Use Spring DM and Eclipse Gemini Blueprint with DOSGi
-----------------------------------------------------
Key: DOSGI-115
URL: https://issues.apache.org/jira/browse/DOSGI-115
Project: CXF Distributed OSGi
Issue Type: New Feature
Components: DSW
Affects Versions: 1.4
Environment: Developped in Windows OS
Reporter: Angelo
Fix For: 1.4
Today cxf-dosgi-ri-dsw-cxf supports only Spring DM. This goal of this issue is
to modify cxf-dosgi-ri-dsw-cxf to support both Spring DM and Eclipse Gemini
Blueprint.
The idea is :
* 1) cxf-dosgi-ri-dsw-cxf :remove Spring DM dependencies (don't use directly
org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext and
org.springframework.osgi.context.BundleContextAware) in this project but use a
commons interface :
------------------------------------------------------------------------
package org.apache.cxf.dosgi.dsw.container;
import java.util.List;
import org.osgi.framework.BundleContext;
import org.springframework.context.ApplicationContext;
/**
* OSGi Spring container API.
*
* @author Angelo Zerr <[email protected]>
*
*/
public interface OsgiSpringContainer {
/**
* Publish the given springs files and returns the Spring
* {@link ApplicationContext}.
*
* @param springIntentLocations
* @param bundleContext
* @return
*/
ApplicationContext publish(List<String> springIntentLocations,
BundleContext bundleContext);
/**
* Returns the {@link BundleContext} from the given Spring application
* context.
*
* @param context
* @return
*/
BundleContext getBundleContext(ApplicationContext context);
}
------------------------------------------------------------------------
1.1) In the class OsgiUtils:
do like this:
------------------------------------------------------------------------
ApplicationContext ctx =
OsgiSpringContainerProvider.getContainer().publish(springIntentLocations,
bundleContext);
------------------------------------------------------------------------
Instead of doing that:
------------------------------------------------------------------------
//
//
// OsgiBundleXmlApplicationContext ctx = new
OsgiBundleXmlApplicationContext(springIntentLocations
// .toArray(new String[] {}));
// ctx.setPublishContextAsService(false);
// ctx.setBundleContext(bundleContext);
// ctx.refresh();
------------------------------------------------------------------------
1.2) In the Activator class:
Implements ApplicationContextAware (instead of BundleContextAware) :
public class Activator implements ManagedService,
ApplicationContextAware/*,BundleContextAware*/ {
and implements setApplicationContext liek this
------------------------------------------------------------------------
public void setApplicationContext(ApplicationContext context)
throws BeansException {
bc = OsgiUtils.getBundleContext(context);
}
------------------------------------------------------------------------
where OsgiUtils.getBundleContext use the interface
------------------------------------------------------------------------
public static BundleContext getBundleContext(ApplicationContext context) {
return OsgiSpringContainerProvider.getContainer().getBundleContext(context);
}:
------------------------------------------------------------------------
1.1) OsgiSpringContainerProvider:
The OsgiSpringContainerProvider use SPI ServiceRegistry to retrieves the
implemententation of OsgiSpringContainer :
------------------------------------------------------------------------
package org.apache.cxf.dosgi.dsw.container;
import java.util.Iterator;
import javax.imageio.spi.ServiceRegistry;
public class OsgiSpringContainerProvider {
private static OsgiSpringContainer container;
public static OsgiSpringContainer getContainer()
throws OsgiSpringContainerNotFoundException {
if (container == null) {
container = getContainerFromFragment();
}
return container;
}
public static synchronized OsgiSpringContainer
getContainerFromFragment()
throws OsgiSpringContainerNotFoundException {
if (container != null) {
return container;
}
Iterator<OsgiSpringContainer> containers = ServiceRegistry
.lookupProviders(OsgiSpringContainer.class,
OsgiSpringContainerProvider.class.getClassLoader());
while (containers.hasNext()) {
return containers.next();
}
throw new OsgiSpringContainerNotFoundException();
}
}
------------------------------------------------------------------------
2) cxf-dosgi-ri-dsw-cxf-gemini : new project which is a fragment linked to
cxf-dosgi-ri-dsw-cxf and register with SPI ServiceRegistry the Gemini BluePring
implementation of OSgiSpringContainer :
------------------------------------------------------------------------
package org.apache.cxf.dosgi.dsw.container.geminiblueprint;
import java.util.List;
import org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer;
import
org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext;
import org.osgi.framework.BundleContext;
import org.springframework.context.ApplicationContext;
public class GeminiBlueprintContainer
implements OsgiSpringContainer {
public ApplicationContext publish(List<String> springIntentLocations,
BundleContext bundleContext) {
OsgiBundleXmlApplicationContext ctx = new
OsgiBundleXmlApplicationContext(
springIntentLocations.toArray(new String[] {}));
ctx.setPublishContextAsService(false);
ctx.setBundleContext(bundleContext);
ctx.refresh();
return ctx;
}
public BundleContext getBundleContext(ApplicationContext context) {
return
((OsgiBundleXmlApplicationContext)context).getBundleContext();
}
}
------------------------------------------------------------------------
This implementation is registered in the file
META-INF/services/org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer :
------------------------------------------------------------------------
org.apache.cxf.dosgi.dsw.container.geminiblueprint.GeminiBlueprintContainer
------------------------------------------------------------------------
This fragment has Eclipse Gemini Blueprint dependencies.
3) cxf-dosgi-ri-dsw-cxf-springdm: new project which is a fragment linked to
cxf-dosgi-ri-dsw-cxf and register with SPI ServiceRegistry the SppringDM
implementation of OSgiSpringContainer :
------------------------------------------------------------------------
package org.apache.cxf.dosgi.dsw.container.springdm;
import java.util.List;
import org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer;
import org.osgi.framework.BundleContext;
import org.springframework.context.ApplicationContext;
import org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext;
public class SpringDMContainer implements
OsgiSpringContainer {
public ApplicationContext publish(List<String> springIntentLocations,
BundleContext bundleContext) {
OsgiBundleXmlApplicationContext ctx = new
OsgiBundleXmlApplicationContext(
springIntentLocations.toArray(new String[] {}));
ctx.setPublishContextAsService(false);
ctx.setBundleContext(bundleContext);
ctx.refresh();
return ctx;
}
public BundleContext getBundleContext(ApplicationContext context) {
return
((OsgiBundleXmlApplicationContext)context).getBundleContext();
}
}
------------------------------------------------------------------------
This implementation is registered in the file
META-INF/services/org.apache.cxf.dosgi.dsw.container.OsgiSpringContainer :
------------------------------------------------------------------------
org.apache.cxf.dosgi.dsw.container.springdm.SpringDMContainer
------------------------------------------------------------------------
This fragment has Spring DM dependencies.
4) Use cxf-dosgi-ri-dsw-cxf with Eclipse Gemini Blueprint
So to use cxf-dosgi-ri-dsw-cxf with Eclipse Gemini Blueprint, add in the OSGi
container cxf-dosgi-ri-dsw-cxf+cxf-dosgi-ri-dsw-cxf-gemini
5) Use cxf-dosgi-ri-dsw-cxf with Spring DM
So to use cxf-dosgi-ri-dsw-cxf with Spring DM, add in the OSGi container
cxf-dosgi-ri-dsw-cxf+cxf-dosgi-ri-dsw-cxf-springdm
I don't Gemini Aires, but if it is based on Spring, we could create a new
fragment cxf-dosgi-ri-dsw-cxf-aires.
Hope you will like it this idea.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira