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); } }