diff options
Diffstat (limited to 'bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/framework/internal/core/SystemBundleActivator.java')
-rw-r--r-- | bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/framework/internal/core/SystemBundleActivator.java | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/framework/internal/core/SystemBundleActivator.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/framework/internal/core/SystemBundleActivator.java new file mode 100644 index 000000000..f3233207d --- /dev/null +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/framework/internal/core/SystemBundleActivator.java @@ -0,0 +1,110 @@ +/******************************************************************************* + * 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 + *******************************************************************************/ + +package org.eclipse.osgi.framework.internal.core; + +import java.util.Dictionary; +import java.util.Hashtable; +import org.eclipse.osgi.framework.debug.FrameworkDebugOptions; +import org.eclipse.osgi.internal.resolver.StateImpl; +import org.eclipse.osgi.service.resolver.State; +import org.osgi.framework.*; +import org.osgi.service.condpermadmin.ConditionalPermissionAdmin; + +/** + * This class activates the System Bundle. + */ + +public class SystemBundleActivator implements BundleActivator { + private BundleContext context; + private InternalSystemBundle bundle; + private Framework framework; + private ServiceRegistration<?> packageAdmin; + private ServiceRegistration<?> securityAdmin; + private ServiceRegistration<?> startLevel; + private ServiceRegistration<?> debugOptions; + private ServiceRegistration<?> contextFinder; + + public void start(BundleContext bc) throws Exception { + this.context = bc; + bundle = (InternalSystemBundle) bc.getBundle(); + framework = bundle.framework; + + if (framework.packageAdmin != null) + packageAdmin = register(new String[] {Constants.OSGI_PACKAGEADMIN_NAME}, framework.packageAdmin, null); + if (framework.securityAdmin != null) + securityAdmin = register(new String[] {Constants.OSGI_PERMISSIONADMIN_NAME, ConditionalPermissionAdmin.class.getName()}, framework.securityAdmin, null); + if (framework.startLevelManager != null) + startLevel = register(new String[] {Constants.OSGI_STARTLEVEL_NAME}, framework.startLevelManager, null); + FrameworkDebugOptions dbgOptions = null; + if ((dbgOptions = FrameworkDebugOptions.getDefault()) != null) { + dbgOptions.start(bc); + debugOptions = register(new String[] {org.eclipse.osgi.service.debug.DebugOptions.class.getName()}, dbgOptions, null); + } + ClassLoader tccl = framework.getContextFinder(); + if (tccl != null) { + Dictionary<String, Object> props = new Hashtable<String, Object>(7); + props.put("equinox.classloader.type", "contextClassLoader"); //$NON-NLS-1$ //$NON-NLS-2$ + contextFinder = register(new String[] {ClassLoader.class.getName()}, tccl, props); + } + + // Always call the adaptor.frameworkStart() at the end of this method. + framework.adaptor.frameworkStart(bc); + State state = framework.adaptor.getState(); + if (state instanceof StateImpl) + ((StateImpl) state).setResolverHookFactory(new CoreResolverHookFactory((BundleContextImpl) context, framework.getServiceRegistry())); + // attempt to resolve all bundles + // this is done after the adaptor.frameworkStart has been called + // this should be the first time the resolver State is accessed + framework.packageAdmin.setResolvedBundles(bundle); + // reinitialize the system bundles localization to take into account system bundle fragments + framework.systemBundle.manifestLocalization = null; + } + + public void stop(BundleContext bc) throws Exception { + // Always call the adaptor.frameworkStop() at the begining of this method. + framework.adaptor.frameworkStop(bc); + + if (packageAdmin != null) + packageAdmin.unregister(); + if (securityAdmin != null) + securityAdmin.unregister(); + if (startLevel != null) + startLevel.unregister(); + if (debugOptions != null) { + FrameworkDebugOptions dbgOptions = FrameworkDebugOptions.getDefault(); + if (dbgOptions != null) + dbgOptions.stop(bc); + debugOptions.unregister(); + } + if (contextFinder != null) + contextFinder.unregister(); + + framework = null; + bundle = null; + this.context = null; + } + + /** + * Register a service object. + * + */ + private ServiceRegistration<?> register(String[] names, Object service, Dictionary<String, Object> properties) { + if (properties == null) + properties = new Hashtable<String, Object>(7); + Dictionary<String, String> headers = bundle.getHeaders(); + properties.put(Constants.SERVICE_VENDOR, headers.get(Constants.BUNDLE_VENDOR)); + properties.put(Constants.SERVICE_RANKING, new Integer(Integer.MAX_VALUE)); + properties.put(Constants.SERVICE_PID, bundle.getBundleId() + "." + service.getClass().getName()); //$NON-NLS-1$ + return context.registerService(names, service, properties); + } + +} |