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;
+ }
+
}