/****************************************************************************** | |
* Copyright (c) 2006, 2010 VMware Inc. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v1.0 | |
* and Apache License v2.0 which accompanies this distribution. | |
* The Eclipse Public License is available at | |
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0 | |
* is available at http://www.opensource.org/licenses/apache2.0.php. | |
* You may elect to redistribute this code under either of these licenses. | |
* | |
* Contributors: | |
* VMware Inc. | |
*****************************************************************************/ | |
package org.eclipse.gemini.blueprint.extender; | |
import org.eclipse.gemini.blueprint.context.DelegatedExecutionOsgiBundleApplicationContext; | |
import org.osgi.framework.BundleContext; | |
/** | |
* Extender hook for customizing the OSGi application context creation. Each | |
* bundle started by the OSGi platform can create (or customize) an application | |
* context that becomes managed by the Spring-DM extender. | |
* | |
* For example, to create an application context based on the presence of a | |
* manifest header, one could use the following code: | |
* | |
* <pre class="code"> class HeaderBasedAppCtxCreator implements | |
* OsgiApplicationContextCreator { | |
* | |
* /** location header */ private static final String HEADER = | |
* "Context-Locations"; | |
* | |
* | |
* public DelegatedExecutionOsgiBundleApplicationContext | |
* createApplicationContext(BundleContext bundleContext) { Bundle owningBundle = | |
* bundleContext.getBundle(); | |
* | |
* Object value = owningBundle.getHeaders().get(HEADER); String[] locations = | |
* null; if (value != null && value instanceof String) { locations = | |
* StringUtils.commaDelimitedListToStringArray((String) value); } else { | |
* locations = <default values> } | |
* | |
* // create application context from 'locations' | |
* | |
* return applicationContext; } } </pre> | |
* | |
* <p/> | |
* <b>Note:</b> The application contexts should be only created and initialized | |
* but not started (i.e. <code>refresh()</code> method should not be called). | |
* | |
* <p/> | |
* The recommended way of configuring the extender is to attach any relevant | |
* <code>OsgiApplicationContextCreator</code> implementation as fragments to | |
* extender bundle. Please see the OSGi specification and Spring-DM reference | |
* documentation for more information on how to do that. | |
* | |
* <p/> | |
* Note the extender also supports <code>OsgiBeanFactoryPostProcessor</code> for | |
* application context customization. | |
* | |
* <p/> | |
* The creation of an application context doesn't guarantee that a bundle | |
* becomes Spring-DM managed. The Spring-DM extender can do additional post | |
* filtering that can discard the bundle (and associated context). | |
* | |
* @author Costin Leau | |
* | |
*/ | |
public interface OsgiApplicationContextCreator { | |
/** | |
* Creates an application context for the given bundle context. If no | |
* application context needs to be created, then <code>null</code> should be | |
* returned. Exceptions will be caught and logged but will not prevent the | |
* creation of other application contexts. | |
* | |
* @param bundleContext OSGi bundle context determining the context creation | |
* @return <code>null</code> if no context should be created, non- | |
* <code>null</code> otherwise | |
* @throws Exception if something goes wrong | |
*/ | |
DelegatedExecutionOsgiBundleApplicationContext createApplicationContext(BundleContext bundleContext) | |
throws Exception; | |
} |