jps: use correct classloader to load extensions and services

This commit is contained in:
nik
2012-08-17 17:15:27 +04:00
parent 3dd771a4dc
commit 6eca599fe6
5 changed files with 21 additions and 9 deletions
@@ -1,7 +1,7 @@
package org.jetbrains.jps.incremental;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.jps.idea.OwnServiceLoader;
import org.jetbrains.jps.service.JpsServiceManager;
import java.util.*;
@@ -25,9 +25,7 @@ public class BuilderRegistry {
myModuleLevelBuilders.put(category, new ArrayList<ModuleLevelBuilder>());
}
final OwnServiceLoader<BuilderService> loader = OwnServiceLoader.load(BuilderService.class);
for (BuilderService service : loader) {
for (BuilderService service : JpsServiceManager.getInstance().getExtensions(BuilderService.class)) {
myProjectLevelBuilders.addAll(service.createProjectLevelBuilders());
final List<? extends ModuleLevelBuilder> moduleLevelBuilders = service.createModuleLevelBuilders();
for (ModuleLevelBuilder builder : moduleLevelBuilders) {
@@ -5,13 +5,13 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.containers.ClassMap;
import org.jetbrains.jps.JpsPathUtil;
import org.jetbrains.jps.idea.OwnServiceLoader;
import org.jetbrains.jps.incremental.artifacts.instructions.ArtifactCompilerInstructionCreator;
import org.jetbrains.jps.incremental.artifacts.instructions.ArtifactInstructionsBuilderContext;
import org.jetbrains.jps.model.artifact.JpsArtifact;
import org.jetbrains.jps.model.artifact.elements.*;
import org.jetbrains.jps.model.java.JpsProductionModuleOutputPackagingElement;
import org.jetbrains.jps.model.java.JpsTestModuleOutputPackagingElement;
import org.jetbrains.jps.service.JpsServiceManager;
import java.io.File;
import java.util.List;
@@ -42,7 +42,7 @@ public class LayoutElementBuildersRegistry {
for (LayoutElementBuilderService<?> builder : standardBuilders) {
myBuilders.put(builder.getElementClass(), builder);
}
for (LayoutElementBuilderService builder : OwnServiceLoader.load(LayoutElementBuilderService.class)) {
for (LayoutElementBuilderService builder : JpsServiceManager.getInstance().getExtensions(LayoutElementBuilderService.class)) {
myBuilders.put(builder.getElementClass(), builder);
}
}
@@ -18,7 +18,7 @@ public abstract class JpsServiceManager {
private static final JpsServiceManager INSTANCE;
static {
INSTANCE = ServiceLoader.load(JpsServiceManager.class).iterator().next();
INSTANCE = ServiceLoader.load(JpsServiceManager.class, JpsServiceManager.class.getClassLoader()).iterator().next();
}
}
}
@@ -17,7 +17,7 @@ public class JpsServiceManagerImpl extends JpsServiceManager {
//noinspection unchecked
T service = (T)myServices.get(serviceClass);
if (service == null) {
final Iterator<T> iterator = ServiceLoader.load(serviceClass).iterator();
final Iterator<T> iterator = ServiceLoader.load(serviceClass, serviceClass.getClassLoader()).iterator();
if (!iterator.hasNext()) {
throw new ServiceConfigurationError("Implementation for " + serviceClass + " not found");
}
@@ -37,7 +37,7 @@ public class JpsServiceManagerImpl extends JpsServiceManager {
public <T> Iterable<T> getExtensions(Class<T> extensionClass) {
List<?> cached = myExtensions.get(extensionClass);
if (cached == null) {
final ServiceLoader<T> loader = ServiceLoader.load(extensionClass);
final ServiceLoader<T> loader = ServiceLoader.load(extensionClass, extensionClass.getClassLoader());
List<T> extensions = new ArrayList<T>();
for (T t : loader) {
extensions.add(t);
@@ -12,6 +12,20 @@ public class IdeaProjectLoader {
private ProjectLoadingErrorReporter errorReporter
private final XmlParser xmlParser = new XmlParser(false, false)
public static String guessHome(Script script) {
File home = new File(script["gant.file"].substring("file:".length()))
while (home != null) {
if (home.isDirectory()) {
if (new File(home, ".idea").exists()) return home.getCanonicalPath()
}
home = home.getParentFile()
}
return null
}
public static ProjectMacroExpander loadFromPath(Project project, String path, Map<String, String> pathVariables) {
return loadFromPath(project, path, pathVariables, "")
}