You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2010/02/24 14:16:17 UTC

svn commit: r915775 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/component/bean/ components/camel-soap/ components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/ components/camel-soap/src/main/java/org/apache/camel/dataforma...

Author: ningjiang
Date: Wed Feb 24 13:16:17 2010
New Revision: 915775

URL: http://svn.apache.org/viewvc?rev=915775&view=rev
Log:
CAMEL-2396 Applied patch with thanks to Christian

Added:
    camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfClientTest.java   (with props)
    camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfServerTest.java   (with props)
    camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfClientTest-context.xml   (with props)
    camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfServerTest-context.xml   (with props)
Removed:
    camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/ExceptionNameStrategy.java
    camel/trunk/components/camel-soap/src/test/java/org/apache/camel/converter/soap/name/ExceptionNameStrategyTest.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/CamelInvocationHandler.java
    camel/trunk/components/camel-soap/pom.xml
    camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/SoapJaxbDataFormat.java
    camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/ElementNameStrategy.java
    camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/QNameStrategy.java
    camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/ServiceInterfaceStrategy.java
    camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/TypeNameStrategy.java
    camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapClientTest.java
    camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapUnMarshalTest.java
    camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapMarshalTestExpectedFault.xml
    camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/responseFault.xml

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/CamelInvocationHandler.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/CamelInvocationHandler.java?rev=915775&r1=915774&r2=915775&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/CamelInvocationHandler.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/bean/CamelInvocationHandler.java Wed Feb 24 13:16:17 2010
@@ -17,7 +17,6 @@
 package org.apache.camel.component.bean;
 
 import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 import org.apache.camel.Endpoint;
@@ -74,7 +73,7 @@
                 }
                 throw (RuntimeCamelException) fault;
             }
-            throw new InvocationTargetException(fault);
+            throw fault;
         }
 
         // do not return a reply if the method is VOID or the MEP is not OUT capable

Modified: camel/trunk/components/camel-soap/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/pom.xml?rev=915775&r1=915774&r2=915775&view=diff
==============================================================================
--- camel/trunk/components/camel-soap/pom.xml (original)
+++ camel/trunk/components/camel-soap/pom.xml Wed Feb 24 13:16:17 2010
@@ -61,8 +61,8 @@
             <artifactId>jaxb-impl</artifactId>
         </dependency>
 
-	<!-- JAXWS api jars -->
-	<dependency>
+		<!-- JAXWS api jars -->
+		<dependency>
             <groupId>org.apache.geronimo.specs</groupId>
             <artifactId>geronimo-ws-metadata_2.0_spec</artifactId>
             <version>1.1.2</version>
@@ -96,6 +96,11 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-cxf</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>commons-logging</groupId>
             <artifactId>commons-logging</artifactId>
             <scope>test</scope>
@@ -116,6 +121,11 @@
             <artifactId>mockito-core</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+        	<groupId>org.springframework</groupId>
+        	<artifactId>spring-test</artifactId>
+        	<scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>

Modified: camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/SoapJaxbDataFormat.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/SoapJaxbDataFormat.java?rev=915775&r1=915774&r2=915775&view=diff
==============================================================================
--- camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/SoapJaxbDataFormat.java (original)
+++ camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/SoapJaxbDataFormat.java Wed Feb 24 13:16:17 2010
@@ -19,20 +19,23 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
+import java.util.List;
 
+import javax.jws.WebMethod;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.JAXBIntrospector;
 import javax.xml.namespace.QName;
+import javax.xml.ws.WebFault;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.bean.BeanInvocation;
 import org.apache.camel.converter.jaxb.JaxbDataFormat;
 import org.apache.camel.dataformat.soap.name.ElementNameStrategy;
-import org.apache.camel.dataformat.soap.name.ExceptionNameStrategy;
 import org.apache.camel.dataformat.soap.name.TypeNameStrategy;
 import org.xmlsoap.schemas.soap.envelope.Body;
 import org.xmlsoap.schemas.soap.envelope.Detail;
@@ -42,15 +45,17 @@
 
 /**
  * Marshaling from Objects to SOAP and back by using JAXB. The classes to be
- * processed need to have JAXB annotations. For marshaling a
- * ElementNameStrategy is used to determine how the top level elements in SOAP
- * are named as this can not be extracted from JAXB.
+ * processed need to have JAXB annotations. For marshaling a ElementNameStrategy
+ * is used to determine how the top level elements in SOAP are named as this can
+ * not be extracted from JAXB.
  */
 public class SoapJaxbDataFormat extends JaxbDataFormat {
     private static final String SOAP_PACKAGE_NAME = Envelope.class.getPackage().getName();
 
+    private static final QName FAULT_CODE_SERVER = new QName("http://www.w3.org/2003/05/soap-envelope", "Receiver");
+
     private ElementNameStrategy elementNameStrategy;
-    
+
     private String elementNameStrategyRef;
 
     /**
@@ -65,8 +70,8 @@
      * 
      * @param contexPath
      */
-    public SoapJaxbDataFormat(String contexPath) {
-        super(contexPath);
+    public SoapJaxbDataFormat(String contextPath) {
+        super(contextPath);
     }
 
     /**
@@ -83,15 +88,16 @@
         this(contextPath);
         this.elementNameStrategy = elementNameStrategy;
     }
-    
+
     public void setElementNameStrategy(Object nameStrategy) {
         if (nameStrategy instanceof ElementNameStrategy) {
             this.elementNameStrategy = (ElementNameStrategy) nameStrategy;
         } else {
-            new IllegalArgumentException("The argument for setElementNameStrategy should be subClass of " + ElementNameStrategy.class.getName());
+            new IllegalArgumentException("The argument for setElementNameStrategy should be subClass of "
+                    + ElementNameStrategy.class.getName());
         }
     }
-    
+
     protected void checkElementNameStrategy(Exchange exchange) {
         if (elementNameStrategy == null) {
             synchronized (this) {
@@ -99,7 +105,8 @@
                     return;
                 } else {
                     if (elementNameStrategyRef != null) {
-                        elementNameStrategy = exchange.getContext().getRegistry().lookup(elementNameStrategyRef, ElementNameStrategy.class);
+                        elementNameStrategy = exchange.getContext().getRegistry().lookup(elementNameStrategyRef,
+                                ElementNameStrategy.class);
                     } else {
                         elementNameStrategy = new TypeNameStrategy();
                     }
@@ -109,16 +116,25 @@
     }
 
     /**
-     * Marshal inputObject to SOAP xml. If the exchange or message has an EXCEPTION_CAUGTH
-     * property or header then instead of the object the exception is marshaled.
+     * Marshal inputObject to SOAP xml. If the exchange or message has an
+     * EXCEPTION_CAUGTH property or header then instead of the object the
+     * exception is marshaled.
      * 
-     * To determine the name of the top level xml elment the elementNameStrategy is used.
+     * To determine the name of the top level xml elment the elementNameStrategy
+     * is used.
      */
     public void marshal(Exchange exchange, final Object inputObject, OutputStream stream) throws IOException {
-        
+
         checkElementNameStrategy(exchange);
 
-        String soapAction = (String) exchange.getProperty(Exchange.SOAP_ACTION);
+        String soapAction = (String) exchange.getIn().getHeader(Exchange.SOAP_ACTION);
+        if (soapAction == null && inputObject instanceof BeanInvocation) {
+            BeanInvocation beanInvocation = (BeanInvocation) inputObject;
+            WebMethod webMethod = beanInvocation.getMethod().getAnnotation(WebMethod.class);
+            if (webMethod != null && webMethod.action() != null) {
+                soapAction = webMethod.action();
+            }
+        }
         Body body = new Body();
 
         Throwable exception = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class);
@@ -145,9 +161,12 @@
      * parameter are not supported. So the interface should be in doc lit bare
      * style.
      * 
-     * @param inputObject object to be put into the SOAP body
-     * @param soapAction for name resolution
-     * @param classResolver for name resolution
+     * @param inputObject
+     *            object to be put into the SOAP body
+     * @param soapAction
+     *            for name resolution
+     * @param classResolver
+     *            for name resolution
      * @return JAXBElement for the body content
      */
     @SuppressWarnings("unchecked")
@@ -178,7 +197,12 @@
      */
     @SuppressWarnings("unchecked")
     private JAXBElement<Fault> createFaultFromException(final Throwable exception, String soapAction) {
-        QName name = new ExceptionNameStrategy().findQNameForSoapActionOrType(soapAction, exception.getClass());
+        WebFault webFault = exception.getClass().getAnnotation(WebFault.class);
+        if (webFault == null || webFault.targetNamespace() == null) {
+            throw new RuntimeException("The exception " + exception.getClass().getName()
+                    + " needs to have an WebFault annotation with name and targetNamespace");
+        }
+        QName name = new QName(webFault.targetNamespace(), webFault.name());
         Object faultObject = null;
         try {
             Method method = exception.getClass().getMethod("getFaultInfo");
@@ -187,9 +211,7 @@
             throw new RuntimeCamelException("Exception while trying to get fault details", e);
         }
         Fault fault = new Fault();
-        fault
-                .setFaultcode(new QName(exception.getClass().getPackage().getName(), exception.getClass()
-                        .getSimpleName()));
+        fault.setFaultcode(FAULT_CODE_SERVER);
         fault.setFaultstring(exception.getMessage());
         Detail detailEl = new ObjectFactory().createDetail();
         JAXBElement<?> faultDetailContent = new JAXBElement(name, faultObject.getClass(), faultObject);
@@ -208,7 +230,51 @@
         }
         Envelope envelope = (Envelope) rootObject;
         Object payloadEl = envelope.getBody().getAny().get(0);
-        return (isIgnoreJAXBElement()) ? JAXBIntrospector.getValue(payloadEl) : payloadEl;
+        Object payload = JAXBIntrospector.getValue(payloadEl);
+        if (payload instanceof Fault) {
+            Exception exception = createExceptionFromFault((Fault) payload);
+            exchange.setException(exception);
+            return null;
+        } else {
+            return isIgnoreJAXBElement() ? payload : payloadEl;
+        }
+    }
+
+    /**
+     * Creates an exception and eventually an embedded bean that contains the
+     * fault detail. The exception class is determined by using the
+     * elementNameStrategy. The qName of the fault detail should match the
+     * WebFault annotation of the Exception class. If no fault detail is set the
+     * a RuntimeCamelException is created.
+     * 
+     * @param fault
+     *            Soap fault
+     * @return created Exception
+     */
+    private Exception createExceptionFromFault(Fault fault) {
+        List<Object> detailList = fault.getDetail().getAny();
+        String message = fault.getFaultstring();
+
+        if (detailList.size() == 0) {
+            return new RuntimeCamelException(message);
+        }
+        JAXBElement<?> detailEl = (JAXBElement<?>) detailList.get(0);
+        Class<? extends Exception> exceptionClass = elementNameStrategy.findExceptionForFaultName(detailEl.getName());
+        Constructor<? extends Exception> messageContructor;
+        Constructor<? extends Exception> constructor;
+
+        try {
+            messageContructor = exceptionClass.getConstructor(String.class);
+            Object detail = JAXBIntrospector.getValue(detailEl);
+            try {
+                constructor = exceptionClass.getConstructor(String.class, detail.getClass());
+                return constructor.newInstance(message, detail);
+            } catch (NoSuchMethodException e) {
+                return messageContructor.newInstance(message);
+            }
+        } catch (Exception e) {
+            throw new RuntimeCamelException(e);
+        }
     }
 
     /**

Modified: camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/ElementNameStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/ElementNameStrategy.java?rev=915775&r1=915774&r2=915775&view=diff
==============================================================================
--- camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/ElementNameStrategy.java (original)
+++ camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/ElementNameStrategy.java Wed Feb 24 13:16:17 2010
@@ -31,4 +31,11 @@
      * @return resolved element name
      */
     QName findQNameForSoapActionOrType(String soapAction, Class<?> type);
+    
+    /**
+     * Determine exception class for given SOAP Fault QName
+     * @param faultName
+     * @return
+     */
+    Class<? extends Exception> findExceptionForFaultName(QName faultName);
 }

