From 5c2ab87b78f12411a675994bf097cccc8072bfbf Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 11 Jul 2012 10:15:34 +0400 Subject: [PATCH] new project model: fixed loading from xml --- .../jps/model/JpsElementFactory.java | 2 ++ .../jps/model/java/LanguageLevel.java | 1 + .../jps/model/impl/JpsElementFactoryImpl.java | 13 ++++++++ .../service/impl/JpsServiceManagerImpl.java | 22 ++++++++++---- .../serialization/JpsLibraryTableLoader.java | 7 +++-- .../model/serialization/JpsLoaderBase.java | 10 +++++-- .../model/serialization/JpsModuleLoader.java | 4 ++- .../model/serialization/JpsProjectLoader.java | 30 +++++++++++++++++-- 8 files changed, 73 insertions(+), 16 deletions(-) diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java index 3d56f5382e2b..5398f212c021 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java @@ -18,6 +18,8 @@ public abstract class JpsElementFactory { return JpsServiceManager.getInstance().getService(JpsElementFactory.class); } + public abstract JpsModel createModel(); + public abstract

JpsModule createModule(@NotNull String name, @NotNull JpsModuleType

type, @NotNull P properties); public abstract

JpsLibrary createLibrary(@NotNull String name, @NotNull JpsLibraryType

type, @NotNull P properties); diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/LanguageLevel.java b/jps/model-api/src/org/jetbrains/jps/model/java/LanguageLevel.java index 5cf1c66de6af..a780b1e9c254 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/java/LanguageLevel.java +++ b/jps/model-api/src/org/jetbrains/jps/model/java/LanguageLevel.java @@ -4,4 +4,5 @@ package org.jetbrains.jps.model.java; * @author nik */ public enum LanguageLevel { + JDK_1_3, JDK_1_4, JDK_1_5, JDK_1_6, JDK_1_7, JDK_1_8 } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java index d0310bbd9a7d..ce54beb8c0b4 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java @@ -19,6 +19,19 @@ import org.jetbrains.jps.model.module.impl.JpsModuleReferenceImpl; * @author nik */ public class JpsElementFactoryImpl extends JpsElementFactory { + @Override + public JpsModel createModel() { + return new JpsModelImpl(new JpsEventDispatcherBase() { + @Override + public void fireElementRenamed(@NotNull JpsNamedElement element, @NotNull String oldName, @NotNull String newName) { + } + + @Override + public void fireElementChanged(@NotNull JpsElement element) { + } + }); + } + @Override public

JpsModule createModule(@NotNull String name, @NotNull JpsModuleType

type, @NotNull P properties) { return new JpsModuleImpl(type, name, properties); diff --git a/jps/model-impl/src/org/jetbrains/jps/service/impl/JpsServiceManagerImpl.java b/jps/model-impl/src/org/jetbrains/jps/service/impl/JpsServiceManagerImpl.java index 960bcff17879..0b701a4ead7a 100644 --- a/jps/model-impl/src/org/jetbrains/jps/service/impl/JpsServiceManagerImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/service/impl/JpsServiceManagerImpl.java @@ -2,10 +2,7 @@ package org.jetbrains.jps.service.impl; import org.jetbrains.jps.service.JpsServiceManager; -import java.util.Iterator; -import java.util.List; -import java.util.ServiceConfigurationError; -import java.util.ServiceLoader; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; /** @@ -13,7 +10,7 @@ import java.util.concurrent.ConcurrentHashMap; */ public class JpsServiceManagerImpl extends JpsServiceManager { private final ConcurrentHashMap myServices = new ConcurrentHashMap(); - private final ConcurrentHashMap> myExtensions = new ConcurrentHashMap>(); + private final ConcurrentHashMap> myExtensions = new ConcurrentHashMap>(); @Override public T getService(Class serviceClass) { @@ -30,12 +27,25 @@ public class JpsServiceManagerImpl extends JpsServiceManager { "More than one implementation for " + serviceClass + " found: " + service.getClass() + " and " + iterator.next().getClass()); } myServices.putIfAbsent(serviceClass, service); + //noinspection unchecked + service = (T)myServices.get(serviceClass); } return service; } @Override public Iterable getExtensions(Class extensionClass) { - return ServiceLoader.load(extensionClass); + List cached = myExtensions.get(extensionClass); + if (cached == null) { + final ServiceLoader loader = ServiceLoader.load(extensionClass); + List extensions = new ArrayList(); + for (T t : loader) { + extensions.add(t); + } + myExtensions.putIfAbsent(extensionClass, extensions); + cached = myExtensions.get(extensionClass); + } + //noinspection unchecked + return (List)cached; } } 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 6240636aaf6f..de9a03045139 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 @@ -43,11 +43,12 @@ public class JpsLibraryTableLoader { MultiMap recursiveJarDirectories = new MultiMap(); for (Element jarDirectory : JDOMUtil.getChildren(libraryElement, "jarDirectory")) { String url = jarDirectory.getAttributeValue("url"); - String rootType = jarDirectory.getAttributeValue("type"); + String rootTypeId = jarDirectory.getAttributeValue("type"); + final JpsOrderRootType rootType = rootTypeId != null ? getRootType(rootTypeId) : JpsOrderRootType.COMPILED; boolean recursive = Boolean.parseBoolean(jarDirectory.getAttributeValue("recursive")); - jarDirectories.putValue(getRootType(rootType), url); + jarDirectories.putValue(rootType, url); if (recursive) { - recursiveJarDirectories.putValue(getRootType(rootType), url); + recursiveJarDirectories.putValue(rootType, url); } } for (Element rootsElement : JDOMUtil.getChildren(libraryElement)) { diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLoaderBase.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLoaderBase.java index ad13061cc071..fece721e2966 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLoaderBase.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLoaderBase.java @@ -21,9 +21,13 @@ public abstract class JpsLoaderBase { } protected Element loadRootElement(final File file) { + return loadRootElement(file, myMacroExpander); + } + + protected static Element loadRootElement(final File file, final JpsMacroExpander macroExpander) { try { final Element element = JDOMUtil.loadDocument(file).getRootElement(); - myMacroExpander.substitute(element, SystemInfo.isFileSystemCaseSensitive); + macroExpander.substitute(element, SystemInfo.isFileSystemCaseSensitive); return element; } catch (JDOMException e) { @@ -35,11 +39,11 @@ public abstract class JpsLoaderBase { } protected static boolean isXmlFile(File file) { - return file.isFile() && FileUtil.getNameWithoutExtension(file).equalsIgnoreCase("xml"); + return file.isFile() && FileUtil.getExtension(file.getName()).equalsIgnoreCase("xml"); } @Nullable - public static Element findComponent(Element root, String componentName) { + protected static Element findComponent(Element root, String componentName) { for (Element element : JDOMUtil.getChildren(root, "component")) { if (componentName.equals(element.getAttributeValue("name"))) { return element; diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleLoader.java index 03cee51e03d1..a2b219a017c9 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleLoader.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleLoader.java @@ -5,7 +5,9 @@ import org.jdom.Element; import org.jetbrains.jps.model.JpsCompositeElement; import org.jetbrains.jps.model.JpsElementFactory; import org.jetbrains.jps.model.JpsElementReference; -import org.jetbrains.jps.model.java.*; +import org.jetbrains.jps.model.java.JavaSourceRootProperties; +import org.jetbrains.jps.model.java.JavaSourceRootType; +import org.jetbrains.jps.model.java.JpsJavaSdkType; import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsSdkType; import org.jetbrains.jps.model.module.*; 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 024689b0df06..11726e45b786 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 @@ -16,17 +16,26 @@ import org.jetbrains.jps.service.JpsServiceManager; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; /** * @author nik */ public class JpsProjectLoader extends JpsLoaderBase { + private static final ExecutorService ourThreadPool = Executors.newFixedThreadPool(2 * Runtime.getRuntime().availableProcessors()); private final JpsProject myProject; + private final Map myPathVariables; public JpsProjectLoader(JpsProject project, Map pathVariables, File baseDir) { super(createMacroExpander(pathVariables, baseDir)); myProject = project; + myPathVariables = pathVariables; } private static JpsMacroExpander createMacroExpander(Map pathVariables, File baseDir) { @@ -95,17 +104,32 @@ public class JpsProjectLoader extends JpsLoaderBase { Element componentRoot = findComponent(root, "ProjectModuleManager"); if (componentRoot == null) return; final Element modules = componentRoot.getChild("modules"); + List> futures = new ArrayList>(); for (Element moduleElement : JDOMUtil.getChildren(modules, "module")) { final String path = moduleElement.getAttributeValue("filepath"); - JpsModule module = loadModule(path); - myProject.addModule(module); + futures.add(ourThreadPool.submit(new Callable() { + @Override + public JpsModule call() throws Exception { + return loadModule(path); + } + })); + } + try { + for (Future future : futures) { + myProject.addModule(future.get()); + } + } + catch (Exception e) { + throw new RuntimeException(e); } } private JpsModule loadModule(String path) { final File file = new File(path); String name = FileUtil.getNameWithoutExtension(file); - final Element moduleRoot = loadRootElement(file); + final JpsMacroExpander expander = new JpsMacroExpander(myPathVariables); + 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);