From 8866bda1f63c4fb6621ef052804bde31739c4420 Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 8 Oct 2009 15:29:10 +0400 Subject: [PATCH] named module libraries supported in artifacts --- .../impl/elements/LibraryElementType.java | 2 +- .../elements/LibraryPackagingElement.java | 79 ++++++++++++++----- .../elements/PackagingElementFactoryImpl.java | 25 ++++-- .../impl/ui/LibraryElementPresentation.java | 18 +++-- .../elements/PackagingElementFactory.java | 2 +- .../conversion/ConversionContext.java | 5 +- .../intellij/conversion/ModuleSettings.java | 8 +- .../impl/ConversionContextImpl.java | 22 +++++- .../conversion/impl/ModuleSettingsImpl.java | 58 +++++++++++--- 9 files changed, 166 insertions(+), 53 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/elements/LibraryElementType.java b/java/compiler/impl/src/com/intellij/packaging/impl/elements/LibraryElementType.java index 2b26eb5aac53..62085385dce9 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/elements/LibraryElementType.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/elements/LibraryElementType.java @@ -43,7 +43,7 @@ public class LibraryElementType extends ComplexPackagingElementType selected = context.chooseLibraries(getAllLibraries(context), ProjectBundle.message("dialog.title.packaging.choose.library")); final List elements = new ArrayList(); for (Library library : selected) { - elements.add(new LibraryPackagingElement(library.getTable().getTableLevel(), library.getName())); + elements.add(new LibraryPackagingElement(library.getTable().getTableLevel(), library.getName(), null)); } return elements; } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/elements/LibraryPackagingElement.java b/java/compiler/impl/src/com/intellij/packaging/impl/elements/LibraryPackagingElement.java index 3b3d3ff84482..1525aed82fb9 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/elements/LibraryPackagingElement.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/elements/LibraryPackagingElement.java @@ -1,23 +1,28 @@ package com.intellij.packaging.impl.elements; +import com.intellij.openapi.deployment.LibraryLink; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.roots.LibraryOrderEntry; +import com.intellij.openapi.roots.OrderEntry; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.roots.ui.configuration.ModulesProvider; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.deployment.LibraryLink; +import com.intellij.packaging.artifacts.ArtifactType; import com.intellij.packaging.elements.ComplexPackagingElement; import com.intellij.packaging.elements.PackagingElement; -import com.intellij.packaging.elements.PackagingElementResolvingContext; import com.intellij.packaging.elements.PackagingElementOutputKind; +import com.intellij.packaging.elements.PackagingElementResolvingContext; import com.intellij.packaging.impl.ui.LibraryElementPresentation; -import com.intellij.packaging.ui.PackagingElementPresentation; import com.intellij.packaging.ui.ArtifactEditorContext; -import com.intellij.packaging.artifacts.ArtifactType; +import com.intellij.packaging.ui.PackagingElementPresentation; import com.intellij.util.PathUtil; 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.List; @@ -26,19 +31,22 @@ import java.util.List; * @author nik */ public class LibraryPackagingElement extends ComplexPackagingElement { - private String myLevel; - private String myName; @NonNls public static final String LIBRARY_NAME_ATTRIBUTE = "name"; + @NonNls public static final String MODULE_NAME_ATTRIBUTE = "module-name"; @NonNls public static final String LIBRARY_LEVEL_ATTRIBUTE = "level"; + private String myLevel; + private String myLibraryName; + private String myModuleName; public LibraryPackagingElement() { super(LibraryElementType.LIBRARY_ELEMENT_TYPE); } - public LibraryPackagingElement(String level, String name) { + public LibraryPackagingElement(String level, String libraryName, String moduleName) { super(LibraryElementType.LIBRARY_ELEMENT_TYPE); myLevel = level; - myName = name; + myLibraryName = libraryName; + myModuleName = moduleName; } public List> getSubstitution(@NotNull PackagingElementResolvingContext context, @NotNull ArtifactType artifactType) { @@ -63,7 +71,7 @@ public class LibraryPackagingElement extends ComplexPackagingElement> createLibraryElements(@NotNull Library library) { final LibraryTable table = library.getTable(); + final String libraryName = library.getName(); if (table != null) { - return Collections.singletonList(createLibraryFiles(table.getTableLevel(), library.getName())); + return Collections.singletonList(createLibraryFiles(libraryName, table.getTableLevel(), null)); + } + if (libraryName != null) { + final Module module = ((LibraryImpl)library).getModule(); + if (module != null) { + return Collections.singletonList(createLibraryFiles(libraryName, LibraryTableImplUtil.MODULE_LEVEL, module.getName())); + } } final List> elements = new ArrayList>(); for (VirtualFile file : library.getFiles(OrderRootType.CLASSES)) { @@ -185,8 +194,8 @@ public class PackagingElementFactoryImpl extends PackagingElementFactory { @NotNull @Override - public PackagingElement createLibraryFiles(@NotNull String level, @NotNull String name) { - return new LibraryPackagingElement(level, name); + public PackagingElement createLibraryFiles(@NotNull String libraryName, @NotNull String level, String moduleName) { + return new LibraryPackagingElement(level, libraryName, moduleName); } @NotNull diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/ui/LibraryElementPresentation.java b/java/compiler/impl/src/com/intellij/packaging/impl/ui/LibraryElementPresentation.java index 0582cc93af1d..a5ee7ad7b683 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/ui/LibraryElementPresentation.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/ui/LibraryElementPresentation.java @@ -13,23 +13,28 @@ import com.intellij.packaging.ui.PackagingElementWeights; import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.Icons; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author nik */ public class LibraryElementPresentation extends PackagingElementPresentation { + private final String myLevel; + private final String myModuleName; private final Library myLibrary; - private final String myName; + private final String myLibraryName; private final ArtifactEditorContext myContext; - public LibraryElementPresentation(String level, String name, Library library, ArtifactEditorContext context) { + public LibraryElementPresentation(String libraryName, String level, @Nullable String moduleName, Library library, ArtifactEditorContext context) { + myLevel = level; + myModuleName = moduleName; myLibrary = library; - myName = name; + myLibraryName = libraryName; myContext = context; } public String getPresentableName() { - return myName; + return myLibraryName; } @Override @@ -50,11 +55,12 @@ public class LibraryElementPresentation extends PackagingElementPresentation { public void render(@NotNull PresentationData presentationData, SimpleTextAttributes mainAttributes, SimpleTextAttributes commentAttributes) { if (myLibrary != null) { presentationData.setIcons(Icons.LIBRARY_ICON); - presentationData.addText(myName, mainAttributes); + presentationData.addText(myLibraryName, mainAttributes); presentationData.addText(getLibraryTableComment(myLibrary), commentAttributes); } else { - presentationData.addText(myName, SimpleTextAttributes.ERROR_ATTRIBUTES); + presentationData.addText(myLibraryName + " (" + (myModuleName != null ? "module '" + myModuleName + "'" : myLevel) + ")", + SimpleTextAttributes.ERROR_ATTRIBUTES); } } 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 f16ce44e63ef..aa3e9d6dd574 100644 --- a/java/compiler/openapi/src/com/intellij/packaging/elements/PackagingElementFactory.java +++ b/java/compiler/openapi/src/com/intellij/packaging/elements/PackagingElementFactory.java @@ -42,7 +42,7 @@ public abstract class PackagingElementFactory { public abstract PackagingElement createArtifactElement(@NotNull Artifact artifact, @NotNull Project project); @NotNull - public abstract PackagingElement createLibraryFiles(@NotNull String level, @NotNull String name); + public abstract PackagingElement createLibraryFiles(@NotNull String libraryName, @NotNull String level, String moduleName); @NotNull diff --git a/platform/lang-impl/src/com/intellij/conversion/ConversionContext.java b/platform/lang-impl/src/com/intellij/conversion/ConversionContext.java index 9e368bf5593e..0ef9f67d34a8 100644 --- a/platform/lang-impl/src/com/intellij/conversion/ConversionContext.java +++ b/platform/lang-impl/src/com/intellij/conversion/ConversionContext.java @@ -28,6 +28,9 @@ public interface ConversionContext { ModuleSettings getModuleSettings(File moduleFile) throws CannotConvertException; + @Nullable + ModuleSettings getModuleSettings(@NotNull String moduleName); + @NotNull String collapsePath(@NotNull String path); @@ -36,6 +39,6 @@ public interface ConversionContext { @Nullable ComponentManagerSettings getCompilerSettings(); - @Nullable + @Nullable ComponentManagerSettings getProjectRootManagerSettings(); } diff --git a/platform/lang-impl/src/com/intellij/conversion/ModuleSettings.java b/platform/lang-impl/src/com/intellij/conversion/ModuleSettings.java index be8ed687bf70..b7a1836dd788 100644 --- a/platform/lang-impl/src/com/intellij/conversion/ModuleSettings.java +++ b/platform/lang-impl/src/com/intellij/conversion/ModuleSettings.java @@ -41,5 +41,11 @@ public interface ModuleSettings extends ComponentManagerSettings { void addExcludedFolder(@NotNull File directory); - List getModuleLibraryRootUrls(String libraryName); + @NotNull + List getModuleLibraryRoots(String libraryName); + + @NotNull + Collection getAllModuleDependencies(); + + boolean hasModuleLibrary(String libraryName); } diff --git a/platform/lang-impl/src/com/intellij/conversion/impl/ConversionContextImpl.java b/platform/lang-impl/src/com/intellij/conversion/impl/ConversionContextImpl.java index 0b5a1028ba9f..0a649bea3779 100644 --- a/platform/lang-impl/src/com/intellij/conversion/impl/ConversionContextImpl.java +++ b/platform/lang-impl/src/com/intellij/conversion/impl/ConversionContextImpl.java @@ -42,7 +42,8 @@ public class ConversionContextImpl implements ConversionContext { private ProjectSettingsImpl myProjectSettings; private WorkspaceSettingsImpl myWorkspaceSettings; private List myNonExistingModuleFiles = new ArrayList(); - private Map myModuleSettingsMap = new HashMap(); + private Map myFile2ModuleSettings = new HashMap(); + private Map myName2ModuleSettings = new HashMap(); private RunManagerSettingsImpl myRunManagerSettings; private File mySettingsBaseDir; private ComponentManagerSettings myCompilerManagerSettings; @@ -175,6 +176,7 @@ public class ConversionContextImpl implements ConversionContext { } } + @NotNull public List getClassRoots(Element libraryElement, ModuleSettingsImpl moduleSettings) { List files = new ArrayList(); //todo[nik] support jar directories @@ -309,14 +311,28 @@ public class ConversionContextImpl implements ConversionContext { public ModuleSettings getModuleSettings(File moduleFile) throws CannotConvertException { - ModuleSettingsImpl settings = myModuleSettingsMap.get(moduleFile); + ModuleSettingsImpl settings = myFile2ModuleSettings.get(moduleFile); if (settings == null) { settings = new ModuleSettingsImpl(moduleFile, this); - myModuleSettingsMap.put(moduleFile, settings); + myFile2ModuleSettings.put(moduleFile, settings); + myName2ModuleSettings.put(settings.getModuleName(), settings); } return settings; } + public ModuleSettings getModuleSettings(@NotNull String moduleName) { + if (!myName2ModuleSettings.containsKey(moduleName)) { + for (File moduleFile : myModuleFiles) { + try { + getModuleSettings(moduleFile); + } + catch (CannotConvertException ignored) { + } + } + } + return myName2ModuleSettings.get(moduleName); + } + public List getNonExistingModuleFiles() { return myNonExistingModuleFiles; } diff --git a/platform/lang-impl/src/com/intellij/conversion/impl/ModuleSettingsImpl.java b/platform/lang-impl/src/com/intellij/conversion/impl/ModuleSettingsImpl.java index 5f238066527b..27fdb185b557 100644 --- a/platform/lang-impl/src/com/intellij/conversion/impl/ModuleSettingsImpl.java +++ b/platform/lang-impl/src/com/intellij/conversion/impl/ModuleSettingsImpl.java @@ -8,10 +8,9 @@ import com.intellij.ide.highlighter.ModuleFileType; import com.intellij.ide.impl.convert.JDomConvertingUtil; import com.intellij.openapi.module.impl.ModuleImpl; import com.intellij.openapi.roots.impl.*; -import com.intellij.openapi.roots.impl.ModuleLibraryOrderEntryImpl; import com.intellij.openapi.roots.impl.libraries.LibraryImpl; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.util.containers.ContainerUtil; import org.jdom.Element; @@ -21,10 +20,7 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.util.*; /** * @author nik @@ -139,17 +135,57 @@ public class ModuleSettingsImpl extends ComponentManagerSettingsImpl implements } } - public List getModuleLibraryRootUrls(String libraryName) { - final Element component = getComponentElement(MODULE_ROOT_MANAGER_COMPONENT); - for (Element element : JDomConvertingUtil.getChildren(component, OrderEntryFactory.ORDER_ENTRY_ELEMENT_NAME)) { + @NotNull + public List getModuleLibraryRoots(String libraryName) { + final Element library = findModuleLibraryElement(libraryName); + return library != null ? myContext.getClassRoots(library, this) : Collections.emptyList(); + } + + public boolean hasModuleLibrary(String libraryName) { + return findModuleLibraryElement(libraryName) != null; + } + + @Nullable + private Element findModuleLibraryElement(String libraryName) { + for (Element element : getOrderEntries()) { if (ModuleLibraryOrderEntryImpl.ENTRY_TYPE.equals(element.getAttributeValue(OrderEntryFactory.ORDER_ENTRY_TYPE_ATTR))) { final Element library = element.getChild(LibraryImpl.ELEMENT); if (library != null && libraryName.equals(library.getAttributeValue(LibraryImpl.LIBRARY_NAME_ATTR))) { - return myContext.getClassRoots(library, this); + return library; + } + } + } + return null; + } + + private List getOrderEntries() { + final Element component = getComponentElement(MODULE_ROOT_MANAGER_COMPONENT); + return JDomConvertingUtil.getChildren(component, OrderEntryFactory.ORDER_ENTRY_ELEMENT_NAME); + } + + @NotNull + public Collection getAllModuleDependencies() { + Set dependencies = new HashSet(); + collectDependencies(dependencies); + return dependencies; + } + + private void collectDependencies(Set dependencies) { + if (!dependencies.add(this)) { + return; + } + + for (Element element : getOrderEntries()) { + if (ModuleOrderEntryImpl.ENTRY_TYPE.equals(element.getAttributeValue(OrderEntryFactory.ORDER_ENTRY_TYPE_ATTR))) { + final String moduleName = element.getAttributeValue(ModuleOrderEntryImpl.MODULE_NAME_ATTR); + if (moduleName != null) { + final ModuleSettings moduleSettings = myContext.getModuleSettings(moduleName); + if (moduleSettings != null) { + ((ModuleSettingsImpl)moduleSettings).collectDependencies(dependencies); + } } } } - return Collections.emptyList(); } private void addExcludedFolder(File directory, Element contentRoot) throws IOException {