blob: ef19ed751c4d6938f2db71e4b08728e7ce6ce6c4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2008 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.adaptor;
import java.io.IOException;
import java.net.URLConnection;
import java.util.Properties;
import org.eclipse.osgi.framework.log.FrameworkLog;
import org.eclipse.osgi.service.resolver.PlatformAdmin;
import org.eclipse.osgi.service.resolver.State;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
/**
* FrameworkAdaptor interface to the osgi framework. This class is used to provide
* platform specific support for the osgi framework.
*
* <p>The OSGi framework will call this class to perform platform specific functions.
*
* Classes that implement FrameworkAdaptor MUST provide a constructor that takes as a
* parameter an array of Strings. This array will contain arguments to be
* handled by the FrameworkAdaptor. The FrameworkAdaptor implementation may define the format
* and content of its arguments.
*
* The constructor should parse the arguments passed to it and remember them.
* The initialize method should perform the actual processing of the adaptor
* arguments.
* <p>
* Clients may implement this interface.
* </p>
* @since 3.1
*/
public interface FrameworkAdaptor {
public static final String FRAMEWORK_SYMBOLICNAME = "org.eclipse.osgi"; //$NON-NLS-1$
/**
* Initialize the FrameworkAdaptor object so that it is ready to be
* called by the framework. Handle the arguments that were
* passed to the constructor.
* This method must be called before any other FrameworkAdaptor methods.
* @param eventPublisher The EventPublisher used to publish any events to
* the framework.
*/
public void initialize(EventPublisher eventPublisher);
/**
* Initialize the persistent storage for the adaptor.
*
* @throws IOException If the adaptor is unable to
* initialize the bundle storage.
*/
public void initializeStorage() throws IOException;
/**
* Compact/cleanup the persistent storage for the adaptor.
* @throws IOException If the adaptor is unable to
* compact the bundle storage.
*
*/
public void compactStorage() throws IOException;
/**
* Return the properties object for the adaptor.
* The properties in the returned object supplement
* the System properties.
* The framework may modify this object. The Framework
* will use the returned properties to set the System
* properties.
*
* @return The properties object for the adaptor.
*/
public Properties getProperties();
/**
* Return a list of the installed bundles. Each element in the
* list must be of type <code>BundleData</code>. Each <code>BundleData</code>
* corresponds to one bundle that is persistently stored.
* This method must construct <code>BundleData</code> objects for all
* installed bundles and return an array containing the objects.
* The returned array becomes the property of the framework.
*
* @return Array of installed BundleData objects, or null if none can be found.
*/
public BundleData[] getInstalledBundles();
/**
* Map a location to a URLConnection. This is used by the Framework when installing a bundle
* from a spacified location.
*
* @param location of the bundle.
* @return URLConnection that represents the location.
* @throws BundleException if the mapping fails.
*/
public URLConnection mapLocationToURLConnection(String location) throws BundleException;
/**
* Prepare to install a bundle from a URLConnection.
* <p>To complete the install,
* begin and then commit
* must be called on the returned <code>BundleOperation</code> object.
* If either of these methods throw a BundleException
* or some other error occurs,
* then undo must be called on the <code>BundleOperation</code> object
* to undo the change to persistent storage.
*
* @param location Bundle location.
* @param source URLConnection from which the bundle may be read.
* Any InputStreams returned from the source
* (URLConnections.getInputStream) must be closed by the
* <code>BundleOperation</code> object.
* @return BundleOperation object to be used to complete the install.
*/
public BundleOperation installBundle(String location, URLConnection source);
/**
* Prepare to update a bundle from a URLConnection.
* <p>To complete the update
* begin and then commit
* must be called on the returned <code>BundleOperation</code> object.
* If either of these methods throw a BundleException
* or some other error occurs,
* then undo must be called on the <code>BundleOperation</code> object
* to undo the change to persistent storage.
*
* @param bundledata BundleData to update.
* @param source URLConnection from which the updated bundle may be read.
* Any InputStreams returned from the source
* (URLConnections.getInputStream) must be closed by the
* <code>BundleOperation</code> object.
* @return BundleOperation object to be used to complete the update.
*/
public BundleOperation updateBundle(BundleData bundledata, URLConnection source);
/**
* Prepare to uninstall a bundle.
* <p>To complete the uninstall,
* begin and then commit
* must be called on the returned <code>BundleOperation</code> object.
* If either of these methods throw a BundleException
* or some other error occurs,
* then undo must be called on the <code>BundleOperation</code> object
* to undo the change to persistent storage.
*
* @param bundledata BundleData to uninstall.
* @return BundleOperation object to be used to complete the uninstall.
*/
public BundleOperation uninstallBundle(BundleData bundledata);
/**
* Returns the total amount of free space available for bundle storage on the device.
*
* @return Free space available in bytes or -1 if it does not apply to this adaptor
* @exception IOException if an I/O error occurs determining the available space
*/
public long getTotalFreeSpace() throws IOException;
/**
* Returns the PermissionStorage object which will be used to
* to manage the permission data.
*
* @return The PermissionStorage object for the adaptor.
* @see "org.osgi.service.permissionadmin.PermissionAdmin"
*/
public PermissionStorage getPermissionStorage() throws IOException;
/**
* The framework will call this method after the
* System BundleActivator.start(BundleContext) has been called. The context is
* the System Bundle's BundleContext. This method allows FrameworkAdaptors to
* have access to the OSGi framework to get services, register services and
* perform other OSGi operations.
* @param context The System Bundle's BundleContext.
* @exception BundleException on any error that may occur.
*/
public void frameworkStart(BundleContext context) throws BundleException;
/**
* The framework will call this method before the
* System BundleActivator.stop(BundleContext) has been called. The context is
* the System Bundle's BundleContext. This method allows FrameworkAdaptors to
* have access to the OSGi framework to get services, register services and
* perform other OSGi operations.
* @param context The System Bundle's BundleContext.
* @exception BundleException on any error that may occur.
*/
public void frameworkStop(BundleContext context) throws BundleException;
/**
* The framework will call this method before the process of framework
* shutdown is started. This gives FrameworkAdaptors a chance to
* perform actions before the framework start level is decremented and
* all the bundles are stopped. This method will get called before the
* {@link #frameworkStop(BundleContext)} method.
* @param context The System Bundle's BundleContext.
*/
public void frameworkStopping(BundleContext context);
/**
* Returns the initial bundle start level as maintained by this adaptor
* @return the initial bundle start level
*/
public int getInitialBundleStartLevel();
/**
* Sets the initial bundle start level
* @param value the initial bundle start level
*/
public void setInitialBundleStartLevel(int value);
/**
* Returns the FrameworkLog for the FrameworkAdaptor. The FrameworkLog
* is used by the Framework and FrameworkAdaptor to log any error messages
* and FramworkEvents of type ERROR.
* @return The FrameworkLog to be used by the Framework.
*/
public FrameworkLog getFrameworkLog();
/**
* Creates a BundleData object for the System Bundle. The BundleData
* returned will be used to define the System Bundle for the Framework.
* @return the BundleData for the System Bundle.
* @throws BundleException if any error occurs while creating the
* System BundleData.
*/
public BundleData createSystemBundleData() throws BundleException;
/**
* Returns the bundle watcher for this FrameworkAdaptor.
* @return the bundle watcher for this FrameworkAdaptor.
*/
public BundleWatcher getBundleWatcher();
/**
* Returns the PlatformAdmin for this FrameworkAdaptor.
* <p>
* This method will not be called until after
* {@link FrameworkAdaptor#frameworkStart(BundleContext)} is called.
* @return the PlatformAdmin for this FrameworkAdaptor.
*/
public PlatformAdmin getPlatformAdmin();
/**
* Returns the State for this FrameworkAdaptor.
* <p>
* This method will not be called until after
* {@link FrameworkAdaptor#frameworkStart(BundleContext)} is called.
* The State returned is used by the framework to resolve bundle
* dependencies.
* @return the State for this FrameworkAdaptor.
*/
public State getState();
/**
* Returns the parent ClassLoader all BundleClassLoaders created. All
* BundleClassLoaders that are created must use the ClassLoader returned
* by this method as a parent ClassLoader. Each call to this method must
* return the same ClassLoader object.
* @return the parent ClassLoader for all BundleClassLoaders created.
*/
public ClassLoader getBundleClassLoaderParent();
/**
* Handles a RuntimeException or Error that was caught by the Framework and
* there is not a suitable caller to propagate the Throwable to. This gives
* the FrameworkAdaptor the ablity to handle such cases. For example, a
* FrameworkAdaptor may decide that such unexpected errors should cause an error
* message to be logged, or that the Framework should be terminated immediately.
* @param error The Throwable for the runtime error that is to be handled.
*/
public void handleRuntimeError(Throwable error);
}