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 2010/10/06 23:14:40 UTC

svn commit: r1005257 - in /cxf/branches/2.2.x-fixes: ./ rt/databinding/xmlbeans/src/main/java/org/apache/cxf/xmlbeans/ systests/databinding/src/test/java/org/apache/cxf/systest/xmlbeans/

Author: dkulp
Date: Wed Oct  6 21:14:37 2010
New Revision: 1005257

URL: http://svn.apache.org/viewvc?rev=1005257&view=rev
Log:
Merged revisions 1005254 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r1005254 | dkulp | 2010-10-06 17:06:12 -0400 (Wed, 06 Oct 2010) | 2 lines
  
  [CXF-2959, CXF-2955] Support the catalogs within XmlBeans
  Support using XmlBeans for header objects
........

Modified:
    cxf/branches/2.2.x-fixes/   (props changed)
    cxf/branches/2.2.x-fixes/rt/databinding/xmlbeans/src/main/java/org/apache/cxf/xmlbeans/DataWriterImpl.java
    cxf/branches/2.2.x-fixes/rt/databinding/xmlbeans/src/main/java/org/apache/cxf/xmlbeans/XmlBeansSchemaInitializer.java
    cxf/branches/2.2.x-fixes/systests/databinding/src/test/java/org/apache/cxf/systest/xmlbeans/ClientServerXmlBeansTest.java

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.2.x-fixes/rt/databinding/xmlbeans/src/main/java/org/apache/cxf/xmlbeans/DataWriterImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/databinding/xmlbeans/src/main/java/org/apache/cxf/xmlbeans/DataWriterImpl.java?rev=1005257&r1=1005256&r2=1005257&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/databinding/xmlbeans/src/main/java/org/apache/cxf/xmlbeans/DataWriterImpl.java (original)
+++ cxf/branches/2.2.x-fixes/rt/databinding/xmlbeans/src/main/java/org/apache/cxf/xmlbeans/DataWriterImpl.java Wed Oct  6 21:14:37 2010
@@ -20,7 +20,9 @@
 package org.apache.cxf.xmlbeans;
 
 
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.util.Collection;
 import java.util.logging.Logger;
 
@@ -45,6 +47,7 @@ import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageUtils;
 import org.apache.cxf.service.model.MessagePartInfo;
 import org.apache.cxf.staxutils.StaxUtils;
+import org.apache.ws.commons.schema.XmlSchemaAnnotated;
 import org.apache.ws.commons.schema.XmlSchemaElement;
 import org.apache.xmlbeans.SchemaType;
 import org.apache.xmlbeans.XmlAnySimpleType;