Modified: camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/QNameStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/QNameStrategy.java?rev=915775&r1=915774&r2=915775&view=diff
==============================================================================
--- camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/QNameStrategy.java (original)
+++ camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/QNameStrategy.java Wed Feb 24 13:16:17 2010
@@ -19,25 +19,31 @@
 import javax.xml.namespace.QName;
 
 /**
- * Simply ElementNameStrategy that returns one preset QName
+ * Simply ElementNameStrategy that returns one preset QName. This can be handy
+ * for simple asynchronous calls
  */
 public class QNameStrategy implements ElementNameStrategy {
     private QName elementName;
-    
+
     /**
      * Initialize with one QName
      * 
-     * @param elmentName QName to be used for all finds
+     * @param elmentName
+     *            QName to be used for all finds
      */
     public QNameStrategy(QName elmentName) {
         this.elementName = elmentName;
     }
-    
+
     /**
      * @return preset element name
      */
     public QName findQNameForSoapActionOrType(String soapAction, Class<?> type) {
         return elementName;
     }
-    
+
+    public Class<? extends Exception> findExceptionForFaultName(QName faultName) {
+        throw new UnsupportedOperationException("Exception lookup is not supported for QNameStrategy");
+    }
+
 }

Modified: camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/ServiceInterfaceStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/ServiceInterfaceStrategy.java?rev=915775&r1=915774&r2=915775&view=diff
==============================================================================
--- camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/ServiceInterfaceStrategy.java (original)
+++ camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/ServiceInterfaceStrategy.java Wed Feb 24 13:16:17 2010
@@ -27,6 +27,7 @@
 import javax.xml.namespace.QName;
 import javax.xml.ws.RequestWrapper;
 import javax.xml.ws.ResponseWrapper;
