Simon Nash wrote:
Dong Liu wrote:
Hi,
It seems the API
ComponentContext.getRequestContext().getCallbackReference() will not
work if the service is pormte to composite service and used by other
compsite as implementation.composite. Here are the composite files I
tried:
innercomposite:
<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
targetNamespace="http://inner" name="InnerComposite">
<service name="Source" promote="InnerSourceComponent"
interface="source.Source" callbackInterface="source.SourceCallback" >
</service>
<component name="InnerSourceComponent">
<implementation.java class="source.SourceImpl"/> </component>
</composite>
OuterComposite:
<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
targetNamespace="http://outer" xmlns:inner="http://inner"
name="OuterComposite">
<component name="InnerComponent">
<implementation.composite name="inner:InnerComposite"/>
<service name="Source" interface="source.Source"
callbackInterface="source.SourceCallback" >
</service>
</component>
<component name="RequestComponent">
<implementation.java class="request.RequestImpl"/>
<reference name="sourceReference"
target="InnerComponent/Source" />
</component> </composite>
SourceImpl.java:
@Service(Source.class)
@Scope("COMPOSITE")
public class SourceImpl implements Source{
final static Logger logger = Logger.getLogger(SourceImpl.class);
private SourceCallback cb;
private ComponentContext ct; @Context public void
setContext(ComponentContext context)
{
logger.debug("Set ComponentContext ");
ct = context;
}
/*
@Callback
public void setSourceCallback(SourceCallback sourceCallback) {
logger.info("Set callback ");
cb = sourceCallback;
}
*/
public void clientMethod(String arg) {
logger.debug("SOurce clientMehod");
cb = (SourceCallback)
ct.getRequestContext().getCallbackReference().getService();
cb.receiveResult("Callbak response "+ arg);
}
}
When method clientMethod() is invoked, the getCallbackReference only
reutrns NULL.
However, the callbackReference is able to be injected by using
@Callback annotation.
Would you like to check my composites/java files to help me fimd out
where the error happens.
Thanks
Dong
Hi Dong,
Thans for reporting this problem. Your composites and Java files are
fine, and this is a bug in the Tuscany runtime. I don't yet know what
is causing it, but while debugging it I have found 3 other problems
so far:
1. When using a local callback interface together with reference or
service promotion, the Tuscany runtime produces a warning message for
interface incompatibility even though the interface is compatible.
I have created TUSCANY-3251 to track this.
2. The warning messages for incompatible references and services are
worded incorrectly. They include the name of the component reference
or service but the message wordings refer to this as a composite
reference or service. I have created TUSCANY-3252 to track this.
3. The implementation-composite sample and the itest/recursive test case
don't verify that the callbacks were received. If the callbacks are
not received because of null pointer exceptions, the tests appear to
pass even though they have failed. I have created TUSCANY-3253 to
track this.
I am still looking into the cause of the null return value from
getCallbackReference(). I will post more information when I have it.
Simon
I have found the cause of the problem with null being returned by
getCallbackReference() for composite implementations. Some code needs
to be added to ComponentServicePromotionBuilderImpl.java and
CompositeServicePromotionBuilderImpl.java. I have created TUSCANY-3254
to track this.
Simon