/*******************************************************************************
* Copyright (c) 2000, 2008 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.buckminster.jdt.launching.macosx;
import java.io.IOException;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.Plugin;
public class MacOSXLaunchingPlugin extends Plugin {
private static MacOSXLaunchingPlugin fgPlugin;
private static final String RESOURCE_BUNDLE= "org.eclipse.buckminster.jdt.launching.macosx.MacOSXLauncherMessages";//$NON-NLS-1$
private static ResourceBundle fgResourceBundle= ResourceBundle.getBundle(RESOURCE_BUNDLE);
public MacOSXLaunchingPlugin() {
super();
Assert.isTrue(fgPlugin == null);
fgPlugin= this;
}
public static MacOSXLaunchingPlugin getDefault() {
return fgPlugin;
}
static String getString(String key) {
try {
return fgResourceBundle.getString(key);
} catch (MissingResourceException e) {
return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$
}
}
/*
* Convenience method which returns the unique identifier of this plugin.
*/
static String getUniqueIdentifier() {
if (getDefault() == null) {
// If the default instance is not yet initialized,
// return a static identifier. This identifier must
// match the plugin id defined in plugin.xml
return "org.eclipse.buckminster.jdt.launching.macosx"; //$NON-NLS-1$
}
return getDefault().getBundle().getSymbolicName();
}
static String[] wrap(Class clazz, String[] cmdLine) {
for (int i= 0; i < cmdLine.length; i++) {
// test whether we depend on SWT
if (useSWT(cmdLine[i]))
return createSWTlauncher(clazz, cmdLine, cmdLine[0]);
}
return cmdLine;
}
/*
* Heuristics: returns true if given argument refers to SWT.
*/
private static boolean useSWT(String arg) {
return arg.indexOf("swt.jar") >= 0 || //$NON-NLS-1$
arg.indexOf("org.eclipse.swt") >= 0 || //$NON-NLS-1$
"-ws".equals(arg); //$NON-NLS-1$
}
/*
* Returns path to executable.
*/
static String[] createSWTlauncher(Class clazz, String[] cmdLine, String vmVersion) {
// the following property is defined if Eclipse is started via java_swt
String java_swt= System.getProperty("org.eclipse.swtlauncher"); //$NON-NLS-1$
if (java_swt == null) {
// not started via java_swt -> now we require that the VM supports the "-XstartOnFirstThread" option
String[] newCmdLine= new String[cmdLine.length+1];
int argCount= 0;
newCmdLine[argCount++]= cmdLine[0];
newCmdLine[argCount++]= "-XstartOnFirstThread"; //$NON-NLS-1$
for (int i= 1; i < cmdLine.length; i++)
newCmdLine[argCount++]= cmdLine[i];
return newCmdLine;
}
try {
// copy java_swt to /tmp in order to get the app name right
Process process= Runtime.getRuntime().exec(new String[] { "/bin/cp", java_swt, "/tmp" }); //$NON-NLS-1$ //$NON-NLS-2$
process.waitFor();
java_swt= "/tmp/java_swt"; //$NON-NLS-1$
} catch (IOException e) {
// ignore and run java_swt in place
} catch (InterruptedException e) {
// ignore and run java_swt in place
}
String[] newCmdLine= new String[cmdLine.length+1];
int argCount= 0;
newCmdLine[argCount++]= java_swt;
newCmdLine[argCount++]= "-XXvm=" + vmVersion; //$NON-NLS-1$
for (int i= 1; i < cmdLine.length; i++)
newCmdLine[argCount++]= cmdLine[i];
return newCmdLine;
}
}