From 5ed00d117ebcff493bf13dc9d9fb47fc69686909 Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Mon, 22 Apr 2013 12:39:54 +0400 Subject: [PATCH] IDEA-104500 Gradle: Allow to reuse common logic for other external systems 1. Remove external-system-impl -> openapi dependency; 2. Correct gradle classpath construction; 3. Don't provide 'external-system-impl' at the platform impl classes; --- build/scripts/layouts.gant | 3 +- build/scripts/utils.gant | 3 +- .../model/project/ModuleData.java | 22 ++++++++++++-- .../util/ExternalSystemApiUtil.java | 20 +++++++++++++ .../external-system-impl.iml | 1 - .../service/ExternalSystemFacadeManager.java | 9 +++--- .../service/project/PlatformFacadeImpl.java | 2 -- .../project/manage/ModuleDataService.java | 4 +-- .../AbstractExternalProjectImportBuilder.java | 7 ----- .../util/ExternalSystemUtil.java | 25 ---------------- plugins/gradle/src/META-INF/plugin.xml | 30 ------------------- .../plugins/gradle/GradleManager.java | 27 ++++++++++++----- .../project/GradleProjectResolver.java | 5 +++- .../settings/GradleProjectImportBuilder.java | 10 ++++--- 14 files changed, 79 insertions(+), 89 deletions(-) diff --git a/build/scripts/layouts.gant b/build/scripts/layouts.gant index a9397239f115..a806b2ba5ba9 100644 --- a/build/scripts/layouts.gant +++ b/build/scripts/layouts.gant @@ -66,7 +66,8 @@ def layoutFull(String home, String targetDirectory, String patchedDescriptorDir "dom-impl", "execution-impl", "jsp-spi", - "idea-ui" + "idea-ui", + "external-system-impl" ].flatten() ant.patternset(id: "resources.included") { diff --git a/build/scripts/utils.gant b/build/scripts/utils.gant index 9200ecdc4b0b..19530671f1f1 100644 --- a/build/scripts/utils.gant +++ b/build/scripts/utils.gant @@ -276,8 +276,7 @@ binding.setVariable("platformImplementationModules", [ "spellchecker", "images", "RegExpSupport", - "dvcs", - "external-system-impl" + "dvcs" ]) binding.setVariable("layoutMacApp", { String path, String ch, Map args -> diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/project/ModuleData.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/project/ModuleData.java index d1467cab1d59..5ea0f8aef7d7 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/project/ModuleData.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/project/ModuleData.java @@ -19,14 +19,21 @@ public class ModuleData extends AbstractNamedData implements Named { @NotNull private final Map myCompileOutputPaths = ContainerUtilRt.newHashMap(); + @NotNull private final String myModuleTypeId; @NotNull private String myModuleFilePath; private boolean myInheritProjectCompileOutputPath = true; - public ModuleData(@NotNull ProjectSystemId owner, @NotNull String name, @NotNull String moduleFileDirectoryPath) { + public ModuleData(@NotNull ProjectSystemId owner, @NotNull String typeId, @NotNull String name, @NotNull String moduleFileDirectoryPath) { super(owner, name); + myModuleTypeId = typeId; setModuleFileDirectoryPath(moduleFileDirectoryPath); } + @NotNull + public String getModuleTypeId() { + return myModuleTypeId; + } + @NotNull public String getModuleFilePath() { return myModuleFilePath; @@ -65,7 +72,18 @@ public class ModuleData extends AbstractNamedData implements Named { myCompileOutputPaths.put(type, ExternalSystemApiUtil.toCanonicalPath(path)); } - + @Override + public int hashCode() { + return 31 * super.hashCode() + myModuleTypeId.hashCode(); + } + + @Override + public boolean equals(Object o) { + if (!super.equals(o)) { + return false; + } + return myModuleTypeId.equals(((ModuleData)o).myModuleTypeId); + } @Override public String toString() { diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemApiUtil.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemApiUtil.java index b7f3161c80d8..bb954b86e24b 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemApiUtil.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemApiUtil.java @@ -16,6 +16,7 @@ package com.intellij.openapi.externalSystem.util; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.PathManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.externalSystem.ExternalSystemManager; import com.intellij.openapi.externalSystem.model.DataNode; @@ -32,6 +33,7 @@ import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.BooleanFunction; import com.intellij.util.PathUtil; +import com.intellij.util.PathsList; import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; @@ -330,4 +332,22 @@ public class ExternalSystemApiUtil { UIUtil.invokeLaterIfNeeded(wrappedTask); } } + + /** + * Configures given classpath to reference target i18n bundle file(s). + * + * @param classPath process classpath + * @param bundlePath path to the target bundle file + * @param contextClass class from the same content root as the target bundle file + */ + public static void addBundle(@NotNull PathsList classPath, @NotNull String bundlePath, @NotNull Class contextClass) { + String pathToUse = bundlePath.replace('.', '/'); + if (!pathToUse.endsWith(".properties")) { + pathToUse += ".properties"; + } + if (!pathToUse.startsWith("/")) { + pathToUse = '/' + pathToUse; + } + classPath.add(PathManager.getResourceRoot(contextClass, pathToUse)); + } } diff --git a/platform/external-system-impl/external-system-impl.iml b/platform/external-system-impl/external-system-impl.iml index 019eb88f1c07..bbc5026dbb5d 100644 --- a/platform/external-system-impl/external-system-impl.iml +++ b/platform/external-system-impl/external-system-impl.iml @@ -10,7 +10,6 @@ - diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ExternalSystemFacadeManager.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ExternalSystemFacadeManager.java index 1e1b757bc791..b9b8b41325d4 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ExternalSystemFacadeManager.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ExternalSystemFacadeManager.java @@ -31,16 +31,15 @@ import com.intellij.openapi.externalSystem.service.remote.RemoteExternalSystemPr import com.intellij.openapi.externalSystem.service.remote.wrapper.ExternalSystemFacadeWrapper; import com.intellij.openapi.externalSystem.settings.ExternalSystemSettingsManager; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; -import com.intellij.openapi.externalSystem.util.ExternalSystemUtil; import com.intellij.openapi.externalSystem.util.IntegrationKey; import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.projectRoots.*; import com.intellij.openapi.roots.DependencyScope; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.ShutDownTracker; -import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.PsiBundle; import com.intellij.util.Alarm; import com.intellij.util.PathUtil; @@ -148,18 +147,18 @@ public class ExternalSystemFacadeManager { // IDE jars. classPath.addAll(PathManager.getUtilClassPath()); - ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(LanguageLevel.class), classPath); + ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(ProjectBundle.class), classPath); + ExternalSystemApiUtil.addBundle(params.getClassPath(), "messages.ProjectBundle", ProjectBundle.class); ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(PsiBundle.class), classPath); ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(Alarm.class), classPath); ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(DependencyScope.class), classPath); - ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(JavaSdkVersion.class), classPath); ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(ExtensionPointName.class), classPath); ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(OpenProjectFileChooserDescriptor.class), classPath); ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(ExternalSystemTaskNotificationListener.class), classPath); // External system module jars ContainerUtil.addIfNotNull(PathUtil.getJarPathForClass(getClass()), classPath); - ExternalSystemUtil.addBundle(params.getClassPath(), "messages.CommonBundle", CommonBundle.class); + ExternalSystemApiUtil.addBundle(params.getClassPath(), "messages.CommonBundle", CommonBundle.class); params.getClassPath().addAll(classPath); params.setMainClass(MAIN_CLASS_NAME); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/PlatformFacadeImpl.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/PlatformFacadeImpl.java index 206fb245995f..34aae4e025d4 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/PlatformFacadeImpl.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/PlatformFacadeImpl.java @@ -5,13 +5,11 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ContentEntry; -import com.intellij.openapi.roots.LanguageLevelProjectExtension; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderEntry; import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable; import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.pom.java.LanguageLevel; import org.jetbrains.annotations.NotNull; import java.util.*; diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDataService.java index 38187f9a0cfa..0df84815b4c1 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDataService.java @@ -12,7 +12,6 @@ import com.intellij.openapi.externalSystem.service.project.ProjectStructureHelpe import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.module.StdModuleTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.*; import com.intellij.openapi.vfs.LocalFileSystem; @@ -93,7 +92,8 @@ public class ModuleDataService implements ProjectDataService { } private void importModule(@NotNull ModuleManager moduleManager, @NotNull DataNode module) { - final Module created = moduleManager.newModule(module.getData().getModuleFilePath(), StdModuleTypes.JAVA.getId()); + ModuleData data = module.getData(); + final Module created = moduleManager.newModule(data.getModuleFilePath(), data.getModuleTypeId()); // Ensure that the dependencies are clear (used to be not clear when manually removing the module and importing it via gradle) ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(created); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportBuilder.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportBuilder.java index b8844bcbc3f1..464cd56b90fe 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportBuilder.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportBuilder.java @@ -25,8 +25,6 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; -import com.intellij.openapi.projectRoots.JavaSdk; -import com.intellij.openapi.projectRoots.SdkTypeId; import com.intellij.openapi.roots.ex.ProjectRootManagerEx; import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable; import com.intellij.openapi.roots.libraries.Library; @@ -315,11 +313,6 @@ public abstract class AbstractExternalProjectImportBuilder contextClass) { - String pathToUse = bundlePath.replace('.', '/'); - if (!pathToUse.endsWith(".properties")) { - pathToUse += ".properties"; - } - if (!pathToUse.startsWith("/")) { - pathToUse = '/' + pathToUse; - } - classPath.add(PathManager.getResourceRoot(contextClass, pathToUse)); - } - /** * {@link RemoteUtil#unwrap(Throwable) unwraps} given exception if possible and builds error message for it. * diff --git a/plugins/gradle/src/META-INF/plugin.xml b/plugins/gradle/src/META-INF/plugin.xml index 5be26a31ac3b..2000beeb443f 100644 --- a/plugins/gradle/src/META-INF/plugin.xml +++ b/plugins/gradle/src/META-INF/plugin.xml @@ -37,8 +37,6 @@ - - @@ -112,7 +110,6 @@ - @@ -122,33 +119,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java index 7aa890fe81fc..f7bd4be6ff5e 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java @@ -25,12 +25,17 @@ import com.intellij.openapi.externalSystem.build.ExternalSystemBuildManager; import com.intellij.openapi.externalSystem.model.ProjectSystemId; import com.intellij.openapi.externalSystem.service.project.ExternalSystemProjectResolver; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; -import com.intellij.openapi.externalSystem.util.ExternalSystemUtil; +import com.intellij.openapi.module.EmptyModuleType; +import com.intellij.openapi.module.JavaModuleType; +import com.intellij.openapi.module.ModuleType; +import com.intellij.openapi.module.StdModuleTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.NotNullLazyValue; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.pom.java.LanguageLevel; import com.intellij.util.Function; import com.intellij.util.PathUtil; +import com.intellij.util.PathsList; import com.intellij.util.containers.ContainerUtilRt; import org.gradle.tooling.ProjectConnection; import org.jetbrains.annotations.NotNull; @@ -152,8 +157,10 @@ public class GradleManager @Override public void enhanceParameters(@NotNull SimpleJavaParameters parameters) throws ExecutionException { + PathsList classPath = parameters.getClassPath(); + // Gradle i18n bundle. - ExternalSystemUtil.addBundle(parameters.getClassPath(), GradleBundle.PATH_TO_BUNDLE, GradleBundle.class); + ExternalSystemApiUtil.addBundle(classPath, GradleBundle.PATH_TO_BUNDLE, GradleBundle.class); // Gradle tool jars. String toolingApiPath = PathManager.getJarPathForClass(ProjectConnection.class); @@ -173,12 +180,18 @@ public class GradleManager throw new ExecutionException("Can't find gradle libraries at " + gradleJarsDir.getAbsolutePath()); } for (String jar : gradleJars) { - parameters.getClassPath().add(new File(gradleJarsDir, jar).getAbsolutePath()); + classPath.add(new File(gradleJarsDir, jar).getAbsolutePath()); } - - String path = PathUtil.getJarPathForClass(JavaProjectData.class); - if (!StringUtil.isEmpty(path)) { - parameters.getClassPath().add(path); + + List additionalEntries = ContainerUtilRt.newArrayList(); + ContainerUtilRt.addIfNotNull(additionalEntries, PathUtil.getJarPathForClass(JavaProjectData.class)); + ContainerUtilRt.addIfNotNull(additionalEntries, PathUtil.getJarPathForClass(LanguageLevel.class)); + ContainerUtilRt.addIfNotNull(additionalEntries, PathUtil.getJarPathForClass(StdModuleTypes.class)); + ContainerUtilRt.addIfNotNull(additionalEntries, PathUtil.getJarPathForClass(JavaModuleType.class)); + ContainerUtilRt.addIfNotNull(additionalEntries, PathUtil.getJarPathForClass(ModuleType.class)); + ContainerUtilRt.addIfNotNull(additionalEntries, PathUtil.getJarPathForClass(EmptyModuleType.class)); + for (String entry : additionalEntries) { + classPath.add(entry); } for (GradleProjectResolverExtension extension : RESOLVER_EXTENSIONS.getValue()) { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java index 354d5a298bb0..25d2dcd8e2b8 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java @@ -8,6 +8,7 @@ import com.intellij.openapi.externalSystem.model.project.*; import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId; import com.intellij.openapi.externalSystem.service.project.ExternalSystemProjectResolver; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; +import com.intellij.openapi.module.StdModuleTypes; import com.intellij.openapi.roots.DependencyScope; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; @@ -141,7 +142,9 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver, IdeaModule> previouslyParsedModule = result.get(moduleName); if (previouslyParsedModule != null) { throw new IllegalStateException( diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleProjectImportBuilder.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleProjectImportBuilder.java index d09f8cdafe07..c5faad8efcb6 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleProjectImportBuilder.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleProjectImportBuilder.java @@ -25,10 +25,7 @@ import com.intellij.openapi.externalSystem.settings.ExternalSystemSettingsManage import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; -import com.intellij.openapi.projectRoots.JavaSdk; -import com.intellij.openapi.projectRoots.JavaSdkVersion; -import com.intellij.openapi.projectRoots.ProjectJdkTable; -import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.projectRoots.*; import com.intellij.openapi.roots.LanguageLevelProjectExtension; import com.intellij.pom.java.LanguageLevel; import icons.GradleIcons; @@ -144,4 +141,9 @@ public class GradleProjectImportBuilder extends AbstractExternalProjectImportBui } return file; } + + @Override + public boolean isSuitableSdkType(SdkTypeId sdk) { + return sdk == JavaSdk.getInstance(); + } }