Author: ffang
Date: Wed Sep  8 09:40:14 2010
New Revision: 994942

URL: http://svn.apache.org/viewvc?rev=994942&view=rev
Log:
[SMXCOMP-800]smx-cxf-bc StaxJbiWrapper should honor extra namespaces in soap env

Modified:
    
servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/interceptors/StaxJbiWrapper.java
    
servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/CxfBcComponentTest.java
    
servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/HelloPortTypeImpl.java

Modified: 
servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/interceptors/StaxJbiWrapper.java
URL: 
http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/interceptors/StaxJbiWrapper.java?rev=994942&r1=994941&r2=994942&view=diff
==============================================================================
--- 
servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/interceptors/StaxJbiWrapper.java
 (original)
+++ 
servicemix/components/bindings/servicemix-cxf-bc/trunk/src/main/java/org/apache/servicemix/cxfbc/interceptors/StaxJbiWrapper.java
 Wed Sep  8 09:40:14 2010
@@ -19,7 +19,9 @@ package org.apache.servicemix.cxfbc.inte
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.xml.XMLConstants;
 import javax.xml.namespace.NamespaceContext;
@@ -28,6 +30,8 @@ import javax.xml.stream.Location;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.cxf.binding.soap.Soap11;
+import org.apache.cxf.binding.soap.Soap12;
 import org.apache.cxf.binding.soap.SoapMessage;
 import org.apache.cxf.binding.soap.model.SoapBindingInfo;
 import org.apache.cxf.binding.soap.model.SoapHeaderInfo;
@@ -45,6 +49,8 @@ import org.apache.servicemix.soap.util.s
 import org.apache.servicemix.soap.util.stax.FragmentStreamReader;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
 
 
 public class StaxJbiWrapper implements XMLStreamReader {
@@ -62,8 +68,10 @@ public class StaxJbiWrapper implements X
     private int reader = -1;
     private int event = START_DOCUMENT;
     private List<List<XMLStreamReader>> parts = new 
ArrayList<List<XMLStreamReader>>();
+    private List<QName> extraPrefixes = new ArrayList<QName>();
 
     public StaxJbiWrapper(Message message) {
+        setExtraPrefix((SoapMessage) message);
         BindingOperationInfo wsdlOperation = getOperation(message);
         wsdlMessage = !isRequestor(message) ? wsdlOperation.getInput() : 
wsdlOperation.getOutput();
         XMLStreamReader xmlReader = message.getContent(XMLStreamReader.class);
@@ -93,6 +101,31 @@ public class StaxJbiWrapper implements X
             }
         }
     }
+    
+    private void setExtraPrefix(SoapMessage message) {
+        Document savedEnv = (Document) message.getContent(Node.class);
+        if (savedEnv != null) {
+            NamedNodeMap attrs = savedEnv.getFirstChild().getAttributes();
+            Map<String, String> nsMap = message.getEnvelopeNs();
+            if (nsMap == null) {
+                nsMap = new HashMap<String, String>();
+            }
+            for (int i = 0; i < attrs.getLength(); i++) {
+                Node node = attrs.item(i);
+                if (!node.getNodeValue().equals(Soap11.SOAP_NAMESPACE)
+                        && !node.getNodeValue().equals(Soap12.SOAP_NAMESPACE)) 
{
+                    //set extra prefix
+                    nsMap.put(node.getLocalName(), node.getNodeValue());
+                    extraPrefixes.add(new QName(node.getNodeValue(), "", 
node.getLocalName()));
+                }
+                    
+            }
+            if (nsMap.size() > 0) {
+                message.put("soap.env.ns.map", nsMap);
+            }
+        }
+    }
+
 
     public int getEventType() {
         return event;
@@ -284,7 +317,7 @@ public class StaxJbiWrapper implements X
     public int getAttributeCount() {
         switch (state) {
             case STATE_START_ELEMENT_WRAPPER:
-                return 7;
+                return 7 + extraPrefixes.size();
             case STATE_START_ELEMENT_PART:
                 return 0;
             case STATE_RUN_PART:
@@ -313,7 +346,15 @@ public class StaxJbiWrapper implements X
                     case 6: return new 
QName(XMLConstants.XMLNS_ATTRIBUTE_NS_URI,
                             CxfJbiConstants.WSDL11_WRAPPER_XSD_PREFIX,
                                              XMLConstants.XMLNS_ATTRIBUTE);
-                    default: throw new IllegalStateException();
+                    default:{
+                        if (i < getAttributeCount()) {
+                            return new 
QName(XMLConstants.XMLNS_ATTRIBUTE_NS_URI,
+                                    extraPrefixes.get(i - 7).getPrefix(),
+                                                     
XMLConstants.XMLNS_ATTRIBUTE);
+                        } else {
+                            throw new IllegalStateException();
+                        }
+                    }
                 }
             case STATE_RUN_PART:
                 return parts.get(part).get(reader).getAttributeName(i);
@@ -333,7 +374,13 @@ public class StaxJbiWrapper implements X
                     case 4: return XMLConstants.NULL_NS_URI;
                     case 5: return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
                     case 6: return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
-                    default: throw new IllegalStateException();
+                    default: {
+                        if (i < getAttributeCount()) {
+                            return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
+                        } else {
+                            throw new IllegalStateException();
+                        }
+                    }
                 }
             case STATE_RUN_PART:
                 return parts.get(part).get(reader).getAttributeNamespace(i);
@@ -353,7 +400,13 @@ public class StaxJbiWrapper implements X
                     case 4: return CxfJbiConstants.WSDL11_WRAPPER_VERSION;
                     case 5: return CxfJbiConstants.WSDL11_WRAPPER_XSI_PREFIX;
                     case 6: return CxfJbiConstants.WSDL11_WRAPPER_XSD_PREFIX;
-                    default: throw new IllegalStateException();
+                    default: {
+                        if (i < getAttributeCount()) {
+                            return extraPrefixes.get(i -7).getPrefix();
+                        } else {
+                            throw new IllegalStateException();
+                        }
+                    }
                 }
             case STATE_RUN_PART:
                 return parts.get(part).get(reader).getAttributeLocalName(i);
