X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=eclipse%2Fplugins%2Forg.argeo.slc.ide.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fide%2Fui%2Flaunch%2Fosgi%2FOsgiLaunchHelper.java;h=253a82afff007924286368ea02da6fe9aa596228;hb=01e4319b49fcc2a6cdf6f0f9271ae27343c7430f;hp=425352beb42f870c67ddbc312d508784505be086;hpb=1ec88bb547b163d84d4e3eecc87cf78ecbd28f6c;p=gpl%2Fargeo-slc.git diff --git a/eclipse/plugins/org.argeo.slc.ide.ui/src/main/java/org/argeo/slc/ide/ui/launch/osgi/OsgiLaunchHelper.java b/eclipse/plugins/org.argeo.slc.ide.ui/src/main/java/org/argeo/slc/ide/ui/launch/osgi/OsgiLaunchHelper.java index 425352beb..253a82aff 100644 --- a/eclipse/plugins/org.argeo.slc.ide.ui/src/main/java/org/argeo/slc/ide/ui/launch/osgi/OsgiLaunchHelper.java +++ b/eclipse/plugins/org.argeo.slc.ide.ui/src/main/java/org/argeo/slc/ide/ui/launch/osgi/OsgiLaunchHelper.java @@ -1,8 +1,10 @@ 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; @@ -13,21 +15,73 @@ import org.eclipse.core.resources.IFile; 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 bundlesToStart = new ArrayList(); + Map systemPropertiesToAppend = new HashMap(); + 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 bundlesToStart, - Map systemPropertiesToAppend, String dir) + Map systemPropertiesToAppend, String dataDir) throws CoreException { // Convert bundle lists String targetBundles = configuration.getAttribute( @@ -43,14 +97,44 @@ public class OsgiLaunchHelper { // 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) { @@ -75,20 +159,6 @@ public class OsgiLaunchHelper { } } - // 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, @@ -99,40 +169,52 @@ public class OsgiLaunchHelper { 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 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; @@ -164,9 +246,11 @@ public class OsgiLaunchHelper { Map 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(); @@ -183,4 +267,39 @@ public class OsgiLaunchHelper { } } + + // 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); + } + }