+import javax.xml.ws.WebFault;
 
 import org.apache.camel.RuntimeCamelException;
 
@@ -40,6 +41,7 @@
     private Map<String, QName> outTypeNameToQName = new HashMap<String, QName>();
     private boolean isClient;
     private ElementNameStrategy fallBackStrategy;
+    private Map<QName, Class<? extends Exception>> faultNameToException = new HashMap<QName, Class<? extends Exception>>();
 
     /**
      * Init with JAX-WS service interface
@@ -115,6 +117,19 @@
                 soapActionToMethodInfo.put(info.getSoapAction(), info);
             }
             outTypeNameToQName.put(info.getOut().getTypeName(), info.getOut().getElName());
+            addExceptions(method);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private void addExceptions(Method method) {
+        Class<?>[] exTypes = method.getExceptionTypes();
+        for (Class<?> exType : exTypes) {
+            WebFault webFault = exType.getAnnotation(WebFault.class);
+            if (webFault != null) {
+                QName faultName = new QName(webFault.targetNamespace(), webFault.name());
+                faultNameToException.put(faultName, (Class<? extends Exception>) exType);
+            }
         }
     }
 
@@ -153,4 +168,9 @@
         }
         return qName;
     }
+
+    public Class<? extends Exception> findExceptionForFaultName(QName faultName) {
+        return faultNameToException.get(faultName);
+    }
+
 }

Modified: camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/TypeNameStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/TypeNameStrategy.java?rev=915775&r1=915774&r2=915775&view=diff
==============================================================================
--- camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/TypeNameStrategy.java (original)
+++ camel/trunk/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/name/TypeNameStrategy.java Wed Feb 24 13:16:17 2010
@@ -21,14 +21,14 @@
 import javax.xml.namespace.QName;
 
 /**
- * Strategy to determine the marshalled element name by looking at the annotations of the
- * class to be marshalled
+ * Strategy to determine the marshalled element name by looking at the
+ * annotations of the class to be marshalled
  */
 public class TypeNameStrategy implements ElementNameStrategy {
 
     /**
-     * @return determine element name by using the XmlType.name() of the type to be
-     * marshalled and the XmlSchema.namespace() of the package-info
+     * @return determine element name by using the XmlType.name() of the type to
+     *         be marshalled and the XmlSchema.namespace() of the package-info
      */
     public QName findQNameForSoapActionOrType(String soapAction, Class<?> type) {
         XmlType xmlType = type.getAnnotation(XmlType.class);
@@ -44,5 +44,9 @@
         }
         return new QName(nameSpace, xmlType.name());
     }
-    
+
+    public Class<? extends Exception> findExceptionForFaultName(QName faultName) {
+        throw new UnsupportedOperationException("Exception lookup is not supported for TypeNameStrategy");
+    }
+
 }

Modified: camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapClientTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapClientTest.java?rev=915775&r1=915774&r2=915775&view=diff
==============================================================================
--- camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapClientTest.java (original)
+++ camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapClientTest.java Wed Feb 24 13:16:17 2010
@@ -26,16 +26,14 @@
 import com.example.customerservice.GetCustomersByNameResponse;
 
 import org.apache.camel.Endpoint;
