alternative jre schould provide not only executable but also jars (IDEA-55638)

This commit is contained in:
anna
2010-07-06 13:04:33 +04:00
parent c0f2332e09
commit 2b3f7eb255
4 changed files with 52 additions and 14 deletions
@@ -21,10 +21,11 @@ import com.intellij.openapi.actionSystem.DataKey;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.OrderEnumerator;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.encoding.EncodingProjectManager;
import com.intellij.util.PairFunction;
import org.jetbrains.annotations.Nullable;
import java.nio.charset.Charset;
@@ -64,15 +65,22 @@ public class JavaParameters extends SimpleJavaParameters {
}
setDefaultCharset(module.getProject());
configureJdkAccordingToJreSelected(jdk);
configureEnumerator(OrderEnumerator.orderEntries(module).runtimeOnly().recursively().withoutSdk(), classPathType).collectPaths(getClassPath());
final PairFunction<OrderEntry, OrderRootType, VirtualFile[]> substitutor = computeSubstitutor(classPathType, jdk);
configureEnumerator(OrderEnumerator.orderEntries(module).runtimeOnly().recursively().substituteFiles(substitutor)
, classPathType).classes().collectPaths(getClassPath());
}
private void configureJdkAccordingToJreSelected(Sdk jdk) {
final Sdk currentJdk = getJdk();
if (currentJdk != null) {
getClassPath().addVirtualFiles(jdk.getRootProvider().getFiles(OrderRootType.CLASSES));
}
@Nullable
private static PairFunction<OrderEntry, OrderRootType, VirtualFile[]> computeSubstitutor(int classPathType, final Sdk jdk) {
return (classPathType & JDK_ONLY) == 0 ? null : new PairFunction<OrderEntry, OrderRootType, VirtualFile[]>() {
@Override
public VirtualFile[] fun(OrderEntry orderEntry, OrderRootType orderRootType) {
if (orderEntry instanceof JdkOrderEntry) {
return jdk.getRootProvider().getFiles(orderRootType);
}
return orderEntry.getFiles(orderRootType);
}
};
}
public void setDefaultCharset(final Project project) {
@@ -109,9 +117,8 @@ public class JavaParameters extends SimpleJavaParameters {
if ((classPathType & CLASSES_ONLY) == 0) {
return;
}
configureJdkAccordingToJreSelected(getJdk());
configureEnumerator(OrderEnumerator.orderEntries(project).runtimeOnly().withoutSdk(), classPathType).collectPaths(getClassPath());
final PairFunction<OrderEntry, OrderRootType, VirtualFile[]> substitutor = computeSubstitutor(classPathType, jdk);
configureEnumerator(OrderEnumerator.orderEntries(project).runtimeOnly().substituteFiles(substitutor), classPathType).classes().collectPaths(getClassPath());
}
private static OrderEnumerator configureEnumerator(OrderEnumerator enumerator, int classPathType) {
@@ -21,6 +21,7 @@ import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.PairFunction;
import com.intellij.util.PathsList;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
@@ -188,4 +189,7 @@ public abstract class OrderEnumerator {
public static OrderEnumerator orderEntries(@NotNull Project project) {
return ProjectRootManager.getInstance(project).orderEntries();
}
public abstract OrderEnumerator substituteFiles(PairFunction<OrderEntry, OrderRootType, VirtualFile[]> substitutor);
public abstract OrderEnumerator substituteUrls(PairFunction<OrderEntry, OrderRootType, String[]> substitutor);
}
@@ -24,6 +24,7 @@ import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.util.PairFunction;
import com.intellij.util.Processor;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
@@ -51,6 +52,8 @@ abstract class OrderEnumeratorBase extends OrderEnumerator {
private boolean myRecursivelyExportedOnly;
private boolean myExportedOnly;
private Condition<OrderEntry> myCondition;
private PairFunction<OrderEntry, OrderRootType, VirtualFile[]> myFileSubstitutor;
private PairFunction<OrderEntry, OrderRootType, String[]> myUrlsSubstitutor;
private List<OrderEnumerationHandler> myCustomHandlers;
private ModulesProvider myModulesProvider;
private OrderRootsCache myCache;
@@ -138,6 +141,18 @@ abstract class OrderEnumeratorBase extends OrderEnumerator {
return this;
}
@Override
public OrderEnumerator substituteFiles(PairFunction<OrderEntry, OrderRootType, VirtualFile[]> substitutor) {
myFileSubstitutor = substitutor;
return this;
}
@Override
public OrderEnumerator substituteUrls(PairFunction<OrderEntry, OrderRootType, String[]> substitutor) {
myUrlsSubstitutor = substitutor;
return this;
}
@Override
public OrderRootsEnumerator classes() {
return new OrderRootsEnumeratorImpl(this, OrderRootType.CLASSES);
@@ -306,6 +321,18 @@ abstract class OrderEnumeratorBase extends OrderEnumerator {
return false;
}
@NotNull
public VirtualFile[] substituteFiles(OrderEntry orderEntry, OrderRootType rootType) {
if (myFileSubstitutor != null) return myFileSubstitutor.fun(orderEntry, rootType);
return orderEntry.getFiles(rootType);
}
@NotNull
public String[] substituteUrls(OrderEntry orderEntry, OrderRootType rootType) {
if (myUrlsSubstitutor != null) return myUrlsSubstitutor.fun(orderEntry, rootType);
return orderEntry.getUrls(rootType);
}
private class OrderEntryProcessor<R> implements Processor<OrderEntry> {
private R myValue;
private final RootPolicy<R> myPolicy;
@@ -97,7 +97,7 @@ public class OrderRootsEnumeratorImpl implements OrderRootsEnumerator {
}
}
else {
Collections.addAll(result, orderEntry.getFiles(myRootType));
Collections.addAll(result, myOrderEnumerator.substituteFiles(orderEntry, myRootType));
}
return true;
}
@@ -124,7 +124,7 @@ public class OrderRootsEnumeratorImpl implements OrderRootsEnumerator {
}
}
else {
Collections.addAll(result, orderEntry.getUrls(myRootType));
Collections.addAll(result, myOrderEnumerator.substituteUrls(orderEntry, myRootType));
}
return true;
}