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 extends JpsArtifactPropertiesSerializer>> 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() {