new project model: improved loading custom properties of elements from xml

This commit is contained in:
nik
2012-07-12 10:44:49 +04:00
parent 20b561bd87
commit a5b44ac395
7 changed files with 99 additions and 59 deletions
@@ -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<P extends JpsElementProperties, Type extends JpsElementType<P>> {
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;
}
}
@@ -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<P extends JpsElementProperties> extends JpsElementPropertiesLoader<P, JpsLibraryType<P>> {
public JpsLibraryPropertiesLoader(JpsLibraryType<P> type, String typeId) {
super(type, typeId);
}
public abstract P loadProperties(@Nullable Element propertiesElement);
}
@@ -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<JpsOrderRootType, String> jarDirectories = new MultiMap<JpsOrderRootType, String>();
MultiMap<JpsOrderRootType, String> recursiveJarDirectories = new MultiMap<JpsOrderRootType, String>();
@@ -72,19 +73,9 @@ public class JpsLibraryTableLoader {
return library;
}
private static <P extends JpsElementProperties> JpsLibrary createLibrary(String name,
JpsLibraryType<P> type, final Element propertiesElement) {
return JpsElementFactory.getInstance().createLibrary(name, type, loadProperties(type, propertiesElement));
}
private static <P extends JpsElementProperties> P loadProperties(JpsLibraryType<P> 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 <P extends JpsElementProperties> JpsLibrary createLibrary(String name, JpsLibraryPropertiesLoader<P> 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<DummyJpsElementProperties>(JpsJavaLibraryType.INSTANCE, null) {
@Override
public DummyJpsElementProperties loadProperties(@Nullable Element propertiesElement) {
return DummyJpsElementProperties.INSTANCE;
}
};
}
}
@@ -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<JpsModulePropertiesLoader<?>> getModulePropertiesLoaders() {
return Collections.emptyList();
}
@Nullable
public <P extends JpsElementProperties> P loadLibraryProperties(JpsLibraryType<P> type, Element propertiesElement) {
return null;
@NotNull
public List<JpsLibraryPropertiesLoader<?>> getLibraryPropertiesLoaders() {
return Collections.emptyList();
}
@NotNull
@@ -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<P extends JpsElementProperties> extends JpsElementPropertiesLoader<P, JpsModuleType<P>> {
protected JpsModulePropertiesLoader(JpsModuleType<P> type, String typeId) {
super(type, typeId);
}
public abstract P loadProperties(@Nullable Element moduleRootElement);
}
@@ -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 <P extends JpsElementProperties> JpsModule createModule(String name, Element moduleRoot, JpsModuleType<P> moduleType) {
return JpsElementFactory.getInstance().createModule(name, moduleType, loadModuleProperties(moduleType, moduleRoot));
private static <P extends JpsElementProperties> JpsModule createModule(String name, Element moduleRoot, JpsModulePropertiesLoader<P> loader) {
return JpsElementFactory.getInstance().createModule(name, loader.getType(), loader.loadProperties(moduleRoot));
}
private static <P extends JpsElementProperties> P loadModuleProperties(JpsModuleType<P> 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<DummyJpsElementProperties>(JpsJavaModuleType.INSTANCE, "JAVA_MODULE") {
@Override
public DummyJpsElementProperties loadProperties(@Nullable Element moduleRootElement) {
return DummyJpsElementProperties.INSTANCE;
}
}
return JpsJavaModuleType.INSTANCE;
};
}
}
@@ -8,22 +8,11 @@ import org.jetbrains.jps.model.library.JpsSdkType;
/**
* @author nik
*/
public abstract class JpsSdkPropertiesLoader<P extends JpsSdkProperties> {
private final String myTypeId;
private final JpsSdkType<P> myType;
public abstract class JpsSdkPropertiesLoader<P extends JpsSdkProperties> extends JpsElementPropertiesLoader<P, JpsSdkType<P>> {
protected JpsSdkPropertiesLoader(String typeId, JpsSdkType<P> 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<P> getType() {
return myType;
}
}