From aa3c7bae1575e3e8ff968ff2c83a2b1204d05920 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 20 Nov 2009 14:33:01 +0300 Subject: [PATCH] artifacts editor: create manifest file if needed, highlighting fixed --- .../impl/artifacts/PackagingElementPath.java | 16 +++ .../impl/elements/ManifestFileUtil.java | 94 +++++++++++----- .../impl/ui/FileCopyPresentation.java | 2 +- .../ElementWithManifestPropertiesPanel.form | 25 +---- .../ElementWithManifestPropertiesPanel.java | 102 ++++-------------- .../packaging/ui/ArtifactEditorContext.java | 4 +- .../ui/ManifestFileConfiguration.java | 2 +- .../artifacts/ArtifactEditorContextImpl.java | 5 - .../artifacts/ArtifactEditorImpl.java | 22 +++- .../ArtifactValidationManagerImpl.java | 11 +- ...ArtifactsStructureConfigurableContext.java | 4 +- ...factsStructureConfigurableContextImpl.java | 5 - .../artifacts/ManifestFilesInfo.java | 39 ++++--- .../artifacts/nodes/PackagingElementNode.java | 40 +++++-- ...temIntoParentAndLinkViaManifestAction.java | 7 +- .../ArtifactExternalDependenciesImporter.java | 4 + 16 files changed, 186 insertions(+), 196 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/PackagingElementPath.java b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/PackagingElementPath.java index 9552836bc767..7894af4334c5 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/PackagingElementPath.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/PackagingElementPath.java @@ -15,9 +15,12 @@ */ package com.intellij.packaging.impl.artifacts; +import com.intellij.packaging.artifacts.Artifact; import com.intellij.packaging.elements.ComplexPackagingElement; import com.intellij.packaging.elements.CompositePackagingElement; import com.intellij.packaging.elements.PackagingElement; +import com.intellij.packaging.elements.PackagingElementResolvingContext; +import com.intellij.packaging.impl.elements.ArtifactPackagingElement; import com.intellij.util.SmartList; import com.intellij.util.StringBuilderSpinAllocator; import org.jetbrains.annotations.NotNull; @@ -115,4 +118,17 @@ public class PackagingElementPath { public boolean isEmpty() { return myParentPath == null; } + + @Nullable + public Artifact findLastArtifact(PackagingElementResolvingContext context) { + PackagingElementPath path = this; + while (path != EMPTY) { + final PackagingElement element = path.myLastElement; + if (element instanceof ArtifactPackagingElement) { + return ((ArtifactPackagingElement)element).findArtifact(context); + } + path = path.myParentPath; + } + return null; + } } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/elements/ManifestFileUtil.java b/java/compiler/impl/src/com/intellij/packaging/impl/elements/ManifestFileUtil.java index 11e2212989cd..3ff8085bf7f7 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/elements/ManifestFileUtil.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/elements/ManifestFileUtil.java @@ -15,22 +15,32 @@ */ package com.intellij.packaging.impl.elements; +import com.intellij.CommonBundle; +import com.intellij.openapi.application.Result; +import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.compiler.make.ManifestBuilder; import com.intellij.openapi.deployment.DeploymentUtil; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.fileChooser.FileChooser; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Ref; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.packaging.artifacts.ArtifactType; import com.intellij.packaging.elements.CompositePackagingElement; import com.intellij.packaging.elements.PackagingElement; +import com.intellij.packaging.elements.PackagingElementFactory; import com.intellij.packaging.elements.PackagingElementResolvingContext; import com.intellij.packaging.impl.artifacts.ArtifactUtil; import com.intellij.packaging.impl.artifacts.PackagingElementPath; import com.intellij.packaging.impl.artifacts.PackagingElementProcessor; +import com.intellij.packaging.ui.ArtifactEditorContext; import com.intellij.packaging.ui.ManifestFileConfiguration; import com.intellij.util.PathUtil; import org.jetbrains.annotations.NotNull; @@ -135,11 +145,10 @@ public class ManifestFileUtil { } } - public static void updateManifest(VirtualFile file, ManifestFileConfiguration configuration, final boolean replaceValues) { + public static void updateManifest(VirtualFile file, final String mainClass, final List classpath, final boolean replaceValues) { final Manifest manifest = readManifest(file); final Attributes mainAttributes = manifest.getMainAttributes(); - final String mainClass = configuration.getMainClass(); if (mainClass != null) { mainAttributes.put(Attributes.Name.MAIN_CLASS, mainClass); } @@ -147,7 +156,6 @@ public class ManifestFileUtil { mainAttributes.remove(Attributes.Name.MAIN_CLASS); } - final List classpath = configuration.getClasspath(); if (classpath != null && !classpath.isEmpty()) { List updatedClasspath; if (replaceValues) { @@ -188,29 +196,16 @@ public class ManifestFileUtil { } @NotNull - public static ManifestFileConfiguration createManifestFileConfiguration(CompositePackagingElement element, - final PackagingElementResolvingContext context, final ArtifactType artifactType) { - return createManifestFileConfiguration(findManifestFile(element, context, artifactType)); - } - - @NotNull - public static ManifestFileConfiguration createManifestFileConfiguration(@Nullable VirtualFile manifestFile) { + public static ManifestFileConfiguration createManifestFileConfiguration(@NotNull VirtualFile manifestFile) { + final String path = manifestFile.getPath(); + Manifest manifest = readManifest(manifestFile); + String mainClass = manifest.getMainAttributes().getValue(Attributes.Name.MAIN_CLASS); + final String classpathText = manifest.getMainAttributes().getValue(Attributes.Name.CLASS_PATH); final List classpath = new ArrayList(); - String mainClass = null; - final String path; - if (manifestFile != null) { - path = manifestFile.getPath(); - Manifest manifest = readManifest(manifestFile); - mainClass = manifest.getMainAttributes().getValue(Attributes.Name.MAIN_CLASS); - final String classpathText = manifest.getMainAttributes().getValue(Attributes.Name.CLASS_PATH); - if (classpathText != null) { - classpath.addAll(StringUtil.split(classpathText, " ")); - } + if (classpathText != null) { + classpath.addAll(StringUtil.split(classpathText, " ")); } - else { - path = null; - } - return new ManifestFileConfiguration(classpath, mainClass, path); + return new ManifestFileConfiguration(path, classpath, mainClass); } public static List getClasspathForElements(List> elements, PackagingElementResolvingContext context, final ArtifactType artifactType) { @@ -237,4 +232,55 @@ public class ManifestFileUtil { } return classpath; } + + @Nullable + public static VirtualFile showDialogAndCreateManifest(final ArtifactEditorContext context, final CompositePackagingElement element) { + FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor(); + descriptor.setTitle("Select Directory for META-INF/MANIFEST.MF file"); + final VirtualFile directory = suggestManifestFileDirectory(element, context, context.getArtifactType()); + final VirtualFile[] files = FileChooser.chooseFiles(context.getProject(), descriptor, directory); + if (files.length != 1) { + return null; + } + + final Ref exc = Ref.create(null); + final VirtualFile file = new WriteAction() { + protected void run(final Result result) { + VirtualFile dir = files[0]; + try { + if (!dir.getName().equals(MANIFEST_DIR_NAME)) { + VirtualFile newDir = dir.findChild(MANIFEST_DIR_NAME); + if (newDir == null) { + newDir = dir.createChildDirectory(this, MANIFEST_DIR_NAME); + } + dir = newDir; + } + result.setResult(dir.createChildData(this, MANIFEST_FILE_NAME)); + } + catch (IOException e) { + exc.set(e); + } + } + }.execute().getResultObject(); + + final IOException exception = exc.get(); + if (exception != null) { + LOG.info(exception); + Messages.showErrorDialog(context.getProject(), exception.getMessage(), CommonBundle.getErrorTitle()); + return null; + } + return file; + } + + public static void addManifestFileToLayout(final @NotNull String path, final @NotNull ArtifactEditorContext context, + final @NotNull CompositePackagingElement element) { + context.editLayout(context.getArtifact(), new Runnable() { + public void run() { + final VirtualFile file = findManifestFile(element, context, context.getArtifactType()); + if (file == null || !FileUtil.pathsEqual(file.getPath(), path)) { + PackagingElementFactory.getInstance().addFileCopy(element, MANIFEST_DIR_NAME, path, MANIFEST_FILE_NAME); + } + } + }); + } } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/ui/FileCopyPresentation.java b/java/compiler/impl/src/com/intellij/packaging/impl/ui/FileCopyPresentation.java index 1dffcc9986ad..853f72c87b9d 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/ui/FileCopyPresentation.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/ui/FileCopyPresentation.java @@ -64,7 +64,7 @@ public class FileCopyPresentation extends PackagingElementPresentation { } public void render(@NotNull PresentationData presentationData, SimpleTextAttributes mainAttributes, SimpleTextAttributes commentAttributes) { - if (myFile != null && !myFile.isDirectory() || myContext.isManifestFile(mySourcePath)) { + if (myFile != null && !myFile.isDirectory()) { presentationData.setIcons(myFile != null ? myFile.getIcon() : FileCopyElementType.ICON); presentationData.addText(myOutputFileName, mainAttributes); presentationData.addText(" (" + mySourcePath + ")", commentAttributes); diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/ui/properties/ElementWithManifestPropertiesPanel.form b/java/compiler/impl/src/com/intellij/packaging/impl/ui/properties/ElementWithManifestPropertiesPanel.form index f40bb99a4a92..f1e893049b3c 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/ui/properties/ElementWithManifestPropertiesPanel.form +++ b/java/compiler/impl/src/com/intellij/packaging/impl/ui/properties/ElementWithManifestPropertiesPanel.form @@ -20,7 +20,7 @@ - + @@ -73,29 +73,6 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/ui/properties/ElementWithManifestPropertiesPanel.java b/java/compiler/impl/src/com/intellij/packaging/impl/ui/properties/ElementWithManifestPropertiesPanel.java index 406b5f1e9d12..0d8cc91fbd75 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/ui/properties/ElementWithManifestPropertiesPanel.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/ui/properties/ElementWithManifestPropertiesPanel.java @@ -15,24 +15,17 @@ */ package com.intellij.packaging.impl.ui.properties; -import com.intellij.CommonBundle; import com.intellij.ide.util.TreeClassChooser; import com.intellij.ide.util.TreeClassChooserFactory; -import com.intellij.openapi.application.Result; -import com.intellij.openapi.application.WriteAction; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; -import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.packaging.elements.PackagingElementFactory; import com.intellij.packaging.impl.elements.CompositeElementWithManifest; import com.intellij.packaging.impl.elements.ManifestFileUtil; import com.intellij.packaging.ui.ArtifactEditorContext; @@ -51,21 +44,18 @@ import javax.swing.event.DocumentEvent; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.io.IOException; import java.util.List; /** * @author nik */ public abstract class ElementWithManifestPropertiesPanel> extends PackagingElementPropertiesPanel { - private static final Logger LOG = Logger.getInstance("#com.intellij.packaging.impl.ui.properties.ElementWithManifestPropertiesPanel"); private final E myElement; private final ArtifactEditorContext myContext; private JPanel myMainPanel; private TextFieldWithBrowseButton myMainClassField; private TextFieldWithBrowseButton myClasspathField; private JLabel myTitleLabel; - private JButton myRemoveFromArtifactButton; private JButton myCreateManifestButton; private JButton myUseExistingManifestButton; private JPanel myPropertiesPanel; @@ -75,7 +65,6 @@ public abstract class ElementWithManifestPropertiesPanel exc = Ref.create(null); - final VirtualFile file = new WriteAction() { - protected void run(final Result result) { - VirtualFile dir = files[0]; - try { - if (!dir.getName().equals(ManifestFileUtil.MANIFEST_DIR_NAME)) { - VirtualFile newDir = dir.findChild(ManifestFileUtil.MANIFEST_DIR_NAME); - if (newDir == null) { - newDir = dir.createChildDirectory(this, ManifestFileUtil.MANIFEST_DIR_NAME); - } - dir = newDir; - } - result.setResult(dir.createChildData(this, ManifestFileUtil.MANIFEST_FILE_NAME)); - } - catch (IOException e) { - exc.set(e); - } - } - }.execute().getResultObject(); - - final IOException exception = exc.get(); - if (exception != null) { - LOG.info(exception); - Messages.showErrorDialog(myMainPanel, exception.getMessage(), CommonBundle.getErrorTitle()); + final VirtualFile file = ManifestFileUtil.showDialogAndCreateManifest(myContext, myElement); + if (file == null) { return; } - addManifestFile(file.getPath()); - updateComponents(new ManifestFileConfiguration(null, null, file.getPath())); - apply(); + ManifestFileUtil.addManifestFileToLayout(file.getPath(), myContext, myElement); + updateManifest(); myContext.getThisArtifactEditor().updateLayoutTree(); } - private void addManifestFile(final String path) { - myContext.editLayout(myContext.getArtifact(), new Runnable() { - public void run() { - PackagingElementFactory.getInstance().addFileCopy(myElement, ManifestFileUtil.MANIFEST_DIR_NAME, path, ManifestFileUtil.MANIFEST_FILE_NAME); - } - }); - } - private void chooseManifest() { final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false) { @Override @@ -187,20 +129,19 @@ public abstract class ElementWithManifestPropertiesPanel getConfiguredClasspath() { diff --git a/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactEditorContext.java b/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactEditorContext.java index 085b55fdd1c5..a141702126f7 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactEditorContext.java +++ b/java/compiler/openapi/src/com/intellij/packaging/ui/ArtifactEditorContext.java @@ -45,11 +45,9 @@ public interface ArtifactEditorContext extends PackagingElementResolvingContext @Nullable ModifiableModuleModel getModifiableModuleModel(); - @NotNull + @Nullable ManifestFileConfiguration getManifestFile(CompositePackagingElement element, ArtifactType artifactType); - boolean isManifestFile(String path); - CompositePackagingElement getRootElement(@NotNull Artifact artifact); diff --git a/java/compiler/openapi/src/com/intellij/packaging/ui/ManifestFileConfiguration.java b/java/compiler/openapi/src/com/intellij/packaging/ui/ManifestFileConfiguration.java index c3d26553eae6..b0642d9ec235 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/ui/ManifestFileConfiguration.java +++ b/java/compiler/openapi/src/com/intellij/packaging/ui/ManifestFileConfiguration.java @@ -33,7 +33,7 @@ public class ManifestFileConfiguration { copyFrom(configuration); } - public ManifestFileConfiguration(@Nullable List classpath, @Nullable String mainClass, @Nullable String manifestFilePath) { + public ManifestFileConfiguration(@NotNull String manifestFilePath, @Nullable List classpath, @Nullable String mainClass) { if (classpath != null) { myClasspath.addAll(classpath); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorContextImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorContextImpl.java index da4ffef5b2d4..746291a7169e 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorContextImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorContextImpl.java @@ -65,15 +65,10 @@ public class ArtifactEditorContextImpl implements ArtifactEditorContext { return myParent.getModifiableModuleModel(); } - @NotNull public ManifestFileConfiguration getManifestFile(CompositePackagingElement element, ArtifactType artifactType) { return myParent.getManifestFile(element, artifactType); } - public boolean isManifestFile(String path) { - return myParent.isManifestFile(path); - } - @NotNull public Project getProject() { return myParent.getProject(); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorImpl.java index 0177313d2b70..6be66d8c1721 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorImpl.java @@ -35,6 +35,7 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.packaging.artifacts.Artifact; import com.intellij.packaging.artifacts.ArtifactType; import com.intellij.packaging.artifacts.ModifiableArtifact; @@ -44,6 +45,7 @@ import com.intellij.packaging.elements.PackagingElementFactory; import com.intellij.packaging.elements.PackagingElementType; import com.intellij.packaging.impl.artifacts.ArtifactUtil; import com.intellij.packaging.impl.elements.ArchivePackagingElement; +import com.intellij.packaging.impl.elements.ManifestFileUtil; import com.intellij.packaging.ui.ManifestFileConfiguration; import com.intellij.ui.PopupHandler; import com.intellij.ui.ScrollPaneFactory; @@ -378,10 +380,22 @@ public class ArtifactEditorImpl implements ArtifactEditorEx { myLayoutTreeComponent.putIntoDefaultLocations(Collections.singletonList(new LibrarySourceItem(library))); } - public void addToClasspath(CompositePackagingElement element, List classpath) { + public void addToClasspath(final CompositePackagingElement element, List classpath) { myLayoutTreeComponent.saveElementProperties(); - final ManifestFileConfiguration manifest = myContext.getManifestFile(element, getArtifact().getArtifactType()); - manifest.addToClasspath(classpath); + ManifestFileConfiguration manifest = myContext.getManifestFile(element, getArtifact().getArtifactType()); + if (manifest == null) { + final VirtualFile file = ManifestFileUtil.showDialogAndCreateManifest(myContext, element); + if (file == null) { + return; + } + + ManifestFileUtil.addManifestFileToLayout(file.getPath(), myContext, element); + manifest = myContext.getManifestFile(element, getArtifact().getArtifactType()); + } + + if (manifest != null) { + manifest.addToClasspath(classpath); + } myLayoutTreeComponent.resetElementProperties(); } @@ -411,4 +425,4 @@ public class ArtifactEditorImpl implements ArtifactEditorEx { } } -} \ No newline at end of file +} diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactValidationManagerImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactValidationManagerImpl.java index 5a43230b94e0..e4ae86d9c81e 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactValidationManagerImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactValidationManagerImpl.java @@ -97,12 +97,11 @@ public class ArtifactValidationManagerImpl implements Disposable { private void registerProblem(String message, List> pathToPlace) { final LayoutTree layoutTree = myArtifactEditor.getLayoutTreeComponent().getLayoutTree(); PackagingElementNode node = layoutTree.getRootPackagingNode(); - int i = 0; - while (node != null) { - registerProblem(node, message); - i++; - if (i >= pathToPlace.size()) break; - node = node.findChildByElement(pathToPlace.get(i)); + if (node != null) { + List> nodes = node.getNodesByPath(pathToPlace.subList(1, pathToPlace.size())); + for (PackagingElementNode elementNode : nodes) { + registerProblem(elementNode, message); + } } } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContext.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContext.java index a11097eaedda..d2909c0d5ab6 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContext.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactsStructureConfigurableContext.java @@ -33,11 +33,9 @@ public interface ArtifactsStructureConfigurableContext extends PackagingElementR @NotNull ModifiableArtifactModel getOrCreateModifiableArtifactModel(); - @NotNull + @Nullable ManifestFileConfiguration getManifestFile(CompositePackagingElement element, ArtifactType artifactType); - boolean isManifestFile(String path); - CompositePackagingElement getRootElement(@NotNull Artifact artifact); void editLayout(@NotNull Artifact artifact, Runnable action); 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 6da61b401a33..61e3a2448836 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 @@ -186,15 +186,10 @@ public class ArtifactsStructureConfigurableContextImpl implements ArtifactsStruc return myContext.getModulesConfigurator().getFacetsConfigurator(); } - @NotNull public ManifestFileConfiguration getManifestFile(CompositePackagingElement element, ArtifactType artifactType) { return myManifestFilesInfo.getManifestFile(element, artifactType, this); } - public boolean isManifestFile(String path) { - return myManifestFilesInfo.isManifestFile(path); - } - public ManifestFilesInfo getManifestFilesInfo() { return myManifestFilesInfo; } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ManifestFilesInfo.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ManifestFilesInfo.java index 5a643cfbc110..54560d670515 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ManifestFilesInfo.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ManifestFilesInfo.java @@ -15,39 +15,45 @@ */ package com.intellij.openapi.roots.ui.configuration.artifacts; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.packaging.artifacts.ArtifactType; import com.intellij.packaging.elements.CompositePackagingElement; import com.intellij.packaging.elements.PackagingElementResolvingContext; import com.intellij.packaging.impl.elements.ManifestFileUtil; import com.intellij.packaging.ui.ManifestFileConfiguration; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; -import java.util.Map; import java.util.HashMap; +import java.util.Map; public class ManifestFilesInfo { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.roots.ui.configuration.artifacts.ManifestFilesInfo"); - private Map, ManifestFileConfiguration> myManifestFiles = new HashMap, ManifestFileConfiguration>(); - private Map, ManifestFileConfiguration> myOriginalManifestFiles = new HashMap, ManifestFileConfiguration>(); + private Map myManifestFiles = new HashMap(); + private Map myOriginalManifestFiles = new HashMap(); + @Nullable public ManifestFileConfiguration getManifestFile(CompositePackagingElement element, ArtifactType artifactType, final PackagingElementResolvingContext context) { - ManifestFileConfiguration manifestFile = myManifestFiles.get(element); + final VirtualFile manifestFile = ManifestFileUtil.findManifestFile(element, context, artifactType); if (manifestFile == null) { - manifestFile = ManifestFileUtil.createManifestFileConfiguration(element, context, artifactType); - myOriginalManifestFiles.put(element, new ManifestFileConfiguration(manifestFile)); - myManifestFiles.put(element, manifestFile); + return null; } - return manifestFile; + + ManifestFileConfiguration configuration = myManifestFiles.get(manifestFile); + if (configuration == null) { + configuration = ManifestFileUtil.createManifestFileConfiguration(manifestFile); + myOriginalManifestFiles.put(manifestFile, new ManifestFileConfiguration(configuration)); + myManifestFiles.put(manifestFile, configuration); + } + return configuration; } public void saveManifestFiles() { - for (Map.Entry, ManifestFileConfiguration> entry : myManifestFiles.entrySet()) { + for (Map.Entry entry : myManifestFiles.entrySet()) { final ManifestFileConfiguration configuration = entry.getValue(); final String path = configuration.getManifestFilePath(); if (path == null) continue; @@ -68,7 +74,7 @@ public class ManifestFilesInfo { } } - ManifestFileUtil.updateManifest(file, configuration, true); + ManifestFileUtil.updateManifest(file, configuration.getMainClass(), configuration.getClasspath(), true); } } @@ -80,13 +86,4 @@ public class ManifestFilesInfo { myManifestFiles.clear(); myOriginalManifestFiles.clear(); } - - public boolean isManifestFile(@NotNull String path) { - for (ManifestFileConfiguration configuration : myManifestFiles.values()) { - if (path.equals(configuration.getManifestFilePath())) { - return true; - } - } - return false; - } } \ No newline at end of file diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/nodes/PackagingElementNode.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/nodes/PackagingElementNode.java index 9048f0efb621..170850b1ea6a 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/nodes/PackagingElementNode.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/nodes/PackagingElementNode.java @@ -147,27 +147,45 @@ public class PackagingElementNode> extends Artifac return null; } - @Nullable - public PackagingElementNode findChildByElement(@NotNull PackagingElement element) { - final SimpleNode[] children = getCached(); - if (children != null) { + + public List> getNodesByPath(List> pathToPlace) { + List> result = new ArrayList>(); + PackagingElementNode current = this; + int i = 0; + result.add(current); + while (current != null && i < pathToPlace.size()) { + final SimpleNode[] children = current.getCached(); + if (children == null) { + break; + } + + PackagingElementNode next = null; + final PackagingElement element = pathToPlace.get(i); + + search: for (SimpleNode child : children) { if (child instanceof PackagingElementNode) { - PackagingElementNode elementNode = (PackagingElementNode)child; - for (PackagingElement childElement : elementNode.getPackagingElements()) { + PackagingElementNode childNode = (PackagingElementNode)child; + for (PackagingElement childElement : childNode.getPackagingElements()) { if (childElement.isEqualTo(element)) { - return elementNode; + next = childNode; + break search; } } - for (PackagingNodeSource nodeSource : elementNode.getNodeSources()) { + for (PackagingNodeSource nodeSource : childNode.getNodeSources()) { if (nodeSource.getSourceElement().isEqualTo(element)) { - return elementNode; + next = current; + break search; } } } } + current = next; + if (current != null) { + result.add(current); + } + i++; } - - return null; + return result; } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/sourceItems/actions/PutSourceItemIntoParentAndLinkViaManifestAction.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/sourceItems/actions/PutSourceItemIntoParentAndLinkViaManifestAction.java index 10ef5c62f411..037bfee72bc2 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/sourceItems/actions/PutSourceItemIntoParentAndLinkViaManifestAction.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/sourceItems/actions/PutSourceItemIntoParentAndLinkViaManifestAction.java @@ -122,12 +122,7 @@ public class PutSourceItemIntoParentAndLinkViaManifestAction extends PutIntoDefa }); final ArtifactEditor parentArtifactEditor = context.getOrCreateEditor(parentsInfo.getParentArtifact()); - final ParentElementsInfo finalParentsInfo = parentsInfo; - context.editLayout(parentsInfo.getParentArtifact(), new Runnable() { - public void run() { - parentArtifactEditor.addToClasspath(finalParentsInfo.getParentElement(), classpath); - } - }); + parentArtifactEditor.addToClasspath(parentsInfo.getParentElement(), classpath); ((ArtifactEditorImpl)context.getOrCreateEditor(parentsInfo.getGrandparentArtifact())).rebuildTries(); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/ArtifactExternalDependenciesImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/ArtifactExternalDependenciesImporter.java index 7f49da105fc1..84080fb015b2 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/ArtifactExternalDependenciesImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/ArtifactExternalDependenciesImporter.java @@ -17,6 +17,7 @@ package org.jetbrains.idea.maven.importing; import com.intellij.openapi.roots.ui.configuration.artifacts.ManifestFilesInfo; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.packaging.artifacts.Artifact; import com.intellij.packaging.artifacts.ModifiableArtifactModel; import com.intellij.packaging.elements.CompositePackagingElement; @@ -27,8 +28,10 @@ import com.intellij.packaging.impl.artifacts.PackagingElementPath; import com.intellij.packaging.impl.artifacts.PackagingElementProcessor; import com.intellij.packaging.impl.elements.ArtifactElementType; import com.intellij.packaging.impl.elements.ArtifactPackagingElement; +import com.intellij.packaging.impl.elements.ManifestFileUtil; import com.intellij.packaging.ui.ManifestFileConfiguration; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.HashMap; @@ -42,6 +45,7 @@ public class ArtifactExternalDependenciesImporter { private ManifestFilesInfo myManifestFiles = new ManifestFilesInfo(); private Map>> myExternalDependencies = new HashMap>>(); + @Nullable public ManifestFileConfiguration getManifestFile(@NotNull Artifact artifact, @NotNull PackagingElementResolvingContext context) { return myManifestFiles.getManifestFile(artifact.getRootElement(), artifact.getArtifactType(), context);