package jetbrains.mps.baseLanguage.execution.api;
/*Generated by MPS */
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import java.io.File;
import java.util.List;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import jetbrains.mps.execution.api.commands.CommandPart;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.ExecutionException;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.execution.api.commands.ListCommandPart;
import jetbrains.mps.execution.api.commands.KeyValueCommandPart;
import jetbrains.mps.execution.api.commands.ProcessHandlerBuilder;
import java.io.FileNotFoundException;
import org.jetbrains.mps.openapi.model.SNodeReference;
import org.jetbrains.mps.openapi.module.SRepository;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import org.jetbrains.mps.openapi.module.SModule;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.debug.api.IDebugger;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import org.apache.log4j.Level;
import jetbrains.mps.textgen.trace.TraceInfo;
import org.jetbrains.mps.util.Condition;
import jetbrains.mps.textgen.trace.TraceablePositionInfo;
import jetbrains.mps.smodel.behaviour.BHReflection;
import jetbrains.mps.core.aspects.behaviour.SMethodTrimmedId;
import java.util.Set;
import jetbrains.mps.project.facets.JavaModuleOperations;
import jetbrains.mps.project.AbstractModule;
import jetbrains.mps.smodel.ModuleRepositoryFacade;
import org.jetbrains.mps.openapi.persistence.PersistenceFacade;
import jetbrains.mps.smodel.ModelAccess;
import jetbrains.mps.util.Computable;
import org.jetbrains.annotations.Nullable;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.util.SystemProperties;
import java.util.LinkedList;
import jetbrains.mps.util.FileUtil;
import java.io.PrintWriter;
import jetbrains.mps.debug.api.run.IDebuggerConfiguration;
import jetbrains.mps.debug.api.IDebuggerSettings;
import jetbrains.mps.debugger.java.api.settings.LocalConnectionSettings;
import jetbrains.mps.debug.api.Debuggers;
import jetbrains.mps.smodel.SModelUtil_new;
import org.jetbrains.mps.openapi.model.SNodeAccessUtil;
import jetbrains.mps.smodel.SReference;
public class Java_Command {
private static final Logger LOG = LogManager.getLogger(Java_Command.class);
private File myWorkingDirectory_File = new File(".");
private String myJrePath_String = Java_Command.getJdkHome();
private String myProgramParameter_String;
private String myVirtualMachineParameter_String;
private List<String> myClassPath_ListString = ListSequence.fromList(new ArrayList<String>());
private String myDebuggerSettings_String;
private CommandPart myVirtualMachineParameter_ProcessBuilderCommandPart;
public Java_Command() {
}
public Java_Command setWorkingDirectory_File(File workingDirectory) {
if (workingDirectory != null) {
myWorkingDirectory_File = workingDirectory;
}
return this;
}
public Java_Command setJrePath_String(String jrePath) {
if (jrePath != null) {
myJrePath_String = jrePath;
}
return this;
}
public Java_Command setProgramParameter_String(String programParameter) {
if (programParameter != null) {
myProgramParameter_String = programParameter;
}
return this;
}
public Java_Command setVirtualMachineParameter_String(String virtualMachineParameter) {
if (virtualMachineParameter != null) {
myVirtualMachineParameter_String = virtualMachineParameter;
}
return this;
}
public Java_Command setClassPath_ListString(List<String> classPath) {
if (classPath != null) {
myClassPath_ListString = classPath;
}
return this;
}
public Java_Command setDebuggerSettings_String(String debuggerSettings) {
if (debuggerSettings != null) {
myDebuggerSettings_String = debuggerSettings;
}
return this;
}
public Java_Command setVirtualMachineParameter_ProcessBuilderCommandPart(CommandPart virtualMachineParameter) {
if (virtualMachineParameter != null) {
myVirtualMachineParameter_ProcessBuilderCommandPart = virtualMachineParameter;
}
return this;
}
public ProcessHandler createProcess(String className) throws ExecutionException {
return new Java_Command().setWorkingDirectory_File(myWorkingDirectory_File).setJrePath_String(myJrePath_String).setProgramParameter_String(myProgramParameter_String).setVirtualMachineParameter_String(myVirtualMachineParameter_String).setDebuggerSettings_String(myDebuggerSettings_String).createProcess(className, ListSequence.fromList(myClassPath_ListString).select(new ISelector<String, File>() {
public File select(String it) {
if (it.startsWith("\"") && it.endsWith("\"")) {
return new File(it.substring(1, it.length() - 2));
}
return new File(it);
}
}).toListSequence());
}
public ProcessHandler createProcess(String className, List<File> classPath) throws ExecutionException {
return new Java_Command().setWorkingDirectory_File(myWorkingDirectory_File).setJrePath_String(myJrePath_String).setVirtualMachineParameter_ProcessBuilderCommandPart(new ListCommandPart(ListSequence.fromListAndArray(new ArrayList(), myVirtualMachineParameter_String))).setDebuggerSettings_String(myDebuggerSettings_String).createProcess(new ListCommandPart(ListSequence.fromListAndArray(new ArrayList(), myProgramParameter_String)), className, classPath);
}
public ProcessHandler createProcess(CommandPart programParameter, String className, List<File> classPath) throws ExecutionException {
CommandPart classPathPart = new KeyValueCommandPart("-" + "classpath", new ListCommandPart(classPath, File.pathSeparator));
if ((className == null || className.length() == 0)) {
throw new ExecutionException("Classname is empty");
}
File java = Java_Command.getJavaCommand(myJrePath_String);
if (check_yvpt_a0a0d0a2(programParameter) + check_yvpt_a0a0d0a2_0(myVirtualMachineParameter_ProcessBuilderCommandPart) + classPathPart.getLength() >= Java_Command.getMaxCommandLine()) {
try {
File parametersFile = Java_Command.writeToTmpFile(programParameter.getCommandList());
File classPathFile = Java_Command.writeToTmpFile(ListSequence.fromList(classPath).select(new ISelector<File, String>() {
public String select(File it) {
return it.getAbsolutePath();
}
}));
// afaiu, next is an approach to deal with very long cp. Need to refactor to get rid of global registry use in getClassRunnerClassPath()
List<File> classRunnerClassPath = ListSequence.fromList(Java_Command.getClassRunnerClassPath()).select(new ISelector<String, File>() {
public File select(String it) {
return new File(it);
}
}).distinct().toListSequence();
return new ProcessHandlerBuilder().append(java).append(myVirtualMachineParameter_ProcessBuilderCommandPart).append(myDebuggerSettings_String).append(new KeyValueCommandPart("-" + "classpath", new ListCommandPart(classRunnerClassPath, File.pathSeparator))).append("jetbrains.mps.execution.lib.startup.ClassRunner").append(new KeyValueCommandPart("-" + ("c"), className)).append(new KeyValueCommandPart("-" + ("f"), parametersFile)).append(new KeyValueCommandPart("-" + ("p"), classPathFile)).build(myWorkingDirectory_File);
} catch (FileNotFoundException e) {
throw new ExecutionException("Could not create temporary file for program parameters and class path.", e);
}
} else {
return new ProcessHandlerBuilder().append(java).append(myVirtualMachineParameter_ProcessBuilderCommandPart).append(myDebuggerSettings_String).append(classPathPart).append(className).append(programParameter).build(myWorkingDirectory_File);
}
}
public ProcessHandler createProcess(final SNodeReference nodePointer, final SRepository repository) throws ExecutionException {
final Wrappers._T<SModule> module = new Wrappers._T<SModule>(null);
final Wrappers._T<String> errorText = new Wrappers._T<String>(null);
final Wrappers._T<List<String>> cp = new Wrappers._T<List<String>>();
final Wrappers._T<String> cn = new Wrappers._T<String>();
repository.getModelAccess().runReadAction(new Runnable() {
public void run() {
SNode resolved = check_yvpt_a0a0a4a0d(nodePointer, repository);
module.value = check_yvpt_a0b0a4a0d(check_yvpt_a0a1a0e0a3(resolved));
if (module.value == null) {
errorText.value = "Can't find module for node " + nodePointer;
} else {
cp.value = Java_Command.getClasspath(Sequence.<SModule>singleton(module.value));
cn.value = Java_Command.getClassName(resolved);
}
}
});
if (errorText.value != null) {
throw new ExecutionException(errorText.value);
}
return new Java_Command().setJrePath_String(myJrePath_String).setWorkingDirectory_File(myWorkingDirectory_File).setProgramParameter_String(myProgramParameter_String).setVirtualMachineParameter_String(myVirtualMachineParameter_String).setClassPath_ListString(cp.value).setDebuggerSettings_String(myDebuggerSettings_String).createProcess(cn.value);
}
public ProcessHandler createProcess(JavaRunParameters runParameters, SNodeReference nodePointer, SRepository repository) throws ExecutionException {
return new Java_Command().setJrePath_String(check_yvpt_a0a0a0e(runParameters)).setProgramParameter_String(check_yvpt_a3a0a0e(runParameters)).setVirtualMachineParameter_String(check_yvpt_a4a0a0e(runParameters)).setWorkingDirectory_File((isEmptyString(check_yvpt_a0a5a0a0e(runParameters)) ? null : new File(check_yvpt_a0a0f0a0a4(runParameters)))).setDebuggerSettings_String(myDebuggerSettings_String).createProcess(nodePointer, repository);
}
public static IDebugger getDebugger() {
return getDebuggerConfiguration().getDebugger();
}
public static boolean isUnitNode(SNode node) {
return isNotEmptyString(Java_Command.getClassName(node));
}
private static String getClassName(SNode node) {
SModel model = SNodeOperations.getModel(node);
SNode module = SModelOperations.getModuleStub(SNodeOperations.getModel(node));
if (model == null) {
return null;
}
if (!(SPropertyOperations.getBoolean(module, MetaAdapterFactory.getProperty(0x86ef829012bb4ca7L, 0x947f093788f263a9L, 0x5869770da61dfe1eL, 0x5869770da61dfe24L, "compileInMPS")))) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("The hosting module's " + module + " classes are not managed by MPS");
}
}
if (!(TraceInfo.hasTrace(model))) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("No trace.info found for model " + model + ". Check that model is generated.");
}
return null;
} else {
Iterable<String> unitNames = TraceInfo.unitNames(node);
if (Sequence.fromIterable(unitNames).isEmpty()) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("No unitName found for " + node + " in trace.info. Check that model is generated.");
}
return null;
} else if (Sequence.fromIterable(unitNames).count() == 1) {
return Sequence.fromIterable(unitNames).first();
} else {
return TraceInfo.unitNameWithPosition(node, new Condition<TraceablePositionInfo>() {
public boolean met(TraceablePositionInfo position) {
return (eq_kk96hj_a0a0a0a0a1a0a0b0a4a62(position.getConcept(), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbbebabf0aL, "jetbrains.mps.baseLanguage.structure.StaticMethodDeclaration"))) && (eq_kk96hj_a0a0a0a0a1a0a0b0a4a62_0(position.getPropertyString(), ((String) BHReflection.invoke(_quotation_createNode_yvpt_a0a0a0a0a0b0a0a1a0e0b(), SMethodTrimmedId.create("getTraceableProperty", null, "4pl5GY7LKmH")))));
}
});
}
}
}
private static int getMaxCommandLine() {
// the command line limit on win is 32767 characters
// (see http://blogs.msdn.com/b/oldnewthing/archive/2003/12/10/56028.aspx)
// we set the limit to 16384 (half as many) just in case
return 16384;
}
public static List<String> getClasspath(Iterable<SModule> modules) {
Set<String> classpath = JavaModuleOperations.collectExecuteClasspath(Sequence.fromIterable(modules).toListSequence().toGenericArray(SModule.class));
classpath.removeAll(((AbstractModule) ModuleRepositoryFacade.getInstance().getModule(PersistenceFacade.getInstance().createModuleReference("6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)"))).getModuleDescriptor().getAdditionalJavaStubPaths());
return new ArrayList<String>(classpath);
}
private static List<String> getClassRunnerClassPath() {
return ModelAccess.instance().runReadAction(new Computable<List<String>>() {
public List<String> compute() {
return Java_Command.getClasspath(Sequence.<SModule>singleton(ModuleRepositoryFacade.getInstance().getModule(PersistenceFacade.getInstance().createModuleReference("5b247b59-8fd0-4475-a767-9e9ff6a9d01c(jetbrains.mps.baseLanguage.execution.startup)"))));
}
});
}
public static File getJavaCommand(@Nullable String javaHome) throws ExecutionException {
if ((javaHome == null || javaHome.length() == 0) || !(new File(javaHome).exists())) {
javaHome = Java_Command.getJdkHome();
}
if ((javaHome == null || javaHome.length() == 0)) {
throw new ExecutionException("Could not find valid java home.");
}
return new File(Java_Command.getJavaCommandPath(javaHome));
}
public static String getJavaCommandPath(String javaHome) {
String result = javaHome + File.separator + "bin" + File.separator;
String java = "java";
if (SystemInfo.isMac) {
result += java;
} else
if (SystemInfo.isWindows) {
result += java + ".exe";
} else {
result += java;
}
return result;
}
public static List<String> getJavaHomes() {
String systemJavaHome = SystemProperties.getJavaHome();
List<String> homes = ListSequence.fromList(new LinkedList<String>());
String systemJdkHome = systemJavaHome.substring(0, systemJavaHome.length() - "/jre".length());
if (systemJavaHome.endsWith("jre") && new File(systemJdkHome + File.separator + "bin").exists()) {
ListSequence.fromList(homes).addElement(systemJdkHome);
}
if (isNotEmptyString(System.getenv("JAVA_HOME"))) {
ListSequence.fromList(homes).addElement(System.getenv("JAVA_HOME"));
}
ListSequence.fromList(homes).addElement(systemJavaHome);
return homes;
}
public static String getJdkHome() {
List<String> homes = Java_Command.getJavaHomes();
for (String javaHome : homes) {
if (new File(Java_Command.getJavaCommandPath(javaHome)).exists()) {
return javaHome;
}
}
return null;
}
public static String protect(String result) {
if (result.contains(" ")) {
return "\"" + result + "\"";
}
return result;
}
private static File writeToTmpFile(Iterable<String> text) throws FileNotFoundException {
File tmpFile = FileUtil.createTmpFile();
tmpFile.deleteOnExit();
PrintWriter writer = new PrintWriter(tmpFile);
for (String line : text) {
writer.println(line);
}
writer.flush();
writer.close();
return tmpFile;
}
public static IDebuggerConfiguration getDebuggerConfiguration() {
return new IDebuggerConfiguration() {
@Nullable
public IDebuggerSettings createDebuggerSettings() {
return new LocalConnectionSettings(true);
}
public IDebugger getDebugger() {
return Debuggers.getInstance().getDebuggerByName("Java");
}
};
}
private static int check_yvpt_a0a0d0a2(CommandPart checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.getLength();
}
return 0;
}
private static int check_yvpt_a0a0d0a2_0(CommandPart checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.getLength();
}
return 0;
}
private static SNode check_yvpt_a0a0a4a0d(SNodeReference checkedDotOperand, SRepository repository) {
if (null != checkedDotOperand) {
return checkedDotOperand.resolve(repository);
}
return null;
}
private static SModule check_yvpt_a0b0a4a0d(SModel checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.getModule();
}
return null;
}
private static SModel check_yvpt_a0a1a0e0a3(SNode checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.getModel();
}
return null;
}
private static String check_yvpt_a0a0a0e(JavaRunParameters checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.getAlternativeJre();
}
return null;
}
private static String check_yvpt_a3a0a0e(JavaRunParameters checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.programParameters();
}
return null;
}
private static String check_yvpt_a4a0a0e(JavaRunParameters checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.vmOptions();
}
return null;
}
private static String check_yvpt_a0a0f0a0a4(JavaRunParameters checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.workingDirectory();
}
return null;
}
private static String check_yvpt_a0a5a0a0e(JavaRunParameters checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.workingDirectory();
}
return null;
}
private static SNode _quotation_createNode_yvpt_a0a0a0a0a0b0a0a1a0e0b() {
PersistenceFacade facade = PersistenceFacade.getInstance();
SNode quotedNode_1 = null;
SNode quotedNode_2 = null;
SNode quotedNode_3 = null;
SNode quotedNode_4 = null;
SNode quotedNode_5 = null;
SNode quotedNode_6 = null;
SNode quotedNode_7 = null;
quotedNode_1 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(MetaAdapterFactory.getLanguage(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, "jetbrains.mps.baseLanguage"), 0xfbbebabf0aL, "StaticMethodDeclaration"), null, null, false);
SNodeAccessUtil.setProperty(quotedNode_1, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"), "main");
quotedNode_2 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(MetaAdapterFactory.getLanguage(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, "jetbrains.mps.baseLanguage"), 0xf8cc6bf96dL, "VoidType"), null, null, false);
quotedNode_1.addChild(MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1fdL, "returnType"), quotedNode_2);
quotedNode_3 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(MetaAdapterFactory.getLanguage(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, "jetbrains.mps.baseLanguage"), 0x10af9581ff1L, "PublicVisibility"), null, null, false);
quotedNode_1.addChild(MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x112670d273fL, 0x112670d886aL, "visibility"), quotedNode_3);
quotedNode_4 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(MetaAdapterFactory.getLanguage(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, "jetbrains.mps.baseLanguage"), 0xf8cc56b200L, "StatementList"), null, null, false);
quotedNode_1.addChild(MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1ffL, "body"), quotedNode_4);
quotedNode_5 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(MetaAdapterFactory.getLanguage(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, "jetbrains.mps.baseLanguage"), 0xf8c77f1e94L, "ParameterDeclaration"), null, null, false);
SNodeAccessUtil.setProperty(quotedNode_5, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"), "args");
quotedNode_6 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(MetaAdapterFactory.getLanguage(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, "jetbrains.mps.baseLanguage"), 0xf940d819f7L, "ArrayType"), null, null, false);
quotedNode_7 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(MetaAdapterFactory.getLanguage(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, "jetbrains.mps.baseLanguage"), 0x101de48bf9eL, "ClassifierType"), null, null, false);
quotedNode_7.setReference(MetaAdapterFactory.getReferenceLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, 0x101de490babL, "classifier"), SReference.create(MetaAdapterFactory.getReferenceLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, 0x101de490babL, "classifier"), quotedNode_7, facade.createModelReference("6354ebe7-c22a-4a0f-ac54-50b52ab9b065/java:java.lang(JDK/)"), facade.createNodeId("~String")));
quotedNode_6.addChild(MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf940d819f7L, 0xf940d819f8L, "componentType"), quotedNode_7);
quotedNode_5.addChild(MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x450368d90ce15bc3L, 0x4ed4d318133c80ceL, "type"), quotedNode_6);
quotedNode_1.addChild(MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1feL, "parameter"), quotedNode_5);
return quotedNode_1;
}
private static boolean isEmptyString(String str) {
return str == null || str.length() == 0;
}
private static boolean isNotEmptyString(String str) {
return str != null && str.length() > 0;
}
private static boolean eq_kk96hj_a0a0a0a0a1a0a0b0a4a62(Object a, Object b) {
return (a != null ? a.equals(b) : a == b);
}
private static boolean eq_kk96hj_a0a0a0a0a1a0a0b0a4a62_0(Object a, Object b) {
return (a != null ? a.equals(b) : a == b);
}
}