blob: 8b0c0aec2728842f4a27d2fbf228720e63a0457c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2005 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.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.security.Permission;
import java.security.ProtectionDomain;
import org.eclipse.osgi.framework.debug.Debug;
import org.osgi.framework.*;
/**
* This class subclasses Bundle to provide a system Bundle
* so that the framework can be represented as a bundle and
* can access the services provided by other bundles.
*/
public class SystemBundle extends BundleHost {
ProtectionDomain systemDomain;
/**
* Private SystemBundle object constructor.
* This method creates the SystemBundle and its BundleContext.
* The SystemBundle's state is set to STARTING.
* This method is called when the framework is constructed.
*
* @param framework Framework this bundle is running in
*/
protected SystemBundle(Framework framework) throws BundleException {
super(framework.adaptor.createSystemBundleData(), framework); // startlevel=0 means framework stopped
Constants.setInternalSymbolicName(bundledata.getSymbolicName());
state = Bundle.RESOLVED;
context = createContext();
}
/**
* Load the bundle.
* This methods overrides the Bundle method and does nothing.
*
*/
protected void load() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
systemDomain = getClass().getProtectionDomain();
}
}
/**
* Reload from a new bundle.
* This methods overrides the Bundle method and does nothing.
*
* @param newBundle
* @return false
*/
protected boolean reload(AbstractBundle newBundle) {
return (false);
}
/**
* Refresh the bundle.
* This methods overrides the Bundle method and does nothing.
*
*/
protected void refresh() {
// do nothing
}
/**
* Unload the bundle.
* This methods overrides the Bundle method and does nothing.
*
* @return false
*/
protected boolean unload() {
return (false);
}
/**
* Close the the Bundle's file.
* This method closes the BundleContext for the SystemBundle
* and sets the SystemBundle's state to UNINSTALLED.
*
*/
protected void close() {
context.close();
context = null;
state = UNINSTALLED;
}
/**
* This method loads a class from the bundle.
*
* @param name the name of the desired Class.
* @param checkPermission indicates whether a permission check should be done.
* @return the resulting Class
* @exception java.lang.ClassNotFoundException if the class definition was not found.
*/
protected Class loadClass(String name, boolean checkPermission) throws ClassNotFoundException {
if (checkPermission) {
framework.checkAdminPermission(this, AdminPermission.CLASS);
checkValid();
}
return (Class.forName(name));
}
/**
* Find the specified resource in this bundle.
* This methods returns null for the system bundle.
*/
public URL getResource(String name) {
return (null);
}
/**
* Indicate SystemBundle is resolved.
*
*/
protected boolean isUnresolved() {
return (false);
}
/**
* Start this bundle.
* This methods overrides the Bundle method and does nothing.
*
*/
public void start() {
framework.checkAdminPermission(this, AdminPermission.EXECUTE);
}
/**
* Start the SystemBundle.
* This method launches the framework.
*
*/
protected void resume() {
/* initialize the startlevel service */
framework.startLevelManager.initialize();
framework.startLevelManager.launch(framework.startLevelManager.getFrameworkStartLevel());
}
/**
* Stop the framework.
* This method spawns a thread which will call framework.shutdown.
*
*/
public void stop() {
framework.checkAdminPermission(this, AdminPermission.EXECUTE);
if (state == ACTIVE) {
Thread shutdown = framework.secureAction.createThread(new Runnable() {
public void run() {
try {
framework.shutdown();
} catch (Throwable t) {
// allow the adaptor to handle this unexpected error
framework.adaptor.handleRuntimeError(t);
}
}
}, "System Bundle Shutdown"); //$NON-NLS-1$
shutdown.start();
}
}
/**
* Stop the SystemBundle.
* This method shuts down the framework.
*
*/
protected void suspend() {
framework.startLevelManager.shutdown();
framework.startLevelManager.cleanup();
/* clean up the exporting loaders */
framework.packageAdmin.cleanup();
if (Debug.DEBUG && Debug.DEBUG_GENERAL) {
Debug.println("->Framework shutdown"); //$NON-NLS-1$
}
// fire the STOPPED event here.
// All bundles have been unloaded, but there may be a boot strap listener that is interested (bug 182742)
framework.publishBundleEvent(BundleEvent.STOPPED, this);
}
protected void suspend(boolean lock) {
// do nothing
}
/**
* Update this bundle.
* This method spawns a thread which will call framework.shutdown
* followed by framework.launch.
*
*/
public void update() {
framework.checkAdminPermission(this, AdminPermission.LIFECYCLE);
if (state == ACTIVE) {
Thread restart = framework.secureAction.createThread(new Runnable() {
public void run() {
framework.shutdown();
framework.launch();
}
}, "System Bundle Update"); //$NON-NLS-1$
restart.start();
}
}
/**
* Update this bundle from an InputStream.
* This methods overrides the Bundle method and does nothing.
*
* @param in The InputStream from which to read the new bundle.
*/
public void update(InputStream in) {
update();
try {
in.close();
} catch (IOException e) {
// do nothing
}
}
/**
* Uninstall this bundle.
* This methods overrides the Bundle method and throws an exception.
*
*/
public void uninstall() throws BundleException {
framework.checkAdminPermission(this, AdminPermission.LIFECYCLE);
throw new BundleException(Msg.BUNDLE_SYSTEMBUNDLE_UNINSTALL_EXCEPTION);
}
/**
* Determine whether the bundle has the requested
* permission.
* This methods overrides the Bundle method and returns <code>true</code>.
*
* @param permission The requested permission.
* @return <code>true</code>
*/
public boolean hasPermission(Object permission) {
if (systemDomain != null) {
if (permission instanceof Permission) {
return systemDomain.implies((Permission) permission);
}
return false;
}
return true;
}
/**
* No work to do for the SystemBundle.
*
* @param refreshedBundles
* A list of bundles which have been refreshed as a result
* of a packageRefresh
*/
protected void unresolvePermissions(AbstractBundle[] refreshedBundles) {
// Do nothing
}
}