From f9d2d9acd95b207807a1e21aa9861bdc36acda04 Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 6 Aug 2012 17:37:14 +0400 Subject: [PATCH] new project model: saving artifacts configuration to xml --- .../jps/model/artifact/JpsArtifact.java | 4 + .../model/artifact/impl/JpsArtifactImpl.java | 15 + .../impl/JpsNamedElementReferenceBase.java | 2 +- .../JpsLibraryTableSerializer.java | 45 ++- .../JpsModelSerializerExtension.java | 11 +- .../serialization/JpsModuleSerializer.java | 47 +-- .../model/serialization/JpsProjectLoader.java | 4 +- .../artifact/JpsArtifactLoader.java | 135 -------- .../artifact/JpsArtifactSerializer.java | 325 ++++++++++++++++++ .../artifact/JpsArtifactTypeSerializer.java | 24 ++ .../artifact/JpsPackagingElementLoader.java | 21 -- .../JpsPackagingElementSerializer.java | 29 ++ .../java/JpsJavaModelSerializerExtension.java | 29 +- .../sampleProject/.idea/artifacts/dir.xml | 17 + .../sampleProject/.idea/artifacts/jar.xml | 10 + .../JpsArtifactSerializationTest.java | 58 ++++ .../JpsProjectSerializationTest.java | 6 +- 17 files changed, 563 insertions(+), 219 deletions(-) delete mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactLoader.java create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactSerializer.java create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactTypeSerializer.java delete mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsPackagingElementLoader.java create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsPackagingElementSerializer.java create mode 100644 jps/model-serialization/testData/sampleProject/.idea/artifacts/dir.xml create mode 100644 jps/model-serialization/testData/sampleProject/.idea/artifacts/jar.xml create mode 100644 jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsArtifactSerializationTest.java diff --git a/jps/model-api/src/org/jetbrains/jps/model/artifact/JpsArtifact.java b/jps/model-api/src/org/jetbrains/jps/model/artifact/JpsArtifact.java index 0fbf491a99d3..7a4526b555eb 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/artifact/JpsArtifact.java +++ b/jps/model-api/src/org/jetbrains/jps/model/artifact/JpsArtifact.java @@ -24,7 +24,11 @@ public interface JpsArtifact extends JpsNamedElement, JpsReferenceableElement TYPED_DATA_ROLE = new JpsTypedDataRole(); private String myOutputPath; + private boolean myBuildOnMake; + public JpsArtifactImpl(@NotNull String name, @NotNull JpsCompositePackagingElement rootElement, @NotNull JpsArtifactType type) { super(name); @@ -72,4 +74,17 @@ public class JpsArtifactImpl extends JpsNamedCompositeElementBase> extends JpsCompositeElementBase implements JpsElementReference { private static final JpsElementChildRole> PARENT_REFERENCE_ROLE = JpsElementChildRoleBase.create("parent"); - private final JpsElementCollectionRole myCollectionRole; + protected final JpsElementCollectionRole myCollectionRole; protected final String myElementName; protected JpsNamedElementReferenceBase(@NotNull JpsElementCollectionRole role, 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 index a16a04fc3f17..d818964503e5 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableSerializer.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableSerializer.java @@ -5,11 +5,10 @@ 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.*; import org.jetbrains.jps.model.java.JpsJavaLibraryType; import org.jetbrains.jps.model.library.*; +import org.jetbrains.jps.model.module.JpsModuleReference; import java.util.*; @@ -40,6 +39,9 @@ public class JpsLibraryTableSerializer { public void saveProperties(DummyJpsElementProperties properties, Element element) { } }; + private static final String MODULE_LEVEL = "module"; + private static final String PROJECT_LEVEL = "project"; + private static final String APPLICATION_LEVEL = "application"; public static void loadLibraries(Element libraryTableElement, JpsLibraryCollection result) { for (Element libraryElement : JDOMUtil.getChildren(libraryTableElement, LIBRARY_TAG)) { @@ -207,4 +209,41 @@ public class JpsLibraryTableSerializer { } throw new IllegalArgumentException("unknown type library:" + type); } + + 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(); + } + + public static String getLevelId(JpsElementReference reference) { + if (reference instanceof JpsModuleReference) { + return MODULE_LEVEL; + } + 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/JpsModelSerializerExtension.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java index 554fbb53449a..3ef2636b0ca3 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelSerializerExtension.java @@ -6,10 +6,10 @@ import org.jetbrains.annotations.Nullable; 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.module.JpsDependencyElement; import org.jetbrains.jps.model.module.JpsModule; -import org.jetbrains.jps.model.serialization.artifact.JpsPackagingElementLoader; +import org.jetbrains.jps.model.serialization.artifact.JpsArtifactTypeSerializer; +import org.jetbrains.jps.model.serialization.artifact.JpsPackagingElementSerializer; import org.jetbrains.jps.model.serialization.facet.JpsModuleExtensionLoader; import org.jetbrains.jps.service.JpsServiceManager; @@ -79,12 +79,11 @@ public abstract class JpsModelSerializerExtension { return Collections.emptyList(); } - public List> getPackagingElementLoaders() { + public List> getPackagingElementSerializers() { return Collections.emptyList(); } - @Nullable - public JpsArtifactType getArtifactType(@NotNull String typeId) { - return null; + public List getArtifactTypeSerializers() { + return Collections.emptyList(); } } 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 index 5072f99e9d78..eb33ef7b6ba0 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleSerializer.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleSerializer.java @@ -42,8 +42,6 @@ public class JpsModuleSerializer { 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) { @@ -84,7 +82,8 @@ public class JpsModuleSerializer { String name = orderEntry.getAttributeValue(NAME_ATTRIBUTE); String level = orderEntry.getAttributeValue(LEVEL_ATTRIBUTE); final JpsLibraryDependency dependency = - dependenciesList.addLibraryDependency(elementFactory.createLibraryReference(name, createLibraryTableReference(level))); + dependenciesList.addLibraryDependency(elementFactory.createLibraryReference(name, JpsLibraryTableSerializer + .createLibraryTableReference(level))); loadModuleDependencyProperties(dependency, orderEntry); } else if (MODULE_LIBRARY_TYPE.equals(type)) { @@ -170,14 +169,14 @@ public class JpsModuleSerializer { JpsLibrary library = reference.resolve(); String libraryName = library.getName(); JpsLibraryTableSerializer - .saveLibrary(library, libraryElement, libraryName.startsWith(GENERATED_LIBRARY_NAME_PREFIX) ? null : libraryName); + .saveLibrary(library, libraryElement, isGeneratedName(libraryName) ? 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)); + element.setAttribute(LEVEL_ATTRIBUTE, JpsLibraryTableSerializer.getLevelId(parentReference)); } rootModelElement.addContent(element); } @@ -194,6 +193,10 @@ public class JpsModuleSerializer { } } + private static boolean isGeneratedName(String libraryName) { + return libraryName.startsWith(GENERATED_LIBRARY_NAME_PREFIX); + } + private static Element createDependencyElement(final String type) { return new Element(ORDER_ENTRY_TAG).setAttribute(TYPE_ATTRIBUTE, type); } @@ -215,38 +218,4 @@ public class JpsModuleSerializer { 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 cffd93202c47..c1ff0b78b295 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 @@ -13,7 +13,7 @@ import org.jetbrains.jps.model.JpsProject; import org.jetbrains.jps.model.java.JpsJavaModuleType; 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.artifact.JpsArtifactSerializer; import org.jetbrains.jps.model.serialization.facet.JpsFacetLoader; import java.io.File; @@ -98,7 +98,7 @@ public class JpsProjectLoader extends JpsLoaderBase { } private void loadArtifacts(Element artifactManagerComponent) { - JpsArtifactLoader.loadArtifacts(myProject, artifactManagerComponent); + JpsArtifactSerializer.loadArtifacts(myProject, artifactManagerComponent); } @Nullable 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 deleted file mode 100644 index e8e117ac49ab..000000000000 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactLoader.java +++ /dev/null @@ -1,135 +0,0 @@ -package org.jetbrains.jps.model.serialization.artifact; - -import com.intellij.openapi.util.JDOMUtil; -import com.intellij.util.xmlb.XmlSerializer; -import org.jdom.Element; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.JpsCompositeElement; -import org.jetbrains.jps.model.JpsElementFactory; -import org.jetbrains.jps.model.JpsElementReference; -import org.jetbrains.jps.model.JpsProject; -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.JpsModelSerializerExtension; -import org.jetbrains.jps.model.serialization.JpsModuleSerializer; - -import java.util.Arrays; -import java.util.List; - -/** - * @author nik - */ -public class JpsArtifactLoader { - private static List> STANDARD_LOADERS = Arrays.asList(); - - public static void loadArtifacts(@NotNull JpsProject project, @Nullable Element componentElement) { - JpsArtifactService service = JpsArtifactService.getInstance(); - for (Element artifactElement : JDOMUtil.getChildren(componentElement, "artifact")) { - ArtifactState state = XmlSerializer.deserialize(artifactElement, ArtifactState.class); - if (state == null) continue; - JpsArtifactType artifactType = getArtifactType(state.getArtifactType()); - JpsPackagingElement rootElement = loadPackagingElement(state.getRootElement()); - if (rootElement != null) { - JpsArtifact artifact = service.addArtifact(project, state.getName(), (JpsCompositePackagingElement)rootElement, artifactType); - artifact.setOutputPath(state.getOutputPath()); - } - } - } - - @Nullable - private static JpsPackagingElement loadPackagingElement(Element element) { - JpsPackagingElement packagingElement = createPackagingElement(element); - if (packagingElement instanceof JpsCompositePackagingElement) { - for (Element childElement : JDOMUtil.getChildren(element, "element")) { - JpsPackagingElement child = loadPackagingElement(childElement); - if (child != null) { - ((JpsCompositePackagingElement)packagingElement).addChild(child); - } - } - } - return packagingElement; - } - - @Nullable - private static JpsPackagingElement createPackagingElement(Element element) { - String typeId = element.getAttributeValue("id"); - JpsPackagingElementFactory factory = JpsPackagingElementFactory.getInstance(); - if (typeId.equals("root")) { - return factory.createArtifactRoot(); - } - if (typeId.equals("directory")) { - return factory.createDirectory(element.getAttributeValue("name")); - } - if (typeId.equals("archive")) { - return factory.createArchive(element.getAttributeValue("name")); - } - if (typeId.equals("file-copy")) { - return factory.createFileCopy(element.getAttributeValue("path"), - element.getAttributeValue("output-file-name")); - } - if (typeId.equals("dir-copy")) { - return factory.createDirectoryCopy(element.getAttributeValue("path")); - } - if (typeId.equals("extracted-dir")) { - return factory.createExtractedDirectory(element.getAttributeValue("path"), - element.getAttributeValue("path-in-jar")); - } - if (typeId.equals("library")) { - String level = element.getAttributeValue("level"); - String libraryName = element.getAttributeValue("name"); - String moduleName = element.getAttributeValue("module-name"); - JpsElementReference parentReference; - if (moduleName != null) { - parentReference = JpsElementFactory.getInstance().createModuleReference(moduleName); - } - else { - parentReference = JpsModuleSerializer.createLibraryTableReference(level); - } - return factory.createLibraryElement(JpsElementFactory.getInstance().createLibraryReference(libraryName, parentReference)); - } - if (typeId.equals("artifact")) { - return factory.createArtifactOutput(JpsArtifactService.getInstance().createReference(element.getAttributeValue("artifact-name"))); - } - JpsPackagingElementLoader loader = findElementLoader(typeId); - if (loader != null) { - return loader.load(element); - } - return null; - } - - private static JpsArtifactType getArtifactType(@Nullable String typeId) { - if (typeId == null || "plain".equals(typeId)) { - return DirectoryArtifactType.INSTANCE; - } - if (typeId.equals("jar")) { - return JarArtifactType.INSTANCE; - } - for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) { - JpsArtifactType type = extension.getArtifactType(typeId); - if (type != null) { - return type; - } - } - return DirectoryArtifactType.INSTANCE; - } - - @Nullable - private static JpsPackagingElementLoader findElementLoader(@NotNull String typeId) { - for (JpsPackagingElementLoader loader : STANDARD_LOADERS) { - if (loader.getTypeId().equals(typeId)) { - return loader; - } - } - for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) { - for (JpsPackagingElementLoader loader : extension.getPackagingElementLoaders()) { - if (loader.getTypeId().equals(typeId)) { - return loader; - } - } - } - return null; - } -} diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactSerializer.java new file mode 100644 index 000000000000..02d23da995de --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactSerializer.java @@ -0,0 +1,325 @@ +package org.jetbrains.jps.model.serialization.artifact; + +import com.intellij.openapi.util.JDOMUtil; +import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters; +import com.intellij.util.xmlb.XmlSerializer; +import org.jdom.Element; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.JpsCompositeElement; +import org.jetbrains.jps.model.JpsElementFactory; +import org.jetbrains.jps.model.JpsElementReference; +import org.jetbrains.jps.model.JpsProject; +import org.jetbrains.jps.model.artifact.*; +import org.jetbrains.jps.model.artifact.elements.*; +import org.jetbrains.jps.model.library.JpsLibraryReference; +import org.jetbrains.jps.model.module.JpsModuleReference; +import org.jetbrains.jps.model.serialization.JpsLibraryTableSerializer; +import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension; + +/** + * @author nik + */ +public class JpsArtifactSerializer { + private static JpsPackagingElementSerializer[] STANDARD_SERIALIZERS = { + new ArtifactRootElementSerializer(), + new DirectoryElementSerializer(), + new ArchiveElementSerializer(), + new FileCopyElementSerializer(), + new DirectoryCopyElementSerializer(), + new ExtractedDirectoryElementSerializer(), + new LibraryFilesElementSerializer(), + new ArtifactOutputElementSerializer() + }; + private static final JpsArtifactTypeSerializer[] STANDARD_TYPE_SERIALIZERS = { + new JpsArtifactTypeSerializer("plain", DirectoryArtifactType.INSTANCE), + new JpsArtifactTypeSerializer("jar", JarArtifactType.INSTANCE) + }; + private static final String ELEMENT_TAG = "element"; + private static final String ID_ATTRIBUTE = "id"; + private static final SkipDefaultValuesSerializationFilters SERIALIZATION_FILTERS = new SkipDefaultValuesSerializationFilters(); + + + public static void loadArtifacts(@NotNull JpsProject project, @Nullable Element componentElement) { + JpsArtifactService service = JpsArtifactService.getInstance(); + for (Element artifactElement : JDOMUtil.getChildren(componentElement, "artifact")) { + ArtifactState state = XmlSerializer.deserialize(artifactElement, ArtifactState.class); + if (state == null) continue; + JpsArtifactType artifactType = getTypeSerializer(state.getArtifactType()).getType(); + JpsPackagingElement rootElement = loadPackagingElement(state.getRootElement()); + if (rootElement != null) { + JpsArtifact artifact = service.addArtifact(project, state.getName(), (JpsCompositePackagingElement)rootElement, artifactType); + artifact.setBuildOnMake(state.isBuildOnMake()); + artifact.setOutputPath(state.getOutputPath()); + } + } + } + + public static void saveArtifact(@NotNull JpsArtifact artifact, Element componentElement) { + ArtifactState state = new ArtifactState(); + state.setName(artifact.getName()); + state.setBuildOnMake(artifact.isBuildOnMake()); + state.setOutputPath(artifact.getOutputPath()); + state.setArtifactType(getTypeSerializer(artifact.getArtifactType()).getTypeId()); + state.setRootElement(savePackagingElement(artifact.getRootElement())); + componentElement.addContent(XmlSerializer.serialize(state, SERIALIZATION_FILTERS)); + } + + private static

Element savePackagingElement(P element) { + //noinspection unchecked + JpsPackagingElementSerializer

serializer = findElementSerializer((Class

)element.getClass()); + Element tag = new Element(ELEMENT_TAG).setAttribute(ID_ATTRIBUTE, serializer.getTypeId()); + serializer.save(element, tag); + if (element instanceof JpsCompositePackagingElement) { + for (JpsPackagingElement child : ((JpsCompositePackagingElement)element).getChildren()) { + tag.addContent(savePackagingElement(child)); + } + } + return tag; + } + + @Nullable + private static JpsPackagingElement loadPackagingElement(Element element) { + JpsPackagingElement packagingElement = createPackagingElement(element); + if (packagingElement instanceof JpsCompositePackagingElement) { + for (Element childElement : JDOMUtil.getChildren(element, ELEMENT_TAG)) { + JpsPackagingElement child = loadPackagingElement(childElement); + if (child != null) { + ((JpsCompositePackagingElement)packagingElement).addChild(child); + } + } + } + return packagingElement; + } + + @Nullable + private static JpsPackagingElement createPackagingElement(Element element) { + String typeId = element.getAttributeValue(ID_ATTRIBUTE); + JpsPackagingElementSerializer serializer = findElementSerializer(typeId); + if (serializer != null) { + return serializer.load(element); + } + return null; + } + + @Nullable + private static JpsPackagingElementSerializer findElementSerializer(@NotNull String typeId) { + for (JpsPackagingElementSerializer serializer : STANDARD_SERIALIZERS) { + if (serializer.getTypeId().equals(typeId)) { + return serializer; + } + } + for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) { + for (JpsPackagingElementSerializer serializer : extension.getPackagingElementSerializers()) { + if (serializer.getTypeId().equals(typeId)) { + return serializer; + } + } + } + return null; + } + + @NotNull + private static JpsPackagingElementSerializer findElementSerializer(@NotNull Class elementClass) { + for (JpsPackagingElementSerializer serializer : STANDARD_SERIALIZERS) { + if (serializer.getElementClass().isAssignableFrom(elementClass)) { + //noinspection unchecked + return (JpsPackagingElementSerializer)serializer; + } + } + for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) { + for (JpsPackagingElementSerializer serializer : extension.getPackagingElementSerializers()) { + if (serializer.getElementClass().isAssignableFrom(elementClass)) { + //noinspection unchecked + return (JpsPackagingElementSerializer)serializer; + } + } + } + throw new IllegalArgumentException("Serializer not found for " + elementClass); + } + + private static JpsArtifactTypeSerializer getTypeSerializer(String typeId) { + for (JpsArtifactTypeSerializer serializer : STANDARD_TYPE_SERIALIZERS) { + if (serializer.getTypeId().equals(typeId)) { + return serializer; + } + } + for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) { + for (JpsArtifactTypeSerializer serializer : extension.getArtifactTypeSerializers()) { + if (serializer.getTypeId().equals(typeId)) { + return serializer; + } + } + } + return null; + } + + private static JpsArtifactTypeSerializer getTypeSerializer(JpsArtifactType type) { + for (JpsArtifactTypeSerializer serializer : STANDARD_TYPE_SERIALIZERS) { + if (serializer.getType().equals(type)) { + return serializer; + } + } + for (JpsModelSerializerExtension extension : JpsModelSerializerExtension.getExtensions()) { + for (JpsArtifactTypeSerializer serializer : extension.getArtifactTypeSerializers()) { + if (serializer.getType().equals(type)) { + return serializer; + } + } + } + return null; + } + + private static class ArtifactRootElementSerializer extends JpsPackagingElementSerializer { + public ArtifactRootElementSerializer() { + super("root", JpsArtifactRootElement.class); + } + + @Override + public JpsArtifactRootElement load(Element element) { + return JpsPackagingElementFactory.getInstance().createArtifactRoot(); + } + + @Override + public void save(JpsArtifactRootElement element, Element tag) { + } + } + + private static class DirectoryElementSerializer extends JpsPackagingElementSerializer { + public DirectoryElementSerializer() { + super("directory", JpsDirectoryPackagingElement.class); + } + + @Override + public JpsDirectoryPackagingElement load(Element element) { + return JpsPackagingElementFactory.getInstance().createDirectory(element.getAttributeValue("name")); + } + + @Override + public void save(JpsDirectoryPackagingElement element, Element tag) { + tag.setAttribute("name", element.getDirectoryName()); + } + } + + private static class ArchiveElementSerializer extends JpsPackagingElementSerializer { + public ArchiveElementSerializer() { + super("archive", JpsArchivePackagingElement.class); + } + + @Override + public JpsArchivePackagingElement load(Element element) { + return JpsPackagingElementFactory.getInstance().createArchive(element.getAttributeValue("name")); + } + + @Override + public void save(JpsArchivePackagingElement element, Element tag) { + tag.setAttribute("name", element.getArchiveName()); + } + } + + private static class FileCopyElementSerializer extends JpsPackagingElementSerializer { + public FileCopyElementSerializer() { + super("file-copy", JpsFileCopyPackagingElement.class); + } + + @Override + public JpsFileCopyPackagingElement load(Element element) { + return JpsPackagingElementFactory.getInstance().createFileCopy(element.getAttributeValue("path"), + element.getAttributeValue("output-file-name")); + } + + @Override + public void save(JpsFileCopyPackagingElement element, Element tag) { + tag.setAttribute("path", element.getFilePath()); + String outputFileName = element.getRenamedOutputFileName(); + if (outputFileName != null) { + tag.setAttribute("output-path-name", outputFileName); + } + } + } + + private static class DirectoryCopyElementSerializer extends JpsPackagingElementSerializer { + public DirectoryCopyElementSerializer() { + super("dir-copy", JpsDirectoryCopyPackagingElement.class); + } + + @Override + public JpsDirectoryCopyPackagingElement load(Element element) { + return JpsPackagingElementFactory.getInstance().createDirectoryCopy(element.getAttributeValue("path")); + } + + @Override + public void save(JpsDirectoryCopyPackagingElement element, Element tag) { + tag.setAttribute("path", element.getDirectoryPath()); + } + } + + private static class ExtractedDirectoryElementSerializer + extends JpsPackagingElementSerializer { + public ExtractedDirectoryElementSerializer() { + super("extracted-dir", JpsExtractedDirectoryPackagingElement.class); + } + + @Override + public JpsExtractedDirectoryPackagingElement load(Element element) { + return JpsPackagingElementFactory.getInstance().createExtractedDirectory(element.getAttributeValue("path"), + element.getAttributeValue("path-in-jar")); + } + + @Override + public void save(JpsExtractedDirectoryPackagingElement element, Element tag) { + tag.setAttribute("path", element.getFilePath()); + tag.setAttribute("path-in-jar", element.getPathInJar()); + } + } + + private static class LibraryFilesElementSerializer extends JpsPackagingElementSerializer { + public LibraryFilesElementSerializer() { + super("library", JpsLibraryFilesPackagingElement.class); + } + + @Override + public JpsLibraryFilesPackagingElement load(Element element) { + String level = element.getAttributeValue("level"); + String libraryName = element.getAttributeValue("name"); + String moduleName = element.getAttributeValue("module-name"); + JpsElementReference parentReference; + if (moduleName != null) { + parentReference = JpsElementFactory.getInstance().createModuleReference(moduleName); + } + else { + parentReference = JpsLibraryTableSerializer.createLibraryTableReference(level); + } + return JpsPackagingElementFactory.getInstance() + .createLibraryElement(JpsElementFactory.getInstance().createLibraryReference(libraryName, parentReference)); + } + + @Override + public void save(JpsLibraryFilesPackagingElement element, Element tag) { + JpsLibraryReference reference = element.getLibraryReference(); + JpsElementReference parentReference = reference.getParentReference(); + tag.setAttribute("level", JpsLibraryTableSerializer.getLevelId(parentReference)); + tag.setAttribute("name", reference.getLibraryName()); + if (parentReference instanceof JpsModuleReference) { + tag.setAttribute("module-name", ((JpsModuleReference)parentReference).getModuleName()); + } + } + } + + private static class ArtifactOutputElementSerializer extends JpsPackagingElementSerializer { + public ArtifactOutputElementSerializer() { + super("artifact", JpsArtifactOutputPackagingElement.class); + } + + @Override + public JpsArtifactOutputPackagingElement load(Element element) { + return JpsPackagingElementFactory.getInstance() + .createArtifactOutput(JpsArtifactService.getInstance().createReference(element.getAttributeValue("artifact-name"))); + } + + @Override + public void save(JpsArtifactOutputPackagingElement element, Element tag) { + tag.setAttribute("artifact-name", element.getArtifactReference().getArtifactName()); + } + } +} diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactTypeSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactTypeSerializer.java new file mode 100644 index 000000000000..d694b8626190 --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsArtifactTypeSerializer.java @@ -0,0 +1,24 @@ +package org.jetbrains.jps.model.serialization.artifact; + +import org.jetbrains.jps.model.artifact.JpsArtifactType; + +/** + * @author nik + */ +public class JpsArtifactTypeSerializer { + private final String myTypeId; + private final JpsArtifactType myType; + + public JpsArtifactTypeSerializer(String typeId, JpsArtifactType type) { + myTypeId = typeId; + myType = type; + } + + public String getTypeId() { + return myTypeId; + } + + public JpsArtifactType getType() { + return myType; + } +} diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsPackagingElementLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsPackagingElementLoader.java deleted file mode 100644 index 3aca2b9751ab..000000000000 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsPackagingElementLoader.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.jetbrains.jps.model.serialization.artifact; - -import org.jdom.Element; -import org.jetbrains.jps.model.artifact.elements.JpsPackagingElement; - -/** - * @author nik - */ -public abstract class JpsPackagingElementLoader { - private final String myTypeId; - - protected JpsPackagingElementLoader(String typeId) { - myTypeId = typeId; - } - - public String getTypeId() { - return myTypeId; - } - - public abstract E load(Element element); -} diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsPackagingElementSerializer.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsPackagingElementSerializer.java new file mode 100644 index 000000000000..09698310a7e2 --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/artifact/JpsPackagingElementSerializer.java @@ -0,0 +1,29 @@ +package org.jetbrains.jps.model.serialization.artifact; + +import org.jdom.Element; +import org.jetbrains.jps.model.artifact.elements.JpsPackagingElement; + +/** + * @author nik + */ +public abstract class JpsPackagingElementSerializer { + private final String myTypeId; + private final Class myElementClass; + + protected JpsPackagingElementSerializer(String typeId, Class elementClass) { + myTypeId = typeId; + myElementClass = elementClass; + } + + public String getTypeId() { + return myTypeId; + } + + public Class getElementClass() { + return myElementClass; + } + + public abstract E load(Element element); + + public abstract void save(E element, Element tag); +} 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 index a9255e6f3482..56168d4f6289 100644 --- 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 @@ -13,7 +13,7 @@ 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 org.jetbrains.jps.model.serialization.artifact.JpsPackagingElementSerializer; import java.util.Arrays; import java.util.List; @@ -119,8 +119,8 @@ public class JpsJavaModelSerializerExtension extends JpsModelSerializerExtension } @Override - public List> getPackagingElementLoaders() { - return Arrays.asList(new JpsModuleOutputPackagingElementLoader(), new JpsTestModuleOutputPackagingElementLoader()); + public List> getPackagingElementSerializers() { + return Arrays.asList(new JpsModuleOutputPackagingElementSerializer(), new JpsTestModuleOutputPackagingElementSerializer()); } private static void loadExplodedDirectoryExtension(JpsModule module, Element rootModelComponent) { @@ -212,9 +212,10 @@ public class JpsJavaModelSerializerExtension extends JpsModelSerializerExtension return JpsJavaExtensionService.getInstance(); } - private static class JpsModuleOutputPackagingElementLoader extends JpsPackagingElementLoader { - private JpsModuleOutputPackagingElementLoader() { - super("module-output"); + private static class JpsModuleOutputPackagingElementSerializer + extends JpsPackagingElementSerializer { + private JpsModuleOutputPackagingElementSerializer() { + super("module-output", JpsProductionModuleOutputPackagingElement.class); } @Override @@ -222,11 +223,16 @@ public class JpsJavaModelSerializerExtension extends JpsModelSerializerExtension JpsModuleReference reference = JpsElementFactory.getInstance().createModuleReference(element.getAttributeValue("name")); return getService().createProductionModuleOutput(reference); } + + @Override + public void save(JpsProductionModuleOutputPackagingElement element, Element tag) { + tag.setAttribute("name", element.getModuleReference().getModuleName()); + } } - private static class JpsTestModuleOutputPackagingElementLoader extends JpsPackagingElementLoader { - private JpsTestModuleOutputPackagingElementLoader() { - super("module-test-output"); + private static class JpsTestModuleOutputPackagingElementSerializer extends JpsPackagingElementSerializer { + private JpsTestModuleOutputPackagingElementSerializer() { + super("module-test-output", JpsTestModuleOutputPackagingElement.class); } @Override @@ -234,5 +240,10 @@ public class JpsJavaModelSerializerExtension extends JpsModelSerializerExtension JpsModuleReference reference = JpsElementFactory.getInstance().createModuleReference(element.getAttributeValue("name")); return getService().createTestModuleOutput(reference); } + + @Override + public void save(JpsTestModuleOutputPackagingElement element, Element tag) { + tag.setAttribute("name", element.getModuleReference().getModuleName()); + } } } diff --git a/jps/model-serialization/testData/sampleProject/.idea/artifacts/dir.xml b/jps/model-serialization/testData/sampleProject/.idea/artifacts/dir.xml new file mode 100644 index 000000000000..bbaca161d1f9 --- /dev/null +++ b/jps/model-serialization/testData/sampleProject/.idea/artifacts/dir.xml @@ -0,0 +1,17 @@ + + + $PROJECT_DIR$/out/artifacts/dir + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jps/model-serialization/testData/sampleProject/.idea/artifacts/jar.xml b/jps/model-serialization/testData/sampleProject/.idea/artifacts/jar.xml new file mode 100644 index 000000000000..7e19ac521425 --- /dev/null +++ b/jps/model-serialization/testData/sampleProject/.idea/artifacts/jar.xml @@ -0,0 +1,10 @@ + + + $PROJECT_DIR$/out/artifacts/jar + + + + + + + \ No newline at end of file diff --git a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsArtifactSerializationTest.java b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsArtifactSerializationTest.java new file mode 100644 index 000000000000..354c7db0c690 --- /dev/null +++ b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsArtifactSerializationTest.java @@ -0,0 +1,58 @@ +package org.jetbrains.jps.model.serialization; + +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.testFramework.PlatformTestUtil; +import org.jdom.Element; +import org.jetbrains.jps.model.artifact.JpsArtifact; +import org.jetbrains.jps.model.artifact.JpsArtifactService; +import org.jetbrains.jps.model.serialization.artifact.JpsArtifactSerializer; + +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +import static org.jetbrains.jps.model.serialization.JpsProjectSerializationTest.SAMPLE_PROJECT_PATH; +import static org.jetbrains.jps.model.serialization.JpsProjectSerializationTest.getFileInSampleProject; + +/** + * @author nik + */ +public class JpsArtifactSerializationTest extends JpsSerializationTestCase { + public void testLoadProject() { + loadProject(SAMPLE_PROJECT_PATH); + List artifacts = getService().getArtifacts(myModel.getProject()); + assertEquals(2, artifacts.size()); + assertEquals("dir", artifacts.get(0).getName()); + assertEquals("jar", artifacts.get(1).getName()); + } + + public void testSaveProject() { + loadProject(SAMPLE_PROJECT_PATH); + File[] artifactFiles = getFileInSampleProject(".idea/artifacts").listFiles(); + assertNotNull(artifactFiles); + for (File file : artifactFiles) { + JpsArtifact artifact = getService().createReference(FileUtil.getNameWithoutExtension(file)).asExternal(myModel).resolve(); + assertNotNull(artifact); + doTestSaveArtifact(artifact, file); + } + } + + private static void doTestSaveArtifact(JpsArtifact artifact, File expectedFile) { + try { + Element actual = new Element("component").setAttribute("name", "ArtifactManager"); + JpsArtifactSerializer.saveArtifact(artifact, actual); + JpsMacroExpander + expander = JpsProjectLoader.createProjectMacroExpander(Collections.emptyMap(), getFileInSampleProject("")); + Element expected = JpsLoaderBase.loadRootElement(expectedFile, expander); + PlatformTestUtil.assertElementsEqual(expected, actual); + } + catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static JpsArtifactService getService() { + return JpsArtifactService.getInstance(); + } +} 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 index 0465d1dedd2c..0a48048cbbd7 100644 --- a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsProjectSerializationTest.java +++ b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsProjectSerializationTest.java @@ -18,7 +18,7 @@ import java.util.List; * @author nik */ public class JpsProjectSerializationTest extends JpsSerializationTestCase { - private static final String SAMPLE_PROJECT_PATH = "/jps/model-serialization/testData/sampleProject"; + public static final String SAMPLE_PROJECT_PATH = "/jps/model-serialization/testData/sampleProject"; public void testLoadProject() { loadProject(SAMPLE_PROJECT_PATH); @@ -89,8 +89,8 @@ public class JpsProjectSerializationTest extends JpsSerializationTestCase { } } - private static File getFileInSampleProject(String moduleFilePath) { - return new File(getTestDataFileAbsolutePath(SAMPLE_PROJECT_PATH + "/" + moduleFilePath)); + public static File getFileInSampleProject(String relativePath) { + return new File(getTestDataFileAbsolutePath(SAMPLE_PROJECT_PATH + "/" + relativePath)); } public void _testLoadIdeaProject() {