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)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 createLibraryTableReference(String tableLevel) { return null; } + public String getLibraryTableLevelId(JpsElementReference reference) { + return null; + } + @NotNull - public List> getModulePropertiesLoaders() { + public List> getModulePropertiesSerializers() { return Collections.emptyList(); } @NotNull - public List> getLibraryPropertiesLoaders() { + public List> getLibraryPropertiesLoaders() { return Collections.emptyList(); } @NotNull - public List> getSdkPropertiesLoaders() { + public List> 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 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 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 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 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 reference = extension.createLibraryTableReference(level); + if (reference != null) { + return reference; + } + } + throw new UnsupportedOperationException(); + } + + private static String getLevelId(JpsElementReference 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> 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> 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> 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> getSdkPropertiesLoaders() { + public List> 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> getModulePropertiesLoaders() { - return Arrays.asList(new JpsPluginModulePropertiesLoader()); + public List> getModulePropertiesSerializers() { + return Arrays.asList(new JpsPluginModulePropertiesSerializer()); } @NotNull @Override - public List> getSdkPropertiesLoaders() { - return Arrays.asList(new JpsIdeaSdkPropertiesLoader()); + public List> 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"); }