From a5b44ac3955612c1a85cb7eb5c035aa52eb9635f Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 11 Jul 2012 11:30:20 +0400 Subject: [PATCH] new project model: improved loading custom properties of elements from xml --- .../JpsElementPropertiesLoader.java | 25 +++++++++++++ .../JpsLibraryPropertiesLoader.java | 17 +++++++++ .../serialization/JpsLibraryTableLoader.java | 37 +++++++++---------- .../JpsModelLoaderExtension.java | 13 +++---- .../JpsModulePropertiesLoader.java | 17 +++++++++ .../model/serialization/JpsProjectLoader.java | 34 ++++++++--------- .../serialization/JpsSdkPropertiesLoader.java | 15 +------- 7 files changed, 99 insertions(+), 59 deletions(-) create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementPropertiesLoader.java create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryPropertiesLoader.java create mode 100644 jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesLoader.java diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementPropertiesLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementPropertiesLoader.java new file mode 100644 index 000000000000..0fcbf4e1ce3a --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsElementPropertiesLoader.java @@ -0,0 +1,25 @@ +package org.jetbrains.jps.model.serialization; + +import org.jetbrains.jps.model.JpsElementProperties; +import org.jetbrains.jps.model.JpsElementType; + +/** + * @author nik + */ +public abstract class JpsElementPropertiesLoader

