You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Clement Escoffier (JIRA)" <ji...@apache.org> on 2014/03/07 09:16:50 UTC
[jira] [Reopened] (FELIX-4443) Using iPOJO API shows different
behavior (works when adding a service only)
[ https://issues.apache.org/jira/browse/FELIX-4443?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Clement Escoffier reopened FELIX-4443:
--------------------------------------
> Using iPOJO API shows different behavior (works when adding a service only)
> ---------------------------------------------------------------------------
>
> Key: FELIX-4443
> URL: https://issues.apache.org/jira/browse/FELIX-4443
> Project: Felix
> Issue Type: Bug
> Components: iPOJO
> Affects Versions: ipojo-runtime-1.11.1
> Environment: Windows 64 Operating System, eclipse, java
> Reporter: Zaid
> Assignee: Clement Escoffier
> Labels: ipojo
>
> 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).
--
This message was sent by Atlassian JIRA
(v6.2#6252)