You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by as...@apache.org on 2015/03/30 09:01:33 UTC
[2/3] cxf git commit: [CXF-6319] Improving fix to keep track of both
namespaces and attributes
[CXF-6319] Improving fix to keep track of both namespaces and attributes
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/80a884c5
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/80a884c5
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/80a884c5
Branch: refs/heads/2.7.x-fixes
Commit: 80a884c5c9c2adb048d792936512dd1f58e0bec1
Parents: 5b5e742
Author: Alessio Soldano <as...@redhat.com>
Authored: Fri Mar 27 13:05:21 2015 +0100
Committer: Alessio Soldano <as...@redhat.com>
Committed: Mon Mar 30 08:40:50 2015 +0200
----------------------------------------------------------------------
.../interceptor/ReadHeadersInterceptor.java | 47 ++++++++++++--------
.../binding/soap/saaj/SAAJInInterceptor.java | 33 +++++++++-----
2 files changed, 51 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cxf/blob/80a884c5/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
----------------------------------------------------------------------
diff --git a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
index ee768d9..f8c2c66 100644
--- a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
+++ b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
@@ -22,9 +22,7 @@ package org.apache.cxf.binding.soap.interceptor;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
@@ -32,7 +30,6 @@ import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
-import javax.xml.stream.events.Namespace;
import javax.xml.stream.events.XMLEvent;
import org.w3c.dom.Attr;
@@ -68,7 +65,8 @@ import org.apache.cxf.staxutils.W3CDOMStreamWriter;
public class ReadHeadersInterceptor extends AbstractSoapInterceptor {
- public static final String ADDITIONAL_ENVELOPE_BODY_NS = "additional.env.body.ns";
+ public static final String ENVELOPE_EVENTS = "envelope.events";
+ public static final String BODY_EVENTS = "body.events";
/**
*
*/
@@ -193,7 +191,8 @@ public class ReadHeadersInterceptor extends AbstractSoapInterceptor {
if (doc != null) {
message.setContent(Node.class, doc);
} else {
- message.put(ADDITIONAL_ENVELOPE_BODY_NS, processor.getEnvelopeAndBodyNamespaces());
+ message.put(ENVELOPE_EVENTS, processor.getEnvAttributeAndNamespaceEvents());
+ message.put(BODY_EVENTS, processor.getBodyAttributeAndNamespaceEvents());
}
}
@@ -286,7 +285,8 @@ public class ReadHeadersInterceptor extends AbstractSoapInterceptor {
private final String body;
private final String envelope;
private final List<XMLEvent> events = new ArrayList<XMLEvent>(8);
- private Map<String, String> namespaces;
+ private List<XMLEvent> envEvents;
+ private List<XMLEvent> bodyEvents;
private StreamToDOMContext context;
private Document doc;
private Node parent;
@@ -377,28 +377,37 @@ public class ReadHeadersInterceptor extends AbstractSoapInterceptor {
events.add(event);
}
} else {
- if (event.isNamespace()) {
+ if (event.isNamespace() || event.isAttribute()) {
final String lastEl = lastStartElementQName.getLocalPart();
- if ((body.equals(lastEl) || envelope.equals(lastEl))
- && ns.equals(lastStartElementQName.getNamespaceURI())) {
- if (namespaces == null) {
- namespaces = new HashMap<String, String>();
+ if (body.equals(lastEl) && ns.equals(lastStartElementQName.getNamespaceURI())) {
+ if (bodyEvents == null) {
+ bodyEvents = new ArrayList<XMLEvent>();
}
- Namespace nsEvent = (Namespace)event;
- //just put in the map, in case of duplicates in env and body,
- //body one will always come afterwards, so we're fine
- namespaces.put(nsEvent.getPrefix(), nsEvent.getNamespaceURI());
+ bodyEvents.add(event);
+ } else if (envelope.equals(lastEl) && ns.equals(lastStartElementQName.getNamespaceURI())) {
+ if (envEvents == null) {
+ envEvents = new ArrayList<XMLEvent>();
+ }
+ envEvents.add(event);
}
}
events.add(event);
}
}
- public Map<String, String> getEnvelopeAndBodyNamespaces() {
- if (namespaces == null) {
- return Collections.emptyMap();
+ public List<XMLEvent> getBodyAttributeAndNamespaceEvents() {
+ if (bodyEvents == null) {
+ return Collections.emptyList();
+ } else {
+ return Collections.unmodifiableList(bodyEvents);
+ }
+ }
+
+ public List<XMLEvent> getEnvAttributeAndNamespaceEvents() {
+ if (envEvents == null) {
+ return Collections.emptyList();
} else {
- return Collections.unmodifiableMap(namespaces);
+ return Collections.unmodifiableList(envEvents);
}
}
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/80a884c5/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
----------------------------------------------------------------------
diff --git a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
index 17d22ed..e8bc8ec 100644
--- a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
+++ b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
@@ -25,14 +25,14 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
import java.util.ResourceBundle;
import javax.xml.namespace.QName;
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
@@ -40,6 +40,9 @@ import javax.xml.soap.SOAPPart;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.events.Attribute;
+import javax.xml.stream.events.Namespace;
+import javax.xml.stream.events.XMLEvent;
import javax.xml.transform.dom.DOMSource;
import org.w3c.dom.Document;
@@ -162,6 +165,7 @@ public class SAAJInInterceptor extends AbstractSoapInterceptor {
+ @SuppressWarnings("unchecked")
public void handleMessage(SoapMessage message) throws Fault {
if (isGET(message)) {
return;
@@ -188,15 +192,12 @@ public class SAAJInInterceptor extends AbstractSoapInterceptor {
if (node != part && node != null) {
StaxUtils.copy(node, new SAAJStreamWriter(part));
} else {
+ SOAPEnvelope env = soapMessage.getSOAPPart().getEnvelope();
+ List<XMLEvent> events = (List<XMLEvent>)message.get(ReadHeadersInterceptor.ENVELOPE_EVENTS);
+ applyEvents(events, env);
SOAPBody body = soapMessage.getSOAPBody();
- @SuppressWarnings("unchecked")
- Map<String, String> additionalNsMap = (Map<String, String>)message
- .get(ReadHeadersInterceptor.ADDITIONAL_ENVELOPE_BODY_NS);
- if (additionalNsMap != null) {
- for (Entry<String, String> e : additionalNsMap.entrySet()) {
- body.addNamespaceDeclaration(e.getKey(), e.getValue());
- }
- }
+ events = (List<XMLEvent>)message.get(ReadHeadersInterceptor.BODY_EVENTS);
+ applyEvents(events, body);
}
message.setContent(Node.class, soapMessage.getSOAPPart());
@@ -253,6 +254,18 @@ public class SAAJInInterceptor extends AbstractSoapInterceptor {
}
}
+ private static void applyEvents(List<XMLEvent> events, SOAPElement el) throws SOAPException {
+ if (events != null) {
+ for (XMLEvent ev : events) {
+ if (ev.isNamespace()) {
+ el.addNamespaceDeclaration(((Namespace)ev).getPrefix(), ((Namespace)ev).getNamespaceURI());
+ } else if (ev.isAttribute()) {
+ el.addAttribute(((Attribute)ev).getName(), ((Attribute)ev).getValue());
+ }
+ }
+ }
+ }
+
public static void replaceHeaders(SOAPMessage soapMessage, SoapMessage message) throws SOAPException {
SOAPHeader header = SAAJUtils.getHeader(soapMessage);
if (header == null) {