blob: f0a4499b13c0e35fdf927536df45915e7050b86e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2015 Xored Software Inc 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:
* Xored Software Inc - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.rcptt.internal.launching.ext;
import static org.eclipse.rcptt.internal.launching.ext.AJConstants.OSGI_FRAMEWORK_EXTENSIONS;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
public class UpdateVMArgs {
public static String escapeCommandArg(String arg) {
if (arg == null || arg.length() == 0) {
return "\"\""; // empty string encoded
}
// escape backslashes and quotes
if (!Platform.getOS().equals(Platform.OS_WIN32))
arg = arg.replace("\\", "\\\\");
arg = arg.replace("\"", "\\\"");
return arg.contains(" ") ? String.format("\"%s\"", arg) : arg;
}
public static final Function<String, String> ESCAPE = new Function<String, String>() {
@Override
public String apply(String input) {
return escapeCommandArg(input);
}
};
public static void updateVMArgs(
ILaunchConfigurationWorkingCopy configuration) {
try {
String attribute = configuration.getAttribute(
IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, "");
String finalValue = updateAttr(attribute);
if (finalValue != null) {
configuration.setAttribute(
IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS,
finalValue);
}
} catch (CoreException e) {
Q7ExtLaunchingPlugin.getDefault().log(e);
}
}
// Adds a single argument if similar is not already present in the set
public static void addIfAbsent(List<String> target, String prefix, String value) {
if (!Iterables.any(target, new StartsWith(prefix))) {
target.add(prefix + value);
}
}
public static String updateAttr(String arguments) {
return Joiner.on(" ").join(updateAttr(Arrays.asList(DebugPlugin.parseArguments(arguments))));
}
private static String addWeavingHook(String extensions, IPluginModelBase hook) {
Preconditions.checkNotNull(hook);
String ajref = String.format("reference:file:%s", hook.getInstallLocation());
if (extensions == null) {
return ajref;
}
// otherwise split and search for a duplicate AJ hook:
StringBuilder result = new StringBuilder();
for (String extension : extensions.split(",")) {
if (extensions.contains(AJConstants.HOOK)) {
continue;
}
if (!extension.isEmpty())
result.append(extension).append(',');
}
result.append(ajref).append(',');
result.setLength(result.length() - 1);
return result.toString();
}
public static List<String> addHook(List<String> vmArguments, IPluginModelBase hook, String defaultExtensions) {
List<String> result = Lists.newArrayList(vmArguments);
final String extensionsPrefix = "-D" + OSGI_FRAMEWORK_EXTENSIONS + "=";
String extensions = "";
Iterator<String> argIter = result.iterator();
while (argIter.hasNext()) {
String argument = argIter.next();
if (argument.startsWith(extensionsPrefix)) {
extensions = argument.substring(extensionsPrefix.length());
argIter.remove();
}
}
if (extensions.isEmpty())
extensions = Strings.nullToEmpty(defaultExtensions);
result.add(extensionsPrefix + addWeavingHook(extensions, hook));
return result;
}
public static List<String> updateAttr(List<String> attribute) {
List<String> result = Lists.newArrayList(attribute);
addIfAbsent(result, "-Xmx", "512m");
addIfAbsent(result, "-XX:MaxPermSize", "=128m");
// -XstartOnFirstThread
// -Dorg.eclipse.swt.internal.carbon.smallFonts
if (Platform.getOS().equals(Platform.OS_MACOSX)) {
addIfAbsent(result, "-XstartOnFirstThread", "");
addIfAbsent(result, "-Dorg.eclipse.swt.internal.carbon.smallFonts", "");
}
return result;
}
}