-import org.apache.camel.EndpointInject;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.Produce;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.bean.ProxyHelper;
-import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.dataformat.soap.name.ElementNameStrategy;
-import org.apache.camel.dataformat.soap.name.TypeNameStrategy;
+import org.apache.camel.dataformat.soap.name.ServiceInterfaceStrategy;
 import org.apache.camel.test.CamelTestSupport;
 
 public class SoapClientTest extends CamelTestSupport {
@@ -51,8 +49,6 @@
         }
     }
 
-    @EndpointInject(uri = "mock:result")
-    protected MockEndpoint resultEndpoint;
     protected CustomerService proxy;
 
     @Produce(uri = "direct:start")
@@ -80,12 +76,12 @@
 
             @Override
             public void configure() throws Exception {
-                ElementNameStrategy elNameStrat = new TypeNameStrategy();
+                ElementNameStrategy elNameStrat = new ServiceInterfaceStrategy(CustomerService.class, true);
                 SoapJaxbDataFormat soapDataFormat = new SoapJaxbDataFormat(
                         jaxbPackage, elNameStrat);
                 final InputStream in = this.getClass().getResourceAsStream(
                         "response.xml");
-                from("direct:start").marshal(soapDataFormat).to("mock:result")
+                from("direct:start").marshal(soapDataFormat)
                         .process(new FileReplyProcessor(in)).unmarshal(
                                 soapDataFormat);
             }

Added: camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfClientTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfClientTest.java?rev=915775&view=auto
==============================================================================
--- camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfClientTest.java (added)
+++ camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfClientTest.java Wed Feb 24 13:16:17 2010
@@ -0,0 +1,84 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dataformat.soap;
+
+import java.util.List;
+
+import javax.annotation.Resource;
+
+import com.example.customerservice.Customer;
+import com.example.customerservice.CustomerService;
+import com.example.customerservice.GetCustomersByName;
+import com.example.customerservice.GetCustomersByNameResponse;
+import com.example.customerservice.NoSuchCustomer;
+import com.example.customerservice.NoSuchCustomerException;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.dataformat.soap.name.ElementNameStrategy;
+import org.apache.camel.dataformat.soap.name.TypeNameStrategy;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration
+public class SoapCxfClientTest extends RouteBuilder {
+    @Resource(name = "customerServiceCxfProxy")
+    protected CustomerService customerService;
+
+    @Test
+    public void testSuccess() throws NoSuchCustomerException {
+        GetCustomersByName request = new GetCustomersByName();
+        request.setName("test");
+        GetCustomersByNameResponse response = customerService.getCustomersByName(request);
+        Assert.assertNotNull(response);
+        List<Customer> customers = response.getReturn();
+        Assert.assertEquals(1, customers.size());
+        Assert.assertEquals("test", customers.get(0).getName());
+    }
+
+    @Test
+    public void testFault() {
+        GetCustomersByName request = new GetCustomersByName();
+        request.setName("none");
+        try {
+            customerService.getCustomersByName(request);
+            Assert.fail("NoSuchCustomerException expected");
+        } catch (NoSuchCustomerException e) {
+            NoSuchCustomer info = e.getFaultInfo();
+            Assert.assertEquals("none", info.getCustomerId());
+        }
+
+    }
+
+    public void configure() throws Exception {
+        String jaxbPackage = GetCustomersByName.class.getPackage().getName();
+        ElementNameStrategy elNameStrat = new TypeNameStrategy();
+        SoapJaxbDataFormat soapDataFormat = new SoapJaxbDataFormat(jaxbPackage, elNameStrat);
+        CustomerServerBean serverBean = new CustomerServerBean();
+        from("direct:cxfclient").onException(Exception.class) // 
+                .handled(true) //
+                .marshal(soapDataFormat) //
+                .end() //
+                .unmarshal(soapDataFormat) //
+                .bean(serverBean) //
+                .marshal(soapDataFormat);
+    }
+
+}

