mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
new project model: improved loading custom properties of elements from xml
This commit is contained in:
+25
@@ -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;
|
||||
}
|
||||
}
|
||||
+17
@@ -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);
|
||||
}
|
||||
+17
-20
@@ -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,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
|
||||
|
||||
+17
@@ -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);
|
||||
}
|
||||
+15
-19
@@ -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;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
+2
-13
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user