@@ -373,7 +426,13 @@ public class StaxJbiWrapper implements X
                     case 4: return XMLConstants.DEFAULT_NS_PREFIX;
                     case 5: return XMLConstants.XMLNS_ATTRIBUTE;
                     case 6: return XMLConstants.XMLNS_ATTRIBUTE;
-                    default: throw new IllegalStateException();
+                    default: {
+                        if (i < getAttributeCount()) {
+                            return XMLConstants.XMLNS_ATTRIBUTE;
+                        } else {
+                            throw new IllegalStateException();
+                        }
+                    }
                 }
             case STATE_RUN_PART:
                 return parts.get(part).get(reader).getAttributePrefix(i);
@@ -418,7 +477,13 @@ public class StaxJbiWrapper implements X
                         return XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI;
                     case 6:
                         return XMLConstants.W3C_XML_SCHEMA_NS_URI;
-                    default: throw new IllegalStateException();
+                    default: {
+                        if (i < getAttributeCount()) {
+                            return extraPrefixes.get(i -7).getNamespaceURI();
+                        } else {
+                            throw new IllegalStateException();
+                        }
+                    }
                 }
             case STATE_RUN_PART:
                 return parts.get(part).get(reader).getAttributeValue(i);

Modified: 
servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/CxfBcComponentTest.java
URL: 
http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/CxfBcComponentTest.java?rev=994942&r1=994941&r2=994942&view=diff
==============================================================================
--- 
servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/CxfBcComponentTest.java
 (original)
+++ 
servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/CxfBcComponentTest.java
 Wed Sep  8 09:40:14 2010
@@ -231,6 +231,42 @@ public class CxfBcComponentTest extends 
         Thread.sleep(100);
     }
 
+    public void testEndpointDOCWithOldFashionClient() throws Exception {
+        CxfBcComponent comp = new CxfBcComponent();
+        CxfBcConsumer ep = new CxfBcConsumer();
+        ep.setWsdl(new ClassPathResource("HelloWorld-DOC.wsdl"));
+        ep.setTargetService(new QName("http://cxfbc.servicemix.apache.org/";,
+                "HelloPortTypeImplService"));
+        ep.setTargetInterface(new QName("uri:HelloWorld", "HelloPortType",
+                "HelloPortType"));
+        ep.setEndpoint("HelloPortTypeImplPort");
+        comp.setEndpoints(new CxfBcEndpointType[] {ep});
+        jbi.activateComponent(comp, "servicemix-cxfbc");
+
+        CxfSeComponent seComp = new CxfSeComponent();
+        CxfSeEndpoint endpoint = new CxfSeEndpoint();
+        endpoint.setPojo(new HelloPortTypeImpl());
+
+        seComp.setEndpoints(new CxfSeEndpoint[] {endpoint});
+        jbi.activateComponent(seComp, "servicemix-cxfse");
+        URLConnection connection = new URL("http://localhost:8080/hello";)
+                .openConnection();
+        connection.setDoInput(true);
+        connection.setDoOutput(true);
+        OutputStream os = connection.getOutputStream();
+        // Post the request file.
+        InputStream fis = new 
ClassPathResource("HelloWorld-DOC-Input-extra-namespace.xml")
+                .getInputStream();
+        copyInputStream(fis, os);
+        // Read the response.
+        InputStream is = connection.getInputStream();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        copyInputStream(is, baos);
+        System.err.println(baos.toString());
+
+        Thread.sleep(100);
+    }
+    
     public static void copyInputStream(InputStream in, OutputStream out) 
throws IOException {
         byte[] buffer = new byte[8192];
         int len = in.read(buffer);

Modified: 
servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/HelloPortTypeImpl.java
URL: 
http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/HelloPortTypeImpl.java?rev=994942&r1=994941&r2=994942&view=diff
==============================================================================
--- 
servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/HelloPortTypeImpl.java
 (original)
+++ 
servicemix/components/bindings/servicemix-cxf-bc/trunk/src/test/java/org/apache/servicemix/cxfbc/HelloPortTypeImpl.java
 Wed Sep  8 09:40:14 2010
@@ -23,6 +23,8 @@ import uri.helloworld.HelloHeader;
 import uri.helloworld.HelloPortType;
 import uri.helloworld.HelloRequest;
 import uri.helloworld.HelloResponse;
+import uri.helloworld.SayHiRequest;
+import uri.helloworld.SayHiResponse;
 
 public class HelloPortTypeImpl implements HelloPortType {
 
@@ -36,4 +38,10 @@ public class HelloPortTypeImpl implement
         return rep;    
     }
 
+    public SayHiResponse sayHi(SayHiRequest body) {
+        SayHiResponse ret = new SayHiResponse();
+        ret.setText("hello" + body.getText());
+        return ret;
+    }
+
 }


Reply via email to