Propchange: camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfClientTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfClientTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfServerTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfServerTest.java?rev=915775&view=auto
==============================================================================
--- camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfServerTest.java (added)
+++ camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfServerTest.java Wed Feb 24 13:16:17 2010
@@ -0,0 +1,89 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dataformat.soap;
+
+import java.util.List;
+
+import com.example.customerservice.Customer;
+import com.example.customerservice.CustomerService;
+import com.example.customerservice.GetCustomersByName;
+import com.example.customerservice.GetCustomersByNameResponse;
+import com.example.customerservice.NoSuchCustomer;
+import com.example.customerservice.NoSuchCustomerException;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.bean.ProxyHelper;
+import org.apache.camel.component.direct.DirectEndpoint;
+import org.apache.camel.dataformat.soap.name.ElementNameStrategy;
+import org.apache.camel.dataformat.soap.name.ServiceInterfaceStrategy;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration
+public class SoapCxfServerTest extends RouteBuilder {
+    protected CustomerService customerServiceProxy;
+
+    @EndpointInject(uri = "direct:camelClient")
+    protected DirectEndpoint clientEndpoint;
+
+    @SuppressWarnings("unchecked")
+    @Before
+    public void init() throws Exception {
+        customerServiceProxy = ProxyHelper.createProxy(clientEndpoint, CustomerService.class);
+    }
+
+    @Test
+    public void testSuccess() throws NoSuchCustomerException {
+        GetCustomersByName request = new GetCustomersByName();
+        request.setName("test");
+        GetCustomersByNameResponse response = customerServiceProxy.getCustomersByName(request);
+        Assert.assertNotNull(response);
+        List<Customer> customers = response.getReturn();
+        Assert.assertEquals(1, customers.size());
+        Assert.assertEquals("test", customers.get(0).getName());
+    }
+
+    @Test
+    public void testFault() {
+        GetCustomersByName request = new GetCustomersByName();
+        request.setName("none");
+        try {
+            customerServiceProxy.getCustomersByName(request);
+            Assert.fail("NoSuchCustomerException expected");
+        } catch (NoSuchCustomerException e) {
+            NoSuchCustomer info = e.getFaultInfo();
+            Assert.assertEquals("none", info.getCustomerId());
+        }
+    }
+
+    public void configure() throws Exception {
+        String jaxbPackage = GetCustomersByName.class.getPackage().getName();
+        ElementNameStrategy elNameStrat = new ServiceInterfaceStrategy(CustomerService.class, true);
+        SoapJaxbDataFormat soapDataFormat = new SoapJaxbDataFormat(jaxbPackage, elNameStrat);
+        from("direct:camelClient").onException(NoSuchCustomerException.class).handled(true).unmarshal(soapDataFormat)
+                .end().marshal(soapDataFormat) //
+                .to("direct:cxfEndpoint") //
+                .unmarshal(soapDataFormat);
+    }
+
+}

