From 446b4da83fa802053836bd43c28dd14cd79c66ff Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 31 Aug 2012 17:58:38 +0400 Subject: [PATCH] loading jps model from eclipse .classpath files: initial --- .idea/modules.xml | 1 + build/scripts/layouts.gant | 7 +++- .../JpsModelSerializerExtension.java | 6 ++++ .../model/serialization/JpsProjectLoader.java | 25 +++++++++++--- .../module/JpsModuleClasspathSerializer.java | 22 +++++++++++++ .../roots/impl/storage/ClasspathStorage.java | 5 +-- plugins/eclipse/eclipse.iml | 1 + .../eclipse/jps-plugin/eclipse-jps-plugin.iml | 15 +++++++++ ....serialization.JpsModelSerializerExtension | 1 + .../model/JpsEclipseClasspathSerializer.java | 22 +++++++++++++ .../JpsEclipseModelSerializerExtension.java | 33 +++++++++++++++++++ plugins/eclipse/resources/META-INF/plugin.xml | 1 + .../EclipseClasspathStorageProvider.java | 6 ++-- .../eclipse/config/EclipseModuleManager.java | 3 +- .../export/ExportEclipseProjectsAction.java | 8 ++--- .../importWizard/EclipseImportBuilder.java | 4 +-- 16 files changed, 142 insertions(+), 18 deletions(-) create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/module/JpsModuleClasspathSerializer.java create mode 100644 plugins/eclipse/jps-plugin/eclipse-jps-plugin.iml create mode 100644 plugins/eclipse/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension create mode 100644 plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathSerializer.java create mode 100644 plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseModelSerializerExtension.java diff --git a/.idea/modules.xml b/.idea/modules.xml index 25816dd77122..fa840d1d2f42 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -38,6 +38,7 @@ + diff --git a/build/scripts/layouts.gant b/build/scripts/layouts.gant index 246565ab3cf0..4110c931269f 100644 --- a/build/scripts/layouts.gant +++ b/build/scripts/layouts.gant @@ -204,7 +204,7 @@ def layoutFull(String home, String targetDirectory, String patchedDescriptorDir public def layoutCommunityPlugins(String home) { dir("plugins") { - def simplePlugins = ["commander", "copyright", "properties", "java-i18n", "eclipse", "hg4idea", "github", "ui-designer-new"] + def simplePlugins = ["commander", "copyright", "properties", "java-i18n", "hg4idea", "github", "ui-designer-new"] simplePlugins.each { layoutPlugin it @@ -364,6 +364,11 @@ public def layoutCommunityPlugins(String home) { } } } + layoutPlugin("eclipse") { + jar("eclipse-jps-plugin.jar") { + module("eclipse-jps-plugin") + } + } layoutPlugin("android") { fileset(dir: "${home}/plugins/android/lib") { diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java index ef9d3608ef77..acac4d181050 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java @@ -13,6 +13,7 @@ import org.jetbrains.jps.model.serialization.facet.JpsFacetConfigurationSerializ import org.jetbrains.jps.model.serialization.library.JpsLibraryPropertiesSerializer; import org.jetbrains.jps.model.serialization.library.JpsLibraryRootTypeSerializer; import org.jetbrains.jps.model.serialization.library.JpsSdkPropertiesSerializer; +import org.jetbrains.jps.model.serialization.module.JpsModuleClasspathSerializer; import org.jetbrains.jps.model.serialization.module.JpsModulePropertiesSerializer; import org.jetbrains.jps.service.JpsServiceManager; @@ -94,4 +95,9 @@ public abstract class JpsModelSerializerExtension { public List> getArtifactTypePropertiesSerializers() { return Collections.emptyList(); } + + @Nullable + public JpsModuleClasspathSerializer getClasspathSerializer() { + return null; + } } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java index 781fc2de332f..3c527e73d177 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java @@ -18,6 +18,7 @@ import org.jetbrains.jps.model.serialization.artifact.JpsArtifactSerializer; import org.jetbrains.jps.model.serialization.facet.JpsFacetSerializer; import org.jetbrains.jps.model.serialization.library.JpsLibraryTableSerializer; import org.jetbrains.jps.model.serialization.library.JpsSdkTableSerializer; +import org.jetbrains.jps.model.serialization.module.JpsModuleClasspathSerializer; import org.jetbrains.jps.model.serialization.module.JpsModulePropertiesSerializer; import org.jetbrains.jps.model.serialization.module.JpsModuleRootModelSerializer; import org.jetbrains.jps.service.SharedThreadPool; @@ -36,6 +37,8 @@ import java.util.concurrent.Future; */ public class JpsProjectLoader extends JpsLoaderBase { private static final BoundedTaskExecutor ourThreadPool = new BoundedTaskExecutor(SharedThreadPool.getInstance(), Runtime.getRuntime().availableProcessors()); + public static final String CLASSPATH_ATTRIBUTE = "classpath"; + public static final String CLASSPATH_DIR_ATTRIBUTE = "classpath-dir"; private final JpsProject myProject; private final Map myPathVariables; @@ -169,11 +172,23 @@ public class JpsProjectLoader extends JpsLoaderBase { final String typeId = moduleRoot.getAttributeValue("type"); final JpsModulePropertiesSerializer serializer = getModulePropertiesSerializer(typeId); final JpsModule module = createModule(name, moduleRoot, serializer); - JpsModuleRootModelSerializer - .loadRootModel(module, JDomSerializationUtil.findComponent(moduleRoot, "NewModuleRootManager"), projectSdkType); - final String moduleDirPath = file.getParent(); - JpsFacetSerializer.loadFacets(module, JDomSerializationUtil.findComponent(moduleRoot, "FacetManager"), - FileUtil.toSystemIndependentName(moduleDirPath)); + + String baseModulePath = FileUtil.toSystemIndependentName(file.getParent()); + String classpath = moduleRoot.getAttributeValue(CLASSPATH_ATTRIBUTE); + if (classpath == null) { + JpsModuleRootModelSerializer.loadRootModel(module, JDomSerializationUtil.findComponent(moduleRoot, "NewModuleRootManager"), + projectSdkType); + } + else { + for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) { + JpsModuleClasspathSerializer classpathSerializer = extension.getClasspathSerializer(); + if (classpathSerializer != null && classpathSerializer.getClasspathId().equals(classpath)) { + String classpathDir = moduleRoot.getAttributeValue(CLASSPATH_DIR_ATTRIBUTE); + classpathSerializer.loadClasspath(module, classpathDir, baseModulePath); + } + } + } + JpsFacetSerializer.loadFacets(module, JDomSerializationUtil.findComponent(moduleRoot, "FacetManager"), baseModulePath); return module; } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/module/JpsModuleClasspathSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/module/JpsModuleClasspathSerializer.java new file mode 100644 index 000000000000..06043ceb2877 --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/module/JpsModuleClasspathSerializer.java @@ -0,0 +1,22 @@ +package org.jetbrains.jps.model.serialization.module; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.module.JpsModule; + +/** + * @author nik + */ +public abstract class JpsModuleClasspathSerializer { + private final String myClasspathId; + + protected JpsModuleClasspathSerializer(String classpathId) { + myClasspathId = classpathId; + } + + public final String getClasspathId() { + return myClasspathId; + } + + public abstract void loadClasspath(@NotNull JpsModule module, @Nullable String classpathDir, @NotNull String baseModulePath); +} diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java index b3497c61fcf3..00b8097809fd 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/storage/ClasspathStorage.java @@ -50,6 +50,7 @@ import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.serialization.JpsProjectLoader; import java.io.File; import java.io.IOException; @@ -69,8 +70,8 @@ public class ClasspathStorage implements StateStorage { public static final String DEFAULT_STORAGE_DESCR = ProjectBundle.message("project.roots.classpath.format.default.descr"); - @NonNls public static final String CLASSPATH_OPTION = "classpath"; - @NonNls public static final String CLASSPATH_DIR_OPTION = "classpath-dir"; + @NonNls public static final String CLASSPATH_OPTION = JpsProjectLoader.CLASSPATH_ATTRIBUTE; + @NonNls public static final String CLASSPATH_DIR_OPTION = JpsProjectLoader.CLASSPATH_DIR_ATTRIBUTE; @NonNls private static final String COMPONENT_TAG = "component"; private Object mySession; diff --git a/plugins/eclipse/eclipse.iml b/plugins/eclipse/eclipse.iml index 729216b7c013..c6a1032d68e7 100644 --- a/plugins/eclipse/eclipse.iml +++ b/plugins/eclipse/eclipse.iml @@ -19,6 +19,7 @@ + diff --git a/plugins/eclipse/jps-plugin/eclipse-jps-plugin.iml b/plugins/eclipse/jps-plugin/eclipse-jps-plugin.iml new file mode 100644 index 000000000000..21ae1c1c5394 --- /dev/null +++ b/plugins/eclipse/jps-plugin/eclipse-jps-plugin.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/plugins/eclipse/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension b/plugins/eclipse/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension new file mode 100644 index 000000000000..eeebef91e18b --- /dev/null +++ b/plugins/eclipse/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension @@ -0,0 +1 @@ +org.jetbrains.jps.eclipse.model.JpsEclipseModelSerializerExtension \ No newline at end of file diff --git a/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathSerializer.java b/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathSerializer.java new file mode 100644 index 000000000000..1b923f8a5b59 --- /dev/null +++ b/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseClasspathSerializer.java @@ -0,0 +1,22 @@ +package org.jetbrains.jps.eclipse.model; + +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.module.JpsModule; +import org.jetbrains.jps.model.serialization.module.JpsModuleClasspathSerializer; + +/** + * @author nik + */ +public class JpsEclipseClasspathSerializer extends JpsModuleClasspathSerializer { + @NonNls public static final String CLASSPATH_STORAGE_ID = "eclipse"; + + public JpsEclipseClasspathSerializer() { + super(CLASSPATH_STORAGE_ID); + } + + @Override + public void loadClasspath(@NotNull JpsModule module, @Nullable String classpathDir, @NotNull String baseModulePath) { + } +} diff --git a/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseModelSerializerExtension.java b/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseModelSerializerExtension.java new file mode 100644 index 000000000000..d42eeb35bca9 --- /dev/null +++ b/plugins/eclipse/jps-plugin/src/org/jetbrains/jps/eclipse/model/JpsEclipseModelSerializerExtension.java @@ -0,0 +1,33 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.jps.eclipse.model; + +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension; +import org.jetbrains.jps.model.serialization.module.JpsModuleClasspathSerializer; + +/** + * @author nik + */ +public class JpsEclipseModelSerializerExtension extends JpsModelSerializerExtension { + private static final JpsEclipseClasspathSerializer CLASSPATH_SERIALIZER = new JpsEclipseClasspathSerializer(); + + @Nullable + @Override + public JpsModuleClasspathSerializer getClasspathSerializer() { + return CLASSPATH_SERIALIZER; + } +} diff --git a/plugins/eclipse/resources/META-INF/plugin.xml b/plugins/eclipse/resources/META-INF/plugin.xml index 834bc4c6d9d9..690735156dc2 100644 --- a/plugins/eclipse/resources/META-INF/plugin.xml +++ b/plugins/eclipse/resources/META-INF/plugin.xml @@ -6,6 +6,7 @@ JetBrains s.r.o. + diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java index eff535917510..6b4b5d8697f4 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseClasspathStorageProvider.java @@ -39,6 +39,7 @@ import org.jetbrains.idea.eclipse.EclipseBundle; import org.jetbrains.idea.eclipse.EclipseXml; import org.jetbrains.idea.eclipse.IdeaXml; import org.jetbrains.idea.eclipse.conversion.*; +import org.jetbrains.jps.eclipse.model.JpsEclipseClasspathSerializer; import java.io.File; import java.io.IOException; @@ -50,12 +51,11 @@ import java.util.Set; * @author Vladislav.Kaznacheev */ public class EclipseClasspathStorageProvider implements ClasspathStorageProvider { - @NonNls public static final String ID = "eclipse"; public static final String DESCR = EclipseBundle.message("eclipse.classpath.storage.description"); @NonNls public String getID() { - return ID; + return JpsEclipseClasspathSerializer.CLASSPATH_STORAGE_ID; } @Nls @@ -144,7 +144,7 @@ public class EclipseClasspathStorageProvider implements ClasspathStorageProvider } public void moduleRenamed(final Module module, String newName) { - if (ClasspathStorage.getStorageType(module).equals(ID)) { + if (ClasspathStorage.getStorageType(module).equals(JpsEclipseClasspathSerializer.CLASSPATH_STORAGE_ID)) { try { final CachedXmlDocumentSet documentSet = getFileCache(module); diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java index da5f40a100e3..69b6268935e8 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/EclipseModuleManager.java @@ -25,6 +25,7 @@ import com.intellij.openapi.roots.impl.storage.ClasspathStorage; import com.intellij.openapi.util.text.StringUtil; import org.jdom.Element; import org.jetbrains.annotations.NonNls; +import org.jetbrains.jps.eclipse.model.JpsEclipseClasspathSerializer; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -154,7 +155,7 @@ public class EclipseModuleManager implements PersistentStateComponent{ } public Element getState() { - if (!ClasspathStorage.getStorageType(myModule).equals(EclipseClasspathStorageProvider.ID)) { + if (!ClasspathStorage.getStorageType(myModule).equals(JpsEclipseClasspathSerializer.CLASSPATH_STORAGE_ID)) { if (!myEclipseUrls.isEmpty() || !myEclipseVariablePaths.isEmpty() || myForceConfigureJDK || !myUnknownCons.isEmpty()) { Element root = new Element("EclipseModuleSettings"); for (String eclipseUrl : myEclipseUrls) { diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/export/ExportEclipseProjectsAction.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/export/ExportEclipseProjectsAction.java index 58b879143bba..fc209b91ad09 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/export/ExportEclipseProjectsAction.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/export/ExportEclipseProjectsAction.java @@ -40,8 +40,8 @@ import org.jdom.output.EclipseJDOMUtil; import org.jetbrains.idea.eclipse.EclipseBundle; import org.jetbrains.idea.eclipse.EclipseXml; import org.jetbrains.idea.eclipse.IdeaXml; -import org.jetbrains.idea.eclipse.config.EclipseClasspathStorageProvider; import org.jetbrains.idea.eclipse.conversion.*; +import org.jetbrains.jps.eclipse.model.JpsEclipseClasspathSerializer; import java.io.File; import java.io.IOException; @@ -64,9 +64,9 @@ public class ExportEclipseProjectsAction extends AnAction implements DumbAware { final List modules = new ArrayList(); final List incompatibleModules = new ArrayList(); for (Module module : ModuleManager.getInstance(project).getModules()) { - if (!EclipseClasspathStorageProvider.ID.equals(ClasspathStorage.getStorageType(module))) { + if (!JpsEclipseClasspathSerializer.CLASSPATH_STORAGE_ID.equals(ClasspathStorage.getStorageType(module))) { try { - ClasspathStorage.getProvider(EclipseClasspathStorageProvider.ID).assertCompatible(ModuleRootManager.getInstance(module)); + ClasspathStorage.getProvider(JpsEclipseClasspathSerializer.CLASSPATH_STORAGE_ID).assertCompatible(ModuleRootManager.getInstance(module)); modules.add(module); } catch (ConfigurationException e1) { @@ -100,7 +100,7 @@ public class ExportEclipseProjectsAction extends AnAction implements DumbAware { if (dialog.isOK()) { if (dialog.isLink()) { for (Module module : dialog.getSelectedModules()) { - ClasspathStorage.setStorageType(ModuleRootManager.getInstance(module), EclipseClasspathStorageProvider.ID); + ClasspathStorage.setStorageType(ModuleRootManager.getInstance(module), JpsEclipseClasspathSerializer.CLASSPATH_STORAGE_ID); } } else { diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java index 0812ac755980..ba06f643a514 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/importWizard/EclipseImportBuilder.java @@ -58,9 +58,9 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.eclipse.EclipseBundle; import org.jetbrains.idea.eclipse.EclipseXml; import org.jetbrains.idea.eclipse.IdeaXml; -import org.jetbrains.idea.eclipse.config.EclipseClasspathStorageProvider; import org.jetbrains.idea.eclipse.conversion.EclipseClasspathReader; import org.jetbrains.idea.eclipse.conversion.EclipseUserLibrariesHelper; +import org.jetbrains.jps.eclipse.model.JpsEclipseClasspathSerializer; import javax.swing.*; import java.io.File; @@ -280,7 +280,7 @@ public class EclipseImportBuilder extends ProjectImportBuilder implement EclipseClasspathReader.setupOutput(rootModel, path + "/bin"); } ClasspathStorage.setStorageType(rootModel, - getParameters().linkConverted ? EclipseClasspathStorageProvider.ID : ClasspathStorage.DEFAULT_STORAGE); + getParameters().linkConverted ? JpsEclipseClasspathSerializer.CLASSPATH_STORAGE_ID : ClasspathStorage.DEFAULT_STORAGE); if (model != null) { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() {