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 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 P loadLibraryProperties(JpsLibraryType type, Element propertiesElement) {
- return null;
+ @NotNull
+ public List 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 {
- 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;
- }
}