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 <angelo.z...@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) { 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