Hi all
I'm trying to use scala to produce iPojo components but I'm getting a
verification class error that I have traced to the way iPojo manipulates the
class files and generates new bytecodes. This happens when using the @Requires
annotation in the constructor.
Here is what the java code looks like and the bytecodes produced:
<code>
@Component
@Instantiate
class StartObservationFactory(@(Requires @param) epicsReader: EpicsReader)
extends KeywordActorsFactory {
</code>
and iPojo makes a new constructor taking an InstanceManager and an EpicsReader
with the following bytecodes:
<bytecode>
private
edu.gemini.aspen.gds.keywordssets.factory.StartObservationFactory(org.apache.felix.ipojo.InstanceManager,
edu.gemini.epics.EpicsReader);
Code:
0: aload_0
1: aload_2
2: invokevirtual #159; //Method
__setepicsReader:(Ledu/gemini/epics/EpicsReader;)V
5: aload_0
6: invokespecial #160; //Method java/lang/Object."<init>":()V
9: aload_0
10: aload_1
11: invokespecial #164; //Method
_setInstanceManager:(Lorg/apache/felix/ipojo/InstanceManager;)V
14: return
</bytecode>
I think the verify error I get is due to the call of __setepicsReader before
the call to the java/lang/Object constructor
This should be exactly as the Java code below:
<code>
@Component
@Instantiate(name = "epicsObserver")
public class EpicsObserverImpl implements EpicsObserver {
public EpicsObserverImpl(@Requires JCAContextController contextController)
</code>
But this produces a different bytecode:
<bytecode>
private
edu.gemini.epics.impl.EpicsObserverImpl(org.apache.felix.ipojo.InstanceManager,
edu.gemini.epics.JCAContextController);
Code:
0: aload_0
1: invokespecial #67; //Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: invokespecial #71; //Method
_setInstanceManager:(Lorg/apache/felix/ipojo/InstanceManager;)V
9: aload_0
</bytecode>
Any ideas? I guess this is due to how the scala compiler produces the classes
that are then process by the iPojo manipulator but I'm not able to propose a
workaround now:
Regards
Carlos Quiroz
PS: This is the error I get when launching the bundle in felix:
[edu.gemini.aspen.gds.keywordssets.factory.StartObservationFactory-0]
createInstance -> The POJO constructor invocation failed : (class:
edu/gemini/aspen/gds/keywordssets/factory/StartObservationFactory, method:
<init> signature:
(Lorg/apache/felix/ipojo/InstanceManager;Ledu/gemini/epics/EpicsReader;)V)
Expecting to find object/array on stack
java.lang.VerifyError: (class:
edu/gemini/aspen/gds/keywordssets/factory/StartObservationFactory, method:
<init> signature:
(Lorg/apache/felix/ipojo/InstanceManager;Ledu/gemini/epics/EpicsReader;)V)
Expecting to find object/array on stack
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
at java.lang.Class.getConstructor0(Class.java:2699)
at java.lang.Class.getDeclaredConstructor(Class.java:1985)
at
org.apache.felix.ipojo.InstanceManager.createObject(InstanceManager.java:638)
at
org.apache.felix.ipojo.InstanceManager.getPojoObject(InstanceManager.java:858)
at
org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.__stateChanged(LifecycleCallbackHandler.java:156)
at
org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler.stateChanged(LifecycleCallbackHandler.java)
at
org.apache.felix.ipojo.InstanceManager.setState(InstanceManager.java:471)
at
org.apache.felix.ipojo.InstanceManager.start(InstanceManager.java:353)
at
org.apache.felix.ipojo.ComponentFactory.createInstance(ComponentFactory.java:166)
at
org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:301)
at
org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:238)
at
org.apache.felix.ipojo.InstanceCreator$ManagedInstance.create(InstanceCreator.java:343)
at
org.apache.felix.ipojo.InstanceCreator.addInstance(InstanceCreator.java:89)
at org.apache.felix.ipojo.Extender.parse(Extender.java:269)
at org.apache.felix.ipojo.Extender.startManagementFor(Extender.java:208)
at org.apache.felix.ipojo.Extender.access$600(Extender.java:52)
at org.apache.felix.ipojo.Extender$CreatorThread.run(Extender.java:682)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]