diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java
index 34d856f83505..91ef7fb1d41b 100644
--- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java
@@ -38,8 +38,8 @@ import org.jetbrains.jps.model.library.JpsOrderRootType;
import org.jetbrains.jps.model.library.JpsSdkProperties;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.model.serialization.JpsProjectLoader;
-import org.jetbrains.jps.model.serialization.JpsSdkPropertiesLoader;
-import org.jetbrains.jps.model.serialization.JpsSdkTableLoader;
+import org.jetbrains.jps.model.serialization.JpsSdkPropertiesSerializer;
+import org.jetbrains.jps.model.serialization.JpsSdkTableSerializer;
import java.io.*;
import java.util.*;
@@ -536,7 +536,7 @@ final class BuildSession implements Runnable, CanceledStatus {
JpsLibrary jpsLibrary = null;
if (library instanceof SdkLibrary) {
final SdkLibrary sdkLibrary = (SdkLibrary)library;
- final JpsSdkPropertiesLoader> loader = JpsSdkTableLoader.getSdkPropertiesLoader(sdkLibrary.getTypeName());
+ final JpsSdkPropertiesSerializer> loader = JpsSdkTableSerializer.getSdkPropertiesSerializer(sdkLibrary.getTypeName());
if (loader != null) {
jpsLibrary = addLibrary(model, sdkLibrary, loader);
}
@@ -567,7 +567,7 @@ final class BuildSession implements Runnable, CanceledStatus {
}
}
- private static
JpsLibrary addLibrary(JpsModel model, SdkLibrary sdkLibrary, JpsSdkPropertiesLoader
loader) {
+ private static
JpsLibrary addLibrary(JpsModel model, SdkLibrary sdkLibrary, JpsSdkPropertiesSerializer
loader) {
try {
final String xml = sdkLibrary.getAdditionalDataXml();
final Element element = xml != null ? JDOMUtil.loadDocument(xml).getRootElement() : null;
diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java b/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java
index 90edf77a03e1..6609a760c49e 100644
--- a/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java
+++ b/jps/model-api/src/org/jetbrains/jps/model/java/JpsJavaExtensionService.java
@@ -33,10 +33,10 @@ public abstract class JpsJavaExtensionService {
@NotNull
public abstract JpsJavaProjectExtension getOrCreateProjectExtension(@NotNull JpsProject project);
-
@Nullable
public abstract JpsJavaProjectExtension getProjectExtension(@NotNull JpsProject project);
+
@NotNull
public abstract JpsJavaModuleExtension getOrCreateModuleExtension(@NotNull JpsModule module);
@@ -49,6 +49,9 @@ public abstract class JpsJavaExtensionService {
@Nullable
public abstract JpsJavaDependencyExtension getDependencyExtension(@NotNull JpsDependencyElement dependency);
+ @Nullable
+ public abstract ExplodedDirectoryModuleExtension getExplodedDirectoryExtension(@NotNull JpsModule module);
+
@NotNull
public abstract ExplodedDirectoryModuleExtension getOrCreateExplodedDirectoryExtension(@NotNull JpsModule module);
diff --git a/jps/model-api/src/org/jetbrains/jps/model/library/JpsTypedLibrary.java b/jps/model-api/src/org/jetbrains/jps/model/library/JpsTypedLibrary.java
index 9b9c6a31401e..aaf0a54997db 100644
--- a/jps/model-api/src/org/jetbrains/jps/model/library/JpsTypedLibrary.java
+++ b/jps/model-api/src/org/jetbrains/jps/model/library/JpsTypedLibrary.java
@@ -7,6 +7,10 @@ import org.jetbrains.jps.model.JpsElementProperties;
* @author nik
*/
public interface JpsTypedLibrary
extends JpsLibrary {
+ @NotNull
+ @Override
+ JpsLibraryType
getType();
+
@NotNull
P getProperties();
}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementChildRoleBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementChildRoleBase.java
index cf1bbcc0200a..9ed14bf64214 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementChildRoleBase.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementChildRoleBase.java
@@ -9,7 +9,7 @@ import org.jetbrains.jps.model.JpsElementChildRole;
public class JpsElementChildRoleBase extends JpsElementChildRole {
private String myDebugName;
- protected JpsElementChildRoleBase(String debugName) {
+ public JpsElementChildRoleBase(String debugName) {
myDebugName = debugName;
}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/ExplodedDirectoryModuleExtensionImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/ExplodedDirectoryModuleExtensionImpl.java
index e286862122fd..584f2fc2a731 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/ExplodedDirectoryModuleExtensionImpl.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/ExplodedDirectoryModuleExtensionImpl.java
@@ -2,6 +2,7 @@ package org.jetbrains.jps.model.java.impl;
import com.intellij.openapi.util.Comparing;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.JpsElementCreator;
import org.jetbrains.jps.model.impl.JpsElementBase;
import org.jetbrains.jps.model.impl.JpsElementChildRoleBase;
import org.jetbrains.jps.model.java.ExplodedDirectoryModuleExtension;
@@ -11,8 +12,6 @@ import org.jetbrains.jps.model.java.ExplodedDirectoryModuleExtension;
*/
public class ExplodedDirectoryModuleExtensionImpl extends JpsElementBase implements
ExplodedDirectoryModuleExtension {
- public static final JpsElementChildRoleBase ROLE = JpsElementChildRoleBase.create("exploded directory");
-
private String myExplodedUrl;
private boolean myExcludeExploded;
@@ -61,4 +60,18 @@ public class ExplodedDirectoryModuleExtensionImpl extends JpsElementBase implements JpsElementCreator {
+ public static final ExplodedDirectoryModuleExtensionRole INSTANCE = new ExplodedDirectoryModuleExtensionRole();
+
+ public ExplodedDirectoryModuleExtensionRole() {
+ super("exploded directory");
+ }
+
+ @NotNull
+ @Override
+ public ExplodedDirectoryModuleExtension create() {
+ return new ExplodedDirectoryModuleExtensionImpl();
+ }
+ }
}
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java
index b81be860a14b..67eeff8c932b 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/java/impl/JpsJavaExtensionServiceImpl.java
@@ -56,11 +56,13 @@ public class JpsJavaExtensionServiceImpl extends JpsJavaExtensionService {
@Override
@NotNull
public ExplodedDirectoryModuleExtension getOrCreateExplodedDirectoryExtension(@NotNull JpsModule module) {
- ExplodedDirectoryModuleExtension extension = module.getContainer().getChild(ExplodedDirectoryModuleExtensionImpl.ROLE);
- if (extension == null) {
- extension = module.getContainer().setChild(ExplodedDirectoryModuleExtensionImpl.ROLE, new ExplodedDirectoryModuleExtensionImpl());
- }
- return extension;
+ return module.getContainer().getOrSetChild(ExplodedDirectoryModuleExtensionImpl.ExplodedDirectoryModuleExtensionRole.INSTANCE);
+ }
+
+ @Override
+ @Nullable
+ public ExplodedDirectoryModuleExtension getExplodedDirectoryExtension(@NotNull JpsModule module) {
+ return module.getContainer().getChild(ExplodedDirectoryModuleExtensionImpl.ExplodedDirectoryModuleExtensionRole.INSTANCE);
}
@NotNull
diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java
index 775a88f9fb2a..de0ed22c42ff 100644
--- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java
+++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java
@@ -30,8 +30,8 @@ public class JpsLibraryImpl extends JpsNamedComp
@Override
@NotNull
- public JpsLibraryType> getType() {
- return myContainer.getChild(TYPED_DATA_ROLE).getType();
+ public JpsLibraryType
getType() {
+ return (JpsLibraryType
)myContainer.getChild(TYPED_DATA_ROLE).getType();
}
@NotNull
diff --git a/jps/model-serialization/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelLoaderExtension b/jps/model-serialization/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelLoaderExtension
deleted file mode 100644
index 4a1c8009b1c3..000000000000
--- a/jps/model-serialization/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelLoaderExtension
+++ /dev/null
@@ -1 +0,0 @@
-org.jetbrains.jps.model.serialization.java.JpsJavaModelLoaderExtension
\ No newline at end of file
diff --git a/jps/model-serialization/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension b/jps/model-serialization/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension
new file mode 100644
index 000000000000..4d4aa951bdfb
--- /dev/null
+++ b/jps/model-serialization/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension
@@ -0,0 +1 @@
+org.jetbrains.jps.model.serialization.java.JpsJavaModelSerializerExtension
\ No newline at end of file
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementPropertiesLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementPropertiesSerializer.java
similarity index 67%
rename from jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementPropertiesLoader.java
rename to jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementPropertiesSerializer.java
index 0fcbf4e1ce3a..02142809d724 100644
--- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementPropertiesLoader.java
+++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementPropertiesSerializer.java
@@ -6,11 +6,11 @@ import org.jetbrains.jps.model.JpsElementType;
/**
* @author nik
*/
-public abstract class JpsElementPropertiesLoader
> {
+public abstract class JpsElementPropertiesSerializer
> {
private final String myTypeId;
private final Type myType;
- public JpsElementPropertiesLoader(Type type, String typeId) {
+ public JpsElementPropertiesSerializer(Type type, String typeId) {
myType = type;
myTypeId = typeId;
}
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java
index 1d4049e7140d..3782c4e2fb4a 100644
--- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java
+++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsGlobalLoader.java
@@ -32,11 +32,11 @@ public class JpsGlobalLoader extends JpsLoaderBase {
private void loadSdks(File optionsDir) {
final Element root = loadRootElement(new File(optionsDir, "jdk.table.xml"));
- JpsSdkTableLoader.loadSdks(findComponent(root, "ProjectJdkTable"), myGlobal.getLibraryCollection());
+ JpsSdkTableSerializer.loadSdks(findComponent(root, "ProjectJdkTable"), myGlobal.getLibraryCollection());
}
private void loadGlobalLibraries(File optionsDir) {
final Element root = loadRootElement(new File(optionsDir, "applicationLibraries.xml"));
- JpsLibraryTableLoader.loadLibraries(findComponent(root, "libraryTable"), myGlobal.getLibraryCollection());
+ JpsLibraryTableSerializer.loadLibraries(findComponent(root, "libraryTable"), myGlobal.getLibraryCollection());
}
}
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryPropertiesLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryPropertiesLoader.java
deleted file mode 100644
index 79a083efee85..000000000000
--- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryPropertiesLoader.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.jetbrains.jps.model.serialization;
-
-import org.jdom.Element;
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.jps.model.JpsElementProperties;
-import org.jetbrains.jps.model.library.JpsLibraryType;
-
-/**
- * @author nik
- */
-public abstract class JpsLibraryPropertiesLoader
extends JpsElementPropertiesLoader
> {
- public JpsLibraryPropertiesLoader(JpsLibraryType
type, String typeId) {
- super(type, typeId);
- }
-
- public abstract P loadProperties(@Nullable Element propertiesElement);
-}
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryPropertiesSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryPropertiesSerializer.java
new file mode 100644
index 000000000000..f60fe46aba71
--- /dev/null
+++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryPropertiesSerializer.java
@@ -0,0 +1,20 @@
+package org.jetbrains.jps.model.serialization;
+
+import org.jdom.Element;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.JpsElementProperties;
+import org.jetbrains.jps.model.library.JpsLibraryType;
+
+/**
+ * @author nik
+ */
+public abstract class JpsLibraryPropertiesSerializer
extends
+ JpsElementPropertiesSerializer
> {
+ public JpsLibraryPropertiesSerializer(JpsLibraryType
type, String typeId) {
+ super(type, typeId);
+ }
+
+ public abstract P loadProperties(@Nullable Element propertiesElement);
+
+ public abstract void saveProperties(P properties, Element element);
+}
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryRootTypeSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryRootTypeSerializer.java
new file mode 100644
index 000000000000..04de078d4ded
--- /dev/null
+++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryRootTypeSerializer.java
@@ -0,0 +1,36 @@
+package org.jetbrains.jps.model.serialization;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.library.JpsOrderRootType;
+
+/**
+ * @author nik
+ */
+public class JpsLibraryRootTypeSerializer implements Comparable {
+ private String myTypeId;
+ private JpsOrderRootType myType;
+ private boolean myWriteIfEmpty;
+
+ public JpsLibraryRootTypeSerializer(@NotNull String typeId, @NotNull JpsOrderRootType type, boolean writeIfEmpty) {
+ myTypeId = typeId;
+ myType = type;
+ myWriteIfEmpty = writeIfEmpty;
+ }
+
+ public boolean isWriteIfEmpty() {
+ return myWriteIfEmpty;
+ }
+
+ public String getTypeId() {
+ return myTypeId;
+ }
+
+ public JpsOrderRootType getType() {
+ return myType;
+ }
+
+ @Override
+ public int compareTo(JpsLibraryRootTypeSerializer o) {
+ return myTypeId.compareTo(o.myTypeId);
+ }
+}
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableLoader.java
deleted file mode 100644
index 1b65cbce8868..000000000000
--- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableLoader.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.jetbrains.jps.model.serialization;
-
-import com.intellij.openapi.util.JDOMUtil;
-import com.intellij.util.containers.MultiMap;
-import org.jdom.Element;
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.jps.model.DummyJpsElementProperties;
-import org.jetbrains.jps.model.JpsElementFactory;
-import org.jetbrains.jps.model.JpsElementProperties;
-import org.jetbrains.jps.model.java.JpsJavaLibraryType;
-import org.jetbrains.jps.model.library.*;
-import org.jetbrains.jps.service.JpsServiceManager;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author nik
- */
-public class JpsLibraryTableLoader {
- private static final Map PREDEFINED_ROOT_TYPES = new HashMap();
-
- static {
- PREDEFINED_ROOT_TYPES.put("CLASSES", JpsOrderRootType.COMPILED);
- PREDEFINED_ROOT_TYPES.put("SOURCES", JpsOrderRootType.SOURCES);
- }
-
- public static void loadLibraries(Element libraryTableElement, JpsLibraryCollection result) {
- for (Element libraryElement : JDOMUtil.getChildren(libraryTableElement, "library")) {
- result.addLibrary(loadLibrary(libraryElement));
- }
- }
-
- public static JpsLibrary loadLibrary(Element libraryElement) {
- return loadLibrary(libraryElement, libraryElement.getAttributeValue("name"));
- }
-
- public static JpsLibrary loadLibrary(Element libraryElement, String name) {
- String typeId = libraryElement.getAttributeValue("type");
- final JpsLibraryPropertiesLoader> loader = getLibraryPropertiesLoader(typeId);
- JpsLibrary library = createLibrary(name, loader, libraryElement.getChild("properties"));
-
- MultiMap jarDirectories = new MultiMap();
- MultiMap recursiveJarDirectories = new MultiMap();
- for (Element jarDirectory : JDOMUtil.getChildren(libraryElement, "jarDirectory")) {
- String url = jarDirectory.getAttributeValue("url");
- String rootTypeId = jarDirectory.getAttributeValue("type");
- final JpsOrderRootType rootType = rootTypeId != null ? getRootType(rootTypeId) : JpsOrderRootType.COMPILED;
- boolean recursive = Boolean.parseBoolean(jarDirectory.getAttributeValue("recursive"));
- jarDirectories.putValue(rootType, url);
- if (recursive) {
- recursiveJarDirectories.putValue(rootType, url);
- }
- }
- for (Element rootsElement : JDOMUtil.getChildren(libraryElement)) {
- final String rootTypeId = rootsElement.getName();
- if (!rootTypeId.equals("jarDirectory")) {
- final JpsOrderRootType rootType = getRootType(rootTypeId);
- for (Element rootElement : JDOMUtil.getChildren(rootsElement, "root")) {
- String url = rootElement.getAttributeValue("url");
- JpsLibraryRoot.InclusionOptions options;
- if (jarDirectories.get(rootType).contains(url)) {
- final boolean recursive = recursiveJarDirectories.get(rootType).contains(url);
- options = recursive ? JpsLibraryRoot.InclusionOptions.ARCHIVES_UNDER_ROOT_RECURSIVELY : JpsLibraryRoot.InclusionOptions.ARCHIVES_UNDER_ROOT;
- }
- else {
- options = JpsLibraryRoot.InclusionOptions.ROOT_ITSELF;
- }
- library.addRoot(url, rootType, options);
- }
- }
- }
- return library;
- }
-
- private static JpsLibrary createLibrary(String name, JpsLibraryPropertiesLoader
loader,
- final Element propertiesElement) {
- return JpsElementFactory.getInstance().createLibrary(name, loader.getType(), loader.loadProperties(propertiesElement));
- }
-
- private static JpsOrderRootType getRootType(String rootTypeId) {
- final JpsOrderRootType type = PREDEFINED_ROOT_TYPES.get(rootTypeId);
- if (type != null) {
- return type;
- }
- for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) {
- final JpsOrderRootType rootType = extension.getRootType(rootTypeId);
- if (rootType != null) {
- return rootType;
- }
- }
- return JpsOrderRootType.COMPILED;
- }
-
- private static JpsLibraryPropertiesLoader> getLibraryPropertiesLoader(@Nullable String typeId) {
- if (typeId != null) {
- for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) {
- for (JpsLibraryPropertiesLoader> loader : extension.getLibraryPropertiesLoaders()) {
- if (loader.getTypeId().equals(typeId)) {
- return loader;
- }
- }
- }
- }
- return new JpsLibraryPropertiesLoader(JpsJavaLibraryType.INSTANCE, null) {
- @Override
- public DummyJpsElementProperties loadProperties(@Nullable Element propertiesElement) {
- return DummyJpsElementProperties.INSTANCE;
- }
- };
- }
-}
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableSerializer.java
new file mode 100644
index 000000000000..a16a04fc3f17
--- /dev/null
+++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableSerializer.java
@@ -0,0 +1,210 @@
+package org.jetbrains.jps.model.serialization;
+
+import com.intellij.openapi.util.JDOMUtil;
+import com.intellij.util.containers.MultiMap;
+import org.jdom.Element;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.DummyJpsElementProperties;
+import org.jetbrains.jps.model.JpsElementFactory;
+import org.jetbrains.jps.model.JpsElementProperties;
+import org.jetbrains.jps.model.java.JpsJavaLibraryType;
+import org.jetbrains.jps.model.library.*;
+
+import java.util.*;
+
+/**
+ * @author nik
+ */
+public class JpsLibraryTableSerializer {
+ private static final JpsLibraryRootTypeSerializer[] PREDEFINED_ROOT_TYPES_SERIALIZERS = {
+ new JpsLibraryRootTypeSerializer("CLASSES", JpsOrderRootType.COMPILED, true),
+ new JpsLibraryRootTypeSerializer("SOURCES", JpsOrderRootType.SOURCES, true)
+ };
+ private static final String NAME_ATTRIBUTE = "name";
+ private static final String TYPE_ATTRIBUTE = "type";
+ private static final String PROPERTIES_TAG = "properties";
+ private static final String JAR_DIRECTORY_TAG = "jarDirectory";
+ private static final String URL_ATTRIBUTE = "url";
+ private static final String ROOT_TAG = "root";
+ private static final String RECURSIVE_ATTRIBUTE = "recursive";
+ private static final String LIBRARY_TAG = "library";
+ private static final JpsLibraryPropertiesSerializer JAVA_LIBRARY_PROPERTIES_SERIALIZER =
+ new JpsLibraryPropertiesSerializer(JpsJavaLibraryType.INSTANCE, null) {
+ @Override
+ public DummyJpsElementProperties loadProperties(@Nullable Element propertiesElement) {
+ return DummyJpsElementProperties.INSTANCE;
+ }
+
+ @Override
+ public void saveProperties(DummyJpsElementProperties properties, Element element) {
+ }
+ };
+
+ public static void loadLibraries(Element libraryTableElement, JpsLibraryCollection result) {
+ for (Element libraryElement : JDOMUtil.getChildren(libraryTableElement, LIBRARY_TAG)) {
+ result.addLibrary(loadLibrary(libraryElement));
+ }
+ }
+
+ public static void saveLibraries(JpsLibraryCollection libraryCollection, Element libraryTableElement) {
+ List libraries = new ArrayList();
+ for (JpsLibrary library : libraryCollection.getLibraries()) {
+ if (!(library.getType() instanceof JpsSdkType>)) {
+ libraries.add(library);
+ }
+ }
+
+ Collections.sort(libraries, new Comparator() {
+ @Override
+ public int compare(JpsLibrary o1, JpsLibrary o2) {
+ return o1.getName().compareToIgnoreCase(o2.getName());
+ }
+ });
+
+ for (JpsLibrary library : libraries) {
+ Element libraryTag = new Element(LIBRARY_TAG);
+ saveLibrary(library, libraryTag, library.getName());
+ libraryTableElement.addContent(libraryTag);
+ }
+ }
+
+ public static JpsLibrary loadLibrary(Element libraryElement) {
+ return loadLibrary(libraryElement, libraryElement.getAttributeValue(NAME_ATTRIBUTE));
+ }
+
+ public static JpsLibrary loadLibrary(Element libraryElement, String name) {
+ String typeId = libraryElement.getAttributeValue(TYPE_ATTRIBUTE);
+ final JpsLibraryPropertiesSerializer> loader = getLibraryPropertiesSerializer(typeId);
+ JpsLibrary library = createLibrary(name, loader, libraryElement.getChild(PROPERTIES_TAG));
+
+ MultiMap jarDirectories = new MultiMap();
+ MultiMap recursiveJarDirectories = new MultiMap();
+ for (Element jarDirectory : JDOMUtil.getChildren(libraryElement, JAR_DIRECTORY_TAG)) {
+ String url = jarDirectory.getAttributeValue(URL_ATTRIBUTE);
+ String rootTypeId = jarDirectory.getAttributeValue(TYPE_ATTRIBUTE);
+ final JpsOrderRootType rootType = rootTypeId != null ? getRootType(rootTypeId) : JpsOrderRootType.COMPILED;
+ boolean recursive = Boolean.parseBoolean(jarDirectory.getAttributeValue(RECURSIVE_ATTRIBUTE));
+ jarDirectories.putValue(rootType, url);
+ if (recursive) {
+ recursiveJarDirectories.putValue(rootType, url);
+ }
+ }
+ for (Element rootsElement : JDOMUtil.getChildren(libraryElement)) {
+ final String rootTypeId = rootsElement.getName();
+ if (!rootTypeId.equals(JAR_DIRECTORY_TAG)) {
+ final JpsOrderRootType rootType = getRootType(rootTypeId);
+ for (Element rootElement : JDOMUtil.getChildren(rootsElement, ROOT_TAG)) {
+ String url = rootElement.getAttributeValue(URL_ATTRIBUTE);
+ JpsLibraryRoot.InclusionOptions options;
+ if (jarDirectories.get(rootType).contains(url)) {
+ final boolean recursive = recursiveJarDirectories.get(rootType).contains(url);
+ options = recursive ? JpsLibraryRoot.InclusionOptions.ARCHIVES_UNDER_ROOT_RECURSIVELY : JpsLibraryRoot.InclusionOptions.ARCHIVES_UNDER_ROOT;
+ }
+ else {
+ options = JpsLibraryRoot.InclusionOptions.ROOT_ITSELF;
+ }
+ library.addRoot(url, rootType, options);
+ }
+ }
+ }
+ return library;
+ }
+
+ public static void saveLibrary(JpsLibrary library, Element libraryElement, final String libraryName) {
+ if (libraryName != null) {
+ libraryElement.setAttribute(NAME_ATTRIBUTE, libraryName);
+ }
+ saveProperties((JpsTypedLibrary extends JpsElementProperties>)library, libraryElement);
+ List jarDirectoryElements = new ArrayList();
+ for (JpsLibraryRootTypeSerializer serializer : getSortedSerializers()) {
+ List roots = library.getRoots(serializer.getType());
+ if (roots.isEmpty() && !serializer.isWriteIfEmpty()) continue;
+
+ Element typeElement = new Element(serializer.getTypeId());
+ for (JpsLibraryRoot root : roots) {
+ typeElement.addContent(new Element(ROOT_TAG).setAttribute(URL_ATTRIBUTE, root.getUrl()));
+ if (root.getInclusionOptions() != JpsLibraryRoot.InclusionOptions.ROOT_ITSELF) {
+ Element jarDirectoryElement = new Element(JAR_DIRECTORY_TAG).setAttribute(URL_ATTRIBUTE, root.getUrl());
+ boolean recursive = root.getInclusionOptions() == JpsLibraryRoot.InclusionOptions.ARCHIVES_UNDER_ROOT_RECURSIVELY;
+ jarDirectoryElement.setAttribute(RECURSIVE_ATTRIBUTE, Boolean.toString(recursive));
+ if (!serializer.getType().equals(JpsOrderRootType.COMPILED)) {
+ jarDirectoryElement.setAttribute(TYPE_ATTRIBUTE, serializer.getTypeId());
+ }
+ jarDirectoryElements.add(jarDirectoryElement);
+ }
+ }
+ libraryElement.addContent(typeElement);
+ }
+ libraryElement.addContent(jarDirectoryElements);
+ }
+
+ private static void saveProperties(JpsTypedLibrary
library, Element libraryElement) {
+ JpsLibraryType
type = library.getType();
+ if (!type.equals(JpsJavaLibraryType.INSTANCE)) {
+ JpsLibraryPropertiesSerializer
serializer = getLibraryPropertiesSerializer(type);
+ libraryElement.setAttribute(TYPE_ATTRIBUTE, serializer.getTypeId());
+ Element element = new Element(PROPERTIES_TAG);
+ serializer.saveProperties(library.getProperties(), element);
+ if (!element.getContent().isEmpty() || !element.getAttributes().isEmpty()) {
+ libraryElement.addContent(element);
+ }
+ }
+ }
+
+ private static
JpsLibrary createLibrary(String name, JpsLibraryPropertiesSerializer
loader,
+ final Element propertiesElement) {
+ return JpsElementFactory.getInstance().createLibrary(name, loader.getType(), loader.loadProperties(propertiesElement));
+ }
+
+ private static JpsOrderRootType getRootType(String rootTypeId) {
+ for (JpsLibraryRootTypeSerializer serializer : PREDEFINED_ROOT_TYPES_SERIALIZERS) {
+ if (serializer.getTypeId().equals(rootTypeId)) {
+ return serializer.getType();
+ }
+ }
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ for (JpsLibraryRootTypeSerializer serializer : extension.getLibraryRootTypeSerializers()) {
+ if (serializer.getTypeId().equals(rootTypeId)) {
+ return serializer.getType();
+ }
+ }
+ }
+ return JpsOrderRootType.COMPILED;
+ }
+
+ private static Collection getSortedSerializers() {
+ List serializers = new ArrayList();
+ Collections.addAll(serializers, PREDEFINED_ROOT_TYPES_SERIALIZERS);
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ serializers.addAll(extension.getLibraryRootTypeSerializers());
+ }
+ Collections.sort(serializers);
+ return serializers;
+ }
+
+ private static JpsLibraryPropertiesSerializer> getLibraryPropertiesSerializer(@Nullable String typeId) {
+ if (typeId != null) {
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ for (JpsLibraryPropertiesSerializer> loader : extension.getLibraryPropertiesLoaders()) {
+ if (loader.getTypeId().equals(typeId)) {
+ return loader;
+ }
+ }
+ }
+ }
+ return JAVA_LIBRARY_PROPERTIES_SERIALIZER;
+ }
+
+ private static JpsLibraryPropertiesSerializer
getLibraryPropertiesSerializer(@NotNull JpsLibraryType
type) {
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ for (JpsLibraryPropertiesSerializer> loader : extension.getLibraryPropertiesLoaders()) {
+ if (loader.getType().equals(type)) {
+ //noinspection unchecked
+ return (JpsLibraryPropertiesSerializer
)loader;
+ }
+ }
+ }
+ throw new IllegalArgumentException("unknown type library:" + type);
+ }
+}
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelLoaderExtension.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java
similarity index 59%
rename from jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelLoaderExtension.java
rename to jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java
index f1a634917e45..78c389822ea6 100644
--- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelLoaderExtension.java
+++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java
@@ -7,11 +7,11 @@ import org.jetbrains.jps.model.JpsCompositeElement;
import org.jetbrains.jps.model.JpsElementReference;
import org.jetbrains.jps.model.JpsProject;
import org.jetbrains.jps.model.artifact.JpsArtifactType;
-import org.jetbrains.jps.model.library.JpsOrderRootType;
import org.jetbrains.jps.model.module.JpsDependencyElement;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.model.serialization.artifact.JpsPackagingElementLoader;
import org.jetbrains.jps.model.serialization.facet.JpsModuleExtensionLoader;
+import org.jetbrains.jps.service.JpsServiceManager;
import java.util.Collections;
import java.util.List;
@@ -19,39 +19,59 @@ import java.util.List;
/**
* @author nik
*/
-public abstract class JpsModelLoaderExtension {
+public abstract class JpsModelSerializerExtension {
+ public static Iterable getExtensions() {
+ return JpsServiceManager.getInstance().getExtensions(JpsModelSerializerExtension.class);
+ }
public void loadRootModel(@NotNull JpsModule module, @NotNull Element rootModel) {
}
+ public void saveRootModel(@NotNull JpsModule module, @NotNull Element rootModel) {
+ }
+
public void loadProjectRoots(JpsProject project, Element rootManagerElement) {
}
- @Nullable
- public JpsOrderRootType getRootType(@NotNull String typeId) {
- return null;
+ public void saveProjectRoots(JpsProject project, Element rootManagerElement) {
+ }
+
+ public List getLibraryRootTypeSerializers() {
+ return Collections.emptyList();
+ }
+
+ @NotNull
+ public List getSdkRootTypeSerializers() {
+ return Collections.emptyList();
}
public void loadModuleDependencyProperties(JpsDependencyElement dependency, Element orderEntry) {
}
+ public void saveModuleDependencyProperties(JpsDependencyElement dependency, Element orderEntry) {
+ }
+
@Nullable
public JpsElementReference extends JpsCompositeElement> createLibraryTableReference(String tableLevel) {
return null;
}
+ public String getLibraryTableLevelId(JpsElementReference extends JpsCompositeElement> reference) {
+ return null;
+ }
+
@NotNull
- public List extends JpsModulePropertiesLoader>> getModulePropertiesLoaders() {
+ public List extends JpsModulePropertiesSerializer>> getModulePropertiesSerializers() {
return Collections.emptyList();
}
@NotNull
- public List> getLibraryPropertiesLoaders() {
+ public List> getLibraryPropertiesLoaders() {
return Collections.emptyList();
}
@NotNull
- public List extends JpsSdkPropertiesLoader>> getSdkPropertiesLoaders() {
+ public List extends JpsSdkPropertiesSerializer>> getSdkPropertiesLoaders() {
return Collections.emptyList();
}
@@ -63,11 +83,6 @@ public abstract class JpsModelLoaderExtension {
return Collections.emptyList();
}
- @Nullable
- public JpsOrderRootType getSdkRootType(@NotNull String typeId) {
- return null;
- }
-
@Nullable
public JpsArtifactType getArtifactType(@NotNull String typeId) {
return null;
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleLoader.java
deleted file mode 100644
index aae1daef722d..000000000000
--- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleLoader.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.jetbrains.jps.model.serialization;
-
-import com.intellij.openapi.util.text.StringUtil;
-import org.jdom.Element;
-import org.jetbrains.jps.model.JpsCompositeElement;
-import org.jetbrains.jps.model.JpsElementFactory;
-import org.jetbrains.jps.model.JpsElementReference;
-import org.jetbrains.jps.model.java.JavaSourceRootProperties;
-import org.jetbrains.jps.model.java.JavaSourceRootType;
-import org.jetbrains.jps.model.java.JpsJavaSdkType;
-import org.jetbrains.jps.model.library.JpsLibrary;
-import org.jetbrains.jps.model.library.JpsSdkType;
-import org.jetbrains.jps.model.module.*;
-import org.jetbrains.jps.service.JpsServiceManager;
-
-import static com.intellij.openapi.util.JDOMUtil.getChildren;
-
-/**
- * @author nik
- */
-public class JpsModuleLoader {
- private static final String URL_ATTRIBUTE = "url";
-
- public static void loadRootModel(JpsModule module, Element rootModelComponent, JpsSdkType> projectSdkType) {
- for (Element contentElement : getChildren(rootModelComponent, "content")) {
- final String url = contentElement.getAttributeValue(URL_ATTRIBUTE);
- module.getContentRootsList().addUrl(url);
- for (Element sourceElement : getChildren(contentElement, "sourceFolder")) {
- final String sourceUrl = sourceElement.getAttributeValue(URL_ATTRIBUTE);
- final String packagePrefix = StringUtil.notNullize(sourceElement.getAttributeValue("packagePrefix"));
- final boolean testSource = Boolean.parseBoolean(sourceElement.getAttributeValue("isTestSource"));
- final JavaSourceRootType rootType = testSource ? JavaSourceRootType.TEST_SOURCE : JavaSourceRootType.SOURCE;
- module.addSourceRoot(sourceUrl, rootType, new JavaSourceRootProperties(packagePrefix));
- }
- for (Element excludeElement : getChildren(contentElement, "excludeFolder")) {
- module.getExcludeRootsList().addUrl(excludeElement.getAttributeValue(URL_ATTRIBUTE));
- }
- }
-
- final JpsDependenciesList dependenciesList = module.getDependenciesList();
- final JpsElementFactory elementFactory = JpsElementFactory.getInstance();
- int moduleLibraryNum = 0;
- for (Element orderEntry : getChildren(rootModelComponent, "orderEntry")) {
- String type = orderEntry.getAttributeValue("type");
- if ("sourceFolder".equals(type)) {
- dependenciesList.addModuleSourceDependency();
- }
- else if ("jdk".equals(type)) {
- String sdkName = orderEntry.getAttributeValue("jdkName");
- String sdkTypeId = orderEntry.getAttributeValue("jdkType");
- final JpsSdkType> sdkType = JpsSdkTableLoader.getSdkType(sdkTypeId);
- dependenciesList.addSdkDependency(sdkType);
- JpsSdkTableLoader.setSdkReference(module.getSdkReferencesTable(), sdkName, sdkType);
- }
- else if ("inheritedJdk".equals(type)) {
- dependenciesList.addSdkDependency(projectSdkType != null ? projectSdkType : JpsJavaSdkType.INSTANCE);
- }
- else if ("library".equals(type)) {
- String name = orderEntry.getAttributeValue("name");
- String level = orderEntry.getAttributeValue("level");
- final JpsLibraryDependency dependency =
- dependenciesList.addLibraryDependency(elementFactory.createLibraryReference(name, createLibraryTableReference(level)));
- loadModuleDependencyProperties(dependency, orderEntry);
- }
- else if ("module-library".equals(type)) {
- final Element moduleLibraryElement = orderEntry.getChild("library");
- String name = moduleLibraryElement.getAttributeValue("name");
- if (name == null) {
- name = "#" + (moduleLibraryNum++);
- }
- final JpsLibrary library = JpsLibraryTableLoader.loadLibrary(moduleLibraryElement, name);
- module.addModuleLibrary(library);
-
- final JpsLibraryDependency dependency = dependenciesList.addLibraryDependency(library);
- loadModuleDependencyProperties(dependency, orderEntry);
- moduleLibraryNum++;
- }
- else if ("module".equals(type)) {
- String name = orderEntry.getAttributeValue("module-name");
- final JpsModuleDependency dependency = dependenciesList.addModuleDependency(elementFactory.createModuleReference(name));
- loadModuleDependencyProperties(dependency, orderEntry);
- }
- }
-
- for (JpsModelLoaderExtension extension : getLoaderExtensions()) {
- extension.loadRootModel(module, rootModelComponent);
- }
- }
-
- private static void loadModuleDependencyProperties(JpsDependencyElement dependency, Element orderEntry) {
- for (JpsModelLoaderExtension extension : getLoaderExtensions()) {
- extension.loadModuleDependencyProperties(dependency, orderEntry);
- }
- }
-
- public static JpsElementReference extends JpsCompositeElement> createLibraryTableReference(String level) {
- JpsElementFactory elementFactory = JpsElementFactory.getInstance();
- if (level.equals("project")) {
- return elementFactory.createProjectReference();
- }
- if (level.equals("application")) {
- return elementFactory.createGlobalReference();
- }
- for (JpsModelLoaderExtension extension : getLoaderExtensions()) {
- final JpsElementReference extends JpsCompositeElement> reference = extension.createLibraryTableReference(level);
- if (reference != null) {
- return reference;
- }
- }
- throw new UnsupportedOperationException();
- }
-
- private static Iterable getLoaderExtensions() {
- return JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class);
- }
-}
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesSerializer.java
similarity index 54%
rename from jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesLoader.java
rename to jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesSerializer.java
index 895d08551e46..5dc1c3d2a764 100644
--- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesLoader.java
+++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesSerializer.java
@@ -8,8 +8,9 @@ import org.jetbrains.jps.model.module.JpsModuleType;
/**
* @author nik
*/
-public abstract class JpsModulePropertiesLoader extends JpsElementPropertiesLoader
> {
- protected JpsModulePropertiesLoader(JpsModuleType
type, String typeId) {
+public abstract class JpsModulePropertiesSerializer
extends
+ JpsElementPropertiesSerializer
> {
+ protected JpsModulePropertiesSerializer(JpsModuleType
type, String typeId) {
super(type, typeId);
}
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleSerializer.java
new file mode 100644
index 000000000000..5072f99e9d78
--- /dev/null
+++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleSerializer.java
@@ -0,0 +1,252 @@
+package org.jetbrains.jps.model.serialization;
+
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.util.text.StringUtil;
+import org.jdom.Element;
+import org.jetbrains.jps.model.*;
+import org.jetbrains.jps.model.java.JavaSourceRootProperties;
+import org.jetbrains.jps.model.java.JavaSourceRootType;
+import org.jetbrains.jps.model.java.JpsJavaSdkType;
+import org.jetbrains.jps.model.library.JpsLibrary;
+import org.jetbrains.jps.model.library.JpsLibraryReference;
+import org.jetbrains.jps.model.library.JpsSdkType;
+import org.jetbrains.jps.model.module.*;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static com.intellij.openapi.util.JDOMUtil.getChildren;
+
+/**
+ * @author nik
+ */
+public class JpsModuleSerializer {
+ private static final String URL_ATTRIBUTE = "url";
+ private static final String CONTENT_TAG = "content";
+ private static final String SOURCE_FOLDER_TAG = "sourceFolder";
+ private static final String PACKAGE_PREFIX_ATTRIBUTE = "packagePrefix";
+ private static final String IS_TEST_SOURCE_ATTRIBUTE = "isTestSource";
+ private static final String EXCLUDE_FOLDER_TAG = "excludeFolder";
+ private static final String ORDER_ENTRY_TAG = "orderEntry";
+ private static final String TYPE_ATTRIBUTE = "type";
+ private static final String SOURCE_FOLDER_TYPE = "sourceFolder";
+ private static final String JDK_TYPE = "jdk";
+ private static final String JDK_NAME_ATTRIBUTE = "jdkName";
+ private static final String JDK_TYPE_ATTRIBUTE = "jdkType";
+ private static final String INHERITED_JDK_TYPE = "inheritedJdk";
+ private static final String LIBRARY_TYPE = "library";
+ private static final String NAME_ATTRIBUTE = "name";
+ private static final String LEVEL_ATTRIBUTE = "level";
+ private static final String LIBRARY_TAG = "library";
+ private static final String MODULE_LIBRARY_TYPE = "module-library";
+ private static final String MODULE_TYPE = "module";
+ private static final String MODULE_NAME_ATTRIBUTE = "module-name";
+ private static final String PROJECT_LEVEL = "project";
+ private static final String APPLICATION_LEVEL = "application";
+ private static final String GENERATED_LIBRARY_NAME_PREFIX = "#";
+
+ public static void loadRootModel(JpsModule module, Element rootModelComponent, JpsSdkType> projectSdkType) {
+ for (Element contentElement : getChildren(rootModelComponent, CONTENT_TAG)) {
+ final String url = contentElement.getAttributeValue(URL_ATTRIBUTE);
+ module.getContentRootsList().addUrl(url);
+ for (Element sourceElement : getChildren(contentElement, SOURCE_FOLDER_TAG)) {
+ final String sourceUrl = sourceElement.getAttributeValue(URL_ATTRIBUTE);
+ final String packagePrefix = StringUtil.notNullize(sourceElement.getAttributeValue(PACKAGE_PREFIX_ATTRIBUTE));
+ final boolean testSource = Boolean.parseBoolean(sourceElement.getAttributeValue(IS_TEST_SOURCE_ATTRIBUTE));
+ final JavaSourceRootType rootType = testSource ? JavaSourceRootType.TEST_SOURCE : JavaSourceRootType.SOURCE;
+ module.addSourceRoot(sourceUrl, rootType, new JavaSourceRootProperties(packagePrefix));
+ }
+ for (Element excludeElement : getChildren(contentElement, EXCLUDE_FOLDER_TAG)) {
+ module.getExcludeRootsList().addUrl(excludeElement.getAttributeValue(URL_ATTRIBUTE));
+ }
+ }
+
+ final JpsDependenciesList dependenciesList = module.getDependenciesList();
+ final JpsElementFactory elementFactory = JpsElementFactory.getInstance();
+ int moduleLibraryNum = 0;
+ for (Element orderEntry : getChildren(rootModelComponent, ORDER_ENTRY_TAG)) {
+ String type = orderEntry.getAttributeValue(TYPE_ATTRIBUTE);
+ if (SOURCE_FOLDER_TYPE.equals(type)) {
+ dependenciesList.addModuleSourceDependency();
+ }
+ else if (JDK_TYPE.equals(type)) {
+ String sdkName = orderEntry.getAttributeValue(JDK_NAME_ATTRIBUTE);
+ String sdkTypeId = orderEntry.getAttributeValue(JDK_TYPE_ATTRIBUTE);
+ final JpsSdkType> sdkType = JpsSdkTableSerializer.getSdkType(sdkTypeId);
+ dependenciesList.addSdkDependency(sdkType);
+ JpsSdkTableSerializer.setSdkReference(module.getSdkReferencesTable(), sdkName, sdkType);
+ }
+ else if (INHERITED_JDK_TYPE.equals(type)) {
+ dependenciesList.addSdkDependency(projectSdkType != null ? projectSdkType : JpsJavaSdkType.INSTANCE);
+ }
+ else if (LIBRARY_TYPE.equals(type)) {
+ String name = orderEntry.getAttributeValue(NAME_ATTRIBUTE);
+ String level = orderEntry.getAttributeValue(LEVEL_ATTRIBUTE);
+ final JpsLibraryDependency dependency =
+ dependenciesList.addLibraryDependency(elementFactory.createLibraryReference(name, createLibraryTableReference(level)));
+ loadModuleDependencyProperties(dependency, orderEntry);
+ }
+ else if (MODULE_LIBRARY_TYPE.equals(type)) {
+ final Element moduleLibraryElement = orderEntry.getChild(LIBRARY_TAG);
+ String name = moduleLibraryElement.getAttributeValue(NAME_ATTRIBUTE);
+ if (name == null) {
+ name = GENERATED_LIBRARY_NAME_PREFIX + (moduleLibraryNum++);
+ }
+ final JpsLibrary library = JpsLibraryTableSerializer.loadLibrary(moduleLibraryElement, name);
+ module.addModuleLibrary(library);
+
+ final JpsLibraryDependency dependency = dependenciesList.addLibraryDependency(library);
+ loadModuleDependencyProperties(dependency, orderEntry);
+ moduleLibraryNum++;
+ }
+ else if (MODULE_TYPE.equals(type)) {
+ String name = orderEntry.getAttributeValue(MODULE_NAME_ATTRIBUTE);
+ final JpsModuleDependency dependency = dependenciesList.addModuleDependency(elementFactory.createModuleReference(name));
+ loadModuleDependencyProperties(dependency, orderEntry);
+ }
+ }
+
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ extension.loadRootModel(module, rootModelComponent);
+ }
+ }
+
+ public static void saveRootModel(JpsModule module, Element rootModelElement) {
+ List sourceRoots = module.getSourceRoots();
+ List excludedUrls = getSortedList(module.getExcludeRootsList().getUrls());
+ for (String url : getSortedList(module.getContentRootsList().getUrls())) {
+ Element contentElement = new Element(CONTENT_TAG);
+ contentElement.setAttribute(URL_ATTRIBUTE, url);
+ rootModelElement.addContent(contentElement);
+ for (JpsModuleSourceRoot root : sourceRoots) {
+ if (FileUtil.startsWith(root.getUrl(), url)) {
+ Element sourceElement = new Element(SOURCE_FOLDER_TAG);
+ sourceElement.setAttribute(URL_ATTRIBUTE, root.getUrl());
+ sourceElement.setAttribute(IS_TEST_SOURCE_ATTRIBUTE, Boolean.toString(root.getRootType().equals(JavaSourceRootType.TEST_SOURCE)));
+ JpsElementProperties properties = root.getProperties();
+ if (properties instanceof JavaSourceRootProperties) {
+ String packagePrefix = ((JavaSourceRootProperties)properties).getPackagePrefix();
+ if (packagePrefix.length() > 0) {
+ sourceElement.setAttribute(PACKAGE_PREFIX_ATTRIBUTE, packagePrefix);
+ }
+ }
+ contentElement.addContent(sourceElement);
+ }
+ }
+ for (String excludedUrl : excludedUrls) {
+ if (FileUtil.startsWith(excludedUrl, url)) {
+ Element element = new Element(EXCLUDE_FOLDER_TAG).setAttribute(URL_ATTRIBUTE, excludedUrl);
+ contentElement.addContent(element);
+ }
+ }
+ }
+
+ for (JpsDependencyElement dependency : module.getDependenciesList().getDependencies()) {
+ if (dependency instanceof JpsModuleSourceDependency) {
+ rootModelElement.addContent(createDependencyElement(SOURCE_FOLDER_TYPE).setAttribute("forTests", "false"));
+ }
+ else if (dependency instanceof JpsSdkDependency) {
+ JpsSdkType> sdkType = ((JpsSdkDependency)dependency).getSdkType();
+ JpsLibraryReference reference = module.getSdkReferencesTable().getSdkReference(sdkType);
+ if (reference == null) {
+ rootModelElement.addContent(createDependencyElement(INHERITED_JDK_TYPE));
+ }
+ else {
+ Element element = createDependencyElement(JDK_TYPE);
+ element.setAttribute(JDK_NAME_ATTRIBUTE, reference.getLibraryName());
+ element.setAttribute(JDK_TYPE_ATTRIBUTE, JpsSdkTableSerializer.getLoader(sdkType).getTypeId());
+ rootModelElement.addContent(element);
+ }
+ }
+ else if (dependency instanceof JpsLibraryDependency) {
+ JpsLibraryReference reference = ((JpsLibraryDependency)dependency).getLibraryReference();
+ JpsElementReference extends JpsCompositeElement> parentReference = reference.getParentReference();
+ Element element;
+ if (parentReference instanceof JpsModuleReference) {
+ element = createDependencyElement(MODULE_LIBRARY_TYPE);
+ saveModuleDependencyProperties(dependency, element);
+ Element libraryElement = new Element(LIBRARY_TAG);
+ JpsLibrary library = reference.resolve();
+ String libraryName = library.getName();
+ JpsLibraryTableSerializer
+ .saveLibrary(library, libraryElement, libraryName.startsWith(GENERATED_LIBRARY_NAME_PREFIX) ? null : libraryName);
+ element.addContent(libraryElement);
+ }
+ else {
+ element = createDependencyElement(LIBRARY_TYPE);
+ saveModuleDependencyProperties(dependency, element);
+ element.setAttribute(NAME_ATTRIBUTE, reference.getLibraryName());
+ element.setAttribute(LEVEL_ATTRIBUTE, getLevelId(parentReference));
+ }
+ rootModelElement.addContent(element);
+ }
+ else if (dependency instanceof JpsModuleDependency) {
+ Element element = createDependencyElement(MODULE_TYPE);
+ element.setAttribute(MODULE_NAME_ATTRIBUTE, ((JpsModuleDependency)dependency).getModuleReference().getModuleName());
+ saveModuleDependencyProperties(dependency, element);
+ rootModelElement.addContent(element);
+ }
+ }
+
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ extension.saveRootModel(module, rootModelElement);
+ }
+ }
+
+ private static Element createDependencyElement(final String type) {
+ return new Element(ORDER_ENTRY_TAG).setAttribute(TYPE_ATTRIBUTE, type);
+ }
+
+ private static List getSortedList(final List list) {
+ List strings = new ArrayList(list);
+ Collections.sort(strings);
+ return strings;
+ }
+
+ private static void loadModuleDependencyProperties(JpsDependencyElement dependency, Element orderEntry) {
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ extension.loadModuleDependencyProperties(dependency, orderEntry);
+ }
+ }
+
+ private static void saveModuleDependencyProperties(JpsDependencyElement dependency, Element orderEntry) {
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ extension.saveModuleDependencyProperties(dependency, orderEntry);
+ }
+ }
+
+ public static JpsElementReference extends JpsCompositeElement> createLibraryTableReference(String level) {
+ JpsElementFactory elementFactory = JpsElementFactory.getInstance();
+ if (level.equals(PROJECT_LEVEL)) {
+ return elementFactory.createProjectReference();
+ }
+ if (level.equals(APPLICATION_LEVEL)) {
+ return elementFactory.createGlobalReference();
+ }
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ final JpsElementReference extends JpsCompositeElement> reference = extension.createLibraryTableReference(level);
+ if (reference != null) {
+ return reference;
+ }
+ }
+ throw new UnsupportedOperationException();
+ }
+
+ private static String getLevelId(JpsElementReference extends JpsCompositeElement> reference) {
+ JpsCompositeElement element = reference.resolve();
+ if (element instanceof JpsProject) {
+ return PROJECT_LEVEL;
+ }
+ else if (element instanceof JpsGlobal) {
+ return APPLICATION_LEVEL;
+ }
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ String levelId = extension.getLibraryTableLevelId(reference);
+ if (levelId != null) {
+ return levelId;
+ }
+ }
+ 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 59ac7a38c855..cffd93202c47 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
@@ -15,7 +15,6 @@ import org.jetbrains.jps.model.library.JpsSdkType;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.model.serialization.artifact.JpsArtifactLoader;
import org.jetbrains.jps.model.serialization.facet.JpsFacetLoader;
-import org.jetbrains.jps.service.JpsServiceManager;
import java.io.File;
import java.io.FileFilter;
@@ -32,17 +31,17 @@ import java.util.concurrent.Future;
* @author nik
*/
public class JpsProjectLoader extends JpsLoaderBase {
- private static final ExecutorService ourThreadPool = Executors.newFixedThreadPool(2 * Runtime.getRuntime().availableProcessors());
+ private static final ExecutorService ourThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
private final JpsProject myProject;
private final Map myPathVariables;
public JpsProjectLoader(JpsProject project, Map pathVariables, File baseDir) {
- super(createMacroExpander(pathVariables, baseDir));
+ super(createProjectMacroExpander(pathVariables, baseDir));
myProject = project;
myPathVariables = pathVariables;
}
- private static JpsMacroExpander createMacroExpander(Map pathVariables, File baseDir) {
+ static JpsMacroExpander createProjectMacroExpander(Map pathVariables, File baseDir) {
final JpsMacroExpander expander = new JpsMacroExpander(pathVariables);
expander.addFileHierarchyReplacements("PROJECT_DIR", baseDir);
return expander;
@@ -110,10 +109,10 @@ public class JpsProjectLoader extends JpsLoaderBase {
String sdkName = rootManagerElement.getAttributeValue("project-jdk-name");
String sdkTypeId = rootManagerElement.getAttributeValue("project-jdk-type");
if (sdkName != null && sdkTypeId != null) {
- sdkType = JpsSdkTableLoader.getSdkType(sdkTypeId);
- JpsSdkTableLoader.setSdkReference(myProject.getSdkReferencesTable(), sdkName, sdkType);
+ sdkType = JpsSdkTableSerializer.getSdkType(sdkTypeId);
+ JpsSdkTableSerializer.setSdkReference(myProject.getSdkReferencesTable(), sdkName, sdkType);
}
- for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) {
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
extension.loadProjectRoots(myProject, rootManagerElement);
}
}
@@ -121,7 +120,7 @@ public class JpsProjectLoader extends JpsLoaderBase {
}
private void loadProjectLibraries(Element libraryTableElement) {
- JpsLibraryTableLoader.loadLibraries(libraryTableElement, myProject.getLibraryCollection());
+ JpsLibraryTableSerializer.loadLibraries(libraryTableElement, myProject.getLibraryCollection());
}
private void loadModules(Element root, final JpsSdkType> projectSdkType) {
@@ -151,30 +150,35 @@ public class JpsProjectLoader extends JpsLoaderBase {
private JpsModule loadModule(String path, JpsSdkType> projectSdkType) {
final File file = new File(path);
String name = FileUtil.getNameWithoutExtension(file);
- final JpsMacroExpander expander = new JpsMacroExpander(myPathVariables);
- expander.addFileHierarchyReplacements("MODULE_DIR", file.getParentFile());
+ final JpsMacroExpander expander = createModuleMacroExpander(myPathVariables, file);
final Element moduleRoot = loadRootElement(file, expander);
final String typeId = moduleRoot.getAttributeValue("type");
- final JpsModulePropertiesLoader> loader = getModulePropertiesLoader(typeId);
+ final JpsModulePropertiesSerializer> loader = getModulePropertiesSerializer(typeId);
final JpsModule module = createModule(name, moduleRoot, loader);
- JpsModuleLoader.loadRootModel(module, findComponent(moduleRoot, "NewModuleRootManager"), projectSdkType);
+ JpsModuleSerializer.loadRootModel(module, findComponent(moduleRoot, "NewModuleRootManager"), projectSdkType);
JpsFacetLoader.loadFacets(module, findComponent(moduleRoot, "FacetManager"), FileUtil.toSystemIndependentName(path));
return module;
}
- private static JpsModule createModule(String name, Element moduleRoot, JpsModulePropertiesLoader
loader) {
+ static JpsMacroExpander createModuleMacroExpander(final Map pathVariables, File moduleFile) {
+ final JpsMacroExpander expander = new JpsMacroExpander(pathVariables);
+ expander.addFileHierarchyReplacements("MODULE_DIR", moduleFile.getParentFile());
+ return expander;
+ }
+
+ private static JpsModule createModule(String name, Element moduleRoot, JpsModulePropertiesSerializer
loader) {
return JpsElementFactory.getInstance().createModule(name, loader.getType(), loader.loadProperties(moduleRoot));
}
- private static JpsModulePropertiesLoader> getModulePropertiesLoader(@NotNull String typeId) {
- for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) {
- for (JpsModulePropertiesLoader> loader : extension.getModulePropertiesLoaders()) {
+ private static JpsModulePropertiesSerializer> getModulePropertiesSerializer(@NotNull String typeId) {
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ for (JpsModulePropertiesSerializer> loader : extension.getModulePropertiesSerializers()) {
if (loader.getTypeId().equals(typeId)) {
return loader;
}
}
}
- return new JpsModulePropertiesLoader(JpsJavaModuleType.INSTANCE, "JAVA_MODULE") {
+ return new JpsModulePropertiesSerializer(JpsJavaModuleType.INSTANCE, "JAVA_MODULE") {
@Override
public DummyJpsElementProperties loadProperties(@Nullable Element moduleRootElement) {
return DummyJpsElementProperties.INSTANCE;
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkPropertiesLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkPropertiesSerializer.java
similarity index 52%
rename from jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkPropertiesLoader.java
rename to jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkPropertiesSerializer.java
index c836987fd43c..29487de2b804 100644
--- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkPropertiesLoader.java
+++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkPropertiesSerializer.java
@@ -1,6 +1,7 @@
package org.jetbrains.jps.model.serialization;
import org.jdom.Element;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.library.JpsSdkProperties;
import org.jetbrains.jps.model.library.JpsSdkType;
@@ -8,11 +9,14 @@ import org.jetbrains.jps.model.library.JpsSdkType;
/**
* @author nik
*/
-public abstract class JpsSdkPropertiesLoader extends JpsElementPropertiesLoader
> {
+public abstract class JpsSdkPropertiesSerializer
extends JpsElementPropertiesSerializer
> {
- protected JpsSdkPropertiesLoader(String typeId, JpsSdkType
type) {
+ protected JpsSdkPropertiesSerializer(String typeId, JpsSdkType
type) {
super(type, typeId);
}
+ @NotNull
public abstract P loadProperties(String homePath, String version, @Nullable Element propertiesElement);
+
+ public abstract void saveProperties(@NotNull P properties, @NotNull Element element);
}
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkTableLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkTableLoader.java
deleted file mode 100644
index a91f38f92230..000000000000
--- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkTableLoader.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package org.jetbrains.jps.model.serialization;
-
-import com.intellij.openapi.util.JDOMUtil;
-import org.jdom.Element;
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.jps.model.JpsElementFactory;
-import org.jetbrains.jps.model.java.JpsJavaSdkType;
-import org.jetbrains.jps.model.java.JpsJavaSdkTypeWrapper;
-import org.jetbrains.jps.model.library.*;
-import org.jetbrains.jps.model.module.JpsSdkReferencesTable;
-import org.jetbrains.jps.service.JpsServiceManager;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author nik
- */
-public class JpsSdkTableLoader {
- private static final Map PREDEFINED_ROOT_TYPES = new HashMap();
-
- static {
- PREDEFINED_ROOT_TYPES.put("classPath", JpsOrderRootType.COMPILED);
- PREDEFINED_ROOT_TYPES.put("sourcePath", JpsOrderRootType.SOURCES);
- }
-
- public static void loadSdks(@Nullable Element sdkListElement, JpsLibraryCollection result) {
- for (Element sdkElement : JDOMUtil.getChildren(sdkListElement, "jdk")) {
- result.addLibrary(loadSdk(sdkElement));
- }
- }
-
- private static JpsLibrary loadSdk(Element sdkElement) {
- String name = getAttributeValue(sdkElement, "name");
- String typeId = getAttributeValue(sdkElement, "type");
- JpsSdkPropertiesLoader> loader = getSdkPropertiesLoader(typeId);
- final JpsLibrary library = createSdk(name, loader, sdkElement);
- final Element roots = sdkElement.getChild("roots");
- for (Element rootTypeElement : JDOMUtil.getChildren(roots)) {
- JpsOrderRootType rootType = getRootType(rootTypeElement.getName());
- if (rootType != null) {
- for (Element rootElement : JDOMUtil.getChildren(rootTypeElement)) {
- loadRoots(rootElement, library, rootType);
- }
- }
- }
- return library;
- }
-
- private static void loadRoots(Element rootElement, JpsLibrary library, JpsOrderRootType rootType) {
- final String type = rootElement.getAttributeValue("type");
- if (type.equals("composite")) {
- for (Element element : JDOMUtil.getChildren(rootElement)) {
- loadRoots(element, library, rootType);
- }
- }
- else if (type.equals("simple")) {
- library.addRoot(rootElement.getAttributeValue("url"), rootType);
- }
- }
-
- @Nullable
- private static JpsOrderRootType getRootType(String typeId) {
- final JpsOrderRootType rootType = PREDEFINED_ROOT_TYPES.get(typeId);
- if (rootType != null) {
- return rootType;
- }
- for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) {
- final JpsOrderRootType type = extension.getSdkRootType(typeId);
- if (type != null) {
- return type;
- }
- }
- return null;
- }
-
- private static JpsLibrary createSdk(String name, JpsSdkPropertiesLoader
loader, Element sdkElement) {
- String versionString = getAttributeValue(sdkElement, "version");
- String homePath = getAttributeValue(sdkElement, "homePath");
- return JpsElementFactory.getInstance().createLibrary(name, loader.getType(), loader.loadProperties(homePath, versionString, sdkElement.getChild("additional")));
- }
-
- public static JpsSdkPropertiesLoader> getSdkPropertiesLoader(String typeId) {
- for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) {
- for (JpsSdkPropertiesLoader> loader : extension.getSdkPropertiesLoaders()) {
- if (loader.getTypeId().equals(typeId)) {
- return loader;
- }
- }
- }
- return new JpsSdkPropertiesLoader("JavaSDK", JpsJavaSdkType.INSTANCE) {
- @Override
- public JpsSdkProperties loadProperties(String homePath, String version, Element propertiesElement) {
- return new JpsSdkProperties(homePath, version);
- }
- };
- }
-
- @Nullable
- private static String getAttributeValue(Element element, String childName) {
- final Element child = element.getChild(childName);
- return child != null ? child.getAttributeValue("value") : null;
- }
-
- public static JpsSdkType> getSdkType(String typeId) {
- return getSdkPropertiesLoader(typeId).getType();
- }
-
- public static void setSdkReference(final JpsSdkReferencesTable table, String sdkName, JpsSdkType> sdkType) {
- JpsLibraryReference reference = JpsElementFactory.getInstance().createSdkReference(sdkName, sdkType);
- table.setSdkReference(sdkType, reference);
- if (sdkType instanceof JpsJavaSdkTypeWrapper) {
- JpsLibrary jpsLibrary = reference.resolve();
- if (jpsLibrary != null) {
- String name = ((JpsJavaSdkTypeWrapper)sdkType).getJavaSdkName((JpsSdkProperties)jpsLibrary.getProperties());
- if (name != null) {
- table.setSdkReference(JpsJavaSdkType.INSTANCE, JpsElementFactory.getInstance().createSdkReference(name, JpsJavaSdkType.INSTANCE));
- }
- }
- }
- }
-}
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkTableSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkTableSerializer.java
new file mode 100644
index 000000000000..8ff012635dba
--- /dev/null
+++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkTableSerializer.java
@@ -0,0 +1,226 @@
+package org.jetbrains.jps.model.serialization;
+
+import com.intellij.openapi.util.JDOMUtil;
+import org.jdom.Element;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.JpsElementFactory;
+import org.jetbrains.jps.model.java.JpsJavaSdkType;
+import org.jetbrains.jps.model.java.JpsJavaSdkTypeWrapper;
+import org.jetbrains.jps.model.library.*;
+import org.jetbrains.jps.model.module.JpsSdkReferencesTable;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author nik
+ */
+public class JpsSdkTableSerializer {
+ private static final JpsLibraryRootTypeSerializer[] PREDEFINED_ROOT_TYPE_SERIALIZERS = {
+ new JpsLibraryRootTypeSerializer("classPath", JpsOrderRootType.COMPILED, true),
+ new JpsLibraryRootTypeSerializer("sourcePath", JpsOrderRootType.SOURCES, true)
+ };
+ private static final JpsSdkPropertiesSerializer JPS_JAVA_SDK_PROPERTIES_LOADER =
+ new JpsSdkPropertiesSerializer("JavaSDK", JpsJavaSdkType.INSTANCE) {
+ @NotNull
+ @Override
+ public JpsSdkProperties loadProperties(String homePath, String version, Element propertiesElement) {
+ return new JpsSdkProperties(homePath, version);
+ }
+
+ @Override
+ public void saveProperties(@NotNull JpsSdkProperties properties, @NotNull Element element) {
+ }
+ };
+ private static final String JDK_TAG = "jdk";
+ private static final String NAME_TAG = "name";
+ private static final String TYPE_TAG = "type";
+ private static final String TYPE_ATTRIBUTE = "type";
+ private static final String ROOTS_TAG = "roots";
+ private static final String ROOT_TAG = "root";
+ private static final String VERSION_TAG = "version";
+ private static final String HOME_PATH_TAG = "homePath";
+ private static final String VALUE_ATTRIBUTE = "value";
+ private static final String COMPOSITE_TYPE = "composite";
+ private static final String SIMPLE_TYPE = "simple";
+ private static final String URL_ATTRIBUTE = "url";
+ private static final String ADDITIONAL_TAG = "additional";
+
+ public static void loadSdks(@Nullable Element sdkListElement, JpsLibraryCollection result) {
+ for (Element sdkElement : JDOMUtil.getChildren(sdkListElement, JDK_TAG)) {
+ result.addLibrary(loadSdk(sdkElement));
+ }
+ }
+
+ public static void saveSdks(JpsLibraryCollection libraryCollection, Element sdkListElement) {
+ for (JpsLibrary library : libraryCollection.getLibraries()) {
+ JpsLibraryType> type = library.getType();
+ if (type instanceof JpsSdkType>) {
+ Element sdkTag = new Element(JDK_TAG);
+ //noinspection unchecked
+ saveSdk((JpsTypedLibrary)library, (JpsSdkType)type, sdkTag);
+ sdkListElement.addContent(sdkTag);
+ }
+ }
+ }
+
+ private static JpsLibrary loadSdk(Element sdkElement) {
+ String name = getAttributeValue(sdkElement, NAME_TAG);
+ String typeId = getAttributeValue(sdkElement, TYPE_TAG);
+ JpsSdkPropertiesSerializer> serializer = getSdkPropertiesSerializer(typeId);
+ final JpsLibrary library = createSdk(name, serializer, sdkElement);
+ final Element roots = sdkElement.getChild(ROOTS_TAG);
+ for (Element rootTypeElement : JDOMUtil.getChildren(roots)) {
+ JpsLibraryRootTypeSerializer rootTypeSerializer = getRootTypeSerializer(rootTypeElement.getName());
+ if (rootTypeSerializer != null) {
+ for (Element rootElement : JDOMUtil.getChildren(rootTypeElement)) {
+ loadRoots(rootElement, library, rootTypeSerializer.getType());
+ }
+ }
+ }
+ return library;
+ }
+
+ private static void saveSdk(JpsTypedLibrary
library, JpsSdkType
type, Element sdkTag) {
+ sdkTag.setAttribute("version", "2");
+ setAttributeValue(sdkTag, NAME_TAG, library.getName());
+ JpsSdkPropertiesSerializer
serializer = getSdkPropertiesSerializer(type);
+ setAttributeValue(sdkTag, TYPE_TAG, serializer.getTypeId());
+ P properties = library.getProperties();
+ String versionString = properties.getVersionString();
+ if (versionString != null) {
+ setAttributeValue(sdkTag, VERSION_TAG, versionString);
+ }
+ setAttributeValue(sdkTag, HOME_PATH_TAG, properties.getHomePath());
+
+ Element rootsTag = new Element(ROOTS_TAG);
+ for (JpsLibraryRootTypeSerializer rootTypeSerializer : getRootTypeSerializers()) {
+ Element rootTypeTag = new Element(rootTypeSerializer.getTypeId());
+ Element compositeTag = new Element(ROOT_TAG);
+ compositeTag.setAttribute(TYPE_ATTRIBUTE, COMPOSITE_TYPE);
+ List roots = library.getRoots(rootTypeSerializer.getType());
+ for (JpsLibraryRoot root : roots) {
+ compositeTag.addContent(new Element(ROOT_TAG).setAttribute(TYPE_ATTRIBUTE, SIMPLE_TYPE).setAttribute(URL_ATTRIBUTE, root.getUrl()));
+ }
+ rootTypeTag.addContent(compositeTag);
+ rootsTag.addContent(rootTypeTag);
+ }
+ sdkTag.addContent(rootsTag);
+
+ Element additionalTag = new Element(ADDITIONAL_TAG);
+ serializer.saveProperties(properties, additionalTag);
+ sdkTag.addContent(additionalTag);
+ }
+
+ private static void setAttributeValue(Element tag, final String tagName, final String value) {
+ tag.addContent(new Element(tagName).setAttribute(VALUE_ATTRIBUTE, value));
+ }
+
+ private static void loadRoots(Element rootElement, JpsLibrary library, JpsOrderRootType rootType) {
+ final String type = rootElement.getAttributeValue(TYPE_ATTRIBUTE);
+ if (type.equals(COMPOSITE_TYPE)) {
+ for (Element element : JDOMUtil.getChildren(rootElement)) {
+ loadRoots(element, library, rootType);
+ }
+ }
+ else if (type.equals(SIMPLE_TYPE)) {
+ library.addRoot(rootElement.getAttributeValue(URL_ATTRIBUTE), rootType);
+ }
+ }
+
+ @Nullable
+ private static JpsLibraryRootTypeSerializer getRootTypeSerializer(String typeId) {
+ for (JpsLibraryRootTypeSerializer serializer : PREDEFINED_ROOT_TYPE_SERIALIZERS) {
+ if (serializer.getTypeId().equals(typeId)) {
+ return serializer;
+ }
+ }
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ for (JpsLibraryRootTypeSerializer serializer : extension.getSdkRootTypeSerializers()) {
+ if (serializer.getTypeId().equals(typeId)) {
+ return serializer;
+ }
+ }
+ }
+ return null;
+ }
+
+ private static List getRootTypeSerializers() {
+ List serializers = new ArrayList(Arrays.asList(PREDEFINED_ROOT_TYPE_SERIALIZERS));
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ serializers.addAll(extension.getSdkRootTypeSerializers());
+ }
+ Collections.sort(serializers);
+ return serializers;
+ }
+
+ private static JpsLibrary createSdk(String name, JpsSdkPropertiesSerializer
loader, Element sdkElement) {
+ String versionString = getAttributeValue(sdkElement, VERSION_TAG);
+ String homePath = getAttributeValue(sdkElement, HOME_PATH_TAG);
+ Element propertiesTag = sdkElement.getChild(ADDITIONAL_TAG);
+ P properties = loader.loadProperties(homePath, versionString, propertiesTag);
+ return JpsElementFactory.getInstance().createLibrary(name, loader.getType(), properties);
+ }
+
+ public static JpsSdkPropertiesSerializer> getSdkPropertiesSerializer(String typeId) {
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ for (JpsSdkPropertiesSerializer> loader : extension.getSdkPropertiesLoaders()) {
+ if (loader.getTypeId().equals(typeId)) {
+ return loader;
+ }
+ }
+ }
+ return JPS_JAVA_SDK_PROPERTIES_LOADER;
+ }
+
+ public static
JpsSdkPropertiesSerializer
getSdkPropertiesSerializer(JpsSdkType
type) {
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ for (JpsSdkPropertiesSerializer> loader : extension.getSdkPropertiesLoaders()) {
+ if (loader.getType().equals(type)) {
+ //noinspection unchecked
+ return (JpsSdkPropertiesSerializer
)loader;
+ }
+ }
+ }
+ //noinspection unchecked
+ return (JpsSdkPropertiesSerializer
)JPS_JAVA_SDK_PROPERTIES_LOADER;
+ }
+
+ @Nullable
+ private static String getAttributeValue(Element element, String childName) {
+ final Element child = element.getChild(childName);
+ return child != null ? child.getAttributeValue(VALUE_ATTRIBUTE) : null;
+ }
+
+ public static JpsSdkType> getSdkType(String typeId) {
+ return getSdkPropertiesSerializer(typeId).getType();
+ }
+
+ public static JpsSdkPropertiesSerializer> getLoader(JpsSdkType> type) {
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
+ for (JpsSdkPropertiesSerializer> loader : extension.getSdkPropertiesLoaders()) {
+ if (loader.getType().equals(type)) {
+ return loader;
+ }
+ }
+ }
+ return JPS_JAVA_SDK_PROPERTIES_LOADER;
+ }
+
+ public static void setSdkReference(final JpsSdkReferencesTable table, String sdkName, JpsSdkType> sdkType) {
+ JpsLibraryReference reference = JpsElementFactory.getInstance().createSdkReference(sdkName, sdkType);
+ table.setSdkReference(sdkType, reference);
+ if (sdkType instanceof JpsJavaSdkTypeWrapper) {
+ JpsLibrary jpsLibrary = reference.resolve();
+ if (jpsLibrary != null) {
+ String name = ((JpsJavaSdkTypeWrapper)sdkType).getJavaSdkName((JpsSdkProperties)jpsLibrary.getProperties());
+ if (name != null) {
+ table.setSdkReference(JpsJavaSdkType.INSTANCE, JpsElementFactory.getInstance().createSdkReference(name, JpsJavaSdkType.INSTANCE));
+ }
+ }
+ }
+ }
+}
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactLoader.java
index 15534c5fcf35..e8e117ac49ab 100644
--- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactLoader.java
+++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactLoader.java
@@ -13,9 +13,8 @@ import org.jetbrains.jps.model.artifact.*;
import org.jetbrains.jps.model.artifact.elements.JpsCompositePackagingElement;
import org.jetbrains.jps.model.artifact.elements.JpsPackagingElement;
import org.jetbrains.jps.model.artifact.elements.JpsPackagingElementFactory;
-import org.jetbrains.jps.model.serialization.JpsModelLoaderExtension;
-import org.jetbrains.jps.model.serialization.JpsModuleLoader;
-import org.jetbrains.jps.service.JpsServiceManager;
+import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension;
+import org.jetbrains.jps.model.serialization.JpsModuleSerializer;
import java.util.Arrays;
import java.util.List;
@@ -87,7 +86,7 @@ public class JpsArtifactLoader {
parentReference = JpsElementFactory.getInstance().createModuleReference(moduleName);
}
else {
- parentReference = JpsModuleLoader.createLibraryTableReference(level);
+ parentReference = JpsModuleSerializer.createLibraryTableReference(level);
}
return factory.createLibraryElement(JpsElementFactory.getInstance().createLibraryReference(libraryName, parentReference));
}
@@ -108,7 +107,7 @@ public class JpsArtifactLoader {
if (typeId.equals("jar")) {
return JarArtifactType.INSTANCE;
}
- for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) {
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
JpsArtifactType type = extension.getArtifactType(typeId);
if (type != null) {
return type;
@@ -124,7 +123,7 @@ public class JpsArtifactLoader {
return loader;
}
}
- for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) {
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
for (JpsPackagingElementLoader> loader : extension.getPackagingElementLoaders()) {
if (loader.getTypeId().equals(typeId)) {
return loader;
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/facet/JpsFacetLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/facet/JpsFacetLoader.java
index b9dc5828a656..49e76c9d5418 100644
--- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/facet/JpsFacetLoader.java
+++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/facet/JpsFacetLoader.java
@@ -7,8 +7,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.JpsElement;
import org.jetbrains.jps.model.module.JpsModule;
-import org.jetbrains.jps.model.serialization.JpsModelLoaderExtension;
-import org.jetbrains.jps.service.JpsServiceManager;
+import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension;
import java.util.List;
@@ -48,7 +47,7 @@ public class JpsFacetLoader {
@Nullable
private static JpsModuleExtensionLoader> getModuleExtensionLoader(@NotNull String typeId) {
- for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) {
+ for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) {
for (JpsModuleExtensionLoader> loader : extension.getModuleExtensionLoaders()) {
if (loader.getFacetTypeId().equals(typeId)) {
return loader;
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelLoaderExtension.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelLoaderExtension.java
deleted file mode 100644
index 794e853097a9..000000000000
--- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelLoaderExtension.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package org.jetbrains.jps.model.serialization.java;
-
-import com.intellij.openapi.util.JDOMUtil;
-import org.jdom.Element;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.jps.model.JpsElementFactory;
-import org.jetbrains.jps.model.JpsProject;
-import org.jetbrains.jps.model.JpsUrlList;
-import org.jetbrains.jps.model.java.*;
-import org.jetbrains.jps.model.library.JpsOrderRootType;
-import org.jetbrains.jps.model.module.JpsDependencyElement;
-import org.jetbrains.jps.model.module.JpsModule;
-import org.jetbrains.jps.model.serialization.JpsModelLoaderExtension;
-import org.jetbrains.jps.model.serialization.artifact.JpsPackagingElementLoader;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author nik
- */
-public class JpsJavaModelLoaderExtension extends JpsModelLoaderExtension {
- @Override
- public void loadRootModel(@NotNull JpsModule module, @NotNull Element rootModel) {
- loadExplodedDirectoryExtension(module, rootModel);
- loadJavaModuleExtension(module, rootModel);
- }
-
- @Override
- public void loadProjectRoots(JpsProject project, Element rootManagerElement) {
- loadJavaProjectExtensions(project, rootManagerElement);
- }
-
- private static void loadJavaProjectExtensions(JpsProject project, Element rootManagerElement) {
- JpsJavaProjectExtension extension = JpsJavaExtensionService.getInstance().getOrCreateProjectExtension(project);
- final Element output = rootManagerElement.getChild("output");
- if (output != null) {
- String url = output.getAttributeValue("url");
- if (url != null) {
- extension.setOutputUrl(url);
- }
- }
- String languageLevel = rootManagerElement.getAttributeValue("languageLevel");
- if (languageLevel != null) {
- extension.setLanguageLevel(LanguageLevel.valueOf(languageLevel));
- }
- }
-
- @Override
- public void loadModuleDependencyProperties(JpsDependencyElement dependency, Element entry) {
- boolean exported = entry.getAttributeValue("exported") != null;
- String scopeName = entry.getAttributeValue("scope");
- JpsJavaDependencyScope scope = scopeName != null ? JpsJavaDependencyScope.valueOf(scopeName) : JpsJavaDependencyScope.COMPILE;
-
- final JpsJavaDependencyExtension extension = JpsJavaExtensionService.getInstance().getOrCreateDependencyExtension(dependency);
- extension.setExported(exported);
- extension.setScope(scope);
- }
-
- @Override
- public JpsOrderRootType getRootType(@NotNull String typeId) {
- if (typeId.equals("JAVADOC")) {
- return JpsOrderRootType.DOCUMENTATION;
- }
- else if (typeId.equals("ANNOTATIONS")) {
- return JpsAnnotationRootType.INSTANCE;
- }
- return null;
- }
-
- @Override
- public JpsOrderRootType getSdkRootType(@NotNull String typeId) {
- if (typeId.equals("javadocPath")) {
- return JpsOrderRootType.DOCUMENTATION;
- }
- if (typeId.equals("annotationsPath")) {
- return JpsAnnotationRootType.INSTANCE;
- }
- return null;
- }
-
- @Override
- public List extends JpsPackagingElementLoader>> getPackagingElementLoaders() {
- return Arrays.asList(new JpsModuleOutputPackagingElementLoader(), new JpsTestModuleOutputPackagingElementLoader());
- }
-
- private static void loadExplodedDirectoryExtension(JpsModule module, Element rootModelComponent) {
- final Element exploded = rootModelComponent.getChild("exploded");
- if (exploded != null) {
- final ExplodedDirectoryModuleExtension extension =
- JpsJavaExtensionService.getInstance().getOrCreateExplodedDirectoryExtension(module);
- extension.setExcludeExploded(rootModelComponent.getChild("exclude-exploded") != null);
- extension.setExplodedUrl(exploded.getAttributeValue("url"));
- }
- }
-
- private static void loadJavaModuleExtension(JpsModule module, Element rootModelComponent) {
- final JpsJavaModuleExtension extension = JpsJavaExtensionService.getInstance().getOrCreateModuleExtension(module);
- final Element outputTag = rootModelComponent.getChild("output");
- if (outputTag != null) {
- extension.setOutputUrl(outputTag.getAttributeValue("url"));
- }
- final Element testOutputTag = rootModelComponent.getChild("output-test");
- if (testOutputTag != null) {
- extension.setOutputUrl(testOutputTag.getAttributeValue("url"));
- }
- extension.setInheritOutput(Boolean.parseBoolean(rootModelComponent.getAttributeValue("inherit-compiler-output")));
- extension.setExcludeOutput(rootModelComponent.getChild("exclude-output") != null);
-
- loadAdditionalRoots(rootModelComponent, "annotation-paths", extension.getAnnotationRoots());
- loadAdditionalRoots(rootModelComponent, "javadoc-paths", extension.getJavadocRoots());
-
- final String languageLevel = rootModelComponent.getAttributeValue("LANGUAGE_LEVEL");
- if (languageLevel != null) {
- extension.setLanguageLevel(LanguageLevel.valueOf(languageLevel));
- }
- }
-
- private static void loadAdditionalRoots(Element rootModelComponent, final String rootsTagName, final JpsUrlList result) {
- final Element roots = rootModelComponent.getChild(rootsTagName);
- for (Element root : JDOMUtil.getChildren(roots, "root")) {
- result.addUrl(root.getAttributeValue("url"));
- }
- }
-
- private static class JpsModuleOutputPackagingElementLoader extends JpsPackagingElementLoader {
- private JpsModuleOutputPackagingElementLoader() {
- super("module-output");
- }
-
- @Override
- public JpsProductionModuleOutputPackagingElement load(Element element) {
- return JpsJavaExtensionService.getInstance().createProductionModuleOutput(JpsElementFactory.getInstance().createModuleReference(element.getAttributeValue("name")));
- }
- }
-
- private static class JpsTestModuleOutputPackagingElementLoader extends JpsPackagingElementLoader {
- private JpsTestModuleOutputPackagingElementLoader() {
- super("module-test-output");
- }
-
- @Override
- public JpsTestModuleOutputPackagingElement load(Element element) {
- return JpsJavaExtensionService.getInstance().createTestModuleOutput(
- JpsElementFactory.getInstance().createModuleReference(element.getAttributeValue("name")));
- }
- }
-}
diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java
new file mode 100644
index 000000000000..a9255e6f3482
--- /dev/null
+++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/java/JpsJavaModelSerializerExtension.java
@@ -0,0 +1,238 @@
+package org.jetbrains.jps.model.serialization.java;
+
+import com.intellij.openapi.util.JDOMUtil;
+import org.jdom.Element;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jps.model.JpsElementFactory;
+import org.jetbrains.jps.model.JpsProject;
+import org.jetbrains.jps.model.JpsUrlList;
+import org.jetbrains.jps.model.java.*;
+import org.jetbrains.jps.model.library.JpsOrderRootType;
+import org.jetbrains.jps.model.module.JpsDependencyElement;
+import org.jetbrains.jps.model.module.JpsModule;
+import org.jetbrains.jps.model.module.JpsModuleReference;
+import org.jetbrains.jps.model.serialization.JpsLibraryRootTypeSerializer;
+import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension;
+import org.jetbrains.jps.model.serialization.artifact.JpsPackagingElementLoader;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author nik
+ */
+public class JpsJavaModelSerializerExtension extends JpsModelSerializerExtension {
+ private static final String EXPORTED_ATTRIBUTE = "exported";
+ private static final String SCOPE_ATTRIBUTE = "scope";
+ private static final String OUTPUT_TAG = "output";
+ private static final String URL_ATTRIBUTE = "url";
+ private static final String LANGUAGE_LEVEL_ATTRIBUTE = "languageLevel";
+ private static final String EXPLODED_TAG = "exploded";
+ private static final String EXCLUDE_EXPLODED_TAG = "exclude-exploded";
+ private static final String TEST_OUTPUT_TAG = "output-test";
+ private static final String INHERIT_COMPILER_OUTPUT_ATTRIBUTE = "inherit-compiler-output";
+ private static final String EXCLUDE_OUTPUT_TAG = "exclude-output";
+ private static final String ANNOTATION_PATHS_TAG = "annotation-paths";
+ private static final String JAVADOC_PATHS_TAG = "javadoc-paths";
+ private static final String MODULE_LANGUAGE_LEVEL_ATTRIBUTE = "LANGUAGE_LEVEL";
+ private static final String ROOT_TAG = "root";
+
+ @Override
+ public void loadRootModel(@NotNull JpsModule module, @NotNull Element rootModel) {
+ loadExplodedDirectoryExtension(module, rootModel);
+ loadJavaModuleExtension(module, rootModel);
+ }
+
+ @Override
+ public void saveRootModel(@NotNull JpsModule module, @NotNull Element rootModel) {
+ saveExplodedDirectoryExtension(module, rootModel);
+ saveJavaModuleExtension(module, rootModel);
+ }
+
+ @Override
+ public void loadProjectRoots(JpsProject project, Element rootManagerElement) {
+ JpsJavaProjectExtension extension = getService().getOrCreateProjectExtension(project);
+ final Element output = rootManagerElement.getChild(OUTPUT_TAG);
+ if (output != null) {
+ String url = output.getAttributeValue(URL_ATTRIBUTE);
+ if (url != null) {
+ extension.setOutputUrl(url);
+ }
+ }
+ String languageLevel = rootManagerElement.getAttributeValue(LANGUAGE_LEVEL_ATTRIBUTE);
+ if (languageLevel != null) {
+ extension.setLanguageLevel(LanguageLevel.valueOf(languageLevel));
+ }
+ }
+
+ @Override
+ public void saveProjectRoots(JpsProject project, Element rootManagerElement) {
+ JpsJavaProjectExtension extension = getService().getProjectExtension(project);
+ if (extension == null) return;
+
+ String outputUrl = extension.getOutputUrl();
+ if (outputUrl != null) {
+ rootManagerElement.addContent(new Element(OUTPUT_TAG).setAttribute(URL_ATTRIBUTE, outputUrl));
+ }
+ LanguageLevel level = extension.getLanguageLevel();
+ rootManagerElement.setAttribute(LANGUAGE_LEVEL_ATTRIBUTE, level.name());
+ rootManagerElement.setAttribute("assert-keyword", Boolean.toString(level.compareTo(LanguageLevel.JDK_1_4) >= 0));
+ rootManagerElement.setAttribute("jdk-15", Boolean.toString(level.compareTo(LanguageLevel.JDK_1_5) >= 0));
+ }
+
+ @Override
+ public void loadModuleDependencyProperties(JpsDependencyElement dependency, Element entry) {
+ boolean exported = entry.getAttributeValue(EXPORTED_ATTRIBUTE) != null;
+ String scopeName = entry.getAttributeValue(SCOPE_ATTRIBUTE);
+ JpsJavaDependencyScope scope = scopeName != null ? JpsJavaDependencyScope.valueOf(scopeName) : JpsJavaDependencyScope.COMPILE;
+
+ final JpsJavaDependencyExtension extension = getService().getOrCreateDependencyExtension(dependency);
+ extension.setExported(exported);
+ extension.setScope(scope);
+ }
+
+ @Override
+ public void saveModuleDependencyProperties(JpsDependencyElement dependency, Element orderEntry) {
+ JpsJavaDependencyExtension extension = getService().getDependencyExtension(dependency);
+ if (extension != null) {
+ if (extension.isExported()) {
+ orderEntry.setAttribute(EXPORTED_ATTRIBUTE, "");
+ }
+ JpsJavaDependencyScope scope = extension.getScope();
+ if (scope != JpsJavaDependencyScope.COMPILE) {
+ orderEntry.setAttribute(SCOPE_ATTRIBUTE, scope.name());
+ }
+ }
+ }
+
+ @Override
+ public List getLibraryRootTypeSerializers() {
+ return Arrays.asList(new JpsLibraryRootTypeSerializer("JAVADOC", JpsOrderRootType.DOCUMENTATION, true),
+ new JpsLibraryRootTypeSerializer("ANNOTATIONS", JpsAnnotationRootType.INSTANCE, false));
+ }
+
+ @NotNull
+ @Override
+ public List getSdkRootTypeSerializers() {
+ return Arrays.asList(new JpsLibraryRootTypeSerializer("javadocPath", JpsOrderRootType.DOCUMENTATION, true),
+ new JpsLibraryRootTypeSerializer("annotationsPath", JpsAnnotationRootType.INSTANCE, true));
+ }
+
+ @Override
+ public List extends JpsPackagingElementLoader>> getPackagingElementLoaders() {
+ return Arrays.asList(new JpsModuleOutputPackagingElementLoader(), new JpsTestModuleOutputPackagingElementLoader());
+ }
+
+ private static void loadExplodedDirectoryExtension(JpsModule module, Element rootModelComponent) {
+ final Element exploded = rootModelComponent.getChild(EXPLODED_TAG);
+ if (exploded != null) {
+ final ExplodedDirectoryModuleExtension extension = getService().getOrCreateExplodedDirectoryExtension(module);
+ extension.setExcludeExploded(rootModelComponent.getChild(EXCLUDE_EXPLODED_TAG) != null);
+ extension.setExplodedUrl(exploded.getAttributeValue(URL_ATTRIBUTE));
+ }
+ }
+
+ private static void saveExplodedDirectoryExtension(JpsModule module, Element rootModelElement) {
+ ExplodedDirectoryModuleExtension extension = getService().getExplodedDirectoryExtension(module);
+ if (extension != null) {
+ if (extension.isExcludeExploded()) {
+ rootModelElement.addContent(0, new Element(EXCLUDE_EXPLODED_TAG));
+ }
+ rootModelElement.addContent(0, new Element(EXPLODED_TAG).setAttribute(URL_ATTRIBUTE, extension.getExplodedUrl()));
+ }
+ }
+
+ private static void loadJavaModuleExtension(JpsModule module, Element rootModelComponent) {
+ final JpsJavaModuleExtension extension = getService().getOrCreateModuleExtension(module);
+ final Element outputTag = rootModelComponent.getChild(OUTPUT_TAG);
+ if (outputTag != null) {
+ extension.setOutputUrl(outputTag.getAttributeValue(URL_ATTRIBUTE));
+ }
+ final Element testOutputTag = rootModelComponent.getChild(TEST_OUTPUT_TAG);
+ if (testOutputTag != null) {
+ extension.setTestOutputUrl(testOutputTag.getAttributeValue(URL_ATTRIBUTE));
+ }
+ extension.setInheritOutput(Boolean.parseBoolean(rootModelComponent.getAttributeValue(INHERIT_COMPILER_OUTPUT_ATTRIBUTE)));
+ extension.setExcludeOutput(rootModelComponent.getChild(EXCLUDE_OUTPUT_TAG) != null);
+
+ final String languageLevel = rootModelComponent.getAttributeValue(MODULE_LANGUAGE_LEVEL_ATTRIBUTE);
+ if (languageLevel != null) {
+ extension.setLanguageLevel(LanguageLevel.valueOf(languageLevel));
+ }
+
+ loadAdditionalRoots(rootModelComponent, ANNOTATION_PATHS_TAG, extension.getAnnotationRoots());
+ loadAdditionalRoots(rootModelComponent, JAVADOC_PATHS_TAG, extension.getJavadocRoots());
+ }
+
+ private static void saveJavaModuleExtension(JpsModule module, Element rootModelComponent) {
+ JpsJavaModuleExtension extension = getService().getModuleExtension(module);
+ if (extension == null) return;
+ if (extension.isExcludeOutput()) {
+ rootModelComponent.addContent(0, new Element(EXCLUDE_OUTPUT_TAG));
+ }
+
+ String testOutputUrl = extension.getTestOutputUrl();
+ if (testOutputUrl != null) {
+ rootModelComponent.addContent(0, new Element(TEST_OUTPUT_TAG).setAttribute(URL_ATTRIBUTE, testOutputUrl));
+ }
+
+ String outputUrl = extension.getOutputUrl();
+ if (outputUrl != null) {
+ rootModelComponent.addContent(0, new Element(OUTPUT_TAG).setAttribute(URL_ATTRIBUTE, outputUrl));
+ }
+
+ LanguageLevel languageLevel = extension.getLanguageLevel();
+ if (languageLevel != null) {
+ rootModelComponent.setAttribute(MODULE_LANGUAGE_LEVEL_ATTRIBUTE, languageLevel.name());
+ }
+ rootModelComponent.setAttribute(INHERIT_COMPILER_OUTPUT_ATTRIBUTE, String.valueOf(extension.isInheritOutput()));
+ saveAdditionalRoots(rootModelComponent, JAVADOC_PATHS_TAG, extension.getJavadocRoots());
+ saveAdditionalRoots(rootModelComponent, ANNOTATION_PATHS_TAG, extension.getAnnotationRoots());
+ }
+
+ private static void loadAdditionalRoots(Element rootModelComponent, final String rootsTagName, final JpsUrlList result) {
+ final Element roots = rootModelComponent.getChild(rootsTagName);
+ for (Element root : JDOMUtil.getChildren(roots, ROOT_TAG)) {
+ result.addUrl(root.getAttributeValue(URL_ATTRIBUTE));
+ }
+ }
+
+ private static void saveAdditionalRoots(Element rootModelComponent, final String rootsTagName, final JpsUrlList list) {
+ List urls = list.getUrls();
+ if (!urls.isEmpty()) {
+ Element roots = new Element(rootsTagName);
+ for (String url : urls) {
+ roots.addContent(new Element(ROOT_TAG).setAttribute(URL_ATTRIBUTE, url));
+ }
+ rootModelComponent.addContent(roots);
+ }
+ }
+
+ private static JpsJavaExtensionService getService() {
+ return JpsJavaExtensionService.getInstance();
+ }
+
+ private static class JpsModuleOutputPackagingElementLoader extends JpsPackagingElementLoader {
+ private JpsModuleOutputPackagingElementLoader() {
+ super("module-output");
+ }
+
+ @Override
+ public JpsProductionModuleOutputPackagingElement load(Element element) {
+ JpsModuleReference reference = JpsElementFactory.getInstance().createModuleReference(element.getAttributeValue("name"));
+ return getService().createProductionModuleOutput(reference);
+ }
+ }
+
+ private static class JpsTestModuleOutputPackagingElementLoader extends JpsPackagingElementLoader {
+ private JpsTestModuleOutputPackagingElementLoader() {
+ super("module-test-output");
+ }
+
+ @Override
+ public JpsTestModuleOutputPackagingElement load(Element element) {
+ JpsModuleReference reference = JpsElementFactory.getInstance().createModuleReference(element.getAttributeValue("name"));
+ return getService().createTestModuleOutput(reference);
+ }
+ }
+}
diff --git a/jps/model-serialization/testData/iprProject/iprProject.iml b/jps/model-serialization/testData/iprProject/iprProject.iml
deleted file mode 100644
index 814115b795e5..000000000000
--- a/jps/model-serialization/testData/iprProject/iprProject.iml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/jps/model-serialization/testData/iprProject/iprProject.ipr b/jps/model-serialization/testData/iprProject/iprProject.ipr
deleted file mode 100644
index 341eae6831cd..000000000000
--- a/jps/model-serialization/testData/iprProject/iprProject.ipr
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
- $PROJECT_DIR$/out/artifacts/explodedWar
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $PROJECT_DIR$/out/artifacts/archive
-
-
-
-
-
-
-
-
-
-
- $PROJECT_DIR$/out/artifacts/files
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/jps/model-serialization/testData/sampleProject/.idea/.name b/jps/model-serialization/testData/sampleProject/.idea/.name
new file mode 100644
index 000000000000..56df8c9ebb3c
--- /dev/null
+++ b/jps/model-serialization/testData/sampleProject/.idea/.name
@@ -0,0 +1 @@
+sampleProject
diff --git a/jps/model-serialization/testData/sampleProject/.idea/compiler.xml b/jps/model-serialization/testData/sampleProject/.idea/compiler.xml
new file mode 100644
index 000000000000..a1b41c52c724
--- /dev/null
+++ b/jps/model-serialization/testData/sampleProject/.idea/compiler.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jps/model-serialization/testData/sampleProject/.idea/encodings.xml b/jps/model-serialization/testData/sampleProject/.idea/encodings.xml
new file mode 100644
index 000000000000..e206d70d8595
--- /dev/null
+++ b/jps/model-serialization/testData/sampleProject/.idea/encodings.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/jps/model-serialization/testData/sampleProject/.idea/libraries/jarDir.xml b/jps/model-serialization/testData/sampleProject/.idea/libraries/jarDir.xml
new file mode 100644
index 000000000000..b5b244c698e3
--- /dev/null
+++ b/jps/model-serialization/testData/sampleProject/.idea/libraries/jarDir.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jps/model-serialization/testData/sampleProject/.idea/libraries/junit.xml b/jps/model-serialization/testData/sampleProject/.idea/libraries/junit.xml
new file mode 100644
index 000000000000..72885d1ec69f
--- /dev/null
+++ b/jps/model-serialization/testData/sampleProject/.idea/libraries/junit.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jps/model-serialization/testData/sampleProject/.idea/libraries/log4j.xml b/jps/model-serialization/testData/sampleProject/.idea/libraries/log4j.xml
new file mode 100644
index 000000000000..909eb84ce54e
--- /dev/null
+++ b/jps/model-serialization/testData/sampleProject/.idea/libraries/log4j.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jps/model-serialization/testData/sampleProject/.idea/misc.xml b/jps/model-serialization/testData/sampleProject/.idea/misc.xml
new file mode 100644
index 000000000000..78f096fb90ba
--- /dev/null
+++ b/jps/model-serialization/testData/sampleProject/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/jps/model-serialization/testData/sampleProject/.idea/modules.xml b/jps/model-serialization/testData/sampleProject/.idea/modules.xml
new file mode 100644
index 000000000000..49067b47ab53
--- /dev/null
+++ b/jps/model-serialization/testData/sampleProject/.idea/modules.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/jps/model-serialization/testData/sampleProject/main.iml b/jps/model-serialization/testData/sampleProject/main.iml
new file mode 100644
index 000000000000..598977a75f8d
--- /dev/null
+++ b/jps/model-serialization/testData/sampleProject/main.iml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jps/model-serialization/testData/sampleProject/util/util.iml b/jps/model-serialization/testData/sampleProject/util/util.iml
new file mode 100644
index 000000000000..bde922eec436
--- /dev/null
+++ b/jps/model-serialization/testData/sampleProject/util/util.iml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java
index aa96a655b161..f937e2beaf56 100644
--- a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java
+++ b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsGlobalSerializationTest.java
@@ -1,7 +1,13 @@
package org.jetbrains.jps.model.serialization;
+import com.intellij.ide.impl.convert.JDomConvertingUtil;
+import com.intellij.openapi.util.JDOMUtil;
+import com.intellij.testFramework.PlatformTestUtil;
+import org.jdom.Element;
+import org.jdom.JDOMException;
import org.jetbrains.jps.model.library.JpsLibrary;
+import java.io.File;
import java.io.IOException;
import java.util.List;
@@ -9,8 +15,10 @@ import java.util.List;
* @author nik
*/
public class JpsGlobalSerializationTest extends JpsSerializationTestCase {
- public void testLoadSdks() throws IOException {
- JpsGlobalLoader.loadGlobalSettings(myModel.getGlobal(), getTestDataFileAbsolutePath("jps/model-serialization/testData/config/options"));
+ private static final String OPTIONS_DIR = "jps/model-serialization/testData/config/options";
+
+ public void testLoadSdks() {
+ loadGlobalSettings();
final List libraries = myModel.getGlobal().getLibraryCollection().getLibraries();
assertEquals(3, libraries.size());
assertEquals("Gant", libraries.get(0).getName());
@@ -19,4 +27,22 @@ public class JpsGlobalSerializationTest extends JpsSerializationTestCase {
final JpsLibrary sdk2 = libraries.get(2);
assertEquals("1.6", sdk2.getName());
}
+
+ public void testSaveSdks() throws JDOMException, IOException {
+ loadGlobalSettings();
+ Element actual = new Element("component").setAttribute("name", "ProjectJdkTable");
+ JpsSdkTableSerializer.saveSdks(myModel.getGlobal().getLibraryCollection(), actual);
+ File jdkTableFile = new File(getTestDataFileAbsolutePath(OPTIONS_DIR), "jdk.table.xml");
+ Element expected = JDomConvertingUtil.findComponent(JDOMUtil.loadDocument(jdkTableFile).getRootElement(), "ProjectJdkTable");
+ PlatformTestUtil.assertElementsEqual(expected, actual);
+ }
+
+ private void loadGlobalSettings() {
+ try {
+ JpsGlobalLoader.loadGlobalSettings(myModel.getGlobal(), getTestDataFileAbsolutePath(OPTIONS_DIR));
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
}
diff --git a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsModuleSerializationTest.java b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsModuleSerializationTest.java
deleted file mode 100644
index 3405abb4b311..000000000000
--- a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsModuleSerializationTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.jetbrains.jps.model.serialization;
-
-import com.intellij.openapi.application.PathManager;
-import org.jetbrains.jps.model.JpsProject;
-import org.jetbrains.jps.model.java.JpsJavaSdkType;
-import org.jetbrains.jps.model.library.JpsLibrary;
-import org.jetbrains.jps.model.module.*;
-
-import java.util.List;
-
-/**
- * @author nik
- */
-public class JpsModuleSerializationTest extends JpsSerializationTestCase {
- public void test() {
- loadProject("/jps/model-serialization/testData/iprProject/iprProject.ipr");
- final JpsModule module = assertOneElement(myModel.getProject().getModules());
- assertEquals("iprProject", module.getName());
-
- final JpsLibrary library = assertOneElement(myModel.getProject().getLibraryCollection().getLibraries());
- assertEquals("junit", library.getName());
-
- List dependencies = module.getDependenciesList().getDependencies();
- JpsSdkDependency sdkDependency = assertInstanceOf(dependencies.get(0), JpsSdkDependency.class);
- assertSame(JpsJavaSdkType.INSTANCE, sdkDependency.getSdkType());
- assertEquals("1.6", sdkDependency.getSdkReference().getLibraryName());
- assertInstanceOf(dependencies.get(1), JpsModuleSourceDependency.class);
- assertInstanceOf(dependencies.get(2), JpsLibraryDependency.class);
- assertInstanceOf(dependencies.get(3), JpsLibraryDependency.class);
- }
-
- public void _testLoadIdeaProject() {
- long start = System.currentTimeMillis();
- final JpsProject project = myModel.getProject();
- loadProject(PathManager.getHomePath());
- assertTrue(project.getModules().size() > 0);
- System.out.println("Time: " + (System.currentTimeMillis() - start));
- }
-}
diff --git a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsProjectSerializationTest.java b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsProjectSerializationTest.java
new file mode 100644
index 000000000000..0465d1dedd2c
--- /dev/null
+++ b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsProjectSerializationTest.java
@@ -0,0 +1,103 @@
+package org.jetbrains.jps.model.serialization;
+
+import com.intellij.ide.impl.convert.JDomConvertingUtil;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.testFramework.PlatformTestUtil;
+import org.jdom.Element;
+import org.jetbrains.jps.model.JpsProject;
+import org.jetbrains.jps.model.java.JpsJavaSdkType;
+import org.jetbrains.jps.model.library.JpsLibrary;
+import org.jetbrains.jps.model.module.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author nik
+ */
+public class JpsProjectSerializationTest extends JpsSerializationTestCase {
+ private static final String SAMPLE_PROJECT_PATH = "/jps/model-serialization/testData/sampleProject";
+
+ public void testLoadProject() {
+ loadProject(SAMPLE_PROJECT_PATH);
+ List modules = myModel.getProject().getModules();
+ assertEquals(2, modules.size());
+ JpsModule main = modules.get(0);
+ assertEquals("main", main.getName());
+ JpsModule util = modules.get(1);
+ assertEquals("util", util.getName());
+
+ List libraries = myModel.getProject().getLibraryCollection().getLibraries();
+ assertEquals(3, libraries.size());
+
+ List dependencies = util.getDependenciesList().getDependencies();
+ assertEquals(4, dependencies.size());
+ JpsSdkDependency sdkDependency = assertInstanceOf(dependencies.get(0), JpsSdkDependency.class);
+ assertSame(JpsJavaSdkType.INSTANCE, sdkDependency.getSdkType());
+ assertEquals("1.5", sdkDependency.getSdkReference().getLibraryName());
+ assertInstanceOf(dependencies.get(1), JpsModuleSourceDependency.class);
+ assertInstanceOf(dependencies.get(2), JpsLibraryDependency.class);
+ assertInstanceOf(dependencies.get(3), JpsLibraryDependency.class);
+ }
+
+ public void testSaveProject() {
+ loadProject(SAMPLE_PROJECT_PATH);
+ JpsModule main = myModel.getProject().getModules().get(0);
+ doTestSaveModule(main, "main.iml");
+
+ JpsModule util = myModel.getProject().getModules().get(1);
+ doTestSaveModule(util, "util/util.iml");
+
+ File[] libs = getFileInSampleProject(".idea/libraries").listFiles();
+ assertNotNull(libs);
+ for (File libFile : libs) {
+ String libName = FileUtil.getNameWithoutExtension(libFile);
+ JpsLibrary library = myModel.getProject().getLibraryCollection().findLibrary(libName);
+ assertNotNull(libName, library);
+ doTestSaveLibrary(libFile, libName, library);
+ }
+ }
+
+ private static void doTestSaveLibrary(File libFile, String libName, JpsLibrary library) {
+ try {
+ Element actual = new Element("library");
+ JpsLibraryTableSerializer.saveLibrary(library, actual, libName);
+ JpsMacroExpander
+ macroExpander = JpsProjectLoader.createProjectMacroExpander(Collections.emptyMap(), getFileInSampleProject(""));
+ Element rootElement = JpsLoaderBase.loadRootElement(libFile, macroExpander);
+ Element expected = rootElement.getChild("library");
+ PlatformTestUtil.assertElementsEqual(expected, actual);
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static void doTestSaveModule(JpsModule util, final String moduleFilePath) {
+ try {
+ Element actual = new Element("component").setAttribute("name", "NewModuleRootManager");
+ JpsModuleSerializer.saveRootModel(util, actual);
+ File utilIml = getFileInSampleProject(moduleFilePath);
+ Element rootElement = JpsLoaderBase.loadRootElement(utilIml, JpsProjectLoader.createModuleMacroExpander(Collections.emptyMap(), utilIml));
+ Element expected = JDomConvertingUtil.findComponent(rootElement, "NewModuleRootManager");
+ PlatformTestUtil.assertElementsEqual(expected, actual);
+ }
+ catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static File getFileInSampleProject(String moduleFilePath) {
+ return new File(getTestDataFileAbsolutePath(SAMPLE_PROJECT_PATH + "/" + moduleFilePath));
+ }
+
+ public void _testLoadIdeaProject() {
+ long start = System.currentTimeMillis();
+ final JpsProject project = myModel.getProject();
+ loadProject("");
+ assertTrue(project.getModules().size() > 0);
+ System.out.println("Time: " + (System.currentTimeMillis() - start));
+ }
+}
diff --git a/plugins/android/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelLoaderExtension b/plugins/android/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelLoaderExtension
deleted file mode 100644
index 9caf8f2cbf2f..000000000000
--- a/plugins/android/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelLoaderExtension
+++ /dev/null
@@ -1 +0,0 @@
-org.jetbrains.jps.android.model.impl.JpsAndroidModelLoaderExtension
\ No newline at end of file
diff --git a/plugins/android/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension b/plugins/android/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension
new file mode 100644
index 000000000000..0adb55b8c80a
--- /dev/null
+++ b/plugins/android/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension
@@ -0,0 +1 @@
+org.jetbrains.jps.android.model.impl.JpsAndroidModelSerializerExtension
\ No newline at end of file
diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidModelLoaderExtension.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidModelSerializerExtension.java
similarity index 73%
rename from plugins/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidModelLoaderExtension.java
rename to plugins/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidModelSerializerExtension.java
index b7f1b32642ea..17154a36f049 100644
--- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidModelLoaderExtension.java
+++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidModelSerializerExtension.java
@@ -23,8 +23,8 @@ import org.jetbrains.jps.android.model.JpsAndroidModuleExtension;
import org.jetbrains.jps.android.model.JpsAndroidSdkProperties;
import org.jetbrains.jps.android.model.JpsAndroidSdkType;
import org.jetbrains.jps.model.JpsElement;
-import org.jetbrains.jps.model.serialization.JpsModelLoaderExtension;
-import org.jetbrains.jps.model.serialization.JpsSdkPropertiesLoader;
+import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension;
+import org.jetbrains.jps.model.serialization.JpsSdkPropertiesSerializer;
import org.jetbrains.jps.model.serialization.facet.JpsModuleExtensionLoader;
import java.util.Arrays;
@@ -33,7 +33,7 @@ import java.util.List;
/**
* @author nik
*/
-public class JpsAndroidModelLoaderExtension extends JpsModelLoaderExtension {
+public class JpsAndroidModelSerializerExtension extends JpsModelSerializerExtension {
private static final List extends JpsModuleExtensionLoader> FACET_PROPERTIES_LOADERS =
Arrays.asList(new JpsModuleExtensionLoader(JpsAndroidModuleExtensionImpl.KIND, "android") {
@Override
@@ -44,8 +44,9 @@ public class JpsAndroidModelLoaderExtension extends JpsModelLoaderExtension {
return new JpsAndroidModuleExtensionImpl(XmlSerializer.deserialize(facetConfigurationElement, JpsAndroidModuleProperties.class), baseModulePath);
}
});
- private static final JpsSdkPropertiesLoader SDK_PROPERTIES_LOADER =
- new JpsSdkPropertiesLoader("Android SDK", JpsAndroidSdkType.INSTANCE) {
+ private static final JpsSdkPropertiesSerializer SDK_PROPERTIES_LOADER =
+ new JpsSdkPropertiesSerializer("Android SDK", JpsAndroidSdkType.INSTANCE) {
+ @NotNull
@Override
public JpsAndroidSdkProperties loadProperties(String homePath, String version, @Nullable Element propertiesElement) {
String buildTarget;
@@ -60,6 +61,18 @@ public class JpsAndroidModelLoaderExtension extends JpsModelLoaderExtension {
}
return new JpsAndroidSdkProperties(homePath, version, buildTarget, jdkName);
}
+
+ @Override
+ public void saveProperties(@NotNull JpsAndroidSdkProperties properties, @NotNull Element element) {
+ String jdkName = properties.getJdkName();
+ if (jdkName != null) {
+ element.setAttribute("jdk", jdkName);
+ }
+ String buildTarget = properties.getBuildTargetHashString();
+ if (buildTarget != null) {
+ element.setAttribute("sdk", buildTarget);
+ }
+ }
};
@Override
@@ -69,7 +82,7 @@ public class JpsAndroidModelLoaderExtension extends JpsModelLoaderExtension {
@NotNull
@Override
- public List extends JpsSdkPropertiesLoader>> getSdkPropertiesLoaders() {
+ public List extends JpsSdkPropertiesSerializer>> getSdkPropertiesLoaders() {
return Arrays.asList(SDK_PROPERTIES_LOADER);
}
}
diff --git a/plugins/devkit/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelLoaderExtension b/plugins/devkit/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelLoaderExtension
deleted file mode 100644
index c4d6e3eb7f05..000000000000
--- a/plugins/devkit/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelLoaderExtension
+++ /dev/null
@@ -1 +0,0 @@
-org.jetbrains.jps.devkit.model.impl.JpsDevKitModelLoaderExtension
\ No newline at end of file
diff --git a/plugins/devkit/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension b/plugins/devkit/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension
new file mode 100644
index 000000000000..34f5c157c462
--- /dev/null
+++ b/plugins/devkit/jps-plugin/src/META-INF/services/org.jetbrains.jps.model.serialization.JpsModelSerializerExtension
@@ -0,0 +1 @@
+org.jetbrains.jps.devkit.model.impl.JpsDevKitModelSerializerExtension
\ No newline at end of file
diff --git a/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/impl/JpsDevKitModelLoaderExtension.java b/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/impl/JpsDevKitModelSerializerExtension.java
similarity index 59%
rename from plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/impl/JpsDevKitModelLoaderExtension.java
rename to plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/impl/JpsDevKitModelSerializerExtension.java
index d5e400a69e03..6249aa61f1b4 100644
--- a/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/impl/JpsDevKitModelLoaderExtension.java
+++ b/plugins/devkit/jps-plugin/src/org/jetbrains/jps/devkit/model/impl/JpsDevKitModelSerializerExtension.java
@@ -23,10 +23,9 @@ import org.jetbrains.jps.devkit.model.JpsIdeaSdkProperties;
import org.jetbrains.jps.devkit.model.JpsIdeaSdkType;
import org.jetbrains.jps.devkit.model.JpsPluginModuleProperties;
import org.jetbrains.jps.devkit.model.JpsPluginModuleType;
-import org.jetbrains.jps.model.serialization.JpsLoaderBase;
-import org.jetbrains.jps.model.serialization.JpsModelLoaderExtension;
-import org.jetbrains.jps.model.serialization.JpsModulePropertiesLoader;
-import org.jetbrains.jps.model.serialization.JpsSdkPropertiesLoader;
+import org.jetbrains.jps.model.serialization.*;
+import org.jetbrains.jps.model.serialization.JpsModulePropertiesSerializer;
+import org.jetbrains.jps.model.serialization.JpsSdkPropertiesSerializer;
import java.util.Arrays;
import java.util.List;
@@ -34,38 +33,48 @@ import java.util.List;
/**
* @author nik
*/
-public class JpsDevKitModelLoaderExtension extends JpsModelLoaderExtension {
+public class JpsDevKitModelSerializerExtension extends JpsModelSerializerExtension {
@NotNull
@Override
- public List extends JpsModulePropertiesLoader>> getModulePropertiesLoaders() {
- return Arrays.asList(new JpsPluginModulePropertiesLoader());
+ public List extends JpsModulePropertiesSerializer>> getModulePropertiesSerializers() {
+ return Arrays.asList(new JpsPluginModulePropertiesSerializer());
}
@NotNull
@Override
- public List extends JpsSdkPropertiesLoader>> getSdkPropertiesLoaders() {
- return Arrays.asList(new JpsIdeaSdkPropertiesLoader());
+ public List extends JpsSdkPropertiesSerializer>> getSdkPropertiesLoaders() {
+ return Arrays.asList(new JpsIdeaSdkPropertiesSerializer());
}
- private static class JpsIdeaSdkPropertiesLoader extends JpsSdkPropertiesLoader {
- public JpsIdeaSdkPropertiesLoader() {
+ private static class JpsIdeaSdkPropertiesSerializer extends JpsSdkPropertiesSerializer {
+ private static final String SANDBOX_HOME_FIELD = "mySandboxHome";
+ private static final String JDK_NAME_ATTRIBUTE = "sdk";
+
+ public JpsIdeaSdkPropertiesSerializer() {
super("IDEA JDK", JpsIdeaSdkType.INSTANCE);
}
+ @NotNull
@Override
public JpsIdeaSdkProperties loadProperties(String homePath, String version, @Nullable Element propertiesElement) {
String sandboxHome = null;
String jdkName = null;
if (propertiesElement != null) {
- sandboxHome = JDOMExternalizerUtil.readField(propertiesElement, "mySandboxHome");
- jdkName = propertiesElement.getAttributeValue("sdk");
+ sandboxHome = JDOMExternalizerUtil.readField(propertiesElement, SANDBOX_HOME_FIELD);
+ jdkName = propertiesElement.getAttributeValue(JDK_NAME_ATTRIBUTE);
}
return new JpsIdeaSdkProperties(homePath, version, sandboxHome, jdkName);
}
+
+ @Override
+ public void saveProperties(@NotNull JpsIdeaSdkProperties properties, @NotNull Element element) {
+ JDOMExternalizerUtil.writeField(element, SANDBOX_HOME_FIELD, properties.getSandboxHome());
+ element.setAttribute(JDK_NAME_ATTRIBUTE, properties.getJdkName());
+ }
}
- private static class JpsPluginModulePropertiesLoader extends JpsModulePropertiesLoader {
- private JpsPluginModulePropertiesLoader() {
+ private static class JpsPluginModulePropertiesSerializer extends JpsModulePropertiesSerializer {
+ private JpsPluginModulePropertiesSerializer() {
super(JpsPluginModuleType.INSTANCE, "PLUGIN_MODULE");
}