@@ -68,7 +71,12 @@ public class DataWriterImpl implements D
     public void write(Object obj, MessagePartInfo part, XMLStreamWriter output) {
         try {
             Class<?> typeClass = part.getTypeClass();
-            if (!XmlObject.class.isAssignableFrom(typeClass)) {
+            if (typeClass == null) {
+                typeClass = obj.getClass();
+            }
+            XmlSchemaAnnotated schemaType = part ==  null ? null : part.getXmlSchema();
+            
+            if (!XmlObject.class.isAssignableFrom(typeClass) && part != null) {
                 typeClass = (Class<?>)part.getProperty(XmlAnySimpleType.class.getName());
                 
                 Class<?> cls[] = typeClass.getDeclaredClasses();
@@ -95,7 +103,7 @@ public class DataWriterImpl implements D
 
             
             if (obj != null
-                || !(part.getXmlSchema() instanceof XmlSchemaElement)) {
+                || !(schemaType instanceof XmlSchemaElement)) {
                 XmlOptions options = new XmlOptions();
                 if (schema != null) {
                     options.setValidateOnSet();
@@ -143,7 +151,20 @@ public class DataWriterImpl implements D
                     XmlTokenSource source = (XmlTokenSource)obj;
                     reader = source.newCursor().newXMLStreamReader(options);                    
                 }
-                SchemaType st = (SchemaType)part.getProperty(SchemaType.class.getName());
+                SchemaType st = part == null ? null 
+                    : (SchemaType)part.getProperty(SchemaType.class.getName());
+                if (st == null) {
+                    try {
+                        Field f = typeClass.getField("type");
+                        if (Modifier.isStatic(f.getModifiers())) {
+                            st = (SchemaType)f.get(null);
+                            part.setProperty(SchemaType.class.getName(), st);
+                        }
+                    } catch (Exception es) {
+                        //ignore
+                        es.printStackTrace();
+                    }
+                }
                 int i = reader.getEventType();
                 if (i == XMLStreamReader.START_DOCUMENT) {
                     i = reader.next();

Modified: cxf/branches/2.2.x-fixes/rt/databinding/xmlbeans/src/main/java/org/apache/cxf/xmlbeans/XmlBeansSchemaInitializer.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/databinding/xmlbeans/src/main/java/org/apache/cxf/xmlbeans/XmlBeansSchemaInitializer.java?rev=1005257&r1=1005256&r2=1005257&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/databinding/xmlbeans/src/main/java/org/apache/cxf/xmlbeans/XmlBeansSchemaInitializer.java (original)
+++ cxf/branches/2.2.x-fixes/rt/databinding/xmlbeans/src/main/java/org/apache/cxf/xmlbeans/XmlBeansSchemaInitializer.java Wed Oct  6 21:14:37 2010
@@ -54,6 +54,7 @@ import org.apache.cxf.service.model.Mess
 import org.apache.cxf.service.model.ServiceInfo;
 import org.apache.ws.commons.schema.XmlSchema;
 import org.apache.ws.commons.schema.XmlSchemaElement;
+import org.apache.ws.commons.schema.XmlSchemaException;
 import org.apache.ws.commons.schema.XmlSchemaType;
 import org.apache.ws.commons.schema.resolver.URIResolver;
 import org.apache.xmlbeans.SchemaType;
@@ -61,13 +62,15 @@ import org.apache.xmlbeans.SchemaTypeSys
 import org.apache.xmlbeans.XmlAnySimpleType;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.impl.schema.BuiltinSchemaTypeSystem;
+import org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl;
 
 /**
  * Walks the service model and sets up the element/type names.
  */
 class XmlBeansSchemaInitializer extends ServiceModelVisitor {
 
-
+    public static final String XML_BEANS_SCHEMA_PREFIX = "schema" 
+        + SchemaTypeSystemImpl.METADATA_PACKAGE_GEN + "/src/";
     private static final Logger LOG = LogUtils.getLogger(XmlBeansSchemaInitializer.class);
     private static final Map<Class<?>, Class<? extends XmlAnySimpleType>> CLASS_MAP 
         = new HashMap<Class<?>, Class<? extends XmlAnySimpleType>>();
@@ -75,6 +78,7 @@ class XmlBeansSchemaInitializer extends 
     private XmlBeansDataBinding dataBinding;
     private Map<String, XmlSchema> schemaMap 
         = new HashMap<String, XmlSchema>();
+    private URIResolver schemaResolver;
     
     static {
         CLASS_MAP.put(String.class, org.apache.xmlbeans.XmlString.class);
@@ -105,6 +109,7 @@ class XmlBeansSchemaInitializer extends 
         super(serviceInfo);
         schemas = col;
         dataBinding = db;
+        schemaResolver = serviceInfo.getXmlSchemaCollection().getXmlSchemaCollection().getSchemaResolver();
     }
     
     public class XMLSchemaResolver implements URIResolver {
@@ -148,10 +153,29 @@ class XmlBeansSchemaInitializer extends 
 
         return schema;
     }
-    XmlSchema getSchema(SchemaTypeSystem sts, String file) {
+    protected XmlSchema getSchema(SchemaTypeSystem sts, String file) {
         if (schemaMap.containsKey(file)) {
             return schemaMap.get(file);
         }
+
+        try {
+            InputSource fileSource = schemaResolver.resolveEntity(null, 
+                                                                        file, 
+                                                                        null);
+            String systemId = removePrefix(fileSource.getSystemId(),
+                                           XML_BEANS_SCHEMA_PREFIX);
+
+            return getSchemaInternal(sts, systemId);
+        } catch (XmlSchemaException e) {
+            if (LOG.isLoggable(Level.FINEST)) {
+                LOG.log(Level.FINEST,
+                        "The XML catalog is not configured to map the file [" + file + "] ", e);
+            }
+        }
+        return getSchemaInternal(sts, file);
+    }
+        
+    protected XmlSchema getSchemaInternal(SchemaTypeSystem sts, String file) {
         InputStream ins = sts.getSourceAsStream(file);
         if (ins == null) {
             return null;
@@ -181,7 +205,18 @@ class XmlBeansSchemaInitializer extends 
             throw new RuntimeException("Failed to find schema for: " + file, e);
         }
     }
-
+    /**
+     * Removes the prefix ending with the given suffix. For instance, the value
+     * XYZ where the prefix is Y, the result will be Z. The removed string is XY.
+     *
+     * @param value the value from where the returned string is extracted
+     * @param prefixSuffix the prefix
+     * @return the rest of the string
+     */
+    protected String removePrefix(String value, String prefixSuffix) {
+        return value.substring(value.indexOf(prefixSuffix) + prefixSuffix.length());
+    } 
+    
     @Override
     public void begin(MessagePartInfo part) {
         LOG.finest(part.getName().toString());

Modified: cxf/branches/2.2.x-fixes/systests/databinding/src/test/java/org/apache/cxf/systest/xmlbeans/ClientServerXmlBeansTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/databinding/src/test/java/org/apache/cxf/systest/xmlbeans/ClientServerXmlBeansTest.java?rev=1005257&r1=1005256&r2=1005257&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/systests/databinding/src/test/java/org/apache/cxf/systest/xmlbeans/ClientServerXmlBeansTest.java (original)
+++ cxf/branches/2.2.x-fixes/systests/databinding/src/test/java/org/apache/cxf/systest/xmlbeans/ClientServerXmlBeansTest.java Wed Oct  6 21:14:37 2010
@@ -19,10 +19,15 @@
 
 package org.apache.cxf.systest.xmlbeans;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.math.BigDecimal;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
 import javax.xml.ws.Holder;
 import javax.xml.ws.WebServiceException;
 import javax.xml.ws.soap.SOAPBinding;
@@ -30,7 +35,9 @@ import javax.xml.ws.soap.SOAPBinding;
 import org.apache.cxf.Bus;
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.bus.spring.SpringBusFactory;
+import org.apache.cxf.endpoint.Client;
 import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.headers.Header;
 import org.apache.cxf.interceptor.LoggingInInterceptor;
 import org.apache.cxf.interceptor.LoggingOutInterceptor;
 import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
@@ -207,5 +214,49 @@ public class ClientServerXmlBeansTest ex
         }
 
     }
-
+    @Test
+    public void testXmlBeansHeader() throws Exception {
+        //CXF-2955
+        SpringBusFactory factory = new SpringBusFactory();
+        Bus bus = factory.createBus("org/apache/cxf/systest/xmlbeans/cxf_no_wsdl.xml");
+        BusFactory.setDefaultBus(bus);
+        URL wsdl = this.getClass().getResource("/wsdl_systest_databinding/xmlbeans/hello_world.wsdl");
+        assertNotNull("We should have found the WSDL here. " , wsdl);      
+        
+        SOAPService ss = new SOAPService(wsdl, SERVICE_NAME);
+        QName soapPort = new QName("http://apache.org/hello_world_soap_http/xmlbeans", "SoapPort");
+        ss.addPort(soapPort, SOAPBinding.SOAP11HTTP_BINDING, "http://localhost:" 
+                   + NOWSDL_PORT + "/SoapContext/SoapPort");
+        Greeter port = ss.getPort(soapPort, Greeter.class);
+        
+        Client client = ClientProxy.getClient(port);
+        
+        List<Header> headers = new ArrayList<Header>();
+        org.apache.helloWorldSoapHttp.xmlbeans.types.GreetMeDocument doc 
+            = org.apache.helloWorldSoapHttp.xmlbeans.types.GreetMeDocument.Factory.newInstance();
+        doc.addNewGreetMe().setRequestType("doc format header");
+        Header head = new Header(new QName("", "doc"), doc,
+                                 client.getEndpoint().getService().getDataBinding());
+        headers.add(head);
+        org.apache.helloWorldSoapHttp.xmlbeans.types.GreetMeDocument.GreetMe gm 
+            = org.apache.helloWorldSoapHttp.xmlbeans.types.GreetMeDocument.GreetMe.Factory.newInstance();
+        gm.setRequestType("non-doc format header");
+        head = new Header(new QName("http://somenamespace.com", "nondocheader"), gm,
+                          client.getEndpoint().getService().getDataBinding());
+        headers.add(head);
+        ((BindingProvider)port).getRequestContext().put(Header.HEADER_LIST, headers);
+        
+        String resp; 
+        ClientProxy.getClient(port).getInInterceptors().add(new LoggingInInterceptor());
+        
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        ClientProxy.getClient(port).getOutInterceptors().add(new LoggingOutInterceptor(pw));
+        resp = port.sayHi();
+        assertEquals("We should get the right response", resp, "Bonjour");
+        assertTrue(sw.toString().contains("doc format header"));
+        assertTrue(sw.toString().contains("non-doc format header"));
+        assertTrue(sw.toString().contains("nondocheader"));
+        
+    }
 }