Hi,

On 07.04.2012, at 23:27, Fabio Fonseca wrote:

> 
> Hi Clement,
> 
> I'm writing again because I managed to solve the option 2 problem... In fact
> there was 2 problems. First of all there was a syntax error in my XML. I
> forgot a "/>" in the first line of the subservice tag, that you can see
> below:
> 
> <composite name="comanche.frontend">
>       <subservice action="import"   /> 
>                   specification="org.apache.comanche.services.RequestHandler"
>                   filter="(instance.name=RequestAnalyzer)" />
>       <instance 
> component="org.apache.comanche.requestReceiver.RequestReceiver"
> name="RequestReceiver"/>
>       <subservice action="instantiate"
> specification="org.apache.comanche.services.Scheduler"/>
> </composite>
> 
> That evil "/>" was the cause for the comanche.frontend instance state be
> "Not Available".
> 
> Then, after this small step, the comanche.frontend instance state was still
> "invalid" and, using the arch command, I saw that the required handle was
> invalid too and the cause was the RequestAnalyzer be "unresolved". The
> problem was that the RequestAnalyzer instance I exported in the
> comanche.backend composite was not being found inside the comanche.frontend
> composite, even with the "subservice import" element.
> 
> Doing a little more research I found the composite.xsd that gave me the clue
> of the "scope" attribute that I could add to the subservice element. I tried
> to add this attribute to the subservice element as a desperate attempt and
> for my complete surprise it worked! Whether I choose "composite" or
> "composite+global" for its value, it correctly finds the RequestAnalyzer
> instance exported in the comanche.backend composite! :-) On the other hand,
> if I choose the "global" value for the scope attribute, the RequestAnalyzer
> remains hidden.

> So, I learned that whenever I need to import an instance from another
> composite at the same hierarchy level, who properly exports it, I must
> specify the scope in the subservice import element. The scope specification,
> however, is not needed when we instantiate the composite inside another
> composite, as the option 1 case I described below. Is it right?
> 

The scope attribute indicates from which level you import your service. Global 
means that you'r looking only in the root one, while composite indicates you're 
looking within the composite.

> Unhappily, the error I found when trying this composite with the earlier
> version of the framework, that I described in my previous message, is still
> happening... This one is too low level for my still small knowledge and
> experience with iPOJO.
> 

We recently fix a loop in composite when a factory is requiring itself 
(infinitely). You're probably hitting this bug: 
https://issues.apache.org/jira/browse/FELIX-3130

Regards,

Clement

