Hi,

It's not clear from the SCA spec how generics impacts the interface mapping. We need some clarifications there.

The JAXWS 2.1 spec uses the erased type and only honor the type argument in Collection. At this moment, Tuscany supports the following case:

@Remotable
public interface MyHelloService extends HelloService<String> {
}

And use MyHelloService as the service interface for HelloServiceImpl.

I don't think it's wise to try to cover other variations before we get it clarified by the spec.

Thanks,
Raymond
--------------------------------------------------
From: "Vamsavardhana Reddy" <[EMAIL PROTECTED]>
Sent: Friday, May 23, 2008 10:42 AM
To: <tuscany-dev@ws.apache.org>
Subject: TransformationException when using java interface definition with generics

Can someone point to me what I am doing wrong or if it is a problem in
Tuscany?  Details follow...

I have the following service interface:
@Remotable
public interface HelloService<E> {
   public E getGreetings(E name);
}
--------
The following is the service implementation:
@Service(HelloService.class)
public class HelloServiceImpl implements HelloService<String> {

   public String getGreetings(String name) {
       return "Hello "+name;
   }
}
--------
The following is the client interface that invokes the service:
public interface HelloServiceClient<E> {
   E getGreetingsForward(E name);
}
--------
The following is the client implementation:
@Service(HelloServiceClient.class)
public class HelloServiceClientImpl implements HelloServiceClient<String> {

   private HelloService<String> service;

   @Reference
   public void setHelloService(HelloService<String> service) {
       this.service = service;
   }

   public String getGreetingsForward(String name) {
       return service.getGreetings(name);
   }
}
--------
I have a HelloService component and two HelloServiceClient components in my
composite (given below):
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0";
          xmlns:wsdli="http://www.w3.org/2006/01/wsdl-instance";
          name="HelloService">

   <!-- Clients to test the service -->
   <component name="HelloServiceClientWSComponent">
       <implementation.java
class="org.apache.tuscany.sca.itest.impl.HelloServiceClientImpl" />
       <reference name="helloService">
           <interface.java
interface="org.apache.tuscany.sca.itest.HelloService"/>
           <binding.ws uri="http://localhost:8080/hs-ep1"/>
       </reference>
   </component>
   <component name="HelloServiceClientSCAComponent">
       <implementation.java
class="org.apache.tuscany.sca.itest.impl.HelloServiceClientImpl" />
       <reference name="helloService" target="HelloServiceComponent">
           <binding.sca/>
       </reference>
   </component>

   <!-- Components used to implement the services -->
   <component name="HelloServiceComponent">
       <implementation.java
class="org.apache.tuscany.sca.itest.impl.HelloServiceImpl"/>
       <service name="HelloService">
           <interface.java
interface="org.apache.tuscany.sca.itest.HelloService"/>
           <binding.ws uri="http://localhost:8080/hs-ep1"/>
           <binding.sca/>
       </service>
   </component>
</composite>
--------
The following is the code I am using to invoke the service via client
components:
       domain = SCADomain.newInstance("hello.composite");
       String name = "Me <String> SCA";
       HelloServiceClient<String> helloServiceClient =
domain.getService(HelloServiceClient.class,
"HelloServiceClientSCAComponent");
       String resp = helloServiceClient.getGreetingsForward(name);
       System.out.println(resp);

       name = "Me <String> WS";
       helloServiceClient = domain.getService(HelloServiceClient.class,
"HelloServiceClientWSComponent");
       resp = helloServiceClient.getGreetingsForward(name);
       System.out.println(resp);
--------

It works fine when I invoke the service using the client component that uses SCA binding to connect to the service. I get the following exception when I
use the client component that uses WS binding.

May 23, 2008 11:04:50 PM
org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceInOutSyncMessageReceiver
invokeBusinessLogic
SEVERE: org.apache.tuscany.sca.databinding.TransformationException: No path
found for the transformation: org.apache.axiom.om.OMElement->null
org.osoa.sca.ServiceRuntimeException:
org.apache.tuscany.sca.databinding.TransformationException: No path found
for the transformation: org.apache.axiom.om.OMElement->null
   at
org.apache.tuscany.sca.core.invocation.RuntimeWireInvoker.invoke(RuntimeWireInvoker.java:119)
   at
org.apache.tuscany.sca.core.invocation.RuntimeWireInvoker.invoke(RuntimeWireInvoker.java:85)
   at
org.apache.tuscany.sca.core.invocation.RuntimeWireInvoker.invoke(RuntimeWireInvoker.java:79)
   at
org.apache.tuscany.sca.core.assembly.RuntimeWireImpl.invoke(RuntimeWireImpl.java:138)
   at
org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceProvider.invokeTarget(Axis2ServiceProvider.java:669)
   at
org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceInOutSyncMessageReceiver.invokeBusinessLogic(Axis2ServiceInOutSyncMessageReceiver.java:68)
   at
org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver.invokeBusinessLogic(AbstractInOutSyncMessageReceiver.java:42)
   at
org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:96)
   at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:145)
   at
org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275)
   at
org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:120)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
   at
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
   at
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
   at
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
   at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)
   at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
   at org.mortbay.jetty.Server.handle(Server.java:324)
   at
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
   at
org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:842)
   at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:648)
   at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
   at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
   at
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
   at org.apache.tuscany.sca.core.work.Jsr237Work.run(Jsr237Work.java:63)
   at
org.apache.tuscany.sca.core.work.ThreadPoolWorkManager$DecoratingWork.run(ThreadPoolWorkManager.java:221)
   at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
   at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
   at java.lang.Thread.run(Thread.java:595)
Caused by: org.apache.tuscany.sca.databinding.TransformationException: No
path found for the transformation: org.apache.axiom.om.OMElement->null
   at
org.apache.tuscany.sca.databinding.impl.MediatorImpl.getTransformerChain(MediatorImpl.java:162)
   at
org.apache.tuscany.sca.databinding.impl.MediatorImpl.mediate(MediatorImpl.java:67)
   at
org.apache.tuscany.sca.core.databinding.transformers.Input2InputTransformer.transform(Input2InputTransformer.java:181)
   at
org.apache.tuscany.sca.core.databinding.transformers.Input2InputTransformer.transform(Input2InputTransformer.java:45)
   at
org.apache.tuscany.sca.databinding.impl.MediatorImpl.mediate(MediatorImpl.java:79)
   at
org.apache.tuscany.sca.core.databinding.wire.DataTransformationInterceptor.transform(DataTransformationInterceptor.java:186)
   at
org.apache.tuscany.sca.core.databinding.wire.DataTransformationInterceptor.invoke(DataTransformationInterceptor.java:76)
   at
org.apache.tuscany.sca.core.invocation.RuntimeWireInvoker.invoke(RuntimeWireInvoker.java:110)
   ... 29 more

Reply via email to