package ee.edio.garmin.runconfig; import com.intellij.execution.CantRunException; import com.intellij.execution.configurations.SimpleProgramParameters; import com.intellij.openapi.module.Module; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.*; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.NotNullFunction; import com.intellij.util.PathsList; import org.intellij.lang.annotations.MagicConstant; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class MonkeyParameters extends SimpleProgramParameters { public static final int SDK_ONLY = 0x1; public static final int CLASSES_ONLY = 0x2; private static final int TESTS_ONLY = 0x4; public static final int SDK_AND_CLASSES = SDK_ONLY | CLASSES_ONLY; private Sdk sdk; private final PathsList classPath = new PathsList(); public Sdk getSdk() { return sdk; } public void setSdk(Sdk sdk) { this.sdk = sdk; } public PathsList getClassPath() { return classPath; } public static Sdk getModuleSdk(final Module module) throws CantRunException { final Sdk sdk = ModuleRootManager.getInstance(module).getSdk(); if (sdk == null) { throw new CantRunException("No SDK for module " + module.getName()); } final VirtualFile homeDirectory = sdk.getHomeDirectory(); if (homeDirectory == null || !homeDirectory.isValid()) { throw CantRunException.jdkMisconfigured(sdk, module); } return sdk; } public void configureByModule(final Module module, @MagicConstant(valuesFromClass = MonkeyParameters.class) final int classPathType) throws CantRunException { final Sdk moduleSdk = getModuleSdk(module); if ((classPathType & SDK_ONLY) != 0) { if (moduleSdk == null) { throw CantRunException.noJdkConfigured(); } setSdk(moduleSdk); } if ((classPathType & CLASSES_ONLY) == 0) { return; } //setDefaultCharset(module.getProject()); configureEnumerator(OrderEnumerator.orderEntries(module).runtimeOnly().recursively(), classPathType, getSdk()).collectPaths(getClassPath()); //configureJavaLibraryPath(OrderEnumerator.orderEntries(module).recursively()); } private static OrderRootsEnumerator configureEnumerator(OrderEnumerator enumerator, @MagicConstant(valuesFromClass = MonkeyParameters.class) int classPathType, Sdk jdk) { if ((classPathType & SDK_ONLY) == 0) { enumerator = enumerator.withoutSdk(); } if ((classPathType & TESTS_ONLY) == 0) { enumerator = enumerator.productionOnly(); } OrderRootsEnumerator rootsEnumerator = enumerator.classes(); final NotNullFunction<OrderEntry, VirtualFile[]> provider = computeRootProvider(classPathType, jdk); if (provider != null) { rootsEnumerator = rootsEnumerator.usingCustomRootProvider(provider); } return rootsEnumerator; } @Nullable private static NotNullFunction<OrderEntry, VirtualFile[]> computeRootProvider(@MagicConstant(valuesFromClass = MonkeyParameters.class) int classPathType, final Sdk sdk) { return (classPathType & SDK_ONLY) == 0 ? null : new NotNullFunction<OrderEntry, VirtualFile[]>() { @NotNull @Override public VirtualFile[] fun(OrderEntry orderEntry) { if (orderEntry instanceof JdkOrderEntry) { return sdk.getRootProvider().getFiles(OrderRootType.CLASSES); } return orderEntry.getFiles(OrderRootType.CLASSES); } }; } }