6 Replies Latest reply: Feb 15, 2012 6:00 PM by Gilles Dupont Tagne Tagne RSS

Camel Services and SOAP Bindings problem

Gilles Dupont Tagne Tagne Newbie

Hi Guys,

 

i started to play around with Switchyard and built a small project which use Camel Services and Soap Bindings. I was able to deploy the Switchyard project on switchyard-as7-0.3. The classes are very simple.

 

The interface CamelService

 

public interface CamelService { 
          public void makeCamelCall(String message);
          public void testCamelCall(String message);
}

 

The Camel Services

 

@Route(CamelService.class)
public class CamelServiceBean extends RouteBuilder {

  @Override
          public void configure() throws Exception {

                    onException(Exception.class)
                                        .handled(true)
                                        .log("\nERROR: ${body}\n");

                    from("switchyard://CamelService")
                                         .log("\n${body}\n");
          }

}

 

The interface HelloService

 

public interface HelloService { 
          public void sayHello(String name);
          public void printMessage(String message);
}

 

The Bean Services

 

@Service(HelloService.class)
public class HelloServiceBean implements HelloService {

  @Inject @Reference
          private CamelService camelService;

  @Override
          public void sayHello(String name) {
                    camelService.makeCamelCall(name);
          }

  @Override
          public void printMessage(String message) {
                    System.out.println("Switchyard Message: " + message + " :-)");
          } 
}

 

I also wrote a Transformer

 

public class SwitchyardTransformer {

  private static final String SAYHELLO_EXPRESSION = "//urn:name";

  @Transformer(from = "{urn:gillesswitchyard:services:1.0}sayHello")
          public String transformSayHello(String xmlName) throws XPathExpressionException{
                    XPathFactory xPathFactory = XPathFactory.newInstance();
                    XPath xPath = xPathFactory.newXPath();
                    xPath.setNamespaceContext(new SwitchyardNamespaceContext());
                    return xPath.evaluate(SAYHELLO_EXPRESSION, new InputSource(new StringReader(xmlName)));
          }

}

 

The helloservice.wsdl

 

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="HelloService" targetNamespace="urn:gillesswitchyard:services:1.0" xmlns:ns1="urn:gillesswitchyard:services:1.0" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:gillesswitchyard:services:1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="urn:gillesswitchyard:services:1.0" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:gillesswitchyard:services:1.0">
  <xsd:element name="sayHello" type="tns:sayHello"/>
  <xsd:complexType name="sayHello">
    <xsd:sequence>
      <xsd:element minOccurs="0" name="name" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>
  </wsdl:types>
  <wsdl:message name="sayHello">
    <wsdl:part name="parameters" element="ns1:sayHello">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="HelloServicePortType">
    <wsdl:operation name="sayHello">
      <wsdl:input name="sayHello" message="ns1:sayHello">
    </wsdl:input>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="HelloServiceSoapBinding" type="ns1:HelloServicePortType">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="sayHello">
      <soap:operation soapAction="urn:gillesswitchyard:services:1.0" style="document"/>
      <wsdl:input name="sayHello">
        <soap:body use="literal"/>
      </wsdl:input>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="HelloService">
    <wsdl:port name="HelloServicePort" binding="ns1:HelloServiceSoapBinding">
      <soap:address location="http://localhost:9000/HelloServicePort"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

 

The switchyard.xml file

 

<?xml version="1.0" encoding="UTF-8"?>
<switchyard xmlns="urn:switchyard-config:switchyard:1.0"
  xmlns:swyd="urn:switchyard-config:switchyard:1.0" xmlns:trfm="urn:switchyard-config:transform:1.0"
  xmlns:bean="urn:switchyard-component-bean:config:1.0" xmlns:camel="urn:switchyard-component-camel:config:1.0"
  xmlns:soap="urn:switchyard-component-soap:config:1.0" xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912"
  targetNamespace="urn:de.gilles.projects.switchyard:switchyardProjects:1.0"
  name="switchyardProjects">

  <sca:composite name="HelloServices" targetNamespace="urn:gillesswitchyard:services:1.0">
  <sca:service name="HelloService" promote="HelloService">
  <soap:binding.soap>
                                        <soap:wsdl>META-INF/wsdl/helloservice.wsdl</soap:wsdl>
  <soap:socketAddr>:9000</soap:socketAddr>
  </soap:binding.soap>
  </sca:service>
  </sca:composite>

</switchyard>

 

As i already told the application was deployed without problem. But when i test the webservice ( Test is done with SOAPUI) with a parameter like Test

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:gillesswitchyard:services:1.0">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:sayHello>
         <!--Optional:-->
         <urn:name>Test</urn:name>
      </urn:sayHello>
   </soapenv:Body>
</soapenv:Envelope>

 

i have an unexpected response on the console

 

20:06:17,894 INFO  [route1] (default-workqueue-3) 
Test

20:06:17,927 INFO  [route1] (default-workqueue-4) 
Test

20:06:17,960 INFO  [route1] (default-workqueue-5) 
Test

20:06:17,996 INFO  [route1] (default-workqueue-1) 
Test

 

Please could somebody explain me what is wrong with my code. Because i was expecting only 1 output and not 4 outputs.

 

Thanks