You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2013/06/14 04:12:45 UTC

svn commit: r1492929 - in /cxf/trunk: rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/ rt/wsdl/src/main/java/org/apache/cxf/wsdl/service/factory/ systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ systests/jaxws/src/test/java/org/apache/c...

Author: dkulp
Date: Fri Jun 14 02:12:45 2013
New Revision: 1492929

URL: http://svn.apache.org/r1492929
Log:
[CXF-5064] XmlJavaTypeAdapter's on soap header params aren't taken into account

Added:
    cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/
    cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/HeaderObj.java
    cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/HeaderObjTypeAdapter.java
    cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/SOAPHeaderSEI.java
    cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/SOAPHeaderServiceImpl.java
Modified:
    cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
    cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java
    cxf/trunk/rt/wsdl/src/main/java/org/apache/cxf/wsdl/service/factory/ReflectionServiceFactoryBean.java
    cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerMiscTest.java
    cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ServerMisc.java

Modified: cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java?rev=1492929&r1=1492928&r2=1492929&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java Fri Jun 14 02:12:45 2013
@@ -21,6 +21,7 @@ package org.apache.cxf.jaxb;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
@@ -46,6 +47,7 @@ import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
 import javax.xml.bind.ValidationEventHandler;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLEventReader;
 import javax.xml.stream.XMLEventWriter;
@@ -60,13 +62,16 @@ import org.w3c.dom.Node;
 import org.xml.sax.InputSource;
 
 import org.apache.cxf.common.injection.NoJSR250Annotations;
+import org.apache.cxf.common.jaxb.JAXBBeanInfo;
 import org.apache.cxf.common.jaxb.JAXBContextCache;
 import org.apache.cxf.common.jaxb.JAXBContextCache.CachedContextAndSchemas;
+import org.apache.cxf.common.jaxb.JAXBContextProxy;
 import org.apache.cxf.common.jaxb.JAXBUtils;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.ModCountCopyOnWriteArrayList;
 import org.apache.cxf.common.util.PackageUtils;
 import org.apache.cxf.common.util.PropertyUtils;
+import org.apache.cxf.common.util.ReflectionInvokationHandler;
 import org.apache.cxf.common.util.ReflectionUtil;
 import org.apache.cxf.common.xmlschema.SchemaCollection;
 import org.apache.cxf.databinding.AbstractDataBinding;
@@ -84,6 +89,8 @@ import org.apache.cxf.message.Message;
 import org.apache.cxf.resource.URIResolver;
 import org.apache.cxf.service.Service;
 import org.apache.cxf.service.factory.ServiceConstructionException;
+import org.apache.cxf.service.model.MessageInfo;
+import org.apache.cxf.service.model.MessagePartInfo;
 import org.apache.cxf.service.model.ServiceInfo;
 import org.apache.cxf.staxutils.StaxUtils;
 import org.apache.cxf.ws.addressing.ObjectFactory;
@@ -340,6 +347,7 @@ public class JAXBDataBinding extends Abs
 
             if (col.getXmlSchemas().length > 1) {
                 // someone has already filled in the types
+                justCheckForJAXBAnnotations(serviceInfo);
                 continue;
             }
 
@@ -411,6 +419,28 @@ public class JAXBDataBinding extends Abs
         }
     }
 
+    private void justCheckForJAXBAnnotations(ServiceInfo serviceInfo) {
+        for (MessageInfo mi: serviceInfo.getMessages().values()) {
+            for (MessagePartInfo mpi : mi.getMessageParts()) {
+                checkForJAXBAnnotations(mpi);
+            }
+        }
+    }
+    private void checkForJAXBAnnotations(MessagePartInfo mpi) {
+        Annotation[] anns = (Annotation[])mpi.getProperty("parameter.annotations");
+        JAXBContextProxy ctx = ReflectionInvokationHandler.createProxyWrapper(context, JAXBContextProxy.class);
+        XmlJavaTypeAdapter jta = JAXBSchemaInitializer.findFromTypeAdapter(ctx, mpi.getTypeClass(), anns);
+        JAXBBeanInfo jtaBeanInfo = null;
+        if (jta != null) {
+            jtaBeanInfo = JAXBSchemaInitializer.findFromTypeAdapter(ctx, jta.value());
+        }
+        JAXBBeanInfo beanInfo = JAXBSchemaInitializer.getBeanInfo(ctx, mpi.getTypeClass());
+        if (jtaBeanInfo != beanInfo && jta != null) {
+            mpi.setProperty("parameter.annotations", anns);
+            mpi.setProperty("honor.jaxb.annotations", Boolean.TRUE);
+        }
+    }
+
     private String getNamespaceToUse(Service service) {
         if ("true".equals(service.get("org.apache.cxf.databinding.namespace"))) {
             return null;

Modified: cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java?rev=1492929&r1=1492928&r2=1492929&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java Fri Jun 14 02:12:45 2013
@@ -170,31 +170,33 @@ class JAXBSchemaInitializer extends Serv
             }
         }
 
