/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.runner;
import com.intellij.execution.configurations.JavaParameters;
import com.intellij.openapi.compiler.ex.CompilerPathsEx;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.OrderEntry;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.PathUtil;
import gw.fs.IDirectory;
import gw.lang.reflect.module.IModule;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class GosuClasspathBuilder {
private final Sdk _gosuSdk;
private final IModule _module;
private final JavaParameters _params;
private List<String> _progClasspath;
public GosuClasspathBuilder(Sdk gosuSdk, IModule module, JavaParameters params) {
_gosuSdk = gosuSdk;
_module = module;
_params = params;
}
public void fillClasspath() {
buildClassPath();
addToClasspathFromDependentModules();
addCurrentFolderToClasspath();
}
public String getProgramClasspath() {
StringBuilder sb = new StringBuilder();
List<String> classpathList = _params.getClassPath().getPathList();
for (String path : getProgramClasspathFromDependentModules()) {
if( !classpathList.contains( path ) ) {
sb.append(path).append(','); // gosu classpath is comma delimited
}
}
return sb.toString();
}
private void addCurrentFolderToClasspath() {
_params.getClassPath().add(new File("."));
}
private void buildClassPath() {
VirtualFile[] jars = ((ProjectJdkImpl) _gosuSdk).getRoots(OrderRootType.CLASSES);
for (VirtualFile jar : jars) {
_params.getClassPath().add(jar);
}
}
private void addToClasspathFromDependentModules() {
for (String path : getProgramClasspathFromDependentModules()) {
_params.getClassPath().add(path);
}
}
private List<String> getProgramClasspathFromDependentModules() {
if (_progClasspath == null) {
List<String> progClasspath = new ArrayList<>();
for (IModule gsModule : _module.getModuleTraversalList()) {
final Module ijModule = (Module) gsModule.getNativeModule();
if (ijModule != null) {
// Add output path to classpath
for (String strOutputPath : CompilerPathsEx.getOutputPaths(new Module[]{ijModule})) {
if (!progClasspath.contains(strOutputPath)) {
progClasspath.add(strOutputPath);
}
}
// Add jar files to classpath
for (OrderEntry entry : ModuleRootManager.getInstance(ijModule).getOrderEntries()) {
for (VirtualFile vfile : entry.getFiles(OrderRootType.CLASSES)) {
String strPath = PathUtil.getLocalPath(vfile);
if (!progClasspath.contains(strPath)) {
progClasspath.add(strPath);
}
}
}
}
// Add source paths as specified in Gosu modules to classpath
for (IDirectory directory : gsModule.getSourcePath()) {
final VirtualFile file = LocalFileSystem.getInstance().findFileByIoFile(new File(directory.getPath().getPathString()));
final String strPath = PathUtil.getLocalPath(file);
if (!progClasspath.contains(strPath)) {
progClasspath.add(strPath);
}
}
}
_progClasspath = progClasspath;
}
return _progClasspath;
}
}