Zaid created FELIX-4443:
----------------------------
Summary: Using iPOJO API shows different behavior (Only works when
adding a service)
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
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\\EBTIC\\ADERE\\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\\EBTIC\\ADERE\\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\\EBTIC\\ADERE\\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.
--
This message was sent by Atlassian JIRA
(v6.2#6252)