/**************************************************************************************
* Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. *
* http://aspectwerkz.codehaus.org *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the LGPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package org.codehaus.aspectwerkz.hook;
/**
* Starts a target process adding a dir in -Xbootclasspath/p: option <p/>Target process is launched using
* <i>$JAVA_HOME/bin/java [opt] [main] </i> <br/>and [opt] is patched to use [bootDir] in -Xbootclasspath/p: option.
* <br/>This is suitable for java 1.3. <br/>This can be use with java 1.4 to avoid running in JDWP mode.
*
* @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur </a>
*/
public class BootClasspathStarter extends AbstractStarter {
private String bootDir;
public BootClasspathStarter(String opt, String main, String bootDir) {
super(opt, main);
this.bootDir = bootDir;
patchBootclasspath();
}
/**
* add dir in first position of -Xbootclasspath/p option for target VM
*/
private void patchBootclasspath() {
// prepend dir in -Xbootclasspath/p:
if (opt.indexOf("-Xbootclasspath/p:") < 0) {
opt = "-Xbootclasspath/p:\"" + bootDir + "\" " + opt;
//todo ? is \" ok on *nix
} else {
int index = -1;
if (opt.indexOf("-Xbootclasspath/p:\"") >= 0) {
// -Xbootclasspath/p: is defined using "
index = opt.indexOf("-Xbootclasspath/p:\"") + "-Xbootclasspath/p:\"".length();
} else if (opt.indexOf("-Xbootclasspath/p:'") >= 0) {
// -Xbootclasspath/p: is defined using '
index = opt.indexOf("-Xbootclasspath/p:'") + "-Xbootclasspath/p:'".length();
} else {
// -Xbootclasspath/p: is defined without quotes
index = opt.indexOf("-Xbootclasspath/p:") + "-Xbootclasspath/p:".length();
}
StringBuffer optB = new StringBuffer("");
optB.append(opt.substring(0, index));
optB.append(bootDir);
optB.append((System.getProperty("os.name", "").toLowerCase().indexOf("windows") >= 0) ? ";" : ":");
optB.append(opt.substring(index));
opt = optB.toString();
}
}
}