Java tutorial
/******************************************************************************* * 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; } }