blob: 38f46dbf6ab3af821b763d24f6d1bf32bb9697e5 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.packaging.impl.artifacts;
import com.intellij.packaging.artifacts.*;
import com.intellij.packaging.elements.CompositePackagingElement;
import com.intellij.util.EventDispatcher;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author nik
*/
public class ArtifactModelImpl extends ArtifactModelBase implements ModifiableArtifactModel {
private final List<ArtifactImpl> myOriginalArtifacts;
private final ArtifactManagerImpl myArtifactManager;
private final Map<ArtifactImpl, ArtifactImpl> myArtifact2ModifiableCopy = new HashMap<ArtifactImpl, ArtifactImpl>();
private final Map<ArtifactImpl, ArtifactImpl> myModifiable2Original = new HashMap<ArtifactImpl, ArtifactImpl>();
private final EventDispatcher<ArtifactListener> myDispatcher = EventDispatcher.create(ArtifactListener.class);
public ArtifactModelImpl(ArtifactManagerImpl artifactManager, List<ArtifactImpl> originalArtifacts) {
myArtifactManager = artifactManager;
myOriginalArtifacts = new ArrayList<ArtifactImpl>(originalArtifacts);
addListener(new ArtifactAdapter() {
@Override
public void artifactChanged(@NotNull Artifact artifact, @NotNull String oldName) {
artifactsChanged();
}
});
}
protected List<? extends Artifact> getArtifactsList() {
final List<ArtifactImpl> list = new ArrayList<ArtifactImpl>();
for (ArtifactImpl artifact : myOriginalArtifacts) {
final ArtifactImpl copy = myArtifact2ModifiableCopy.get(artifact);
if (copy != null) {
list.add(copy);
}
else {
list.add(artifact);
}
}
return list;
}
@NotNull
public ModifiableArtifact addArtifact(@NotNull final String name, @NotNull ArtifactType artifactType) {
return addArtifact(name, artifactType, artifactType.createRootElement(name));
}
@NotNull
public ModifiableArtifact addArtifact(@NotNull String name, @NotNull ArtifactType artifactType, CompositePackagingElement<?> rootElement) {
final String uniqueName = generateUniqueName(name);
final String outputPath = ArtifactUtil.getDefaultArtifactOutputPath(uniqueName, myArtifactManager.getProject());
final ArtifactImpl artifact = new ArtifactImpl(uniqueName, artifactType, false, rootElement, outputPath, myDispatcher);
myOriginalArtifacts.add(artifact);
myArtifact2ModifiableCopy.put(artifact, artifact);
myModifiable2Original.put(artifact, artifact);
artifactsChanged();
myDispatcher.getMulticaster().artifactAdded(artifact);
return artifact;
}
private String generateUniqueName(String baseName) {
String name = baseName;
int i = 2;
while (true) {
if (findArtifact(name) == null) {
return name;
}
name = baseName + i++;
}
}
public void addListener(@NotNull ArtifactListener listener) {
myDispatcher.addListener(listener);
}
public void removeListener(@NotNull ArtifactListener listener) {
myDispatcher.addListener(listener);
}
public void removeArtifact(@NotNull Artifact artifact) {
final ArtifactImpl artifactImpl = (ArtifactImpl)artifact;
ArtifactImpl original = myModifiable2Original.remove(artifactImpl);
if (original != null) {
myOriginalArtifacts.remove(original);
}
else {
original = artifactImpl;
}
myArtifact2ModifiableCopy.remove(original);
myOriginalArtifacts.remove(original);
artifactsChanged();
myDispatcher.getMulticaster().artifactRemoved(original);
}
@NotNull
public ModifiableArtifact getOrCreateModifiableArtifact(@NotNull Artifact artifact) {
final ArtifactImpl artifactImpl = (ArtifactImpl)artifact;
if (myModifiable2Original.containsKey(artifactImpl)) {
return artifactImpl;
}
ArtifactImpl modifiableCopy = myArtifact2ModifiableCopy.get(artifactImpl);
if (modifiableCopy == null) {
modifiableCopy = artifactImpl.createCopy(myDispatcher);
myDispatcher.getMulticaster().artifactChanged(modifiableCopy, artifact.getName());
myArtifact2ModifiableCopy.put(artifactImpl, modifiableCopy);
myModifiable2Original.put(modifiableCopy, artifactImpl);
artifactsChanged();
}
return modifiableCopy;
}
@NotNull
public Artifact getOriginalArtifact(@NotNull Artifact artifact) {
final ArtifactImpl original = myModifiable2Original.get(artifact);
return original != null ? original : artifact;
}
@NotNull
public ArtifactImpl getArtifactByOriginal(@NotNull Artifact artifact) {
final ArtifactImpl artifactImpl = (ArtifactImpl)artifact;
final ArtifactImpl copy = myArtifact2ModifiableCopy.get(artifactImpl);
return copy != null ? copy : artifactImpl;
}
public boolean isModified() {
return !myOriginalArtifacts.equals(myArtifactManager.getArtifactsList()) || !myArtifact2ModifiableCopy.isEmpty();
}
public void commit() {
myArtifactManager.commit(this);
}
public void dispose() {
List<Artifact> artifacts = new ArrayList<Artifact>();
for (ArtifactImpl artifact : myModifiable2Original.keySet()) {
if (myModifiable2Original.get(artifact).equals(artifact)) {
artifacts.add(artifact);
}
}
((ArtifactPointerManagerImpl)ArtifactPointerManager.getInstance(myArtifactManager.getProject())).disposePointers(artifacts);
}
@Nullable
public ArtifactImpl getModifiableCopy(Artifact artifact) {
//noinspection SuspiciousMethodCalls
return myArtifact2ModifiableCopy.get(artifact);
}
public List<ArtifactImpl> getOriginalArtifacts() {
return myOriginalArtifacts;
}
}