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);