CXF Distributed OSGi
  1. CXF Distributed OSGi
  2. DOSGI-115

Use Spring DM and Eclipse Gemini Blueprint with DOSGi

    Details

    • Type: New Feature New Feature
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.4.0
    • Fix Version/s: 1.4.0
    • Component/s: DSW
    • Labels:
    • Environment:

      Developped in Windows OS

    • Estimated Complexity:
      Unknown

      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)

      { 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 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.

        Issue Links

          Activity

          Christian Schneider made changes -
          Status Resolved [ 5 ] Closed [ 6 ]
          Christian Schneider made changes -
          Status Open [ 1 ] Resolved [ 5 ]
          Resolution Fixed [ 1 ]
          Christian Schneider made changes -
          Link This issue duplicates DOSGI-86 [ DOSGI-86 ]
          Christian Schneider made changes -
          Assignee Christian Schneider [ chris@die-schneider.net ]
          Christian Schneider made changes -
          Link This issue is related to DOSGI-86 [ DOSGI-86 ]
          Angelo made changes -
          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) {
          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.
          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) {
          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 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.
          Angelo made changes -
          Field Original Value New Value
          Attachment cxf-dosgi-ri-dsw-Eclipse Projects cxf with Spring DM+Eclipse Gemini Blueprint.zip [ 12518443 ]
          Angelo created issue -

            People

            • Assignee:
              Christian Schneider
              Reporter:
              Angelo
            • Votes:
              1 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development