+        Annotation[] anns = (Annotation[])part.getProperty("parameter.annotations");
+        XmlJavaTypeAdapter jta = findFromTypeAdapter(context, clazz, anns);
+        JAXBBeanInfo jtaBeanInfo = null;
+        if (jta != null) {
+            jtaBeanInfo = findFromTypeAdapter(context, jta.value());
+        }
         JAXBBeanInfo beanInfo = getBeanInfo(clazz);
-        if (beanInfo == null) {
-            Annotation[] anns = (Annotation[])part.getProperty("parameter.annotations");
-            XmlJavaTypeAdapter jta = findFromTypeAdapter(clazz, anns);
-            if (jta != null) {
-                beanInfo = findFromTypeAdapter(jta.value());
-                if (anns == null) {
-                    anns = new Annotation[] {jta};
-                } else {
-                    boolean found = false;
-                    for (Annotation t : anns) {
-                        if (t == jta) {
-                            found = true;
-                        }
-                    }
-                    if (!found) {
-                        Annotation tmp[] = new Annotation[anns.length + 1];
-                        System.arraycopy(anns, 0, tmp, 0, anns.length);
-                        tmp[anns.length] = jta;
-                        anns = tmp;
+        if (jtaBeanInfo != beanInfo && jta != null) {
+            beanInfo = jtaBeanInfo;
+            if (anns == null) {
+                anns = new Annotation[] {jta};
+            } else {
+                boolean found = false;
+                for (Annotation t : anns) {
+                    if (t == jta) {
+                        found = true;
                     }
                 }
-                part.setProperty("parameter.annotations", anns);
-                part.setProperty("honor.jaxb.annotations", Boolean.TRUE);
+                if (!found) {
+                    Annotation tmp[] = new Annotation[anns.length + 1];
+                    System.arraycopy(anns, 0, tmp, 0, anns.length);
+                    tmp[anns.length] = jta;
+                    anns = tmp;
+                }
             }
+            part.setProperty("parameter.annotations", anns);
+            part.setProperty("honor.jaxb.annotations", Boolean.TRUE);
         }
         if (beanInfo == null) {
             if (Exception.class.isAssignableFrom(clazz)) {
@@ -249,29 +251,32 @@ class JAXBSchemaInitializer extends Serv
         }
     }
 
-    private XmlJavaTypeAdapter findFromTypeAdapter(Class<?> clazz, Annotation[] anns) {
+    static XmlJavaTypeAdapter findFromTypeAdapter(JAXBContextProxy context, Class<?> clazz, Annotation[] anns) {
         JAXBBeanInfo ret = null;
         if (anns != null) {
             for (Annotation a : anns) {
                 if (XmlJavaTypeAdapter.class.isAssignableFrom(a.annotationType())) {
-                    ret = findFromTypeAdapter(((XmlJavaTypeAdapter)a).value());
+                    ret = findFromTypeAdapter(context, ((XmlJavaTypeAdapter)a).value());
                     if (ret != null) {
                         return (XmlJavaTypeAdapter)a;
                     }
                 }
             }
         }
-        XmlJavaTypeAdapter xjta = clazz.getAnnotation(XmlJavaTypeAdapter.class);
-        if (xjta != null) {
-            ret = findFromTypeAdapter(xjta.value());
-            if (ret != null) {
-                return xjta;
+        if (clazz != null) {
+            XmlJavaTypeAdapter xjta = clazz.getAnnotation(XmlJavaTypeAdapter.class);
+            if (xjta != null) {
+                ret = findFromTypeAdapter(context, xjta.value());
+                if (ret != null) {
+                    return xjta;
+                }
             }
         }
         return null;
     }
 
-    private JAXBBeanInfo findFromTypeAdapter(@SuppressWarnings("rawtypes") 
+    static JAXBBeanInfo findFromTypeAdapter(JAXBContextProxy context,
+                                            @SuppressWarnings("rawtypes") 
                                              Class<? extends XmlAdapter> aclass) {
         Class<?> c2 = aclass;
         Type sp = c2.getGenericSuperclass();
@@ -282,7 +287,7 @@ class JAXBSchemaInitializer extends Serv
         if (sp instanceof ParameterizedType) {
             Type tp = ((ParameterizedType)sp).getActualTypeArguments()[0];
             if (tp instanceof Class) {
-                return getBeanInfo((Class<?>)tp);
+                return getBeanInfo(context, (Class<?>)tp);
             }
         }
         return null;

Modified: cxf/trunk/rt/wsdl/src/main/java/org/apache/cxf/wsdl/service/factory/ReflectionServiceFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/wsdl/src/main/java/org/apache/cxf/wsdl/service/factory/ReflectionServiceFactoryBean.java?rev=1492929&r1=1492928&r2=1492929&view=diff
==============================================================================
--- cxf/trunk/rt/wsdl/src/main/java/org/apache/cxf/wsdl/service/factory/ReflectionServiceFactoryBean.java (original)
+++ cxf/trunk/rt/wsdl/src/main/java/org/apache/cxf/wsdl/service/factory/ReflectionServiceFactoryBean.java Fri Jun 14 02:12:45 2013
@@ -149,6 +149,9 @@ public class ReflectionServiceFactoryBea
     public static final String METHOD_ANNOTATIONS = "method.return.annotations";
     public static final String PARAM_ANNOTATION = "parameter.annotations";
     private static final Logger LOG = LogUtils.getL7dLogger(ReflectionServiceFactoryBean.class);
+    private static final boolean DO_VALIDATE = SystemPropertyAction.getProperty("cxf.validateServiceSchemas", "false")
+            .equals("true");
+
     private static Class<? extends DataBinding> defaultDatabindingClass;
 
     protected String wsdlURL;
@@ -184,17 +187,16 @@ public class ReflectionServiceFactoryBea
 
     public ReflectionServiceFactoryBean() {
         getServiceConfigurations().add(0, new DefaultServiceConfiguration());
-
-        ignoredClasses.add("java.lang.Object");
-        ignoredClasses.add("java.lang.Throwable");
-        ignoredClasses.add("org.omg.CORBA_2_3.portable.ObjectImpl");
-        ignoredClasses.add("org.omg.CORBA.portable.ObjectImpl");
-        ignoredClasses.add("javax.ejb.EJBObject");
-        ignoredClasses.add("javax.rmi.CORBA.Stub");
+        ignoredClasses.addAll(Arrays.asList(new String[] {
+            "java.lang.Object",
+            "java.lang.Throwable",
+            "org.omg.CORBA_2_3.portable.ObjectImpl",
+            "org.omg.CORBA.portable.ObjectImpl",
+            "javax.ejb.EJBObject",
+            "javax.rmi.CORBA.Stub"
+        }));
     }
 
-
-
     protected DataBinding createDefaultDataBinding() {
         Object obj = null;
         Class<? extends DataBinding> cls = null;
@@ -839,6 +841,9 @@ public class ReflectionServiceFactoryBea
                     inf.setElementQName(part.getElementQName());
                     inf.setConcreteName(part.getConcreteName());
                     inf.setXmlSchema(part.getXmlSchema());
+                    if (paraAnnos != null) {
+                        part.setProperty(PARAM_ANNOTATION, paraAnnos);
+                    }
                     part = inf;
                     inf.setProperty(HEADER, Boolean.TRUE);
                 }
@@ -2459,7 +2464,7 @@ public class ReflectionServiceFactoryBea
     }
 
     public void setWsdlURL(URL wsdlURL) {
-        this.wsdlURL = wsdlURL.toString();
+        setWsdlURL(wsdlURL.toString());
     }
 
     public List<AbstractServiceConfiguration> getServiceConfigurations() {
@@ -2583,8 +2588,7 @@ public class ReflectionServiceFactoryBea
     }
 
     private boolean isValidate() {
-        return validate 
-            || SystemPropertyAction.getProperty("cxf.validateServiceSchemas", "false").equals("true");
+        return validate || DO_VALIDATE;
     }
 
     /**

Modified: cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerMiscTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerMiscTest.java?rev=1492929&r1=1492928&r2=1492929&view=diff
==============================================================================
--- cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerMiscTest.java (original)
+++ cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerMiscTest.java Fri Jun 14 02:12:45 2013
@@ -19,7 +19,9 @@
 
 package org.apache.cxf.systest.jaxws;
 
+import java.io.BufferedReader;
 import java.io.InputStream;
+import java.io.StringReader;
 import java.lang.reflect.Field;
 import java.lang.reflect.UndeclaredThrowableException;
 import java.math.BigInteger;
@@ -72,6 +74,8 @@ import org.apache.cxf.systest.jaxws.DocL
 import org.apache.cxf.systest.jaxws.DocLitWrappedCodeFirstService.CXF2411Result;
 import org.apache.cxf.systest.jaxws.DocLitWrappedCodeFirstService.CXF2411SubClass;
 import org.apache.cxf.systest.jaxws.DocLitWrappedCodeFirstService.Foo;
+import org.apache.cxf.systest.jaxws.cxf5064.HeaderObj;
+import org.apache.cxf.systest.jaxws.cxf5064.SOAPHeaderSEI;
 import org.apache.cxf.tests.inherit.Inherit;
 import org.apache.cxf.tests.inherit.InheritService;
 import org.apache.cxf.tests.inherit.objects.SubTypeA;
@@ -878,4 +882,36 @@ public class ClientServerMiscTest extend
         }
        
     }
+    
+    
+    @Test
+    public void testCXF5064() throws Exception {
+        URL url = new URL(ServerMisc.CXF_5064_URL + "?wsdl");
+        HttpURLConnection con = (HttpURLConnection)url.openConnection();
+        con.getResponseCode();
+        String str = IOUtils.readStringFromStream(con.getInputStream());
+        
+        //Check to make sure SESSIONID is a string
+        BufferedReader reader = new BufferedReader(new StringReader(str)); 
+        String s = reader.readLine();
+        while (s != null) {
+            if (s.contains("SESSIONID") && s.contains("element ")) {
+                assertTrue(s.contains("string"));
+                assertFalse(s.contains("headerObj"));
+            }
+            s = reader.readLine();   
+        }
+        //wsdl is correct, now make sure we can actually invoke it 
+        QName name = new QName("http://cxf.apache.org/cxf5064", 
+            "SOAPHeaderServiceImplService");
+        Service service = Service.create(name);
+        service.addPort(name, SOAPBinding.SOAP11HTTP_BINDING, ServerMisc.CXF_5064_URL);
+        SOAPHeaderSEI port = service.getPort(name, SOAPHeaderSEI.class);
+        assertEquals("a-b", port.test(new HeaderObj("a-b")));
+        
+        
+        service = Service.create(url, name);
+        port = service.getPort(SOAPHeaderSEI.class);
+        assertEquals("a-b", port.test(new HeaderObj("a-b")));
+    }
 }

Modified: cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ServerMisc.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ServerMisc.java?rev=1492929&r1=1492928&r2=1492929&view=diff
==============================================================================
--- cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ServerMisc.java (original)
+++ cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ServerMisc.java Fri Jun 14 02:12:45 2013
@@ -19,6 +19,9 @@
 
 package org.apache.cxf.systest.jaxws;
 
+import java.util.LinkedList;
+import java.util.List;
+
 import javax.xml.ws.Endpoint;
 
 import org.apache.cxf.anonymous_complex_type.AnonymousComplexTypeImpl;
@@ -33,6 +36,7 @@ import org.apache.cxf.service.invoker.Fa
 import org.apache.cxf.service.invoker.PerRequestFactory;
 import org.apache.cxf.service.invoker.PooledFactory;
 import org.apache.cxf.service.model.MessagePartInfo;
+import org.apache.cxf.systest.jaxws.cxf5064.SOAPHeaderServiceImpl;
 import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
 import org.apache.cxf.wsdl.service.factory.AbstractServiceConfiguration;
 
@@ -51,6 +55,25 @@ public class ServerMisc extends Abstract
         "http://localhost:" + PORT + "/DocLitBareCodeFirstService/";
     public static final String DOCLIT_CODEFIRST_SETTINGS_URL = 
         "http://localhost:" + PORT + "/DocLitWrappedCodeFirstServiceSettings/";
+    public static final String CXF_5064_URL = 
+        "http://localhost:" + PORT + "/CXF5064/";
+    
+    
+    List<org.apache.cxf.endpoint.Server> servers = new LinkedList<org.apache.cxf.endpoint.Server>();
+    List<Endpoint> endpoints = new LinkedList<Endpoint>();
+    public void tearDown() throws Exception {
+        for (org.apache.cxf.endpoint.Server s : servers) {
+            s.stop();
+            s.destroy();
+        }
+        servers.clear();
+        
+        for (Endpoint ep : endpoints) {
+            ep.stop();
+        }
+        endpoints.clear();
+    }
+    
     
     @SuppressWarnings("deprecation")
     protected void run() {
@@ -65,7 +88,7 @@ public class ServerMisc extends Abstract
         factoryBean.setAddress(DOCLIT_CODEFIRST_URL);
         factoryBean.setServiceClass(DocLitWrappedCodeFirstServiceImpl.class);
         factoryBean.setInvoker(invoker);
-        factoryBean.create();
+        servers.add(factoryBean.create());
         
         factoryBean = new JaxWsServerFactoryBean();
         factoryBean.setAddress(DOCLIT_CODEFIRST_SETTINGS_URL);
@@ -80,41 +103,43 @@ public class ServerMisc extends Abstract
                 return Long.valueOf(1L);
             }
         });
-        factoryBean.create();
+        servers.add(factoryBean.create());
          
         //Object implementor4 = new DocLitWrappedCodeFirstServiceImpl();
-        //Endpoint.publish(DOCLIT_CODEFIRST_URL, implementor4);
+        //endpoints.add(Endpoint.publish(DOCLIT_CODEFIRST_URL, implementor4));
         
         Object implementor7 = new DocLitBareCodeFirstServiceImpl();
         EndpointImpl ep = (EndpointImpl)Endpoint.publish(DOCLITBARE_CODEFIRST_URL, implementor7);
         ep.getServer().getEndpoint().getInInterceptors().add(new SAAJInInterceptor());
         ep.getServer().getEndpoint().getInInterceptors().add(new URIMappingInterceptor());
+        endpoints.add(ep);
 
         
         Object implementor6 = new InterfaceInheritTestImpl();
-        Endpoint.publish(DOCLIT_CODEFIRST_BASE_URL, implementor6);
+        endpoints.add(Endpoint.publish(DOCLIT_CODEFIRST_BASE_URL, implementor6));
         
         Object implementor1 = new AnonymousComplexTypeImpl();
         String address = "http://localhost:" + PORT + "/anonymous_complex_typeSOAP";
-        Endpoint.publish(address, implementor1);
+        endpoints.add(Endpoint.publish(address, implementor1));
 
         Object implementor2 = new JaxbElementTestImpl();
         address = "http://localhost:" + PORT + "/jaxb_element_test";
-        Endpoint.publish(address, implementor2);
+        endpoints.add(Endpoint.publish(address, implementor2));
 
         Object implementor3 = new OrderedParamHolderImpl();
         address = "http://localhost:" + PORT + "/ordered_param_holder/";
-        Endpoint.publish(address, implementor3);
+        endpoints.add(Endpoint.publish(address, implementor3));
         
         //Object implementor4 = new DocLitWrappedCodeFirstServiceImpl();
-        //Endpoint.publish(DOCLIT_CODEFIRST_URL, implementor4);
+        //endpoints.add(Endpoint.publish(DOCLIT_CODEFIRST_URL, implementor4));
         
         Object implementor5 = new RpcLitCodeFirstServiceImpl();
-        Endpoint.publish(RPCLIT_CODEFIRST_URL, implementor5);
+        endpoints.add(Endpoint.publish(RPCLIT_CODEFIRST_URL, implementor5));
         
-        Endpoint.publish("http://localhost:" + PORT + "/InheritContext/InheritPort",
-                         new InheritImpl());
-
+        endpoints.add(Endpoint.publish("http://localhost:" + PORT + "/InheritContext/InheritPort",
+                         new InheritImpl()));
+        
+        endpoints.add(Endpoint.publish(CXF_5064_URL, new SOAPHeaderServiceImpl()));
     }
 
     public static void main(String[] args) {

Added: cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/HeaderObj.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/HeaderObj.java?rev=1492929&view=auto
==============================================================================
--- cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/HeaderObj.java (added)
+++ cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/HeaderObj.java Fri Jun 14 02:12:45 2013
@@ -0,0 +1,62 @@
+/**
+ * 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.cxf.systest.jaxws.cxf5064;
+
+/**
+ * 
+ */
+public class HeaderObj {
+    String field1;
+    String field2;
+
+    public HeaderObj() {
+    }
+
+    public HeaderObj(String value) {
+        if (value != null && !value.trim().isEmpty()) {
+            String fields[] = value.split("-");
+            if (fields.length == 2) {
+                field1 = fields[0];
+                field2 = fields[1];
+            }
+        }
+    }
+
+    public String getField1() {
+        return field1;
+    }
+
+    public void setField1(String field1) {
+        this.field1 = field1;
+    }
+
+    public String getField2() {
+        return field2;
+    }
+
+    public void setField2(String field2) {
+        this.field2 = field2;
+    }
+
+    @Override
+    public String toString() {
+        return field1 + "-" + field2;
+    }
+}

Added: cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/HeaderObjTypeAdapter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/HeaderObjTypeAdapter.java?rev=1492929&view=auto
==============================================================================
--- cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/HeaderObjTypeAdapter.java (added)
+++ cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/HeaderObjTypeAdapter.java Fri Jun 14 02:12:45 2013
@@ -0,0 +1,37 @@
+/**
+ * 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.cxf.systest.jaxws.cxf5064;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+public class HeaderObjTypeAdapter extends XmlAdapter<String, HeaderObj> {
+    @Override
+    public String marshal(HeaderObj v) throws Exception {
+        if (v == null) {
+            return null;
+        }
+        return v.toString();
+    }
+
+    @Override
+    public HeaderObj unmarshal(String v) throws Exception {
+        return new HeaderObj(v);
+    }
+}

Added: cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/SOAPHeaderSEI.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/SOAPHeaderSEI.java?rev=1492929&view=auto
==============================================================================
--- cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/SOAPHeaderSEI.java (added)
+++ cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/SOAPHeaderSEI.java Fri Jun 14 02:12:45 2013
@@ -0,0 +1,33 @@
+/**
+ * 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.cxf.systest.jaxws.cxf5064;
+
+import javax.jws.WebMethod;
+import javax.jws.WebParam;
+import javax.jws.WebParam.Mode;
+import javax.jws.WebService;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+@WebService(targetNamespace = "http://cxf.apache.org/cxf5064")
+public interface SOAPHeaderSEI {
+    @WebMethod(operationName = "test")
+    String test(@WebParam(header = true, mode = Mode.IN, name = "SESSIONID") 
+        @XmlJavaTypeAdapter(HeaderObjTypeAdapter.class) HeaderObj headerObj);
+}

Added: cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/SOAPHeaderServiceImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/SOAPHeaderServiceImpl.java?rev=1492929&view=auto
==============================================================================
--- cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/SOAPHeaderServiceImpl.java (added)
+++ cxf/trunk/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/cxf5064/SOAPHeaderServiceImpl.java Fri Jun 14 02:12:45 2013
@@ -0,0 +1,38 @@
+/**
+ * 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.cxf.systest.jaxws.cxf5064;
+
+import javax.jws.WebService;
+
+@WebService(targetNamespace = "http://cxf.apache.org/cxf5064")
+public class SOAPHeaderServiceImpl implements SOAPHeaderSEI {
+
+    /**
+     * 
+     */
+    public SOAPHeaderServiceImpl() {
+        // TODO Auto-generated constructor stub
+    }
+
+    public String test(HeaderObj headerObj) {
+        return headerObj.toString();
+    }
+
+}