package org.argeo.slc.ide.ui.launch.osgi;
+import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
+import org.eclipse.core.variables.IStringVariableManager;
+import org.eclipse.core.variables.VariablesPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.IVMInstall2;
import org.eclipse.jdt.launching.IVMInstallType;
import org.eclipse.jdt.launching.JavaRuntime;
+import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.pde.ui.launcher.IPDELauncherConstants;
+import org.eclipse.pde.ui.launcher.OSGiLaunchConfigurationInitializer;
+import org.eclipse.swt.widgets.Display;
-public class OsgiLaunchHelper {
+public class OsgiLaunchHelper implements OsgiLauncherConstants {
private static Boolean debug = false;
+ /** Expect properties file to be set as mapped resources */
+ public static void updateLaunchConfiguration(
+ ILaunchConfigurationWorkingCopy configuration) {
+ try {
+ IFile propertiesFile = (IFile) configuration.getMappedResources()[0];
+
+ Properties properties = OsgiLaunchHelper
+ .readProperties(propertiesFile);
+
+ List<String> bundlesToStart = new ArrayList<String>();
+ Map<String, String> systemPropertiesToAppend = new HashMap<String, String>();
+ OsgiLaunchHelper.interpretProperties(properties, bundlesToStart,
+ systemPropertiesToAppend);
+
+ // Reinitialize using standard OSGi launch shortcut
+ // Kind of a hack but it lacks extension capabilities and it is
+ // still
+ // cleaner than forking the code (which would imply a lot of fork
+ // indeed
+ // because of all the internal classes)
+ // new OSGiLaunchShortcut() {
+ // @Override
+ // public void initializeConfiguration(
+ // ILaunchConfigurationWorkingCopy configuration) {
+ // // TODO Auto-generated method stub
+ // super.initializeConfiguration(configuration);
+ // }
+ // }.initializeConfiguration(configuration);
+
+ // initializeConfiguration(configuration);
+
+ File workingDir = getWorkingDirectory(configuration);
+ File dataDir = new File(workingDir, "data");
+
+ OsgiLaunchHelper.updateLaunchConfiguration(configuration,
+ bundlesToStart, systemPropertiesToAppend, dataDir
+ .getAbsolutePath());
+ } catch (Exception e) {
+ ErrorDialog.openError(Display.getCurrent().getActiveShell(),
+ "Error", "Cannot read properties",
+ new Status(IStatus.ERROR, SlcIdeUiPlugin.ID,
+ e.getMessage(), e));
+ return;
+ }
+ }
+
public static void updateLaunchConfiguration(
ILaunchConfigurationWorkingCopy configuration,
List<String> bundlesToStart,
- Map<String, String> systemPropertiesToAppend, String dir)
+ Map<String, String> systemPropertiesToAppend, String dataDir)
throws CoreException {
// Convert bundle lists
String targetBundles = configuration.getAttribute(
// Update other default information
configuration.setAttribute(IPDELauncherConstants.DEFAULT_AUTO_START,
false);
- configuration.setAttribute(IPDELauncherConstants.CONFIG_CLEAR_AREA,
- true);
String defaultVmArgs = configuration.getAttribute(
OsgiLauncherConstants.ATTR_DEFAULT_VM_ARGS, "");
StringBuffer vmArgs = new StringBuffer(defaultVmArgs);
- vmArgs.append(" -Xmx256m");
+ vmArgs.append(" "
+ + configuration.getAttribute(ATTR_ADDITIONAL_VM_ARGS, ""));
// Add locations of JVMs
+ if (configuration.getAttribute(ATTR_ADD_JVM_PATHS, false))
+ addVms(vmArgs);
+
+ // Add other system properties
+ for (String key : systemPropertiesToAppend.keySet())
+ addSysProperty(vmArgs, key, systemPropertiesToAppend.get(key));
+
+ if (dataDir != null)
+ addSysProperty(vmArgs, OsgiLauncherConstants.ARGEO_OSGI_DATA_DIR,
+ dataDir);
+
+ configuration.setAttribute(
+ IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, vmArgs
+ .toString());
+
+ // Program arguments
+ StringBuffer progArgs = new StringBuffer(configuration.getAttribute(
+ OsgiLauncherConstants.ATTR_ADDITIONAL_PROGRAM_ARGS, ""));
+ if (dataDir != null) {
+ progArgs.append(" -data ");
+ progArgs.append(surroundSpaces(dataDir));
+ }
+ configuration.setAttribute(
+ IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS,
+ progArgs.toString());
+
+ // String dir = findWorkingDirectory();
+
+ }
+
+ protected static void addVms(StringBuffer vmArgs) {
addVmSysProperty(vmArgs, "default", JavaRuntime.getDefaultVMInstall());
IVMInstallType[] vmTypes = JavaRuntime.getVMInstallTypes();
for (IVMInstallType vmType : vmTypes) {
}
}
- // Add other system properties
- for (String key : systemPropertiesToAppend.keySet())
- addSysProperty(vmArgs, key, systemPropertiesToAppend.get(key));
-
- configuration.setAttribute(
- IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, vmArgs
- .toString());
-
- // String dir = findWorkingDirectory();
- if (dir != null)
- configuration.setAttribute(
- IJavaLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY,
- dir);
-
}
protected static void addVmSysProperty(StringBuffer vmArgs, String suffix,
protected static void addSysProperty(StringBuffer vmArgs, String key,
String value) {
+ surroundSpaces(value);
String str = "-D" + key + "=" + value;
- if (str.contains(" "))
- str = "\"" + str + "\"";
+ // surroundSpaces(str);
vmArgs.append(" " + str);
}
+ protected static String surroundSpaces(String str) {
+ if (str.indexOf(' ') >= 0)
+ return '\"' + str + '\"';
+ else
+ return str;
+ }
+
protected static String convertBundleList(List<String> bundlesToStart,
String original) {
StringBuffer bufBundles = new StringBuffer(1024);
StringTokenizer stComa = new StringTokenizer(original, ",");
boolean first = true;
- while (stComa.hasMoreTokens()) {
+ bundles: while (stComa.hasMoreTokens()) {
if (first)
first = false;
else
bufBundles.append(',');
- String tkComa = stComa.nextToken();
- int indexAt = tkComa.indexOf('@');
+ String bundleId = stComa.nextToken();
+ int indexAt = bundleId.indexOf('@');
boolean modified = false;
if (indexAt >= 0) {
- String bundelId = tkComa.substring(0, indexAt);
-
- if (bundlesToStart.contains(bundelId)) {
- bufBundles.append(bundelId).append('@').append(
- "default:true");
- modified = true;
- if (debug)
- System.out.println("Will start " + bundelId);
- }
+ bundleId = bundleId.substring(0, indexAt);
+ }
+
+ if (bundleId.endsWith(".source")) {
+ if (debug)
+ System.out.println("Skip source bundle " + bundleId);
+ continue bundles;
+ }
+
+ if (bundlesToStart.contains(bundleId)) {
+ bufBundles.append(bundleId).append('@').append("default:true");
+ modified = true;
+ if (debug)
+ System.out.println("Will start " + bundleId);
}
if (!modified)
- bufBundles.append(tkComa);
+ bufBundles.append(bundleId);
}
String output = bufBundles.toString();
return output;
Map<String, String> systemPropertiesToAppend) {
String argeoOsgiStart = properties
.getProperty(OsgiLauncherConstants.ARGEO_OSGI_START);
- StringTokenizer st = new StringTokenizer(argeoOsgiStart, ",");
- while (st.hasMoreTokens())
- bundlesToStart.add(st.nextToken());
+ if (argeoOsgiStart != null) {
+ StringTokenizer st = new StringTokenizer(argeoOsgiStart, ",");
+ while (st.hasMoreTokens())
+ bundlesToStart.add(st.nextToken());
+ }
propKeys: for (Object keyObj : properties.keySet()) {
String key = keyObj.toString();
}
}
+
+ // Hacked from
+ // org.eclipse.pde.internal.ui.launcher.LaunchArgumentsHelper.getWorkingDirectory(ILaunchConfiguration)
+ public static File getWorkingDirectory(ILaunchConfiguration configuration)
+ throws CoreException {
+ String working;
+ try {
+ working = configuration.getAttribute(
+ IJavaLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY,
+ new File(".").getCanonicalPath()); //$NON-NLS-1$
+ } catch (IOException e) {
+ working = "${workspace_loc}/../"; //$NON-NLS-1$
+ }
+ File dir = new File(getSubstitutedString(working));
+ if (!dir.exists())
+ dir.mkdirs();
+ return dir;
+ }
+
+ // Hacked from
+ // org.eclipse.pde.internal.ui.launcher.LaunchArgumentsHelper.getSubstitutedString(String)
+ private static String getSubstitutedString(String text)
+ throws CoreException {
+ if (text == null)
+ return ""; //$NON-NLS-1$
+ IStringVariableManager mgr = VariablesPlugin.getDefault()
+ .getStringVariableManager();
+ return mgr.performStringSubstitution(text);
+ }
+
+ static void initializeConfiguration(
+ ILaunchConfigurationWorkingCopy configuration) {
+ new OSGiLaunchConfigurationInitializer().initialize(configuration);
+ }
+
}