package org.fandev.runner;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.Executor;
import com.intellij.execution.configurations.*;
import com.intellij.execution.filters.TextConsoleBuilder;
import com.intellij.execution.filters.TextConsoleBuilderFactory;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.JDOMExternalizer;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.vfs.VirtualFile;
import org.fandev.index.FanIndex;
import org.fandev.module.FanModuleType;
import org.fandev.sdk.FanSdkType;
import org.fandev.utils.FanUtil;
import org.fandev.utils.TextUtil;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
/**
* Date: Sep 5, 2009
* Time: 11:16:49 PM
*
* @author Dror Bereznitsky
*/
public abstract class FanRunConfiguration extends ModuleBasedConfiguration {
protected final ConfigurationFactory factory;
protected String myModuleName;
protected String executionParameters;
protected final FanIndex index;
public FanRunConfiguration(final String name, final RunConfigurationModule runConfigurationModule, final ConfigurationFactory factory) {
super(name, runConfigurationModule, factory);
this.factory = factory;
this.index = getProject().getComponent(FanIndex.class);
}
public RunProfileState getState(@NotNull final Executor executor, @NotNull final ExecutionEnvironment env) throws ExecutionException {
final JavaCommandLineState state = new JavaCommandLineState(env) {
protected JavaParameters createJavaParameters() throws ExecutionException {
final String outDir = getModuleOutDir();
final JavaParameters params = new JavaParameters();
params.setJdk(FanUtil.createFanJdk(getSdk()));
params.getVMParametersList().add("-Dfan.home=" + getSdk().getHomePath());
params.getVMParametersList().add("-Djava.library.path=" + FanSdkType.getExtDir(getSdk()));
params.getVMParametersList().add("-Dfan.debug=true");
params.setWorkingDirectory(outDir);
params.getClassPath().add(outDir + "/classes");
params.setMainClass(getMainClass());
setExecutable(params);
params.getProgramParametersList().addParametersString(getExecutionParameters());
params.configureByModule(getModule(), JavaParameters.CLASSES_ONLY);
return params;
}
};
final TextConsoleBuilder textConsoleBuilder = TextConsoleBuilderFactory.getInstance().createBuilder(getProject());
textConsoleBuilder.addFilter(new FanTypeFilter(getProject()));
state.setConsoleBuilder(textConsoleBuilder);
return state;
}
protected String getMainClass() {
return "fanx.tools.Fan";
}
@Override
public void readExternal(final Element element) throws InvalidDataException {
super.readExternal(element);
readModule(element);
executionParameters = JDOMExternalizer.readString(element, "parameters");
}
@Override
public void writeExternal(final Element element) throws WriteExternalException {
super.writeExternal(element);
writeModule(element);
JDOMExternalizer.write(element, "parameters", executionParameters);
}
public Collection<Module> getValidModules() {
final Module[] modules = ModuleManager.getInstance(getProject()).getModules();
final ArrayList<Module> res = new ArrayList<Module>();
for (final Module module : modules) {
if (module.getModuleType() instanceof FanModuleType) {
res.add(module);
}
}
return res;
}
public Sdk getSdk() {
final Module module = getModule();
if (module != null) {
if (FanUtil.isFanModuleType(module)) {
return ModuleRootManager.getInstance(module).getSdk();
}
}
return null;
}
@Nullable
protected Module findModuleByName(@Nullable final String name) {
if (name == null) {
return null;
}
final Module module = ModuleManager.getInstance(getProject()).findModuleByName(name);
return module != null && !module.isDisposed() ? module : null;
}
protected String getModuleOutDir() {
final VirtualFile[] outRootDirs = ModuleRootManager.getInstance(getModule()).getRootPaths(OrderRootType.CLASSES_AND_OUTPUT);
if (outRootDirs != null && outRootDirs.length > 0) {
return outRootDirs[0].getPath();
}
return null;
}
@Nullable
public Module getModule() {
return findModuleByName(myModuleName);
}
@Nullable
public String getModuleName() {
return myModuleName;
}
public void setModuleName(@Nullable final String moduleName) {
myModuleName = TextUtil.getAsNotNull(moduleName);
}
public void setModule(@Nullable final Module module) {
setModuleName(module != null ? module.getName() : null);
}
public String getExecutionParameters() {
return executionParameters;
}
public void setExecutionParameters(final String executionParameters) {
this.executionParameters = executionParameters;
}
protected abstract void setExecutable(final JavaParameters params);
}