Details
Description
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 <angelo.zerr@gmail.com>
*/
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)
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())
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 know 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.