IDEADEV-41212: Created an artifact from a folder, then renamed the artifact and it broke the link with the artifact I extracted it from (90.137)

This commit is contained in:
nik
2009-11-06 12:58:08 +03:00
parent 6a159827e5
commit d214956031
22 changed files with 213 additions and 114 deletions
@@ -16,11 +16,9 @@
package com.intellij.packaging.impl.artifacts;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.packaging.artifacts.ArtifactProperties;
import com.intellij.packaging.artifacts.ArtifactPropertiesProvider;
import com.intellij.packaging.artifacts.ArtifactType;
import com.intellij.packaging.artifacts.ModifiableArtifact;
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.NonNls;
@@ -37,16 +35,23 @@ public class ArtifactImpl extends UserDataHolderBase implements ModifiableArtifa
private String myName;
private boolean myBuildOnMake;
private String myOutputPath;
private final EventDispatcher<ArtifactListener> myDispatcher;
private ArtifactType myArtifactType;
private Map<ArtifactPropertiesProvider, ArtifactProperties<?>> myProperties;
public ArtifactImpl(@NotNull String name, @NotNull ArtifactType artifactType, boolean buildOnMake, @NotNull CompositePackagingElement<?> rootElement,
String outputPath) {
this(name, artifactType, buildOnMake, rootElement, outputPath, null);
}
public ArtifactImpl(@NotNull String name, @NotNull ArtifactType artifactType, boolean buildOnMake, @NotNull CompositePackagingElement<?> rootElement,
String outputPath,
EventDispatcher<ArtifactListener> dispatcher) {
myName = name;
myArtifactType = artifactType;
myBuildOnMake = buildOnMake;
myRootElement = rootElement;
myOutputPath = outputPath;
myDispatcher = dispatcher;
myProperties = new HashMap<ArtifactPropertiesProvider, ArtifactProperties<?>>();
resetProperties();
}
@@ -86,8 +91,8 @@ public class ArtifactImpl extends UserDataHolderBase implements ModifiableArtifa
return Collections.unmodifiableCollection(myProperties.keySet());
}
public ArtifactImpl createCopy() {
final ArtifactImpl artifact = new ArtifactImpl(myName, myArtifactType, myBuildOnMake, myRootElement, myOutputPath);
public ArtifactImpl createCopy(EventDispatcher<ArtifactListener> dispatcher) {
final ArtifactImpl artifact = new ArtifactImpl(myName, myArtifactType, myBuildOnMake, myRootElement, myOutputPath, dispatcher);
for (Map.Entry<ArtifactPropertiesProvider, ArtifactProperties<?>> entry : myProperties.entrySet()) {
final ArtifactProperties newProperties = artifact.myProperties.get(entry.getKey());
//noinspection unchecked
@@ -97,7 +102,11 @@ public class ArtifactImpl extends UserDataHolderBase implements ModifiableArtifa
}
public void setName(@NotNull String name) {
String oldName = myName;
myName = name;
if (myDispatcher != null) {
myDispatcher.getMulticaster().artifactChanged(this, oldName);
}
}
@NonNls @Override
@@ -52,7 +52,7 @@ public class ArtifactManagerImpl extends ArtifactManager implements ProjectCompo
@NonNls public static final String COMPONENT_NAME = "ArtifactManager";
@NonNls public static final String PACKAGING_ELEMENT_NAME = "element";
@NonNls public static final String TYPE_ID_ATTRIBUTE = "id";
private final ArtifactManagerModel myModel = new ArtifactManagerModel();
private final ArtifactManagerModel myModel;
private final Project myProject;
private final DefaultPackagingElementResolvingContext myResolvingContext;
private boolean myInsideCommit = false;
@@ -67,6 +67,7 @@ public class ArtifactManagerImpl extends ArtifactManager implements ProjectCompo
public ArtifactManagerImpl(Project project, VirtualFileManager virtualFileManager) {
myProject = project;
myModel = new ArtifactManagerModel();
myResolvingContext = new DefaultPackagingElementResolvingContext(myProject);
virtualFileManager.addVirtualFileListener(new ArtifactVirtualFileListener(myProject, this), myProject);
}
@@ -85,6 +86,11 @@ public class ArtifactManagerImpl extends ArtifactManager implements ProjectCompo
return myModel.getArtifactByOriginal(artifact);
}
@NotNull
public Artifact getOriginalArtifact(@NotNull Artifact artifact) {
return myModel.getOriginalArtifact(artifact);
}
public Collection<? extends Artifact> getArtifactsByType(@NotNull ArtifactType type) {
return myModel.getArtifactsByType(type);
}
@@ -183,8 +189,7 @@ public class ArtifactManagerImpl extends ArtifactManager implements ProjectCompo
}
if (myLoaded) {
final ArtifactModelImpl model = new ArtifactModelImpl(this);
model.addArtifacts(artifacts);
final ArtifactModelImpl model = new ArtifactModelImpl(this, artifacts);
doCommit(model);
}
else {
@@ -258,10 +263,7 @@ public class ArtifactManagerImpl extends ArtifactManager implements ProjectCompo
@Override
public ModifiableArtifactModel createModifiableModel() {
((ArtifactPointerManagerImpl)ArtifactPointerManager.getInstance(myProject)).updateAllPointers();
final ArtifactModelImpl model = new ArtifactModelImpl(this);
model.addArtifacts(getArtifactsList());
return model;
return new ArtifactModelImpl(this, getArtifactsList());
}
@Override
@@ -55,6 +55,11 @@ public abstract class ArtifactModelBase implements ArtifactModel {
return artifact;
}
@NotNull
public Artifact getOriginalArtifact(@NotNull Artifact artifact) {
return artifact;
}
public Collection<? extends Artifact> getArtifactsByType(@NotNull ArtifactType type) {
final List<Artifact> result = new ArrayList<Artifact>();
for (Artifact artifact : getArtifacts()) {
@@ -36,16 +36,15 @@ public class ArtifactModelImpl extends ArtifactModelBase implements ModifiableAr
private final Map<ArtifactImpl, ArtifactImpl> myModifiable2Original = new HashMap<ArtifactImpl, ArtifactImpl>();
private final EventDispatcher<ArtifactListener> myDispatcher = EventDispatcher.create(ArtifactListener.class);
public ArtifactModelImpl(ArtifactManagerImpl artifactManager) {
public ArtifactModelImpl(ArtifactManagerImpl artifactManager, List<ArtifactImpl> originalArtifacts) {
myArtifactManager = artifactManager;
myOriginalArtifacts = new ArrayList<ArtifactImpl>();
}
public void addArtifacts(List<ArtifactImpl> artifacts) {
for (ArtifactImpl artifact : artifacts) {
myOriginalArtifacts.add(artifact);
}
artifactsChanged();
myOriginalArtifacts = new ArrayList<ArtifactImpl>(originalArtifacts);
addListener(new ArtifactAdapter() {
@Override
public void artifactChanged(@NotNull Artifact artifact, @NotNull String oldName) {
artifactsChanged();
}
});
}
protected List<? extends Artifact> getArtifactsList() {
@@ -70,7 +69,7 @@ public class ArtifactModelImpl extends ArtifactModelBase implements ModifiableAr
@NotNull
public ModifiableArtifact addArtifact(@NotNull String name, @NotNull ArtifactType artifactType, CompositePackagingElement<?> rootElement) {
final String outputPath = ArtifactUtil.getDefaultArtifactOutputPath(name, myArtifactManager.getProject());
final ArtifactImpl artifact = new ArtifactImpl(generateUniqueName(name), artifactType, false, rootElement, outputPath);
final ArtifactImpl artifact = new ArtifactImpl(generateUniqueName(name), artifactType, false, rootElement, outputPath, myDispatcher);
myOriginalArtifacts.add(artifact);
myArtifact2ModifiableCopy.put(artifact, artifact);
myModifiable2Original.put(artifact, artifact);
@@ -123,7 +122,8 @@ public class ArtifactModelImpl extends ArtifactModelBase implements ModifiableAr
ArtifactImpl modifiableCopy = myArtifact2ModifiableCopy.get(artifactImpl);
if (modifiableCopy == null) {
modifiableCopy = artifactImpl.createCopy();
modifiableCopy = artifactImpl.createCopy(myDispatcher);
myDispatcher.getMulticaster().artifactChanged(modifiableCopy, artifact.getName());
myArtifact2ModifiableCopy.put(artifactImpl, modifiableCopy);
myModifiable2Original.put(modifiableCopy, artifactImpl);
artifactsChanged();
@@ -131,7 +131,8 @@ public class ArtifactModelImpl extends ArtifactModelBase implements ModifiableAr
return modifiableCopy;
}
public Artifact getOriginalArtifact(Artifact artifact) {
@NotNull
public Artifact getOriginalArtifact(@NotNull Artifact artifact) {
final ArtifactImpl original = myModifiable2Original.get(artifact);
return original != null ? original : artifact;
}
@@ -151,6 +152,16 @@ public class ArtifactModelImpl extends ArtifactModelBase implements ModifiableAr
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
@@ -15,9 +15,7 @@
*/
package com.intellij.packaging.impl.artifacts;
import com.intellij.openapi.project.Project;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactManager;
import com.intellij.packaging.artifacts.ArtifactModel;
import com.intellij.packaging.artifacts.ArtifactPointer;
import org.jetbrains.annotations.NotNull;
@@ -26,35 +24,42 @@ import org.jetbrains.annotations.NotNull;
* @author nik
*/
public class ArtifactPointerImpl implements ArtifactPointer {
private final Project myProject;
private String myName;
private Artifact myArtifact;
public ArtifactPointerImpl(@NotNull Project project, @NotNull String name) {
myProject = project;
public ArtifactPointerImpl(@NotNull String name) {
myName = name;
}
public ArtifactPointerImpl(@NotNull Artifact artifact) {
myArtifact = artifact;
myName = artifact.getName();
}
@NotNull
public String getName() {
public String getArtifactName() {
return myName;
}
public Artifact getArtifact() {
if (myArtifact == null) {
myArtifact = findArtifact(ArtifactManager.getInstance(myProject));
}
return myArtifact;
}
public Artifact findArtifact(@NotNull ArtifactModel artifactModel) {
if (myArtifact != null) {
final Artifact artifact = artifactModel.getArtifactByOriginal(myArtifact);
if (!artifact.equals(myArtifact)) {
return artifact;
}
@NotNull
public String getArtifactName(@NotNull ArtifactModel artifactModel) {
final Artifact artifact = getArtifact();
if (artifact != null) {
return artifactModel.getArtifactByOriginal(artifact).getName();
}
return artifactModel.findArtifact(myName);
return myName;
}
public Artifact findArtifact(@NotNull ArtifactModel artifactModel) {
final Artifact artifact = getArtifact();
if (artifact != null) {
return artifactModel.getArtifactByOriginal(artifact);
}
return null;
}
void setArtifact(Artifact artifact) {
@@ -20,72 +20,98 @@ import com.intellij.packaging.artifacts.*;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author nik
*/
public class ArtifactPointerManagerImpl extends ArtifactPointerManager {
private final Map<String, ArtifactPointerImpl> myUnresolvedPointers = new HashMap<String, ArtifactPointerImpl>();
private final Map<Artifact, ArtifactPointerImpl> myPointers = new HashMap<Artifact, ArtifactPointerImpl>();
private final Project myProject;
private final Map<String, ArtifactPointerImpl> myPointers = new HashMap<String, ArtifactPointerImpl>();
public ArtifactPointerManagerImpl(Project project) {
myProject = project;
myProject.getMessageBus().connect().subscribe(ArtifactManager.TOPIC, new ArtifactAdapter() {
project.getMessageBus().connect().subscribe(ArtifactManager.TOPIC, new ArtifactAdapter() {
@Override
public void artifactRemoved(@NotNull Artifact artifact) {
final ArtifactPointerImpl pointer = myPointers.get(artifact.getName());
if (pointer != null) {
pointer.setArtifact(null);
}
disposePointer(artifact);
}
@Override
public void artifactAdded(@NotNull Artifact artifact) {
final ArtifactPointerImpl artifactPointer = myPointers.get(artifact.getName());
if (artifactPointer != null) {
artifactPointer.setArtifact(artifact);
final ArtifactPointerImpl pointer = myPointers.get(artifact);
if (pointer != null) {
pointer.setName(artifact.getName());
}
final ArtifactPointerImpl unresolved = myUnresolvedPointers.remove(artifact.getName());
if (unresolved != null) {
unresolved.setArtifact(artifact);
if (pointer == null) {
myPointers.put(artifact, unresolved);
}
}
}
@Override
public void artifactChanged(@NotNull Artifact artifact, @NotNull String oldName) {
final ArtifactPointerImpl pointer = myPointers.get(oldName);
final ArtifactPointerImpl pointer = myPointers.get(artifact);
if (pointer != null) {
pointer.setArtifact(artifact);
final String newName = artifact.getName();
if (!newName.equals(oldName)) {
pointer.setName(newName);
myPointers.remove(oldName);
myPointers.put(newName, pointer);
pointer.setName(artifact.getName());
}
final ArtifactPointerImpl unresolved = myUnresolvedPointers.remove(artifact.getName());
if (unresolved != null) {
unresolved.setArtifact(artifact);
if (pointer == null) {
myPointers.put(artifact, unresolved);
}
}
}
});
}
public void updateAllPointers() {
for (ArtifactPointerImpl pointer : myPointers.values()) {
pointer.getArtifact();
private void disposePointer(Artifact artifact) {
final ArtifactPointerImpl pointer = myPointers.remove(artifact);
if (pointer != null) {
pointer.setArtifact(null);
myUnresolvedPointers.put(pointer.getArtifactName(), pointer);
}
}
public ArtifactPointer create(@NotNull String name) {
ArtifactPointerImpl pointer = myPointers.get(name);
public ArtifactPointer createPointer(@NotNull String name) {
final Artifact artifact = ArtifactManager.getInstance(myProject).findArtifact(name);
if (artifact != null) {
return createPointer(artifact);
}
ArtifactPointerImpl pointer = myUnresolvedPointers.get(name);
if (pointer == null) {
pointer = new ArtifactPointerImpl(myProject, name);
myPointers.put(name, pointer);
pointer = new ArtifactPointerImpl(name);
myUnresolvedPointers.put(name, pointer);
}
return pointer;
}
public ArtifactPointer create(@NotNull Artifact artifact) {
final String name = artifact.getName();
ArtifactPointerImpl pointer = myPointers.get(name);
public ArtifactPointer createPointer(@NotNull Artifact artifact) {
ArtifactPointerImpl pointer = myPointers.get(artifact);
if (pointer == null) {
pointer = new ArtifactPointerImpl(myProject, name);
myPointers.put(artifact.getName(), pointer);
pointer = new ArtifactPointerImpl(artifact);
myPointers.put(artifact, pointer);
}
return pointer;
}
@Override
public ArtifactPointer createPointer(@NotNull Artifact artifact, @NotNull ArtifactModel artifactModel) {
return createPointer(artifactModel.getOriginalArtifact(artifact));
}
public void disposePointers(List<Artifact> artifacts) {
for (Artifact artifact : artifacts) {
disposePointer(artifact);
}
}
}
@@ -58,7 +58,7 @@ public class ArtifactElementType extends ComplexPackagingElementType<ArtifactPac
List<Artifact> artifacts = context.chooseArtifacts(getAvailableArtifacts(context, artifact), CompilerBundle.message("dialog.title.choose.artifacts"));
final List<ArtifactPackagingElement> elements = new ArrayList<ArtifactPackagingElement>();
for (Artifact selected : artifacts) {
elements.add(new ArtifactPackagingElement(project, ArtifactPointerManager.getInstance(project).create(selected.getName())));
elements.add(new ArtifactPackagingElement(project, ArtifactPointerManager.getInstance(project).createPointer(selected, context.getArtifactModel())));
}
return elements;
}
@@ -18,19 +18,16 @@ package com.intellij.packaging.impl.elements;
import com.intellij.compiler.ant.BuildProperties;
import com.intellij.compiler.ant.Generator;
import com.intellij.openapi.project.Project;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactType;
import com.intellij.packaging.artifacts.ArtifactPointer;
import com.intellij.packaging.artifacts.ArtifactPointerManager;
import com.intellij.packaging.artifacts.*;
import com.intellij.packaging.elements.*;
import com.intellij.packaging.impl.ui.ArtifactElementPresentation;
import com.intellij.packaging.impl.ui.DelegatedPackagingElementPresentation;
import com.intellij.packaging.ui.PackagingElementPresentation;
import com.intellij.packaging.ui.ArtifactEditorContext;
import com.intellij.packaging.ui.PackagingElementPresentation;
import com.intellij.util.xmlb.annotations.Attribute;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NonNls;
import java.util.ArrayList;
import java.util.Collections;
@@ -107,14 +104,14 @@ public class ArtifactPackagingElement extends ComplexPackagingElement<ArtifactPa
public ArtifactPackagingElementState getState() {
final ArtifactPackagingElementState state = new ArtifactPackagingElementState();
if (myArtifactPointer != null) {
state.setArtifactName(myArtifactPointer.getName());
state.setArtifactName(myArtifactPointer.getArtifactName());
}
return state;
}
public void loadState(ArtifactPackagingElementState state) {
final String name = state.getArtifactName();
myArtifactPointer = name != null ? ArtifactPointerManager.getInstance(myProject).create(name) : null;
myArtifactPointer = name != null ? ArtifactPointerManager.getInstance(myProject).createPointer(name) : null;
}
@Override
@@ -135,7 +132,7 @@ public class ArtifactPackagingElement extends ComplexPackagingElement<ArtifactPa
@Nullable
public String getArtifactName() {
return myArtifactPointer != null ? myArtifactPointer.getName() : null;
return myArtifactPointer != null ? myArtifactPointer.getArtifactName() : null;
}
@@ -27,6 +27,7 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactPointer;
import com.intellij.packaging.artifacts.ArtifactPointerManager;
import com.intellij.packaging.elements.*;
import com.intellij.packaging.ui.ArtifactEditorContext;
@@ -114,7 +115,7 @@ public class PackagingElementFactoryImpl extends PackagingElementFactory {
@NotNull
@Override
public PackagingElement<?> createArtifactElement(@NotNull Artifact artifact, @NotNull Project project) {
return new ArtifactPackagingElement(project, ArtifactPointerManager.getInstance(project).create(artifact));
return new ArtifactPackagingElement(project, ArtifactPointerManager.getInstance(project).createPointer(artifact));
}
@NotNull
@@ -204,6 +205,12 @@ public class PackagingElementFactoryImpl extends PackagingElementFactory {
return elements;
}
@NotNull
@Override
public PackagingElement<?> createArtifactElement(@NotNull ArtifactPointer artifactPointer, @NotNull Project project) {
return new ArtifactPackagingElement(project, artifactPointer);
}
@NotNull
@Override
public PackagingElement<?> createLibraryFiles(@NotNull String libraryName, @NotNull String level, String moduleName) {
@@ -32,7 +32,7 @@ import java.util.List;
public class ArtifactChooser extends ElementsChooser<ArtifactPointer> {
private static final Comparator<ArtifactPointer> ARTIFACT_COMPARATOR = new Comparator<ArtifactPointer>() {
public int compare(ArtifactPointer o1, ArtifactPointer o2) {
return o1.getName().compareToIgnoreCase(o2.getName());
return o1.getArtifactName().compareToIgnoreCase(o2.getArtifactName());
}
};
private static final ElementProperties INVALID_ARTIFACT_PROPERTIES = new ElementProperties() {
@@ -57,7 +57,7 @@ public class ArtifactChooser extends ElementsChooser<ArtifactPointer> {
@Override
protected String getItemText(@NotNull ArtifactPointer value) {
return value.getName();
return value.getArtifactName();
}
@Override
@@ -72,7 +72,7 @@ public class BuildArtifactsBeforeRun implements BeforeRunTaskProvider<BuildArtif
return "Build Artifacts";
}
if (pointers.size() == 1) {
return "Build '" + pointers.get(0).getName() + "' artifact";
return "Build '" + pointers.get(0).getArtifactName() + "' artifact";
}
return "Build " + pointers.size() + " artifacts";
}
@@ -89,7 +89,7 @@ public class BuildArtifactsBeforeRun implements BeforeRunTaskProvider<BuildArtif
final Artifact[] artifacts = ArtifactManager.getInstance(myProject).getArtifacts();
Set<ArtifactPointer> pointers = new THashSet<ArtifactPointer>();
for (Artifact artifact : artifacts) {
pointers.add(ArtifactPointerManager.getInstance(myProject).create(artifact));
pointers.add(ArtifactPointerManager.getInstance(myProject).createPointer(artifact));
}
pointers.addAll(task.getArtifactPointers());
ArtifactChooser chooser = new ArtifactChooser(new ArrayList<ArtifactPointer>(pointers));
@@ -46,7 +46,7 @@ public class BuildArtifactsBeforeRunTask extends BeforeRunTask {
final List<Element> children = element.getChildren(ARTIFACT_ELEMENT);
final ArtifactPointerManager pointerManager = ArtifactPointerManager.getInstance(myProject);
for (Element child : children) {
myArtifactPointers.add(pointerManager.create(child.getAttributeValue(NAME_ATTRIBUTE)));
myArtifactPointers.add(pointerManager.createPointer(child.getAttributeValue(NAME_ATTRIBUTE)));
}
}
@@ -54,7 +54,7 @@ public class BuildArtifactsBeforeRunTask extends BeforeRunTask {
public void writeExternal(Element element) {
super.writeExternal(element);
for (ArtifactPointer pointer : myArtifactPointers) {
element.addContent(new Element(ARTIFACT_ELEMENT).setAttribute(NAME_ATTRIBUTE, pointer.getName()));
element.addContent(new Element(ARTIFACT_ELEMENT).setAttribute(NAME_ATTRIBUTE, pointer.getArtifactName()));
}
}
@@ -74,14 +74,14 @@ public class BuildArtifactsBeforeRunTask extends BeforeRunTask {
}
public void addArtifact(Artifact artifact) {
final ArtifactPointer pointer = ArtifactPointerManager.getInstance(myProject).create(artifact);
final ArtifactPointer pointer = ArtifactPointerManager.getInstance(myProject).createPointer(artifact);
if (!myArtifactPointers.contains(pointer)) {
myArtifactPointers.add(pointer);
}
}
public void removeArtifact(Artifact artifact) {
myArtifactPointers.remove(ArtifactPointerManager.getInstance(myProject).create(artifact));
myArtifactPointers.remove(ArtifactPointerManager.getInstance(myProject).createPointer(artifact));
}
public boolean equals(Object o) {
@@ -24,43 +24,51 @@ import com.intellij.packaging.ui.PackagingElementWeights;
import com.intellij.packaging.ui.TreeNodePresentation;
import com.intellij.ui.SimpleTextAttributes;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author nik
*/
public class ArtifactElementPresentation extends TreeNodePresentation {
private final Artifact myArtifact;
private final ArtifactPointer myArtifactPointer;
private final ArtifactEditorContext myContext;
private final String myName;
public ArtifactElementPresentation(ArtifactPointer artifactPointer, ArtifactEditorContext context) {
myName = artifactPointer != null ? artifactPointer.getName() : "<unknown>";
myArtifact = artifactPointer != null ? artifactPointer.findArtifact(context.getArtifactModel()) : null;
myArtifactPointer = artifactPointer;
myContext = context;
}
public String getPresentableName() {
return myName;
return myArtifactPointer != null ? myArtifactPointer.getArtifactName(myContext.getArtifactModel()) : "<unknown>";
}
@Override
public boolean canNavigateToSource() {
return myArtifact != null;
return findArtifact() != null;
}
@Override
public Object getSourceObject() {
return myArtifact;
return myArtifactPointer;
}
@Override
public void navigateToSource() {
myContext.selectArtifact(myArtifact);
final Artifact artifact = findArtifact();
if (artifact != null) {
myContext.selectArtifact(artifact);
}
}
public void render(@NotNull PresentationData presentationData, SimpleTextAttributes mainAttributes, SimpleTextAttributes commentAttributes) {
presentationData.setIcons(myArtifact != null ? myArtifact.getArtifactType().getIcon() : PlainArtifactType.ARTIFACT_ICON);
presentationData.addText(myName, myArtifact != null ? mainAttributes : SimpleTextAttributes.ERROR_ATTRIBUTES);
final Artifact artifact = findArtifact();
presentationData.setIcons(artifact != null ? artifact.getArtifactType().getIcon() : PlainArtifactType.ARTIFACT_ICON);
presentationData.addText(getPresentableName(), artifact != null ? mainAttributes : SimpleTextAttributes.ERROR_ATTRIBUTES);
}
@Nullable
private Artifact findArtifact() {
return myArtifactPointer != null ? myArtifactPointer.findArtifact(myContext.getArtifactModel()) : null;
}
@Override
@@ -33,5 +33,8 @@ public interface ArtifactModel {
@NotNull
Artifact getArtifactByOriginal(@NotNull Artifact artifact);
@NotNull
Artifact getOriginalArtifact(@NotNull Artifact artifact);
Collection<? extends Artifact> getArtifactsByType(@NotNull ArtifactType type);
}
@@ -24,11 +24,14 @@ import org.jetbrains.annotations.NotNull;
public interface ArtifactPointer {
@NotNull
String getName();
String getArtifactName();
@Nullable
Artifact getArtifact();
@NotNull
String getArtifactName(@NotNull ArtifactModel artifactModel);
@Nullable
Artifact findArtifact(@NotNull ArtifactModel artifactModel);
@@ -27,7 +27,9 @@ public abstract class ArtifactPointerManager {
return ServiceManager.getService(project, ArtifactPointerManager.class);
}
public abstract ArtifactPointer create(@NotNull String name);
public abstract ArtifactPointer createPointer(@NotNull String name);
public abstract ArtifactPointer create(@NotNull Artifact artifact);
public abstract ArtifactPointer createPointer(@NotNull Artifact artifact);
public abstract ArtifactPointer createPointer(@NotNull Artifact artifact, @NotNull ArtifactModel artifactModel);
}
@@ -35,10 +35,17 @@ public interface ModifiableArtifactModel extends ArtifactModel {
@NotNull
ModifiableArtifact getOrCreateModifiableArtifact(@NotNull Artifact artifact);
@Nullable
Artifact getModifiableCopy(Artifact artifact);
void addListener(@NotNull ArtifactListener listener);
void removeListener(@NotNull ArtifactListener listener);
boolean isModified();
void commit();
@Nullable
Artifact getModifiableCopy(Artifact artifact);
void dispose();
}
@@ -20,6 +20,7 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.project.Project;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactPointer;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -53,6 +54,9 @@ public abstract class PackagingElementFactory {
@NotNull
public abstract List<? extends PackagingElement<?>> createLibraryElements(@NotNull Library library);
@NotNull
public abstract PackagingElement<?> createArtifactElement(@NotNull ArtifactPointer artifactPointer, @NotNull Project project);
@NotNull
public abstract PackagingElement<?> createArtifactElement(@NotNull Artifact artifact, @NotNull Project project);
@@ -22,7 +22,6 @@ import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigur
import com.intellij.openapi.util.Disposer;
import com.intellij.packaging.artifacts.*;
import com.intellij.packaging.elements.CompositePackagingElement;
import com.intellij.packaging.impl.artifacts.ArtifactModelImpl;
import com.intellij.packaging.impl.artifacts.ArtifactUtil;
import com.intellij.packaging.ui.ManifestFileConfiguration;
import org.jetbrains.annotations.NotNull;
@@ -69,7 +68,7 @@ class ArtifactsStructureConfigurableContextImpl implements ArtifactsStructureCon
@NotNull
public Artifact getOriginalArtifact(@NotNull Artifact artifact) {
if (myModifiableModel != null) {
return ((ArtifactModelImpl)myModifiableModel).getOriginalArtifact(artifact);
return myModifiableModel.getOriginalArtifact(artifact);
}
return artifact;
}
@@ -108,7 +107,7 @@ class ArtifactsStructureConfigurableContextImpl implements ArtifactsStructureCon
artifact = getOriginalArtifact(artifact);
ArtifactEditorImpl artifactEditor = myArtifactEditors.get(artifact);
if (artifactEditor == null) {
final ArtifactEditorSettings settings = myEditorSettings.get(ArtifactPointerManager.getInstance(myProject).create(artifact));
final ArtifactEditorSettings settings = myEditorSettings.get(ArtifactPointerManager.getInstance(myProject).createPointer(artifact, getArtifactModel()));
artifactEditor = new ArtifactEditorImpl(this, artifact, settings != null ? settings : myDefaultSettings);
myArtifactEditors.put(artifact, artifactEditor);
}
@@ -124,7 +123,7 @@ class ArtifactsStructureConfigurableContextImpl implements ArtifactsStructureCon
public ModifiableArtifactModel getModifiableArtifactModel() {
if (myModifiableModel == null) {
myModifiableModel = ArtifactManager.getInstance(myProject).createModifiableModel();
((ArtifactModelImpl)myModifiableModel).addListener(myModifiableModelListener);
myModifiableModel.addListener(myModifiableModelListener);
}
return myModifiableModel;
}
@@ -168,12 +167,15 @@ class ArtifactsStructureConfigurableContextImpl implements ArtifactsStructureCon
Disposer.dispose(editor);
}
myArtifactEditors.clear();
if (myModifiableModel != null) {
myModifiableModel.dispose();
}
}
public void saveEditorSettings() {
myEditorSettings.clear();
for (ArtifactEditorImpl artifactEditor : myArtifactEditors.values()) {
final ArtifactPointer pointer = ArtifactPointerManager.getInstance(myProject).create(artifactEditor.getArtifact());
final ArtifactPointer pointer = ArtifactPointerManager.getInstance(myProject).createPointer(artifactEditor.getArtifact(), getArtifactModel());
myEditorSettings.put(pointer, artifactEditor.createSettings());
}
}
@@ -16,7 +16,6 @@
package com.intellij.openapi.roots.ui.configuration.artifacts.actions;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectBundle;
import com.intellij.openapi.roots.ui.configuration.artifacts.ArtifactEditorEx;
@@ -71,7 +70,7 @@ public class ExtractArtifactAction extends LayoutTreeActionBase {
for (PackagingElement element : selectedElements) {
parent.removeChild(element);
}
parent.addOrFindChild(new ArtifactPackagingElement(project, ArtifactPointerManager.getInstance(project).create(artifact)));
parent.addOrFindChild(new ArtifactPackagingElement(project, ArtifactPointerManager.getInstance(project).createPointer(artifact, myArtifactEditor.getContext().getArtifactModel())));
}
});
treeComponent.rebuildTree();
@@ -15,15 +15,19 @@
*/
package com.intellij.openapi.roots.ui.configuration.artifacts.sourceItems;
import com.intellij.openapi.project.Project;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactPointerManager;
import com.intellij.packaging.artifacts.ArtifactPointer;
import com.intellij.packaging.artifacts.ArtifactPointerManager;
import com.intellij.packaging.elements.PackagingElement;
import com.intellij.packaging.elements.PackagingElementFactory;
import com.intellij.packaging.elements.PackagingElementOutputKind;
import com.intellij.packaging.impl.artifacts.JarArtifactType;
import com.intellij.packaging.impl.ui.ArtifactElementPresentation;
import com.intellij.packaging.ui.*;
import com.intellij.packaging.ui.ArtifactEditorContext;
import com.intellij.packaging.ui.PackagingSourceItem;
import com.intellij.packaging.ui.SourceItemPresentation;
import com.intellij.packaging.ui.SourceItemWeights;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
@@ -40,7 +44,7 @@ public class ArtifactSourceItem extends PackagingSourceItem {
}
public SourceItemPresentation createPresentation(@NotNull ArtifactEditorContext context) {
final ArtifactPointer pointer = ArtifactPointerManager.getInstance(context.getProject()).create(myArtifact);
final ArtifactPointer pointer = ArtifactPointerManager.getInstance(context.getProject()).createPointer(myArtifact, context.getArtifactModel());
return new DelegatedSourceItemPresentation(new ArtifactElementPresentation(pointer, context)) {
@Override
public int getWeight() {
@@ -51,7 +55,9 @@ public class ArtifactSourceItem extends PackagingSourceItem {
@NotNull
public List<? extends PackagingElement<?>> createElements(@NotNull ArtifactEditorContext context) {
return Collections.singletonList(PackagingElementFactory.getInstance().createArtifactElement(myArtifact, context.getProject()));
final Project project = context.getProject();
final ArtifactPointer pointer = ArtifactPointerManager.getInstance(project).createPointer(myArtifact, context.getArtifactModel());
return Collections.singletonList(PackagingElementFactory.getInstance().createArtifactElement(pointer, project));
}
public boolean equals(Object obj) {
@@ -133,6 +133,9 @@ public class MavenDefaultModifiableModelsProvider extends MavenBaseModifiableMod
each.dispose();
}
myModuleModel.dispose();
if (myArtifactModel != null) {
myArtifactModel.dispose();
}
}
});
}