Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (c) 2003, 2010 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 Alex Blewitt (bug 172969) /
  
  package org.eclipse.core.runtime.adaptor;
  
  import java.io.*;
  import java.net.*;
  import java.util.*;
Special startup class for the Eclipse Platform. This class cannot be instantiated; all functionality is provided by static methods.

The Eclipse Platform makes heavy use of Java class loaders for loading plug-ins. Even the Eclipse Runtime itself and the OSGi framework need to be loaded by special class loaders. The upshot is that a client program (such as a Java main program, a servlet) cannot reference any part of Eclipse directly. Instead, a client must use this loader class to start the platform, invoking functionality defined in plug-ins, and shutting down the platform when done.

Note that the fields on this class are not API.

Since:
3.0
Noextend:
This class is not intended to be subclassed by clients.
  
  public class EclipseStarter {
  	private static FrameworkAdaptor adaptor;
  	private static BundleContext context;
  	private static boolean initialize = false;
  	public static boolean debug = false;
  	private static boolean running = false;
  	private static Framework framework = null;
  	private static ServiceRegistration defaultMonitorRegistration = null;
  	private static ServiceRegistration appLauncherRegistration = null;
  	private static ServiceRegistration splashStreamRegistration = null;
  
  	// command line arguments
  	private static final String CLEAN = "-clean"//$NON-NLS-1$
  	private static final String CONSOLE = "-console"//$NON-NLS-1$
  	private static final String CONSOLE_LOG = "-consoleLog"//$NON-NLS-1$
  	private static final String DEBUG = "-debug"//$NON-NLS-1$
  	private static final String INITIALIZE = "-initialize"//$NON-NLS-1$
  	private static final String DEV = "-dev"//$NON-NLS-1$
  	private static final String WS = "-ws"//$NON-NLS-1$
  	private static final String OS = "-os"//$NON-NLS-1$
  	private static final String ARCH = "-arch"//$NON-NLS-1$
  	private static final String NL = "-nl"//$NON-NLS-1$
  	private static final String NL_EXTENSIONS = "-nlExtensions"//$NON-NLS-1$
  	private static final String CONFIGURATION = "-configuration"//$NON-NLS-1$	
  	private static final String USER = "-user"//$NON-NLS-1$
  	private static final String NOEXIT = "-noExit"//$NON-NLS-1$
  	private static final String LAUNCHER = "-launcher"//$NON-NLS-1$
  
  	// this is more of an Eclipse argument but this OSGi implementation stores its 
  	// metadata alongside Eclipse's.
  	private static final String DATA = "-data"//$NON-NLS-1$
  
  	// System properties
  	public static final String PROP_BUNDLES = "osgi.bundles"//$NON-NLS-1$
  	public static final String PROP_BUNDLES_STARTLEVEL = "osgi.bundles.defaultStartLevel"//$NON-NLS-1$ //The start level used to install the bundles
  	public static final String PROP_EXTENSIONS = "osgi.framework.extensions"//$NON-NLS-1$
  	public static final String PROP_INITIAL_STARTLEVEL = "osgi.startLevel"//$NON-NLS-1$ //The start level when the fwl start
  	public static final String PROP_DEBUG = "osgi.debug"//$NON-NLS-1$
  	public static final String PROP_DEV = "osgi.dev"//$NON-NLS-1$
  	public static final String PROP_CLEAN = "osgi.clean"//$NON-NLS-1$
  	public static final String PROP_CONSOLE = "osgi.console"//$NON-NLS-1$
  	public static final String PROP_CONSOLE_CLASS = "osgi.consoleClass"//$NON-NLS-1$
  	public static final String PROP_CHECK_CONFIG = "osgi.checkConfiguration"//$NON-NLS-1$
  	public static final String PROP_OS = "osgi.os"//$NON-NLS-1$
  	public static final String PROP_WS = "osgi.ws"//$NON-NLS-1$
 	public static final String PROP_NL = "osgi.nl"//$NON-NLS-1$
 	private static final String PROP_NL_EXTENSIONS = "osgi.nl.extensions"//$NON-NLS-1$
 	public static final String PROP_ARCH = "osgi.arch"//$NON-NLS-1$
 	public static final String PROP_ADAPTOR = "osgi.adaptor"//$NON-NLS-1$
 	public static final String PROP_SYSPATH = "osgi.syspath"//$NON-NLS-1$
 	public static final String PROP_LOGFILE = "osgi.logfile"//$NON-NLS-1$
 	public static final String PROP_FRAMEWORK = "osgi.framework"//$NON-NLS-1$
 	public static final String PROP_INSTALL_AREA = "osgi.install.area"//$NON-NLS-1$
 	public static final String PROP_FRAMEWORK_SHAPE = "osgi.framework.shape"//$NON-NLS-1$ //the shape of the fwk (jar, or folder)
 	public static final String PROP_NOSHUTDOWN = "osgi.noShutdown"//$NON-NLS-1$
 	private static final String PROP_FORCED_RESTART = "osgi.forcedRestart"//$NON-NLS-1$
 
 	public static final String PROP_EXITCODE = "eclipse.exitcode"//$NON-NLS-1$
 	public static final String PROP_EXITDATA = "eclipse.exitdata"//$NON-NLS-1$
 	public static final String PROP_CONSOLE_LOG = "eclipse.consoleLog"//$NON-NLS-1$
 	public static final String PROP_IGNOREAPP = "eclipse.ignoreApp"//$NON-NLS-1$
 	public static final String PROP_REFRESH_BUNDLES = "eclipse.refreshBundles"//$NON-NLS-1$
 	private static final String PROP_ALLOW_APPRELAUNCH = "eclipse.allowAppRelaunch"//$NON-NLS-1$
 	private static final String PROP_APPLICATION_LAUNCHDEFAULT = "eclipse.application.launchDefault"//$NON-NLS-1$
 
 	private static final String FILE_SCHEME = "file:"//$NON-NLS-1$
 	private static final String REFERENCE_SCHEME = "reference:"//$NON-NLS-1$
 	private static final String REFERENCE_PROTOCOL = "reference"//$NON-NLS-1$
 	private static final String INITIAL_LOCATION = "initial@"//$NON-NLS-1$
 	
string containing the classname of the adaptor to be used in this framework instance
 
 	protected static final String DEFAULT_ADAPTOR_CLASS = "org.eclipse.osgi.baseadaptor.BaseAdaptor"//$NON-NLS-1$
 
 	private static final int DEFAULT_INITIAL_STARTLEVEL = 6; // default value for legacy purposes
 	private static final String DEFAULT_BUNDLES_STARTLEVEL = "4"//$NON-NLS-1$
 
 	private static FrameworkLog log;
 	// directory of serch candidates keyed by directory abs path -> directory listing (bug 122024)
 	private static HashMap searchCandidates = new HashMap(4);
 	private static EclipseAppLauncher appLauncher;
 	private static List shutdownHandlers;
 
 	private static ConsoleManager consoleMgr = null;

This is the main to start osgi. It only works when the framework is being jared as a single jar
 
 	public static void main(String[] argsthrows Exception {
 		if (FrameworkProperties.getProperty("eclipse.startTime") == null//$NON-NLS-1$
 			FrameworkProperties.setProperty("eclipse.startTime", Long.toString(System.currentTimeMillis())); //$NON-NLS-1$
 		if (FrameworkProperties.getProperty() == null)
 			FrameworkProperties.setProperty("true"); //$NON-NLS-1$
 		// set the compatibility boot delegation flag to false to get "standard" OSGi behavior WRT boot delegation (bug 178477)
 		if (FrameworkProperties.getProperty(.) == null)
 			FrameworkProperties.setProperty(."false"); //$NON-NLS-1$
 		Object result = run(argsnull);
 		if (result instanceof Integer && !Boolean.valueOf(FrameworkProperties.getProperty()).booleanValue())
 			System.exit(((Integerresult).intValue());
 	}

Launches the platform and runs a single application. The application is either identified in the given arguments (e.g., -application <app id>) or in the eclipse.application System property. This convenience method starts up the platform, runs the indicated application, and then shuts down the platform. The platform must not be running already.

Parameters:
args the command line-style arguments used to configure the platform
endSplashHandler the block of code to run to tear down the splash screen or null if no tear down is required
Returns:
the result of running the application
Throws:
java.lang.Exception if anything goes wrong
 
 	public static Object run(String[] argsRunnable endSplashHandlerthrows Exception {
 			Profile.logEnter("EclipseStarter.run()"null); //$NON-NLS-1$
 		if ()
 		boolean startupFailed = true;
 		try {
 			startup(argsendSplashHandler);
 			startupFailed = false;
 			if (Boolean.valueOf(FrameworkProperties.getProperty()).booleanValue() || isForcedRestart())
 				return null;
 			return run(null);
 		} catch (Throwable e) {
 			// ensure the splash screen is down
 			if (endSplashHandler != null)
 				endSplashHandler.run();
 			// may use startupFailed to understand where the error happened
 			if ( != null)
 				.log(logEntry);
 			else
 				// TODO desperate measure - ideally, we should write this to disk (a la Main.log)
 		} finally {
 			try {
 				// The application typically sets the exit code however the framework can request that
 				// it be re-started. We need to check for this and potentially override the exit code.
 					FrameworkProperties.setProperty("23"); //$NON-NLS-1$
 				if (!Boolean.valueOf(FrameworkProperties.getProperty()).booleanValue())
 			} catch (Throwable e) {
 				if ( != null)
 					.log(logEntry);
 				else
 					// TODO desperate measure - ideally, we should write this to disk (a la Main.log)
 			}
 				Profile.logExit("EclipseStarter.run()"); //$NON-NLS-1$
 			if (.) {
 				String report = Profile.getProfileLog();
 				// avoiding writing to the console if there is nothing to print
 				if (report != null && report.length() > 0)
 					..println(report);
 			}
 		}
 		// we only get here if an error happened
 		if (FrameworkProperties.getProperty() == null) {
 			FrameworkProperties.setProperty("13"); //$NON-NLS-1$
 			FrameworkProperties.setProperty(, NLS.bind(. == null ? null : .getFile().getPath()));
 		}
 		return null;
 	}

Returns true if the platform is already running, false otherwise.

Returns:
whether or not the platform is already running
 
 	public static boolean isRunning() {
 		return ;
 	}
 
 	protected static FrameworkLog createFrameworkLog() {
 		FrameworkLog frameworkLog;
 		String logFileProp = FrameworkProperties.getProperty(.);
 		if (logFileProp != null) {
 			frameworkLog = new EclipseLog(new File(logFileProp));
 		} else {
 			Location location = LocationManager.getConfigurationLocation();
 			File configAreaDirectory = null;
 			if (location != null)
 				// TODO assumes the URL is a file: url
 				configAreaDirectory = new File(location.getURL().getFile());
 
 			if (configAreaDirectory != null) {
 				String logFileName = Long.toString(System.currentTimeMillis()) + ".log"//$NON-NLS-1$
 				File logFile = new File(configAreaDirectorylogFileName);
 				FrameworkProperties.setProperty(.logFile.getAbsolutePath());
 				frameworkLog = new EclipseLog(logFile);
 			} else
 				frameworkLog = new EclipseLog();
 		}
 		if ("true".equals(FrameworkProperties.getProperty(.))) //$NON-NLS-1$
 			frameworkLog.setConsoleLog(true);
 		return frameworkLog;
 	}

Starts the platform and sets it up to run a single application. The application is either identified in the given arguments (e.g., -application <app id>) or in the eclipse.application System property. The platform must not be running already.

The given runnable (if not null) is used to tear down the splash screen if required.

Parameters:
args the arguments passed to the application
Returns:
BundleContext the context of the system bundle
Throws:
java.lang.Exception if anything goes wrong
 
 	public static BundleContext startup(String[] argsRunnable endSplashHandlerthrows Exception {
 			Profile.logEnter("EclipseStarter.startup()"null); //$NON-NLS-1$
 		if ()
 		FrameworkProperties.initializeProperties();
 		LocationManager.initializeLocations();
 			Profile.initProps(); // catch any Profile properties set in eclipse.properties...
 			Profile.logTime("EclipseStarter.startup()""props inited"); //$NON-NLS-1$ //$NON-NLS-2$
 			Profile.logTime("EclipseStarter.startup()""adapter created"); //$NON-NLS-1$ //$NON-NLS-2$
 			Profile.logTime("EclipseStarter.startup()""OSGi created"); //$NON-NLS-1$ //$NON-NLS-2$
 		publishSplashScreen(endSplashHandler);
 			Profile.logTime("EclipseStarter.startup()""osgi launched"); //$NON-NLS-1$ //$NON-NLS-2$
 		 = ConsoleManager.startConsole();
 		if ( != null && . && .) {
 			Profile.logTime("EclipseStarter.startup()""console started"); //$NON-NLS-1$ //$NON-NLS-2$
 		}
 		// save the cached timestamp before loading basic bundles; this is needed so we can do a proper timestamp check when logging resolver errors
 		long stateStamp = .getState().getTimeStamp();
 		Bundle[] startBundles = loadBasicBundles();
 
 		if (startBundles == null || ("true".equals(FrameworkProperties.getProperty()) && refreshPackages(getCurrentBundles(false)))) { //$NON-NLS-1$
 			return // cannot continue; loadBasicBundles caused refreshPackages to shutdown the framework
 		}
 
 			Profile.logTime("EclipseStarter.startup()""loading basic bundles"); //$NON-NLS-1$ //$NON-NLS-2$
 
 		// set the framework start level to the ultimate value.  This will actually start things
 		// running if they are persistently active.
 			Profile.logTime("EclipseStarter.startup()""StartLevel set"); //$NON-NLS-1$ //$NON-NLS-2$
 		// they should all be active by this time
 		ensureBundlesActive(startBundles);
 		if ( || FrameworkProperties.getProperty() != null)
 			// only spend time showing unresolved bundles in dev/debug mode and the state has changed
 			if (stateStamp != .getState().getTimeStamp())
 		 = true;
 			Profile.logExit("EclipseStarter.startup()"); //$NON-NLS-1$
 		return ;
 	}
 
 	private static int getStartLevel() {
 		String level = FrameworkProperties.getProperty();
 		if (level != null)
 			try {
 				return Integer.parseInt(level);
 			} catch (NumberFormatException e) {
 				if ()
 					..println("Start level = " + level + "  parsed. Using hardcoded default: 6"); //$NON-NLS-1$ //$NON-NLS-2$
 			}
 	}

Runs the application for which the platform was started. The platform must be running.

The given argument is passed to the application being run. If it is null then the command line arguments used in starting the platform, and not consumed by the platform code, are passed to the application as a String[].

Parameters:
argument the argument passed to the application. May be null
Returns:
the result of running the application
Throws:
java.lang.Exception if anything goes wrong
 
 	public static Object run(Object argumentthrows Exception {
 			Profile.logEnter("EclipseStarter.run(Object)()"null); //$NON-NLS-1$
 		if (!)
 		// if we are just initializing, do not run the application just return.
 		if ()
 			return new Integer(0);
 		try {
 			if ( == null) {
 				boolean launchDefault = Boolean.valueOf(FrameworkProperties.getProperty("true")).booleanValue(); //$NON-NLS-1$
 				// create the ApplicationLauncher and register it as a service
 				 = new EclipseAppLauncher(, Boolean.valueOf(FrameworkProperties.getProperty()).booleanValue(), launchDefault);
 				// must start the launcher AFTER service restration because this method 
 				// blocks and runs the application on the current thread.  This method 
 				// will return only after the application has stopped.
 				return .start(argument);
 			}
 			return .reStart(argument);
 		} catch (Exception e) {
 			if ( != null &&  != null// context can be null if OSGi failed to launch (bug 151413)
 			throw e;
 		}
 	}

Shuts down the Platform. The state of the Platform is not automatically saved before shutting down.

On return, the Platform will no longer be running (but could be re-launched with another call to startup). If relaunching, care must be taken to reinitialize any System properties which the platform uses (e.g., osgi.instance.area) as some policies in the platform do not allow resetting of such properties on subsequent runs.

Any objects handed out by running Platform, including Platform runnables obtained via getRunnable, will be permanently invalid. The effects of attempting to invoke methods on invalid objects is undefined.

Throws:
java.lang.Exception if anything goes wrong
 
 	public static void shutdown() throws Exception {
 		if (! ||  == null)
 			return;
 		if ( != null)
 		if ( != null)
 		if ( != null)
 		 = null;
 		if ( != null) {
 			 = null;
 		}
 		 = null;
 		 = null;
 		 = false;
 	}
 
 	private static void ensureBundlesActive(Bundle[] bundles) {
 		ServiceTracker tracker = null;
 		try {
 			for (int i = 0; i < bundles.lengthi++) {
 				if (bundles[i].getState() != .) {
 					if (bundles[i].getState() == .) {
 						// Log that the bundle is not resolved
 						continue;
 					}
 					// check that the startlevel allows the bundle to be active (111550)
 					if (tracker == null) {
 						tracker = new ServiceTracker(StartLevel.class.getName(), null);
 						tracker.open();
 					}
 					StartLevel sl = (StartLeveltracker.getService();
 					if (sl != null && (sl.getBundleStartLevel(bundles[i]) <= sl.getStartLevel())) {
 					}
 				}
 			}
 		} finally {
 			if (tracker != null)
 				tracker.close();
 		}
 	}
 
 	private static void logUnresolvedBundles(Bundle[] bundles) {
 		State state = .getState();
 
 		// first lets look for missing leaf constraints (bug 114120)
 		VersionConstraint[] leafConstraints = stateHelper.getUnsatisfiedLeaves(state.getBundles());
 		// hash the missing leaf constraints by the declaring bundles
 		Map missing = new HashMap();
 		for (int i = 0; i < leafConstraints.lengthi++) {
 			// only include non-optional and non-dynamic constraint leafs
 			if (leafConstraints[iinstanceof BundleSpecification && ((BundleSpecificationleafConstraints[i]).isOptional())
 				continue;
 			if (leafConstraints[iinstanceof ImportPackageSpecification) {
 					continue;
 					continue;
 			}
 			BundleDescription bundle = leafConstraints[i].getBundle();
 			ArrayList constraints = (ArrayListmissing.get(bundle);
 			if (constraints == null) {
 				constraints = new ArrayList();
 				missing.put(bundleconstraints);
 			}
 			constraints.add(leafConstraints[i]);
 		}
 
 		// found some bundles with missing leaf constraints; log them first 
 		if (missing.size() > 0) {
 			FrameworkLogEntry[] rootChildren = new FrameworkLogEntry[missing.size()];
 			int rootIndex = 0;
 			for (Iterator iter = missing.keySet().iterator(); iter.hasNext(); rootIndex++) {
 				BundleDescription description = (BundleDescriptioniter.next();
 				String symbolicName = description.getSymbolicName() == null ? . : description.getSymbolicName();
 				ArrayList constraints = (ArrayListmissing.get(description);
 				FrameworkLogEntry[] logChildren = new FrameworkLogEntry[constraints.size()];
 				for (int i = 0; i < logChildren.lengthi++)
 					logChildren[i] = new FrameworkLogEntry(symbolicName., 0, MessageHelper.getResolutionFailureMessage((VersionConstraintconstraints.get(i)), 0, nullnull);
 				rootChildren[rootIndex] = new FrameworkLogEntry(.., 0, generalMessage, 0, nulllogChildren);
 			}
 		}
 
 		// There may be some bundles unresolved for other reasons, causing the system to be unresolved
 		// log all unresolved constraints now
 		ArrayList allChildren = new ArrayList();
 		for (int i = 0; i < bundles.lengthi++)
 			if (bundles[i].getState() == .) {
 				String symbolicName = bundles[i].getSymbolicName() == null ? . : bundles[i].getSymbolicName();
 				BundleDescription description = state.getBundle(bundles[i].getBundleId());
 				// for some reason, the state does not know about that bundle
 				if (description == null)
 					continue;
 				FrameworkLogEntry[] logChildren = null;
 				VersionConstraint[] unsatisfied = stateHelper.getUnsatisfiedConstraints(description);
 				if (unsatisfied.length > 0) {
 					// the bundle wasn't resolved due to some of its constraints were unsatisfiable
 					logChildren = new FrameworkLogEntry[unsatisfied.length];
 					for (int j = 0; j < unsatisfied.lengthj++)
 						logChildren[j] = new FrameworkLogEntry(symbolicName., 0, MessageHelper.getResolutionFailureMessage(unsatisfied[j]), 0, nullnull);
 				} else {
 					ResolverError[] resolverErrors = state.getResolverErrors(description);
 					if (resolverErrors.length > 0) {
 						logChildren = new FrameworkLogEntry[resolverErrors.length];
 						for (int j = 0; j < resolverErrors.lengthj++)
 							logChildren[j] = new FrameworkLogEntry(symbolicName., 0, resolverErrors[j].toString(), 0, nullnull);
 					}
 				}
 
 				allChildren.add(new FrameworkLogEntry(.., 0, generalMessage, 0, nulllogChildren));
 			}
 		if (allChildren.size() > 0)
 	}
 
 	private static void publishSplashScreen(final Runnable endSplashHandler) {
 		if (endSplashHandler == null)
 			return;
 		// register the output stream to the launcher if it exists
 		try {
 			Method method = endSplashHandler.getClass().getMethod("getOutputStream"new Class[0]); //$NON-NLS-1$
 			Object outputStream = method.invoke(endSplashHandlernew Object[0]);
 			if (outputStream instanceof OutputStream) {
 				Dictionary osProperties = new Hashtable();
 				osProperties.put("name""splashstream"); //$NON-NLS-1$//$NON-NLS-2$
 				 = .registerService(OutputStream.class.getName(), outputStreamosProperties);
 			}
 		} catch (Exception ex) {
 			// ignore
 		}
 		// keep this splash handler as the default startup monitor
 		try {
 			Dictionary monitorProps = new Hashtable();
 			 = .registerService(StartupMonitor.class.getName(), new DefaultStartupMonitor(endSplashHandler), monitorProps);
 		} catch (IllegalStateException e) {
 			//splash handler did not provide the necessary methods, ignore it
 		}
 	}
 
 	private static URL searchForBundle(String nameString parentthrows MalformedURLException {
 		URL url = null;
 		File fileLocation = null;
 		boolean reference = false;
 		try {
 			new URL(name); // quick check to see if the name is a valid URL
 			url = new URL(new File(parent).toURL(), name);
 		} catch (MalformedURLException e) {
 			// TODO this is legacy support for non-URL names.  It should be removed eventually.
 			// if name was not a URL then construct one.  
 			// Assume it should be a reference and that it is relative.  This support need not 
 			// be robust as it is temporary..
 			File child = new File(name);
 			fileLocation = child.isAbsolute() ? child : new File(parentname);
 			url = new URL(nullfileLocation.toURL().toExternalForm());
 			reference = true;
 		}
 		// if the name was a URL then see if it is relative.  If so, insert syspath.
 		if (!reference) {
 			URL baseURL = url;
 			// if it is a reference URL then strip off the reference: and set base to the file:...
 				reference = true;
 				String baseSpec = url.getFile();
 				if (baseSpec.startsWith()) {
 					File child = new File(baseSpec.substring(5));
 					baseURL = child.isAbsolute() ? child.toURL() : new File(parentchild.getPath()).toURL();
 				} else
 					baseURL = new URL(baseSpec);
 			}
 
 			fileLocation = new File(baseURL.getFile());
 			// if the location is relative, prefix it with the parent
 			if (!fileLocation.isAbsolute())
 				fileLocation = new File(parentfileLocation.toString());
 		}
 		// If the result is a reference then search for the real result and 
 		// reconstruct the answer.
 		if (reference) {
 			String result = searchFor(fileLocation.getName(), new File(fileLocation.getParent()).getAbsolutePath());
 			if (result != null)
 				url = new URL(null + result);
 			else
 				return null;
 		}
 
 		// finally we have something worth trying	
 		try {
 			URLConnection result = url.openConnection();
 			result.connect();
 			return url;
 		} catch (IOException e) {
 			//			int i = location.lastIndexOf('_');
 			//			return i == -1? location : location.substring(0, i);
 			return null;
 		}
 	}
 
 	/*
 	 * Ensure all basic bundles are installed, resolved and scheduled to start. Returns an array containing
 	 * all basic bundles that are marked to start. 
 	 * Returns null if the framework has been shutdown as a result of refreshPackages
 	 */
 	private static Bundle[] loadBasicBundles() {
 		long startTime = System.currentTimeMillis();
 		String osgiBundles = FrameworkProperties.getProperty();
 		String osgiExtensions = FrameworkProperties.getProperty();
 		if (osgiExtensions != null && osgiExtensions.length() > 0) {
 			osgiBundles = osgiExtensions + ',' + osgiBundles;
 			FrameworkProperties.setProperty(osgiBundles);
 		}
 		String[] installEntries = getArrayFromList(osgiBundles","); //$NON-NLS-1$
 		// get the initial bundle list from the installEntries
 		InitialBundle[] initialBundles = getInitialBundles(installEntries);
 		// get the list of currently installed initial bundles from the framework
 		Bundle[] curInitBundles = getCurrentBundles(true);
 
 		// list of bundles to be refreshed
 		List toRefresh = new ArrayList(curInitBundles.length);
 		// uninstall any of the currently installed bundles that do not exist in the 
 		// initial bundle list from installEntries.
 		uninstallBundles(curInitBundlesinitialBundlestoRefresh);
 
 		// install the initialBundles that are not already installed.
 		ArrayList startBundles = new ArrayList(installEntries.length);
 		ArrayList lazyActivationBundles = new ArrayList(installEntries.length);
 		installBundles(initialBundlescurInitBundlesstartBundleslazyActivationBundlestoRefresh);
 
 		// If we installed/uninstalled something, force a refresh of all installed/uninstalled bundles
 		if (!toRefresh.isEmpty() && refreshPackages((Bundle[]) toRefresh.toArray(new Bundle[toRefresh.size()])))
 			return null// cannot continue; refreshPackages shutdown the framework
 
 		// schedule all basic bundles to be started
 		Bundle[] startInitBundles = (Bundle[]) startBundles.toArray(new Bundle[startBundles.size()]);
 		Bundle[] lazyInitBundles = (Bundle[]) lazyActivationBundles.toArray(new Bundle[lazyActivationBundles.size()]);
 		startBundles(startInitBundleslazyInitBundles);
 
 		if ()
 			..println("Time to load bundles: " + (System.currentTimeMillis() - startTime)); //$NON-NLS-1$
 		return startInitBundles;
 	}
 
 	private static InitialBundle[] getInitialBundles(String[] installEntries) {
 		ArrayList result = new ArrayList(installEntries.length);
 		int defaultStartLevel = Integer.parseInt(FrameworkProperties.getProperty());
 		String syspath = getSysPath();
 		// should canonicalize the syspath.
 		try {
 			syspath = new File(syspath).getCanonicalPath();
 		} catch (IOException ioe) {
 			// do nothing
 		}
 		for (int i = 0; i < installEntries.lengthi++) {
 			String name = installEntries[i];
 			int level = defaultStartLevel;
 			boolean start = false;
 			int index = name.lastIndexOf('@');
 			if (index >= 0) {
 				String[] attributes = getArrayFromList(name.substring(index + 1, name.length()), ":"); //$NON-NLS-1$
 				for (int j = 0; j < attributes.lengthj++) {
 					String attribute = attributes[j];
 					if (attribute.equals("start")) //$NON-NLS-1$
 						start = true;
 					else {
 						try {
 							level = Integer.parseInt(attribute);
 						} catch (NumberFormatException e) { // bug 188089
 							index = name.length();
 							continue;
 						}
 					}
 				}
 				name = name.substring(0, index);
 			}
 			try {
 				URL location = searchForBundle(namesyspath);
 				if (location == null) {
 					.log(entry);
 					// skip this entry
 					continue;
 				}
 				location = makeRelative(LocationManager.getInstallLocation().getURL(), location);
 				String locationString =  + location.toExternalForm();
 				result.add(new InitialBundle(locationStringlocationlevelstart));
 			} catch (IOException e) {
 			}
 		}
 		return (InitialBundle[]) result.toArray(new InitialBundle[result.size()]);
 	}
 
 	// returns true if the refreshPackages operation caused the framework to shutdown
 	private static boolean refreshPackages(Bundle[] bundles) {
 		PackageAdmin packageAdmin = null;
 		if (packageAdminRef != null)
 			packageAdmin = (PackageAdmin.getService(packageAdminRef);
 		if (packageAdmin == null)
 			return false;
 		// TODO this is such a hack it is silly.  There are still cases for race conditions etc
 		// but this should allow for some progress...
 		final Semaphore semaphore = new Semaphore(0);
 		packageAdmin.refreshPackages(bundles);
 		.ungetService(packageAdminRef);
 		updateSplash(semaphorelistener);
 			return true;
 		return false;
 	}
 
 	private static void waitForShutdown() {
 		if (!isForcedRestart())
 			return;
 		// wait for the system bundle to stop
 		Bundle systemBundle = .getBundle(0);
 		int i = 0;
 		while (i < 5000 && (systemBundle.getState() & (. | . | .)) != 0) {
 			i += 200;
 			try {
 				Thread.sleep(200);
 			} catch (InterruptedException e) {
 				break;
 			}
 		}
 	}

Creates and returns the adaptor

Returns:
a FrameworkAdaptor object
 
 	private static FrameworkAdaptor createAdaptor() throws Exception {
 		String adaptorClassName = FrameworkProperties.getProperty();
 		Class adaptorClass = Class.forName(adaptorClassName);
 		Class[] constructorArgs = new Class[] {String[].class};
 		Constructor constructor = adaptorClass.getConstructor(constructorArgs);
 		return (FrameworkAdaptorconstructor.newInstance(new Object[] {new String[0]});
 	}
 
 	private static String[] processCommandLine(String[] argsthrows Exception {
 		EclipseEnvironmentInfo.setAllArgs(args);
 		if (args.length == 0) {
 			EclipseEnvironmentInfo.setFrameworkArgs(args);
 			EclipseEnvironmentInfo.setAllArgs(args);
 			return args;
 		}
 		int[] configArgs = new int[args.length];
 		configArgs[0] = -1; // need to initialize the first element to something that could not be an index.
 		int configArgIndex = 0;
 		for (int i = 0; i < args.lengthi++) {
 			boolean found = false;
 			// check for args without parameters (i.e., a flag arg)
 
 			// check if debug should be enabled for the entire platform
 			// If this is the last arg or there is a following arg (i.e., arg+1 has a leading -), 
 			// simply enable debug.  Otherwise, assume that that the following arg is
 			// actually the filename of an options file.  This will be processed below.
 			if (args[i].equalsIgnoreCase() && ((i + 1 == args.length) || ((i + 1 < args.length) && (args[i + 1].startsWith("-"))))) { //$NON-NLS-1$
 				FrameworkProperties.setProperty(""); //$NON-NLS-1$
 				 = true;
 				found = true;
 			}
 
 			// check if development mode should be enabled for the entire platform
 			// If this is the last arg or there is a following arg (i.e., arg+1 has a leading -), 
 			// simply enable development mode.  Otherwise, assume that that the following arg is
 			// actually some additional development time class path entries.  This will be processed below.
 			if (args[i].equalsIgnoreCase() && ((i + 1 == args.length) || ((i + 1 < args.length) && (args[i + 1].startsWith("-"))))) { //$NON-NLS-1$
 				FrameworkProperties.setProperty(""); //$NON-NLS-1$
 				found = true;
 			}
 
 			// look for the initialization arg
 			if (args[i].equalsIgnoreCase()) {
 				 = true;
 				found = true;
 			}
 
 			// look for the clean flag.
 			if (args[i].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty("true"); //$NON-NLS-1$
 				found = true;
 			}
 
 			// look for the consoleLog flag
 			if (args[i].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty("true"); //$NON-NLS-1$
 				found = true;
 			}
 
 			// look for the console with no port.  
 			if (args[i].equalsIgnoreCase() && ((i + 1 == args.length) || ((i + 1 < args.length) && (args[i + 1].startsWith("-"))))) { //$NON-NLS-1$
 				FrameworkProperties.setProperty(""); //$NON-NLS-1$
 				found = true;
 			}
 
 			if (args[i].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty("true"); //$NON-NLS-1$
 				found = true;
 			}
 
 			if (found) {
 				configArgs[configArgIndex++] = i;
 				continue;
 			}
 			// check for args with parameters. If we are at the last argument or if the next one
 			// has a '-' as the first character, then we can't have an arg with a parm so continue.
 			if (i == args.length - 1 || args[i + 1].startsWith("-")) { //$NON-NLS-1$
 				continue;
 			}
 			String arg = args[++i];
 
 			// look for the console and port.  
 			if (args[i - 1].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty(arg);
 				found = true;
 			}
 
 			// look for the configuration location .  
 			if (args[i - 1].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty(.arg);
 				found = true;
 			}
 
 			// look for the data location for this instance.  
 			if (args[i - 1].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty(.arg);
 				found = true;
 			}
 
 			// look for the user location for this instance.  
 			if (args[i - 1].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty(.arg);
 				found = true;
 			}
 
 			// look for the launcher location
 			if (args[i - 1].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty(.arg);
 				found = true;
 			}
 			// look for the development mode and class path entries.  
 			if (args[i - 1].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty(arg);
 				found = true;
 			}
 
 			// look for the debug mode and option file location.  
 			if (args[i - 1].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty(arg);
 				 = true;
 				found = true;
 			}
 
 			// look for the window system.  
 			if (args[i - 1].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty(arg);
 				found = true;
 			}
 
 			// look for the operating system
 			if (args[i - 1].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty(arg);
 				found = true;
 			}
 
 			// look for the system architecture
 			if (args[i - 1].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty(arg);
 				found = true;
 			}
 
 			// look for the nationality/language
 			if (args[i - 1].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty(arg);
 				found = true;
 			}
 
 			// look for the locale extensions
 			if (args[i - 1].equalsIgnoreCase()) {
 				FrameworkProperties.setProperty(arg);
 				found = true;
 			}
 
 			// done checking for args.  Remember where an arg was found 
 			if (found) {
 				configArgs[configArgIndex++] = i - 1;
 				configArgs[configArgIndex++] = i;
 			}
 		}
 
 		// remove all the arguments consumed by this argument parsing
 		if (configArgIndex == 0) {
 			EclipseEnvironmentInfo.setFrameworkArgs(new String[0]);
 			EclipseEnvironmentInfo.setAppArgs(args);
 			return args;
 		}
 		String[] appArgs = new String[args.length - configArgIndex];
 		String[] frameworkArgs = new String[configArgIndex];
 		configArgIndex = 0;
 		int j = 0;
 		int k = 0;
 		for (int i = 0; i < args.lengthi++) {
 			if (i == configArgs[configArgIndex]) {
 				frameworkArgs[k++] = args[i];
 				configArgIndex++;
 			} else
 				appArgs[j++] = args[i];
 		}
 		EclipseEnvironmentInfo.setFrameworkArgs(frameworkArgs);
 		EclipseEnvironmentInfo.setAppArgs(appArgs);
 		return appArgs;
 	}

Returns the result of converting a list of comma-separated tokens into an array

Parameters:
prop the initial comma-separated string
Returns:
the array of string tokens
 
 	private static String[] getArrayFromList(String propString separator) {
 		return ManifestElement.getArrayFromList(propseparator);
 	}
 
 	protected static String getSysPath() {
 		String result = FrameworkProperties.getProperty();
 		if (result != null)
 			return result;
 		result = getSysPathFromURL(FrameworkProperties.getProperty());
 		if (result == null)
 		if (result == null)
 			throw new IllegalStateException("Can not find the system path."); //$NON-NLS-1$
 		if (Character.isUpperCase(result.charAt(0))) {
 			char[] chars = result.toCharArray();
 			chars[0] = Character.toLowerCase(chars[0]);
 			result = new String(chars);
 		}
 		FrameworkProperties.setProperty(result);
 		return result;
 	}
 
 	private static String getSysPathFromURL(String urlSpec) {
 		if (urlSpec == null)
 			return null;
 		URL url = LocationHelper.buildURL(urlSpecfalse);
 		if (url == null)
 			return null;
 		File fwkFile = new File(url.getFile());
 		fwkFile = new File(fwkFile.getAbsolutePath());
 		fwkFile = new File(fwkFile.getParent());
 		return fwkFile.getAbsolutePath();
 	}
 
 	private static String getSysPathFromCodeSource() {
 		if (pd == null)
 			return null;
 		CodeSource cs = pd.getCodeSource();
 		if (cs == null)
 			return null;
 		URL url = cs.getLocation();
 		if (url == null)
 			return null;
 		String result = url.getFile();
 		if (result.endsWith(".jar")) { //$NON-NLS-1$
 			result = result.substring(0, result.lastIndexOf('/'));
 			if ("folder".equals(FrameworkProperties.getProperty())) //$NON-NLS-1$
 				result = result.substring(0, result.lastIndexOf('/'));
 		} else {
 			if (result.endsWith("/")) //$NON-NLS-1$
 				result = result.substring(0, result.length() - 1);
 			result = result.substring(0, result.lastIndexOf('/'));
 			result = result.substring(0, result.lastIndexOf('/'));
 		}
 		return result;
 	}
 
 	private static Bundle[] getCurrentBundles(boolean includeInitial) {
 		Bundle[] installed = .getBundles();
 		ArrayList initial = new ArrayList();
 		for (int i = 0; i < installed.lengthi++) {
 			Bundle bundle = installed[i];
				if (includeInitial)
					initial.add(bundle);
else if (!includeInitial && bundle.getBundleId() != 0)
				initial.add(bundle);
		return (Bundle[]) initial.toArray(new Bundle[initial.size()]);
	private static Bundle getBundleByLocation(String locationBundle[] bundles) {
		for (int i = 0; i < bundles.lengthi++) {
			Bundle bundle = bundles[i];
			if (location.equalsIgnoreCase(bundle.getLocation()))
				return bundle;
		return null;
	private static void uninstallBundles(Bundle[] curInitBundlesInitialBundle[] newInitBundlesList toRefresh) {
		for (int i = 0; i < curInitBundles.lengthi++) {
			boolean found = false;
			for (int j = 0; j < newInitBundles.lengthj++) {
				if (curInitBundles[i].getLocation().equalsIgnoreCase(newInitBundles[j].)) {
					found = true;
					break;
			if (!found)
				try {
					curInitBundles[i].uninstall();
					toRefresh.add(curInitBundles[i]);
catch (BundleException e) {
					.log(entry);
	private static void installBundles(InitialBundle[] initialBundlesBundle[] curInitBundlesArrayList startBundlesArrayList lazyActivationBundlesList toRefresh) {
		StartLevel startService = null;
		if (reference != null)
			startService = (StartLevel.getService(reference);
		try {
			for (int i = 0; i < initialBundles.lengthi++) {
				Bundle osgiBundle = getBundleByLocation(initialBundles[i].curInitBundles);
				try {
					// don't need to install if it is already installed
					if (osgiBundle == null) {
						InputStream in = initialBundles[i]..openStream();
						try {
							osgiBundle = .installBundle(initialBundles[