> Best regards,
> Fabio
> 
> 
> 
> Fabio Fonseca wrote:
>> 
>> Hi Clement,
>> 
>> Still regarding compositions with the same interface, I have one more
>> problem when trying to build some hierarchical compositions.
>> 
>> 1. Simple hierarchical composition: This is the option that works. I built
>> one composite instantiating a lower level composite, who, in turn,
>> instantiate a even lower level composite, and so on. I have used the tip
>> you gave me in previous messages regarding exporting the right instance.
>> My metadata is the one below:
>> 
>> <composite name="comanche.requestHandler">
>>      <instance
>> component="org.apache.comanche.requestDispatcher.RequestDispatcher"
>> name="RequestDispatcher"/>
>>      <instance component="FileRH"/>
>>      <instance component="ErrorRH"/>
>>      <provides action="export"
>>                specification="org.apache.comanche.services.RequestHandler"
>>                filter="(instance.name=RequestDispatcher)" />
>> </composite>
>> 
>> <composite name="comanche.backend">
>>      <instance component="comanche.requestHandler" name="RequestDispatcher"/>
>>      <instance 
>> component="org.apache.comanche.requestAnalyzer.RequestAnalyzer"
>> name="RequestAnalyzer"/>
>>      <instance component="org.apache.comanche.basicLogger.BasicLogger"/>
>>      <provides action="export"
>>                specification="org.apache.comanche.services.RequestHandler"
>>                filter="(instance.name=RequestAnalyzer)" />
>> </composite>
>> 
>> <composite name="comanche.frontend">
>>      <instance component="comanche.backend" name="RequestAnalyzer" />
>>      <instance 
>> component="org.apache.comanche.requestReceiver.RequestReceiver"
>> name="RequestReceiver"/>
>>      <subservice action="instantiate"
>> specification="org.apache.comanche.services.Scheduler"/>
>> </composite>
>> 
>> <composite name="comanche">
>>      <instance component="comanche.frontend"/>
>> </composite>
>> 
>> <instance component="comanche"/>
>> 
>> 2. Not-so-simple hierarchical composition: This is a variation of the
>> option 1, but with the highest level composite instantiating two lower
>> level composites that provides and requires services from each other.
>> Please see my metadata below:
>> 
>> <composite name="comanche.requestHandler">
>>      <instance
>> component="org.apache.comanche.requestDispatcher.RequestDispatcher"
>> name="RequestDispatcher"/>
>>      <instance component="FileRH"/>
>>      <instance component="ErrorRH"/>
>>      <provides action="export"
>>                specification="org.apache.comanche.services.RequestHandler"
>>                filter="(instance.name=RequestDispatcher)" />
>> </composite>
>> 
>> <composite name="comanche.backend">
>>      <instance component="comanche.requestHandler" name="RequestDispatcher"/>
>>      <instance 
>> component="org.apache.comanche.requestAnalyzer.RequestAnalyzer"
>> name="RequestAnalyzer"/>
>>      <instance component="org.apache.comanche.basicLogger.BasicLogger"/>
>>      <provides action="export"
>>                specification="org.apache.comanche.services.RequestHandler"
>>                filter="(instance.name=RequestAnalyzer)" />
>> </composite>
>> 
>> <composite name="comanche.frontend">
>>      <subservice action="import"/>
>>                  specification="org.apache.comanche.services.RequestHandler"
>>                  filter="(instance.name=RequestAnalyzer)" />
>>      <instance 
>> component="org.apache.comanche.requestReceiver.RequestReceiver"
>> name="RequestReceiver"/>
>>      <subservice action="instantiate"
>> specification="org.apache.comanche.services.Scheduler"/>
>> </composite>
>> 
>> <composite name="comanche">
>>      <instance component="comanche.backend" name="RequestAnalyzer" />
>>      <instance component="comanche.frontend"/>
>> </composite>
>> 
>> <instance component="comanche"/>
>> 
>> Here, you can see in the bold parts, that I export the RequestAnalyzer
>> service in the comanche.backend composite and import it in the
>> comanche.frontend composite. But it is not working. When I use the arch
>> command to see the internals of my compositions, I see the following:
>> 
>> (...)
>>      handler name="org.apache.felix.ipojo:instance" state="invalid"
>>              instance name="RequestAnalyzer" state="valid" 
>> factory="comanche.backend"
>>              instance state="Not Available" factory="comanche.frontend"
>>      handler name="org.apache.felix.ipojo:architecture" state="valid"
>> 
>> It shows that the comanche.frontend, although having a valid factory, does
>> not have a valid instance.
>> 
>> Well, I am a bit lost here. I think it may be again a matter of finding
>> the right parameters to the XML to make this composite works. Can you help
>> me?
>> 
>> In time: I'm using the framework prepared for composites that we can
>> download from the composite tutorial. It uses the following bundles:
>> 
>> -> ps
>> START LEVEL 1
>>   ID   State         Level  Name
>> [   0] [Active     ] [    0] System Bundle (2.0.5)
>> [   1] [Active     ] [    1] Apache Felix Bundle Repository (1.4.3)
>> [   2] [Active     ] [    1] Apache Felix iPOJO (1.6.0)
>> [   3] [Active     ] [    1] Apache Felix iPOJO Arch Command (1.6.0)
>> [   4] [Active     ] [    1] Apache Felix iPOJO Composite (1.6.0)
>> [   5] [Active     ] [    1] Apache Felix Log Service (1.0.0)
>> [   6] [Active     ] [    1] Apache Felix Shell Service (1.4.2)
>> [   7] [Active     ] [    1] Apache Felix Shell TUI (1.4.1)
>> 
>> As a matter of fact, I tried to use the latest version of the framework
>> with iPOJO 1.8.0 and Composite 1.8.0, but it generates a HUGE loop stack
>> trace when I start my composite bundle. It gives me high number of
>> warnings about the "name" attribute, that is deprecated in favor of
>> "instance.name" and the main error is:
>> 
>> [ERROR]  : The method bindFactory in the implementation class
>> org.apache.felix.ipojo.composite.instance.InstanceHandler throws an
>> exception : null
>> java.lang.StackOverflowError
>>      at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
>>      at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>      at java.lang.reflect.Method.invoke(Method.java:597)
>>      at org.apache.felix.ipojo.util.Callback.call(Callback.java:260)
>>      at
>> org.apache.felix.ipojo.handlers.dependency.DependencyCallback.callOnInstance(DependencyCallback.java:309)
>>      at
>> org.apache.felix.ipojo.handlers.dependency.Dependency.invokeCallback(Dependency.java:314)
>> (...)
>> 
>> 
>> Thanks in advance and best regards!
>> Fabio
>> 
>> 
>> clement escoffier wrote:
>>> 
>>> Hi,
>>> 
>>> On 06.04.2012, at 22:49, Fabio Fonseca wrote:
>>> 
>>>> 
>>>> Hi All!
>>>> 
>>>> I'm trying to make the Comanche SCA example to work with iPOJO. This
>>>> example
>>>> application is a very simple web server and is used everywhere with SCA.
>>>> The
>>>> problem is that different components of this application implements the
>>>> same
>>>> java interface.
>>>> 
>>>> In the SCA + Fractal component model world (Frascatti), this is not a
>>>> problem, since the software can be assembled by direct referencing the
>>>> desired instance. But this is a problem with OSGi/iPOJO, since, as far
>>>> as I
>>>> know, the bind is done automatically and the key for this mechanism is
>>>> the
>>>> unicity of the interface implemented by the component, which identifies
>>>> the
>>>> component.
>>>> 
>>>> When not using composites, I found a workaround for this problem by
>>>> specifying a name for a instance and using this name in the component
>>>> declaration, in the '<requires from="RequestDispatcher"...' key.
>>>> 
>>>> However, I'm facing a problem trying to use composite to assemble the
>>>> Comanche application. I'm trying to build a composite who encapsulates 3
>>>> components that implement the same interface. This composite has to
>>>> export
>>>> one specific instance to be used by the parent scope. To accomplish
>>>> this, I
>>>> did the following XML:
>>>> 
>>>> <composite name="RH">
>>>>    <instance component="FileRH" name="FileRH-Instance"/>
>>>>    <instance component="ErrorRH" name="ErrorRH-Instance"/>
>>>>    <instance
>>>> component="org.apache.comanche.requestDispatcher.RequestDispatcher"
>>>> name="RequestDispatcher"/>
>>>>    <provides action="export"
>>>> specification="org.apache.comanche.services.RequestHandler"/>
>>>> </composite>
>>>> 
>>>> The problem is: since all three components implements the same
>>>> RequestHandler interface, how can I tell the composite to export the
>>>> specific RequestDispatcher instance? I tried to use the "name"
>>>> workaround,
>>>> explained above, but it did not work. How can I do it?
>>> 
>>> The <provides/> element can have a 'filter' attribute indicating which
>>> service you want to export:
>>> <composite:provides action="export"
>>>     specification="..."
>>>     filter="(instance.name=RequestDispatcher)" />
>>> 
>>>> 
>>>> Also, I miss a Reference Card like the one found in
>>>> (http://felix.apache.org/site/ipojo-reference-card.html) enlightening
>>>> the
>>>> possibilities with composites. Do anyone plan to create something like
>>>> that?
>>>> 
>>> 
>>> 
>>> It's planed, but hard to say when….
>>> 
>>> Regards,
>>> 
>>> Clement
>>> 
>>>> Thanks in advance!
>>>> Fabio
>>>> -- 
>>>> View this message in context:
>>>> http://old.nabble.com/Different-components-using-the-same-interface-inside-a-composite-tp33645498p33645498.html
>>>> Sent from the Apache Felix - Users mailing list archive at Nabble.com.
>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: [email protected]
>>>> For additional commands, e-mail: [email protected]
>>>> 
>>> 
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>> 
>>> 
>>> 
>> 
>> 
> 
> -- 
> View this message in context: 
> http://old.nabble.com/Different-components-using-the-same-interface-inside-a-composite-tp33645498p33649920.html
> Sent from the Apache Felix - Users mailing list archive at Nabble.com.
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> 

Reply via email to