| /******************************************************************************* |
| * Copyright (c) 2000, 2014 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.core.tests.runtime; |
| |
| |
| import java.io.File; |
| import java.io.FileOutputStream; |
| import java.io.IOException; |
| import java.io.PrintWriter; |
| import java.util.Enumeration; |
| import java.util.Vector; |
| |
| import org.eclipse.jdt.core.tests.util.Util; |
| import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; |
| |
| /** |
| * A standard VM launcher launches an external standard VM with |
| * the given arguments on the same machine. |
| */ |
| @SuppressWarnings({ "rawtypes" ,"unchecked" }) |
| public class StandardVMLauncher extends LocalVMLauncher { |
| String batchFileName; |
| /** |
| * Creates a new StandardVMLauncher that launches a standard VM |
| * on the same machine. |
| */ |
| public StandardVMLauncher() { |
| super(); |
| } |
| /** |
| * Builds the actual boot class path that is going to be passed to the VM. |
| */ |
| protected String buildBootClassPath() { |
| StringBuffer bootPathString = new StringBuffer(); |
| char pathSeparator = File.pathSeparatorChar; |
| |
| if (this.bootPath != null) { |
| // Add boot class path given by client |
| int length = this.bootPath.length; |
| for (int i = 0; i < length; i++){ |
| bootPathString.append(this.bootPath[i]); |
| bootPathString.append(pathSeparator); |
| } |
| } else { |
| // Add regular rt.jar |
| bootPathString.append(this.vmPath); |
| bootPathString.append(File.separator); |
| if (!(this.vmPath.toLowerCase().endsWith("jre") || this.vmPath.toLowerCase().endsWith("jre" + File.separator))) { |
| bootPathString.append("jre"); |
| bootPathString.append(File.separator); |
| } |
| bootPathString.append("lib"); |
| bootPathString.append(File.separator); |
| bootPathString.append("rt.jar"); |
| bootPathString.append(pathSeparator); |
| } |
| |
| // Add boot class path directory if needed |
| if (this.evalTargetPath != null && TARGET_HAS_FILE_SYSTEM) { |
| bootPathString.append(this.evalTargetPath); |
| bootPathString.append(File.separatorChar); |
| bootPathString.append(BOOT_CLASSPATH_DIRECTORY); |
| } |
| |
| return bootPathString.toString(); |
| } |
| /** |
| * Returns the name of the batch file used to launch the VM. |
| */ |
| public String getBatchFileName() { |
| return this.batchFileName; |
| } |
| /** |
| * @see LocalVMLauncher#getCommandLine |
| */ |
| public String[] getCommandLine() { |
| Vector commandLine= new Vector(); |
| |
| // VM binary |
| StringBuffer vmLocation = new StringBuffer(this.vmPath); |
| vmLocation |
| .append(this.vmPath.endsWith(File.separator) ? "" : File.separator) |
| .append("bin") |
| .append(File.separator) |
| .append("java"); |
| commandLine.addElement(String.valueOf(vmLocation)); |
| |
| // VM arguments |
| if (this.vmArguments != null) { |
| for (int i = 0; i < this.vmArguments.length; i++) { |
| commandLine.addElement(this.vmArguments[i]); |
| } |
| } |
| |
| long vmVersion = Util.getMajorMinorVMVersion(); |
| if (vmVersion != -1) { |
| if (vmVersion >= ClassFileConstants.JDK1_6) { |
| commandLine.addElement("-XX:-FailOverToOldVerifier"); |
| commandLine.addElement("-Xverify:all"); |
| } |
| if (vmVersion >= ClassFileConstants.JDK1_7) { |
| commandLine.addElement("-XX:+UnlockExperimentalVMOptions"); |
| } |
| } |
| |
| // debug mode |
| if (this.debugPort != -1) { |
| commandLine.addElement("-Xdebug"); |
| commandLine.addElement("-Xnoagent"); |
| // commandLine.addElement("-Djava.compiler=NONE"); |
| commandLine.addElement( |
| "-Xrunjdwp:transport=dt_socket,address=" + |
| this.debugPort + |
| ",server=y,suspend=n"); |
| } |
| |
| // boot classpath |
| commandLine.addElement("-Xbootclasspath/a:" + buildBootClassPath()); |
| |
| // regular classpath |
| commandLine.addElement("-classpath"); |
| commandLine.addElement(buildClassPath()); |
| |
| // code snippet runner class |
| if (this.evalPort != -1) { |
| commandLine.addElement(CODE_SNIPPET_RUNNER_CLASS_NAME); |
| } |
| |
| // code snippet runner arguments |
| if (this.evalPort != -1) { |
| commandLine.addElement(EVALPORT_ARG); |
| commandLine.addElement(Integer.toString(this.evalPort)); |
| if (TARGET_HAS_FILE_SYSTEM) { |
| commandLine.addElement(CODESNIPPET_CLASSPATH_ARG); |
| commandLine.addElement(this.evalTargetPath + File.separator + REGULAR_CLASSPATH_DIRECTORY); |
| commandLine.addElement(CODESNIPPET_BOOTPATH_ARG); |
| commandLine.addElement(this.evalTargetPath + File.separator + BOOT_CLASSPATH_DIRECTORY); |
| } |
| } |
| |
| // program class |
| if (this.programClass != null) { |
| commandLine.addElement(this.programClass); |
| } |
| |
| // program arguments |
| if (this.programArguments != null) { |
| for (int i=0;i<this.programArguments.length;i++) { |
| commandLine.addElement(this.programArguments[i]); |
| } |
| } |
| |
| String[] result; |
| if (this.batchFileName!= null) { |
| // Write to batch file if specified |
| writeBatchFile(this.batchFileName, commandLine); |
| result = new String[] {this.batchFileName}; |
| } else { |
| result = new String[commandLine.size()]; |
| commandLine.copyInto(result); |
| } |
| |
| // check for spaces in result |
| for (int i = 0; i < result.length; i++) { |
| String argument = result[i]; |
| if (argument.indexOf(' ') != -1) { |
| result[i] = "\"" + argument + "\""; |
| } |
| } |
| |
| return result; |
| } |
| /** |
| * Sets the name of the batch file used to launch the VM. |
| * When this option is set, the launcher writes the command line to the given batch file, |
| * and it launches the batch file. This causes a DOS console to be opened. Note it |
| * doesn't delete the batch file when done. |
| */ |
| public void setBatchFileName(String batchFileName) { |
| this.batchFileName = batchFileName; |
| } |
| protected void writeBatchFile(String fileName, Vector commandLine) { |
| FileOutputStream output = null; |
| try { |
| output = new FileOutputStream(fileName); |
| PrintWriter out= new PrintWriter(output); |
| for (Enumeration e = commandLine.elements(); e.hasMoreElements();) { |
| out.print((String)e.nextElement()); |
| out.print(" "); |
| } |
| out.println("pause"); |
| out.close(); |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } finally { |
| if (output != null) { |
| try { |
| output.close(); |
| } catch (IOException e2) { |
| // ignore |
| } |
| } |
| } |
| } |
| } |