From d214956031a0f4f2a3c9df0c22fa689ef9316f51 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 6 Nov 2009 12:58:08 +0300 Subject: [PATCH] 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) --- .../impl/artifacts/ArtifactImpl.java | 21 +++-- .../impl/artifacts/ArtifactManagerImpl.java | 16 ++-- .../impl/artifacts/ArtifactModelBase.java | 5 ++ .../impl/artifacts/ArtifactModelImpl.java | 35 +++++--- .../impl/artifacts/ArtifactPointerImpl.java | 37 +++++---- .../artifacts/ArtifactPointerManagerImpl.java | 82 ++++++++++++------- .../impl/elements/ArtifactElementType.java | 2 +- .../elements/ArtifactPackagingElement.java | 15 ++-- .../elements/PackagingElementFactoryImpl.java | 9 +- .../packaging/impl/run/ArtifactChooser.java | 4 +- .../impl/run/BuildArtifactsBeforeRun.java | 4 +- .../impl/run/BuildArtifactsBeforeRunTask.java | 8 +- .../impl/ui/ArtifactElementPresentation.java | 28 ++++--- .../packaging/artifacts/ArtifactModel.java | 3 + .../packaging/artifacts/ArtifactPointer.java | 5 +- .../artifacts/ArtifactPointerManager.java | 6 +- .../artifacts/ModifiableArtifactModel.java | 11 ++- .../elements/PackagingElementFactory.java | 4 + ...factsStructureConfigurableContextImpl.java | 12 +-- .../actions/ExtractArtifactAction.java | 3 +- .../sourceItems/ArtifactSourceItem.java | 14 +++- .../MavenDefaultModifiableModelsProvider.java | 3 + 22 files changed, 213 insertions(+), 114 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactImpl.java b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactImpl.java index 90b10646826d..77564966808f 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactImpl.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactImpl.java @@ -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 myDispatcher; private ArtifactType myArtifactType; private Map> 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 dispatcher) { myName = name; myArtifactType = artifactType; myBuildOnMake = buildOnMake; myRootElement = rootElement; myOutputPath = outputPath; + myDispatcher = dispatcher; myProperties = new HashMap>(); 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 dispatcher) { + final ArtifactImpl artifact = new ArtifactImpl(myName, myArtifactType, myBuildOnMake, myRootElement, myOutputPath, dispatcher); for (Map.Entry> 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 diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactManagerImpl.java b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactManagerImpl.java index bb89c9db80db..7ccbe70ec50f 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactManagerImpl.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactManagerImpl.java @@ -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 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 diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactModelBase.java b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactModelBase.java index a3db26ee4d86..ee67d33edb5e 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactModelBase.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactModelBase.java @@ -55,6 +55,11 @@ public abstract class ArtifactModelBase implements ArtifactModel { return artifact; } + @NotNull + public Artifact getOriginalArtifact(@NotNull Artifact artifact) { + return artifact; + } + public Collection getArtifactsByType(@NotNull ArtifactType type) { final List result = new ArrayList(); for (Artifact artifact : getArtifacts()) { diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactModelImpl.java b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactModelImpl.java index bd4583e8073e..2617aaf973b0 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactModelImpl.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactModelImpl.java @@ -36,16 +36,15 @@ public class ArtifactModelImpl extends ArtifactModelBase implements ModifiableAr private final Map myModifiable2Original = new HashMap(); private final EventDispatcher myDispatcher = EventDispatcher.create(ArtifactListener.class); - public ArtifactModelImpl(ArtifactManagerImpl artifactManager) { + public ArtifactModelImpl(ArtifactManagerImpl artifactManager, List originalArtifacts) { myArtifactManager = artifactManager; - myOriginalArtifacts = new ArrayList(); - } - - public void addArtifacts(List artifacts) { - for (ArtifactImpl artifact : artifacts) { - myOriginalArtifacts.add(artifact); - } - artifactsChanged(); + myOriginalArtifacts = new ArrayList(originalArtifacts); + addListener(new ArtifactAdapter() { + @Override + public void artifactChanged(@NotNull Artifact artifact, @NotNull String oldName) { + artifactsChanged(); + } + }); } protected List 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 artifacts = new ArrayList(); + 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 diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactPointerImpl.java b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactPointerImpl.java index 23aa58e44a95..c8b6b369fc98 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactPointerImpl.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactPointerImpl.java @@ -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) { diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactPointerManagerImpl.java b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactPointerManagerImpl.java index 4d19897f7438..92401f8a24ef 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactPointerManagerImpl.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/ArtifactPointerManagerImpl.java @@ -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 myUnresolvedPointers = new HashMap(); + private final Map myPointers = new HashMap(); private final Project myProject; - private final Map myPointers = new HashMap(); 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 artifacts) { + for (Artifact artifact : artifacts) { + disposePointer(artifact); + } + } } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/elements/ArtifactElementType.java b/java/compiler/impl/src/com/intellij/packaging/impl/elements/ArtifactElementType.java index 021c9772d3f2..8addfc9c57e0 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/elements/ArtifactElementType.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/elements/ArtifactElementType.java @@ -58,7 +58,7 @@ public class ArtifactElementType extends ComplexPackagingElementType artifacts = context.chooseArtifacts(getAvailableArtifacts(context, artifact), CompilerBundle.message("dialog.title.choose.artifacts")); final List elements = new ArrayList(); 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; } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/elements/ArtifactPackagingElement.java b/java/compiler/impl/src/com/intellij/packaging/impl/elements/ArtifactPackagingElement.java index 5995a48e5444..4207fbbfde5f 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/elements/ArtifactPackagingElement.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/elements/ArtifactPackagingElement.java @@ -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 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) { diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/run/ArtifactChooser.java b/java/compiler/impl/src/com/intellij/packaging/impl/run/ArtifactChooser.java index 6040b2d44727..b2ef063f94ae 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/run/ArtifactChooser.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/run/ArtifactChooser.java @@ -32,7 +32,7 @@ import java.util.List; public class ArtifactChooser extends ElementsChooser { private static final Comparator ARTIFACT_COMPARATOR = new Comparator() { 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 { @Override protected String getItemText(@NotNull ArtifactPointer value) { - return value.getName(); + return value.getArtifactName(); } @Override diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRun.java b/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRun.java index d16dfac6052f..f9f8c8bcad13 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRun.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRun.java @@ -72,7 +72,7 @@ public class BuildArtifactsBeforeRun implements BeforeRunTaskProvider pointers = new THashSet(); 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(pointers)); diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTask.java b/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTask.java index 3411b1066c8a..65a1d8d36be6 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTask.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/run/BuildArtifactsBeforeRunTask.java @@ -46,7 +46,7 @@ public class BuildArtifactsBeforeRunTask extends BeforeRunTask { final List 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) { diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/ui/ArtifactElementPresentation.java b/java/compiler/impl/src/com/intellij/packaging/impl/ui/ArtifactElementPresentation.java index 2daa2a0b324a..a9dabbf9f02d 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/ui/ArtifactElementPresentation.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/ui/ArtifactElementPresentation.java @@ -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() : ""; - myArtifact = artifactPointer != null ? artifactPointer.findArtifact(context.getArtifactModel()) : null; + myArtifactPointer = artifactPointer; myContext = context; } public String getPresentableName() { - return myName; + return myArtifactPointer != null ? myArtifactPointer.getArtifactName(myContext.getArtifactModel()) : ""; } @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 diff --git a/java/compiler/openapi/src/com/intellij/packaging/artifacts/ArtifactModel.java b/java/compiler/openapi/src/com/intellij/packaging/artifacts/ArtifactModel.java index 4c339a000d72..1a11ecbb4c67 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/artifacts/ArtifactModel.java +++ b/java/compiler/openapi/src/com/intellij/packaging/artifacts/ArtifactModel.java @@ -33,5 +33,8 @@ public interface ArtifactModel { @NotNull Artifact getArtifactByOriginal(@NotNull Artifact artifact); + @NotNull + Artifact getOriginalArtifact(@NotNull Artifact artifact); + Collection getArtifactsByType(@NotNull ArtifactType type); } diff --git a/java/compiler/openapi/src/com/intellij/packaging/artifacts/ArtifactPointer.java b/java/compiler/openapi/src/com/intellij/packaging/artifacts/ArtifactPointer.java index 78908d8d8815..ee1ed1c5390f 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/artifacts/ArtifactPointer.java +++ b/java/compiler/openapi/src/com/intellij/packaging/artifacts/ArtifactPointer.java @@ -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); diff --git a/java/compiler/openapi/src/com/intellij/packaging/artifacts/ArtifactPointerManager.java b/java/compiler/openapi/src/com/intellij/packaging/artifacts/ArtifactPointerManager.java index f6927e12dc28..c5f32f480c43 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/artifacts/ArtifactPointerManager.java +++ b/java/compiler/openapi/src/com/intellij/packaging/artifacts/ArtifactPointerManager.java @@ -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); } diff --git a/java/compiler/openapi/src/com/intellij/packaging/artifacts/ModifiableArtifactModel.java b/java/compiler/openapi/src/com/intellij/packaging/artifacts/ModifiableArtifactModel.java index 50d16dad85c6..5e6172f8e6c2 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/artifacts/ModifiableArtifactModel.java +++ b/java/compiler/openapi/src/com/intellij/packaging/artifacts/ModifiableArtifactModel.java @@ -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(); } diff --git a/java/compiler/openapi/src/com/intellij/packaging/elements/PackagingElementFactory.java b/java/compiler/openapi/src/com/intellij/packaging/elements/PackagingElementFactory.java index 179477db3faa..7401a31d0e55 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/elements/PackagingElementFactory.java +++ b/java/compiler/openapi/src/com/intellij/packaging/elements/PackagingElementFactory.java @@ -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> 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); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContextImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContextImpl.java index 6f3ade014cf3..fe32672e4699 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContextImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContextImpl.java @@ -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()); } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/actions/ExtractArtifactAction.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/actions/ExtractArtifactAction.java index bc96b49d0686..f3cb59b7db44 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/actions/ExtractArtifactAction.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/actions/ExtractArtifactAction.java @@ -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(); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/sourceItems/ArtifactSourceItem.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/sourceItems/ArtifactSourceItem.java index b393f4785910..e56a47bc42c4 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/sourceItems/ArtifactSourceItem.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/sourceItems/ArtifactSourceItem.java @@ -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> 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) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenDefaultModifiableModelsProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenDefaultModifiableModelsProvider.java index 7e21c9e15cab..fb5bdd2bd40b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenDefaultModifiableModelsProvider.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenDefaultModifiableModelsProvider.java @@ -133,6 +133,9 @@ public class MavenDefaultModifiableModelsProvider extends MavenBaseModifiableMod each.dispose(); } myModuleModel.dispose(); + if (myArtifactModel != null) { + myArtifactModel.dispose(); + } } }); }