Propchange: camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfServerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapCxfServerTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapUnMarshalTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapUnMarshalTest.java?rev=915775&r1=915774&r2=915775&view=diff
==============================================================================
--- camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapUnMarshalTest.java (original)
+++ camel/trunk/components/camel-soap/src/test/java/org/apache/camel/dataformat/soap/SoapUnMarshalTest.java Wed Feb 24 13:16:17 2010
@@ -29,8 +29,6 @@
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.dataformat.soap.name.ElementNameStrategy;
-import org.apache.camel.dataformat.soap.name.TypeNameStrategy;
 import org.apache.camel.test.CamelTestSupport;
 
 public class SoapUnMarshalTest extends CamelTestSupport {

Added: camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfClientTest-context.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfClientTest-context.xml?rev=915775&view=auto
==============================================================================
--- camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfClientTest-context.xml (added)
+++ camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfClientTest-context.xml Wed Feb 24 13:16:17 2010
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+	<!--
+		Licensed to the Apache Software Foundation (ASF) under one or more
+		contributor license agreements. See the NOTICE file distributed with
+		this work for additional information regarding copyright ownership.
+		The ASF licenses this file to You under the Apache License, Version
+		2.0 (the "License"); you may not use this file except in compliance
+		with the License. You may obtain a copy of the License at
+
+		http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+		applicable law or agreed to in writing, software distributed under the
+		License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+		CONDITIONS OF ANY KIND, either express or implied. See the License for
+		the specific language governing permissions and limitations under the
+		License.
+	-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:jaxws="http://cxf.apache.org/jaxws"
+	xmlns:customer="http://customerservice.example.com/"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
+		http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
+		http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
+		http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+">
+
+	<import resource="classpath:META-INF/cxf/cxf.xml" />
+	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
+	<import resource="classpath:META-INF/cxf/cxf-extension-http.xml" />
+	<import resource="classpath:META-INF/cxf/cxf-extension-camel.xml" />
+
+	<jaxws:client id="customerServiceCxfProxy" 
+		serviceName="customer:CustomerServiceService" 
+		endpointName="customer:CustomerServiceEndpoint"
+		address="camel://direct:cxfclient" 
+		serviceClass="com.example.customerservice.CustomerService">
+	</jaxws:client>
+	
+	<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring">
+		<routeBuilder ref="testClass" />    
+	</camelContext>
+	
+	<bean id="testClass" class="org.apache.camel.dataformat.soap.SoapCxfClientTest"/>
+</beans>

Propchange: camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfClientTest-context.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfClientTest-context.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfClientTest-context.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfServerTest-context.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfServerTest-context.xml?rev=915775&view=auto
==============================================================================
--- camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfServerTest-context.xml (added)
+++ camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfServerTest-context.xml Wed Feb 24 13:16:17 2010
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+	<!--
+		Licensed to the Apache Software Foundation (ASF) under one or more
+		contributor license agreements. See the NOTICE file distributed with
+		this work for additional information regarding copyright ownership.
+		The ASF licenses this file to You under the Apache License, Version
+		2.0 (the "License"); you may not use this file except in compliance
+		with the License. You may obtain a copy of the License at
+
+		http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+		applicable law or agreed to in writing, software distributed under the
+		License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+		CONDITIONS OF ANY KIND, either express or implied. See the License for
+		the specific language governing permissions and limitations under the
+		License.
+	-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:jaxws="http://cxf.apache.org/jaxws"
+	xmlns:customer="http://customerservice.example.com/"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
+		http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
+		http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
+		http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+">
+
+	<import resource="classpath:META-INF/cxf/cxf.xml" />
+	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
+	<import resource="classpath:META-INF/cxf/cxf-extension-http.xml" />
+	<import resource="classpath:META-INF/cxf/cxf-extension-camel.xml" />
+
+	<bean id="serviceImpl" class="org.apache.camel.dataformat.soap.CustomerServerBean"/>
+	
+	<jaxws:endpoint id="customerServiceEndpoint" 
+		serviceName="customer:CustomerServiceService" 
+		endpointName="customer:CustomerServiceEndpoint"
+		address="camel://direct:cxfEndpoint" 
+		implementor="#serviceImpl"
+	/>
+	
+	<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring">
+		<routeBuilder ref="testClass" />    
+	</camelContext>
+	
+	<bean id="testClass" class="org.apache.camel.dataformat.soap.SoapCxfServerTest"/>
+</beans>

Propchange: camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfServerTest-context.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfServerTest-context.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapCxfServerTest-context.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Modified: camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapMarshalTestExpectedFault.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapMarshalTestExpectedFault.xml?rev=915775&r1=915774&r2=915775&view=diff
==============================================================================
--- camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapMarshalTestExpectedFault.xml (original)
+++ camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/SoapMarshalTestExpectedFault.xml Wed Feb 24 13:16:17 2010
@@ -2,7 +2,7 @@
 <ns2:Envelope xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns3="http://customerservice.example.com/">
     <ns2:Body>
         <ns2:Fault>
-            <faultcode xmlns:ns4="com.example.customerservice">ns4:NoSuchCustomerException</faultcode>
+            <faultcode xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">ns4:Receiver</faultcode>
             <faultstring>No customer found</faultstring>
             <detail>
                 <ns3:NoSuchCustomer>

Modified: camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/responseFault.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/responseFault.xml?rev=915775&r1=915774&r2=915775&view=diff
==============================================================================
--- camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/responseFault.xml (original)
+++ camel/trunk/components/camel-soap/src/test/resources/org/apache/camel/dataformat/soap/responseFault.xml Wed Feb 24 13:16:17 2010
@@ -2,7 +2,7 @@
 <ns2:Envelope xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns3="http://customerservice.example.com/">
     <ns2:Body>
         <ns2:Fault>
-            <faultcode xmlns:ns4="com.example.customerservice">ns4:NoSuchCustomerException</faultcode>
+            <faultcode xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">ns4:Receiver</faultcode>
             <faultstring>Customer not found</faultstring>
             <detail>
                 <ns3:NoSuchCustomer>