> { + private final String myTypeId; + private final Type myType; + + public JpsElementPropertiesLoader(Type type, String typeId) { + myType = type; + myTypeId = typeId; + } + + public String getTypeId() { + return myTypeId; + } + + public Type getType() { + return myType; + } +} 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 new file mode 100644 index 000000000000..79a083efee85 --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryPropertiesLoader.java @@ -0,0 +1,17 @@ +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/JpsLibraryTableLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableLoader.java index de9a03045139..1b65cbce8868 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableLoader.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableLoader.java @@ -3,6 +3,7 @@ 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; @@ -36,8 +37,8 @@ public class JpsLibraryTableLoader { public static JpsLibrary loadLibrary(Element libraryElement, String name) { String typeId = libraryElement.getAttributeValue("type"); - final JpsLibraryType type = getLibraryType(typeId); - JpsLibrary library = createLibrary(name, type, libraryElement.getChild("properties")); + final JpsLibraryPropertiesLoader loader = getLibraryPropertiesLoader(typeId); + JpsLibrary library = createLibrary(name, loader, libraryElement.getChild("properties")); MultiMap jarDirectories = new MultiMap(); MultiMap recursiveJarDirectories = new MultiMap(); @@ -72,19 +73,9 @@ public class JpsLibraryTableLoader { return library; } - private static

JpsLibrary createLibrary(String name, - JpsLibraryType

type, final Element propertiesElement) { - return JpsElementFactory.getInstance().createLibrary(name, type, loadProperties(type, propertiesElement)); - } - - private static

P loadProperties(JpsLibraryType

type, Element propertiesElement) { - for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) { - final P properties = extension.loadLibraryProperties(type, propertiesElement); - if (properties != null) { - return properties; - } - } - return (P)DummyJpsElementProperties.INSTANCE; + 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) { @@ -101,15 +92,21 @@ public class JpsLibraryTableLoader { return JpsOrderRootType.COMPILED; } - private static JpsLibraryType getLibraryType(String typeId) { + private static JpsLibraryPropertiesLoader getLibraryPropertiesLoader(@Nullable String typeId) { if (typeId != null) { for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) { - final JpsLibraryType type = extension.getLibraryType(typeId); - if (type != null) { - return type; + for (JpsLibraryPropertiesLoader loader : extension.getLibraryPropertiesLoaders()) { + if (loader.getTypeId().equals(typeId)) { + return loader; + } } } } - return JpsJavaLibraryType.INSTANCE; + 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/JpsModelLoaderExtension.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelLoaderExtension.java index 8d83cdfc8562..420364c6fad7 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelLoaderExtension.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModelLoaderExtension.java @@ -6,7 +6,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsCompositeElement; import org.jetbrains.jps.model.JpsElementProperties; import org.jetbrains.jps.model.JpsElementReference; -import org.jetbrains.jps.model.library.JpsLibraryType; import org.jetbrains.jps.model.library.JpsOrderRootType; import org.jetbrains.jps.model.library.JpsSdkType; import org.jetbrains.jps.model.module.JpsDependencyElement; @@ -52,14 +51,14 @@ public abstract class JpsModelLoaderExtension { return null; } - @Nullable - public JpsLibraryType getLibraryType(@NotNull String typeId) { - return null; + @NotNull + public List> getModulePropertiesLoaders() { + return Collections.emptyList(); } - @Nullable - public

P loadLibraryProperties(JpsLibraryType

type, Element propertiesElement) { - return null; + @NotNull + public List> getLibraryPropertiesLoaders() { + return Collections.emptyList(); } @NotNull diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesLoader.java new file mode 100644 index 000000000000..895d08551e46 --- /dev/null +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModulePropertiesLoader.java @@ -0,0 +1,17 @@ +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.module.JpsModuleType; + +/** + * @author nik + */ +public abstract class JpsModulePropertiesLoader

extends JpsElementPropertiesLoader> { + protected JpsModulePropertiesLoader(JpsModuleType

type, String typeId) { + super(type, typeId); + } + + public abstract P loadProperties(@Nullable Element moduleRootElement); +} 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 11726e45b786..163327d57733 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 @@ -4,6 +4,7 @@ import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.io.FileUtil; 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; @@ -11,7 +12,6 @@ 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.module.JpsModuleType; import org.jetbrains.jps.service.JpsServiceManager; import java.io.File; @@ -131,33 +131,29 @@ public class JpsProjectLoader extends JpsLoaderBase { expander.addFileHierarchyReplacements("MODULE_DIR", file.getParentFile()); final Element moduleRoot = loadRootElement(file, expander); final String typeId = moduleRoot.getAttributeValue("type"); - final JpsModuleType moduleType = getModuleType(typeId); - final JpsModule module = createModule(name, moduleRoot, moduleType); + final JpsModulePropertiesLoader loader = getModulePropertiesLoader(typeId); + final JpsModule module = createModule(name, moduleRoot, loader); JpsModuleLoader.loadRootModel(module, findComponent(moduleRoot, "NewModuleRootManager")); return module; } - private static

JpsModule createModule(String name, Element moduleRoot, JpsModuleType

moduleType) { - return JpsElementFactory.getInstance().createModule(name, moduleType, loadModuleProperties(moduleType, moduleRoot)); + private static

JpsModule createModule(String name, Element moduleRoot, JpsModulePropertiesLoader

loader) { + return JpsElementFactory.getInstance().createModule(name, loader.getType(), loader.loadProperties(moduleRoot)); } - private static

P loadModuleProperties(JpsModuleType

type, Element moduleRoot) { + private static JpsModulePropertiesLoader getModulePropertiesLoader(@NotNull String typeId) { for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) { - P properties = extension.loadModuleProperties(type, moduleRoot); - if (properties != null) { - return properties; + for (JpsModulePropertiesLoader loader : extension.getModulePropertiesLoaders()) { + if (loader.getTypeId().equals(typeId)) { + return loader; + } } } - return (P)DummyJpsElementProperties.INSTANCE; - } - - private static JpsModuleType getModuleType(@NotNull String typeId) { - for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) { - final JpsModuleType type = extension.getModuleType(typeId); - if (type != null) { - return type; + return new JpsModulePropertiesLoader(JpsJavaModuleType.INSTANCE, "JAVA_MODULE") { + @Override + public DummyJpsElementProperties loadProperties(@Nullable Element moduleRootElement) { + return DummyJpsElementProperties.INSTANCE; } - } - return JpsJavaModuleType.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/JpsSdkPropertiesLoader.java index b1cfaa0fbe71..c836987fd43c 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkPropertiesLoader.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsSdkPropertiesLoader.java @@ -8,22 +8,11 @@ import org.jetbrains.jps.model.library.JpsSdkType; /** * @author nik */ -public abstract class JpsSdkPropertiesLoader

{ - private final String myTypeId; - private final JpsSdkType

myType; +public abstract class JpsSdkPropertiesLoader

extends JpsElementPropertiesLoader> { protected JpsSdkPropertiesLoader(String typeId, JpsSdkType

type) { - myTypeId = typeId; - myType = type; + super(type, typeId); } public abstract P loadProperties(String homePath, String version, @Nullable Element propertiesElement); - - public String getTypeId() { - return myTypeId; - } - - public JpsSdkType

getType() { - return myType; - } }