Uploaded image for project: 'Felix'
  1. Felix
  2. FELIX-4443

Using iPOJO API shows different behavior (works when adding a service only)

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Invalid
    • ipojo-runtime-1.11.1
    • None
    • iPOJO
    • Windows 64 Operating System, eclipse, java

    Description

      I am trying to use ipojo API to create a component type. I am embedding Felix framework and I load my component bundle to the framework.

      In my bundle I have the following class:

      public class PlainHelloImpl implements PlainHello{

      @Override
      public void sayHello()

      { System.out.println("Plainly Hello :D"); }

      public PlainHelloImpl()

      { System.out.println("in contructor"); }

      public void start()

      { System.out.println("Hello, this is the plain hello component start method"); }

      public void stop()

      { System.out.println("Bye, this is the plain hello component stop method"); }

      }

      and below is my activator where the error occurs:

      public class Activator implements BundleActivator {

      public static BundleContext bundleContext;

      public void start(BundleContext context) throws Exception

      { System.out.println("Plain Hello iPOJO Bundle Started!"); bundleContext=context; PrimitiveComponentType x= new PrimitiveComponentType() .setBundleContext(context) .setClassName(PlainHelloImpl.class.getName()) .setValidateMethod("start") .setInvalidateMethod("stop") .addService(new Service()) ; x.start(); ComponentInstance i = x.createInstance(); //ERROR HERE i.start(); System.out.println("and we are done!"); }

      public void stop(BundleContext context) throws Exception

      { context = null; System.out.println("Plain Hello iPOJO Bundle Stopped!"); }

      }

      In my java application, I have the following code:

      Map config= new HashMap();

      // Create a configuration property map.
      //Map config = new HashMap();
      config.put(Constants.FRAMEWORK_STORAGE_CLEAN, Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT);
      // Create host activator;
      m_activator = new HostActivator();
      List list = new ArrayList();
      list.add(m_activator);

      config.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list);

      try

      { // Now create an instance of the framework with // our configuration properties. m_felix = new Felix(config); // Now start Felix instance. m_felix.start(); }

      catch (Exception ex)

      { System.err.println("Could not create framework: " + ex); ex.printStackTrace(); }

      // Register the application's context as an OSGi service!
      BundleContext bundleContext1 = m_felix.getBundleContext();

      //starting ipojo required bundles
      Bundle coreBundle = bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Dropbox\\feasibility-codes\\ipojo\\ipojo-distribution-1.11.0\\bundle
      org.apache.felix.ipojo-1.11.0.jar");
      coreBundle.start();
      if(coreBundle.getState()== Bundle.ACTIVE)
      System.out.println("Core Bundle is Active!");

      Bundle compositeBundle = bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Dropbox\\feasibility-codes\\ipojo\\ipojo-distribution-1.11.0\\bundle
      org.apache.felix.ipojo.composite-1.6.0.jar");
      compositeBundle.start();
      if(compositeBundle.getState()== Bundle.ACTIVE)
      System.out.println("Composite Bundle is Active!");

      Bundle apiBundle = bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Dropbox\\feasibility-codes\\ipojo\\ipojo-distribution-1.11.0\\bundle
      org.apache.felix.ipojo.api-1.6.0.jar");
      apiBundle.start();
      if(apiBundle.getState()== Bundle.ACTIVE)
      System.out.println("API Bundle is Active!");

      //HERE I start my bundle
      Bundle plainIPOJOBundle = bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Desktop\\plugins
      Manipulated_PlainHelloiPOJO.jar");
      plainIPOJOBundle.start();

      As you see, at the very end, I start my bundle. This shows me the following error:

      [ERROR] : [plainhelloipojo.PlainHelloImpl-0] createInstance -> Cannot invoke the constructor (method not found) : plainhelloipojo.PlainHelloImpl.<init>(org.apache.felix.ipojo.InstanceManager)
      java.lang.NoSuchMethodException: plainhelloipojo.PlainHelloImpl.<init>(org.apache.felix.ipojo.InstanceManager)
      at java.lang.Class.getConstructor0(Class.java:2715)
      at java.lang.Class.getDeclaredConstructor(Class.java:1987)
      at org.apache.felix.ipojo.InstanceManager.createObject(InstanceManager.java:726)
      at org.apache.felix.ipojo.InstanceManager.getPojoObject(InstanceManager.java:923)
      at org.apache.felix.ipojo.util.Callback.call(Callback.java:233)
      at org.apache.felix.ipojo.util.Callback.call(Callback.java:193)
      at org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallback.call(LifecycleCallback.java:86)
      at org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.__M_stateChanged(LifecycleCallbackHandler.java:162)
      at org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.stateChanged(LifecycleCallbackHandler.java)
      at org.apache.felix.ipojo.InstanceManager.setState(InstanceManager.java:536)
      at org.apache.felix.ipojo.InstanceManager.start(InstanceManager.java:418)
      at org.apache.felix.ipojo.ComponentFactory.createInstance(ComponentFactory.java:179)
      at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:319)
      at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:240)
      at org.apache.felix.ipojo.api.ComponentType.createInstance(ComponentType.java:79)
      at plainhelloipojo.Activator.start(Activator.java:38)
      at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
      at org.apache.felix.framework.Felix.activateBundle(Felix.java:2146)
      at org.apache.felix.framework.Felix.startBundle(Felix.java:2064)
      at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
      at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)
      at embedder.HostApplication.<init>(HostApplication.java:82)
      at embedder.Embedder.main(Embedder.java:12)
      [ERROR] plainhelloipojo.PlainHelloImpl : Cannot create a POJO instance, the POJO constructor cannot be found
      Exception in thread "main" org.osgi.framework.BundleException: Activator start error in bundle PlainHelloiPOJO [4].
      at org.apache.felix.framework.Felix.activateBundle(Felix.java:2196)
      at org.apache.felix.framework.Felix.startBundle(Felix.java:2064)
      at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
      at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)
      at embedder.HostApplication.<init>(HostApplication.java:82)
      at embedder.Embedder.main(Embedder.java:12)
      Caused by: org.apache.felix.ipojo.ConfigurationException: The configuration is not correct for the type plainhelloipojo.PlainHelloImpl : Cannot create a POJO instance, the POJO constructor cannot be found
      at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:328)
      at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:240)
      at org.apache.felix.ipojo.api.ComponentType.createInstance(ComponentType.java:79)
      at plainhelloipojo.Activator.start(Activator.java:38)
      at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
      at org.apache.felix.framework.Felix.activateBundle(Felix.java:2146)
      ... 5 more
      Caused by: org.apache.felix.ipojo.ConfigurationException: Cannot create a POJO instance, the POJO constructor cannot be found
      at org.apache.felix.ipojo.ComponentFactory.createInstance(ComponentFactory.java:191)
      at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:319)
      ... 10 more
      Caused by: java.lang.RuntimeException: Cannot create a POJO instance, the POJO constructor cannot be found
      at org.apache.felix.ipojo.InstanceManager.createObject(InstanceManager.java:766)
      at org.apache.felix.ipojo.InstanceManager.getPojoObject(InstanceManager.java:923)
      at org.apache.felix.ipojo.util.Callback.call(Callback.java:233)
      at org.apache.felix.ipojo.util.Callback.call(Callback.java:193)
      at org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallback.call(LifecycleCallback.java:86)
      at org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.__M_stateChanged(LifecycleCallbackHandler.java:162)
      at org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.stateChanged(LifecycleCallbackHandler.java)
      at org.apache.felix.ipojo.InstanceManager.setState(InstanceManager.java:536)
      at org.apache.felix.ipojo.InstanceManager.start(InstanceManager.java:418)
      at org.apache.felix.ipojo.ComponentFactory.createInstance(ComponentFactory.java:179)
      ... 11 more
      Caused by: java.lang.NoSuchMethodException: plainhelloipojo.PlainHelloImpl.<init>(org.apache.felix.ipojo.InstanceManager)
      at java.lang.Class.getConstructor0(Class.java:2715)
      at java.lang.Class.getDeclaredConstructor(Class.java:1987)
      at org.apache.felix.ipojo.InstanceManager.createObject(InstanceManager.java:726)
      ... 20 more

      Now, here's the weird behavior:

      This works fine (no errors):

      PrimitiveComponentType x= new PrimitiveComponentType()
      .setBundleContext(context)
      .setClassName(PlainHelloImpl.class.getName())
      .addService(new Service()) // Provide the Foo service
      ;

      x.start();

      ComponentInstance i = x.createInstance();
      i.start();

      This however doesn't work (shows the error):

      PrimitiveComponentType x= new PrimitiveComponentType()
      .setBundleContext(context)
      .setClassName(PlainHelloImpl.class.getName())
      .setValidateMethod("start")
      .setInvalidateMethod("stop")
      .addService(new Service()) // Provide the Foo service
      ;

      x.start();

      ComponentInstance i = x.createInstance();
      i.start();

      This also shows the error:

      PrimitiveComponentType x= new PrimitiveComponentType()
      .setBundleContext(context)
      .setClassName(PlainHelloImpl.class.getName())
      ;

      x.start();

      ComponentInstance i = x.createInstance();
      i.start();

      and many other scenarios show the error. The only case that does not show my error is when I provide a component name, bundle context, and service (and nothing else).

      Attachments

        Activity

          People

            clement.escoffier Clement Escoffier
            TravellingSalesman Zaid
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: