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 2017/06/08 15:29:07 UTC

[1/2] cxf git commit: Optimizations to keep RM Objects as objects instead of converting to DOM

Repository: cxf
Updated Branches:
  refs/heads/master 7054ae68a -> 3d85f3179


Optimizations to keep RM Objects as objects instead of converting to DOM


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/3d85f317
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/3d85f317
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/3d85f317

Branch: refs/heads/master
Commit: 3d85f3179ffae6eadd5174ace6df015494d995bc
Parents: 4fb0711
Author: Daniel Kulp <dk...@apache.org>
Authored: Thu Jun 8 11:27:58 2017 -0400
Committer: Daniel Kulp <dk...@apache.org>
Committed: Thu Jun 8 11:28:25 2017 -0400

----------------------------------------------------------------------
 .../org/apache/cxf/binding/soap/SoapHeader.java |  9 +++
 rt/ws/rm/pom.xml                                | 12 +++
 .../org/apache/cxf/ws/rm/EncoderDecoder.java    | 82 ++++++++++----------
 .../apache/cxf/ws/rm/EncoderDecoder10AImpl.java | 28 ++++---
 .../apache/cxf/ws/rm/EncoderDecoder10Impl.java  | 29 ++++---
 .../apache/cxf/ws/rm/EncoderDecoder11Impl.java  | 24 ++++--
 .../cxf/ws/rm/soap/RMSoapOutInterceptor.java    | 41 ++--------
 .../apache/cxf/ws/rm/v200502/package-info.java  | 25 ++++++
 .../cxf/ws/rm/v200502wsa15/package-info.java    | 25 ++++++
 .../apache/cxf/ws/rm/v200702/package-info.java  | 25 ++++++
 .../ws/rm/soap/RMSoapOutInterceptorTest.java    | 54 +++++--------
 11 files changed, 220 insertions(+), 134 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/3d85f317/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapHeader.java
----------------------------------------------------------------------
diff --git a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapHeader.java b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapHeader.java
index ecf88fb..356d0f9 100644
--- a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapHeader.java
+++ b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/SoapHeader.java
@@ -33,6 +33,15 @@ public class SoapHeader extends Header {
     public SoapHeader(QName q, Object o, DataBinding b) {
         super(q, o, b);
     }
+    public SoapHeader(QName q, Object o, DataBinding b, boolean mustUnderstand, String actor) {
+        super(q, o, b);
+        this.mustUnderstand = mustUnderstand;
+        this.actor = actor;
+    }
+    public SoapHeader(QName q, Object o, DataBinding b, boolean mustUnderstand) {
+        super(q, o, b);
+        this.mustUnderstand = mustUnderstand;
+    }
 
     public String getActor() {
         return actor;

http://git-wip-us.apache.org/repos/asf/cxf/blob/3d85f317/rt/ws/rm/pom.xml
----------------------------------------------------------------------
diff --git a/rt/ws/rm/pom.xml b/rt/ws/rm/pom.xml
index 1e05711..3b0b7c0 100644
--- a/rt/ws/rm/pom.xml
+++ b/rt/ws/rm/pom.xml
@@ -170,6 +170,9 @@
                                     <deleteDirs>
                                         <deleteDir>${basedir}/target/generated/src/main/java/org/apache/cxf/ws/addressing</deleteDir>
                                     </deleteDirs>
+                                    <extensionArgs>
+                                        <extensionArg>-npa</extensionArg>
+                                    </extensionArgs>
                                 </xsdOption>
                                 <xsdOption>
                                     <xsd>${basedir}/src/main/resources/schemas/wsdl/wsrm-1.0-wsa15.xsd</xsd>
@@ -178,6 +181,9 @@
                                     <deleteDirs>
                                         <deleteDir>${basedir}/target/generated/src/main/java/org/apache/cxf/ws/addressing</deleteDir>
                                     </deleteDirs>
+                                    <extensionArgs>
+                                        <extensionArg>-npa</extensionArg>
+                                    </extensionArgs>
                                 </xsdOption>
                                 <xsdOption>
                                     <xsd>${basedir}/src/main/resources/schemas/wsdl/wsrm-1.1.xsd</xsd>
@@ -186,6 +192,9 @@
                                     <deleteDirs>
                                         <deleteDir>${basedir}/target/generated/src/main/java/org/apache/cxf/ws/addressing</deleteDir>
                                     </deleteDirs>
+                                    <extensionArgs>
+                                        <extensionArg>-npa</extensionArg>
+                                    </extensionArgs>
                                 </xsdOption>
                                 <xsdOption>
                                     <xsd>${basedir}/src/main/resources/schemas/wsdl/wsmc-1.1.xsd</xsd>
@@ -194,6 +203,9 @@
                                     <deleteDirs>
                                         <deleteDir>${basedir}/target/generated/src/main/java/org/apache/cxf/ws/addressing</deleteDir>
                                     </deleteDirs>
+                                    <extensionArgs>
+                                        <extensionArg>-npa</extensionArg>
+                                    </extensionArgs>
                                 </xsdOption>
                                 <xsdOption>
                                     <xsd>${basedir}/src/main/resources/schemas/configuration/wsrm-manager-types.xsd</xsd>

http://git-wip-us.apache.org/repos/asf/cxf/blob/3d85f317/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder.java
----------------------------------------------------------------------
diff --git a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder.java b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder.java
index 68c42ea..3717a18 100644
--- a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder.java
+++ b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder.java
@@ -20,17 +20,18 @@
 package org.apache.cxf.ws.rm;
 
 import java.util.Collection;
+import java.util.List;
 
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.namespace.QName;
 
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import org.apache.cxf.helpers.DOMUtils;
+import org.apache.cxf.databinding.DataBinding;
+import org.apache.cxf.headers.Header;
+import org.apache.cxf.jaxb.JAXBDataBinding;
 import org.apache.cxf.ws.rm.v200702.AckRequestedType;
 import org.apache.cxf.ws.rm.v200702.CloseSequenceType;
 import org.apache.cxf.ws.rm.v200702.CreateSequenceResponseType;
@@ -45,7 +46,8 @@ import org.apache.cxf.ws.rm.v200702.TerminateSequenceType;
  * encoding and decoding.
  */
 public abstract class EncoderDecoder {
-
+    protected volatile DataBinding databinding;
+    
     /**
      * Get context for JAXB marshalling/unmarshalling.
      *
@@ -53,6 +55,7 @@ public abstract class EncoderDecoder {
      * @throws JAXBException
      */
     protected abstract JAXBContext getContext() throws JAXBException;
+        
 
     /**
      * Get the WS-ReliableMessaging namespace used by this encoder/decoder.
@@ -103,6 +106,26 @@ public abstract class EncoderDecoder {
      */
     public abstract Class<?> getTerminateSequenceResponseType();
 
+    
+    /**
+     * Get the databinding used for the header objects
+     * @return databinding
+     */
+    protected DataBinding getDataBinding() throws JAXBException {
+        DataBinding result = databinding;
+        if (result == null) {
+            synchronized (this) {
+                result = databinding;
+                if (result == null) {
+                    result = new JAXBDataBinding(getContext());
+                    databinding = result;
+                }
+            }
+        }
+        return result;
+    }
+
+    
     /**
      * Builds an element containing WS-RM headers. This adds the appropriate WS-RM namespace declaration to the element,
      * and then adds any WS-RM headers set in the supplied properties as child elements.
@@ -111,38 +134,20 @@ public abstract class EncoderDecoder {
      * @param qname constructed element name
      * @return element (<code>null</code> if none)
      */
-    public Element buildHeaders(RMProperties rmps, QName qname) throws JAXBException {
+    public void buildHeaders(RMProperties rmps, List<Header> headers) throws JAXBException {
 
         // check if there's anything to insert
         SequenceType seq = rmps.getSequence();
         Collection<SequenceAcknowledgement> acks = rmps.getAcks();
         Collection<AckRequestedType> reqs = rmps.getAcksRequested();
         if (seq == null && acks == null && reqs == null) {
-            return null;
+            return;
         }
 
-        // create element with namespace declaration included
-        Document doc = DOMUtils.createDocument();
-        Element header = doc.createElementNS(qname.getNamespaceURI(), qname.getLocalPart());
-        addNamespaceDecl(header);
-
         // build individual headers
         Marshaller marshaller = getContext().createMarshaller();
         marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
-        buildHeaders(seq, acks, reqs, rmps.isLastMessage(), header, marshaller);
-        return header;
-    }
-
-    /**
-     * Add WS-RM namespace declaration to element.
-     *
-     * @param element
-     */
-    protected void addNamespaceDecl(Element element) {
-        Attr attr = element.getOwnerDocument().createAttributeNS("http://www.w3.org/2000/xmlns/",
-            "xmlns:" + RMConstants.NAMESPACE_PREFIX);
-        attr.setValue(getWSRMNamespace());
-        element.setAttributeNodeNS(attr);
+        buildHeaders(seq, acks, reqs, rmps.isLastMessage(), headers);
     }
 
     /**
@@ -153,18 +158,12 @@ public abstract class EncoderDecoder {
      * @param qname constructed element name
      * @return element
      */
-    public Element buildHeaderFault(SequenceFault sf, QName qname) throws JAXBException {
-
-        // create element with namespace declaration included
-        Document doc = DOMUtils.createDocument();
-        Element header = doc.createElementNS(qname.getNamespaceURI(), qname.getLocalPart());
-        addNamespaceDecl(header);
-
-        // insert the actual fault
-        Marshaller marshaller = getContext().createMarshaller();
-        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
-        buildHeaderFault(sf, header, marshaller);
-        return header;
+    public Header buildHeaderFault(SequenceFault sf) throws JAXBException {
+        Object o = buildHeaderFaultObject(sf);
+        
+        return new Header(new QName(getConstants().getWSRMNamespace(),
+                                    RMConstants.SEQUENCE_FAULT_NAME),
+                          o, getDataBinding());
     }
 
     /**
@@ -179,18 +178,15 @@ public abstract class EncoderDecoder {
      * @throws JAXBException
      */
     protected abstract void buildHeaders(SequenceType seq, Collection<SequenceAcknowledgement> acks,
-        Collection<AckRequestedType> reqs, boolean last, Element header, Marshaller marshaller) throws JAXBException;
+        Collection<AckRequestedType> reqs, boolean last, List<Header> headers) throws JAXBException;
 
     /**
      * Build a header fault, using the correct protocol variation.
      *
      * @param sf
-     * @param header
-     * @param marshaller
-     * @throws JAXBException
+     * @return the object marshallable with the JAXContext 
      */
-    protected abstract void buildHeaderFault(SequenceFault sf, Element header, Marshaller marshaller)
-        throws JAXBException;
+    protected abstract Object buildHeaderFaultObject(SequenceFault sf);
 
     /**
      * Marshals a SequenceAcknowledgement to the appropriate external form.

http://git-wip-us.apache.org/repos/asf/cxf/blob/3d85f317/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10AImpl.java
----------------------------------------------------------------------
diff --git a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10AImpl.java b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10AImpl.java
index 084e9db..16ff41b 100644
--- a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10AImpl.java
+++ b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10AImpl.java
@@ -20,6 +20,7 @@
 package org.apache.cxf.ws.rm;
 
 import java.util.Collection;
+import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -29,12 +30,15 @@ import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
+import javax.xml.namespace.QName;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import org.apache.cxf.binding.soap.SoapHeader;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.PackageUtils;
+import org.apache.cxf.headers.Header;
 import org.apache.cxf.helpers.DOMUtils;
 import org.apache.cxf.ws.addressing.Names;
 import org.apache.cxf.ws.rm.v200702.AckRequestedType;
@@ -105,8 +109,10 @@ public final class EncoderDecoder10AImpl extends EncoderDecoder {
         return jaxbContext;
     }
 
+    @Override
     protected void buildHeaders(SequenceType seq, Collection<SequenceAcknowledgement> acks,
-        Collection<AckRequestedType> reqs, boolean last, Element header, Marshaller marshaller) throws JAXBException {
+        Collection<AckRequestedType> reqs, boolean last, List<Header> headers) throws JAXBException {
+       
         if (null != seq) {
             LOG.log(Level.FINE, "encoding sequence into RM header");
             org.apache.cxf.ws.rm.v200502wsa15.SequenceType toseq = VersionTransformer.convert200502wsa15(seq);
@@ -115,24 +121,30 @@ public final class EncoderDecoder10AImpl extends EncoderDecoder {
             }
             JAXBElement<org.apache.cxf.ws.rm.v200502wsa15.SequenceType> element
                 = RMUtils.getWSRM200502WSA200508Factory().createSequence(toseq);
-            marshaller.marshal(element, header);
+            headers.add(new SoapHeader(element.getName(), element, getDataBinding(), true));
         }
         if (null != acks) {
             LOG.log(Level.FINE, "encoding sequence acknowledgement(s) into RM header");
             for (SequenceAcknowledgement ack : acks) {
-                marshaller.marshal(VersionTransformer.convert200502wsa15(ack), header);
+                headers.add(new SoapHeader(new QName(getConstants().getWSRMNamespace(), 
+                                                     RMConstants.SEQUENCE_ACK_NAME),
+                                           VersionTransformer.convert200502wsa15(ack), getDataBinding()));
             }
         }
         if (null != reqs) {
             LOG.log(Level.FINE, "encoding acknowledgement request(s) into RM header");
             for (AckRequestedType req : reqs) {
-                marshaller.marshal(RMUtils.getWSRM200502WSA200508Factory()
-                    .createAckRequested(VersionTransformer.convert200502wsa15(req)), header);
+                headers.add(new SoapHeader(new QName(getConstants().getWSRMNamespace(), 
+                                                     RMConstants.ACK_REQUESTED_NAME),
+                                           RMUtils.getWSRM200502WSA200508Factory()
+                                               .createAckRequested(VersionTransformer.convert200502wsa15(req)),
+                                           getDataBinding()));
             }
         }
     }
 
-    public void buildHeaderFault(SequenceFault sf, Element header, Marshaller marshaller) throws JAXBException {
+    @Override
+    protected Object buildHeaderFaultObject(SequenceFault sf) {
         org.apache.cxf.ws.rm.v200502wsa15.SequenceFaultType flt =
             new org.apache.cxf.ws.rm.v200502wsa15.SequenceFaultType();
         flt.setFaultCode(sf.getFaultCode());
@@ -148,9 +160,7 @@ public final class EncoderDecoder10AImpl extends EncoderDecoder {
         if (data != null) {
             flt.getAny().add(data);
         }
-        marshaller.marshal(new JAXBElement<org.apache.cxf.ws.rm.v200502wsa15.SequenceFaultType>(
-            RM10Constants.SEQUENCE_FAULT_QNAME,
-            org.apache.cxf.ws.rm.v200502wsa15.SequenceFaultType.class, flt), header);
+        return flt;
     }
 
     public Element encodeSequenceAcknowledgement(SequenceAcknowledgement ack) throws JAXBException {

http://git-wip-us.apache.org/repos/asf/cxf/blob/3d85f317/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10Impl.java
----------------------------------------------------------------------
diff --git a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10Impl.java b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10Impl.java
index 35ec94c..55658a1 100644
--- a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10Impl.java
+++ b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10Impl.java
@@ -20,6 +20,7 @@
 package org.apache.cxf.ws.rm;
 
 import java.util.Collection;
+import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -29,12 +30,15 @@ import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
+import javax.xml.namespace.QName;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import org.apache.cxf.binding.soap.SoapHeader;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.PackageUtils;
+import org.apache.cxf.headers.Header;
 import org.apache.cxf.helpers.DOMUtils;
 import org.apache.cxf.ws.addressing.VersionTransformer.Names200408;
 import org.apache.cxf.ws.rm.v200702.AckRequestedType;
@@ -105,8 +109,9 @@ public final class EncoderDecoder10Impl extends EncoderDecoder {
         return jaxbContext;
     }
 
+    @Override
     protected void buildHeaders(SequenceType seq, Collection<SequenceAcknowledgement> acks,
-        Collection<AckRequestedType> reqs, boolean last, Element header, Marshaller marshaller) throws JAXBException {
+        Collection<AckRequestedType> reqs, boolean last, List<Header> headers) throws JAXBException {       
         if (null != seq) {
             LOG.log(Level.FINE, "encoding sequence into RM header");
             org.apache.cxf.ws.rm.v200502.SequenceType toseq = VersionTransformer.convert200502(seq);
@@ -114,24 +119,32 @@ public final class EncoderDecoder10Impl extends EncoderDecoder {
                 toseq.setLastMessage(new org.apache.cxf.ws.rm.v200502.SequenceType.LastMessage());
             }
             JAXBElement<?> element = RMUtils.getWSRM200502Factory().createSequence(toseq);
-            marshaller.marshal(element, header);
+            headers.add(new SoapHeader(element.getName(), element, getDataBinding(), true));
         }
         if (null != acks) {
             LOG.log(Level.FINE, "encoding sequence acknowledgement(s) into RM header");
             for (SequenceAcknowledgement ack : acks) {
-                marshaller.marshal(VersionTransformer.convert200502(ack), header);
+                headers.add(new SoapHeader(new QName(getConstants().getWSRMNamespace(), 
+                                                     RMConstants.SEQUENCE_ACK_NAME),
+                                           VersionTransformer.convert200502(ack),
+                                           getDataBinding()));
             }
         }
         if (null != reqs) {
             LOG.log(Level.FINE, "encoding acknowledgement request(s) into RM header");
             for (AckRequestedType req : reqs) {
-                marshaller.marshal(RMUtils.getWSRM200502Factory()
-                    .createAckRequested(VersionTransformer.convert200502(req)), header);
+                headers.add(new SoapHeader(new QName(getConstants().getWSRMNamespace(), 
+                                                     RMConstants.ACK_REQUESTED_NAME),
+                                           RMUtils.getWSRM200502Factory()
+                                               .createAckRequested(VersionTransformer.convert200502(req)),
+                                           getDataBinding()));
             }
         }
+        
     }
 
-    public void buildHeaderFault(SequenceFault sf, Element header, Marshaller marshaller) throws JAXBException {
+    @Override
+    protected Object buildHeaderFaultObject(SequenceFault sf) {
         org.apache.cxf.ws.rm.v200502.SequenceFaultType flt = new org.apache.cxf.ws.rm.v200502.SequenceFaultType();
         flt.setFaultCode(sf.getFaultCode());
         Object detail = sf.getDetail();
@@ -146,9 +159,7 @@ public final class EncoderDecoder10Impl extends EncoderDecoder {
         if (data != null) {
             flt.getAny().add(data);
         }
-        marshaller.marshal(new JAXBElement<org.apache.cxf.ws.rm.v200502.SequenceFaultType>(
-            RM10Constants.SEQUENCE_FAULT_QNAME,
-            org.apache.cxf.ws.rm.v200502.SequenceFaultType.class, flt), header);
+        return flt;
     }
 
     public Element encodeSequenceAcknowledgement(SequenceAcknowledgement ack) throws JAXBException {

http://git-wip-us.apache.org/repos/asf/cxf/blob/3d85f317/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder11Impl.java
----------------------------------------------------------------------
diff --git a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder11Impl.java b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder11Impl.java
index 72153ad..b896272 100644
--- a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder11Impl.java
+++ b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder11Impl.java
@@ -20,6 +20,7 @@
 package org.apache.cxf.ws.rm;
 
 import java.util.Collection;
+import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -29,12 +30,15 @@ import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
+import javax.xml.namespace.QName;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
+import org.apache.cxf.binding.soap.SoapHeader;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.common.util.PackageUtils;
+import org.apache.cxf.headers.Header;
 import org.apache.cxf.helpers.DOMUtils;
 import org.apache.cxf.ws.addressing.Names;
 import org.apache.cxf.ws.rm.v200702.AckRequestedType;
@@ -107,29 +111,36 @@ public final class EncoderDecoder11Impl extends EncoderDecoder {
         return jaxbContext;
     }
 
+    @Override
     protected void buildHeaders(SequenceType seq, Collection<SequenceAcknowledgement> acks,
-        Collection<AckRequestedType> reqs, boolean last, Element header, Marshaller marshaller) throws JAXBException {
+        Collection<AckRequestedType> reqs, boolean last, List<Header> headers) throws JAXBException {
 
         if (null != seq) {
             LOG.log(Level.FINE, "encoding sequence into RM header");
             JAXBElement<SequenceType> element = RMUtils.getWSRMFactory().createSequence(seq);
-            marshaller.marshal(element, header);
+            headers.add(new SoapHeader(element.getName(), element, getDataBinding(), true));
         }
         if (null != acks) {
             LOG.log(Level.FINE, "encoding sequence acknowledgement(s) into RM header");
             for (SequenceAcknowledgement ack : acks) {
-                marshaller.marshal(ack, header);
+                headers.add(new SoapHeader(new QName(getConstants().getWSRMNamespace(), 
+                                                     RMConstants.SEQUENCE_ACK_NAME),
+                                           ack, getDataBinding()));
             }
         }
         if (null != reqs) {
             LOG.log(Level.FINE, "encoding acknowledgement request(s) into RM header");
             for (AckRequestedType req : reqs) {
-                marshaller.marshal(RMUtils.getWSRMFactory().createAckRequested(req), header);
+                headers.add(new SoapHeader(new QName(getConstants().getWSRMNamespace(), 
+                                                     RMConstants.ACK_REQUESTED_NAME),
+                                           RMUtils.getWSRMFactory().createAckRequested(req),
+                                           getDataBinding()));
             }
         }
     }
 
-    public void buildHeaderFault(SequenceFault sf, Element header, Marshaller marshaller) throws JAXBException {
+    @Override
+    protected Object buildHeaderFaultObject(SequenceFault sf) {
         SequenceFaultType flt = new SequenceFaultType();
         flt.setFaultCode(sf.getFaultCode());
         Object detail = sf.getDetail();
@@ -138,8 +149,7 @@ public final class EncoderDecoder11Impl extends EncoderDecoder {
         if (data != null) {
             addDetail(flt, data);
         }
-        marshaller.marshal(new JAXBElement<SequenceFaultType>(RM11Constants.SEQUENCE_FAULT_QNAME,
-            SequenceFaultType.class, flt), header);
+        return flt;
     }
 
     private static void addDetail(SequenceFaultType sft, Element data) {

http://git-wip-us.apache.org/repos/asf/cxf/blob/3d85f317/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/soap/RMSoapOutInterceptor.java
----------------------------------------------------------------------
diff --git a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/soap/RMSoapOutInterceptor.java b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/soap/RMSoapOutInterceptor.java
index 070c098..1a5eccf 100644
--- a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/soap/RMSoapOutInterceptor.java
+++ b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/soap/RMSoapOutInterceptor.java
@@ -30,12 +30,8 @@ import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.namespace.QName;
 
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
 
 import org.apache.cxf.binding.soap.SoapFault;
-import org.apache.cxf.binding.soap.SoapHeader;
 import org.apache.cxf.binding.soap.SoapMessage;
 import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
 import org.apache.cxf.common.logging.LogUtils;
@@ -49,7 +45,6 @@ import org.apache.cxf.ws.addressing.soap.MAPCodec;
 import org.apache.cxf.ws.rm.ProtocolVariation;
 import org.apache.cxf.ws.rm.RM10Constants;
 import org.apache.cxf.ws.rm.RM11Constants;
-import org.apache.cxf.ws.rm.RMConstants;
 import org.apache.cxf.ws.rm.RMContextUtils;
 import org.apache.cxf.ws.rm.RMProperties;
 import org.apache.cxf.ws.rm.SequenceFault;
@@ -132,26 +127,13 @@ public class RMSoapOutInterceptor extends AbstractSoapInterceptor {
 
             AddressingProperties maps = RMContextUtils.retrieveMAPs(message, false, true);
             ProtocolVariation protocol = ProtocolVariation.findVariant(rmps.getNamespaceURI(), maps.getNamespaceURI());
-            Element header = protocol.getCodec().buildHeaders(rmps, message.getVersion().getHeader());
-            if (header != null) {
-                Node node = header.getFirstChild();
-                if (node != null && MessageUtils.isPartialResponse(message)) {
-                    // make sure the response is returned as HTTP 200 and not 202
-                    message.put(Message.RESPONSE_CODE, HttpURLConnection.HTTP_OK);
-                }
-                while (node != null) {
-                    Header holder = null;
-                    if (node.getLocalName().equals("Sequence")) {
-                        holder = new SoapHeader(new QName(node.getNamespaceURI(), node.getLocalName()), node);
-                        ((SoapHeader)holder).setMustUnderstand(true);
-                    } else {
-                        holder = new Header(new QName(node.getNamespaceURI(), node.getLocalName()), node);
-                    }
-                    message.getHeaders().add(holder);
-                    node = node.getNextSibling();
-                }
+            List<Header> headers = message.getHeaders();
+            int startSize = headers.size();
+            protocol.getCodec().buildHeaders(rmps, headers);
+            if (startSize != headers.size() && MessageUtils.isPartialResponse(message)) {
+                // make sure the response is returned as HTTP 200 and not 202
+                message.put(Message.RESPONSE_CODE, HttpURLConnection.HTTP_OK);
             }
-
         } catch (JAXBException je) {
             LOG.log(Level.WARNING, "SOAP_HEADER_ENCODE_FAILURE_MSG", je);
         }
@@ -171,16 +153,9 @@ public class RMSoapOutInterceptor extends AbstractSoapInterceptor {
             AddressingProperties maps = RMContextUtils.retrieveMAPs(inmsg, false, false);
             ProtocolVariation protocol = ProtocolVariation.findVariant(rmps.getNamespaceURI(),
                 maps.getNamespaceURI());
-            Element header = protocol.getCodec().buildHeaderFault(sf, message.getVersion().getHeader());
-            Node node = header.getFirstChild();
-            if (node instanceof Element) {
-                Attr attr = header.getOwnerDocument().createAttributeNS("http://www.w3.org/2000/xmlns/",
-                    "xmlns:" + RMConstants.NAMESPACE_PREFIX);
-                attr.setValue(rmps.getNamespaceURI());
-                ((Element)node).setAttributeNodeNS(attr);
-            }
+            Header header = protocol.getCodec().buildHeaderFault(sf);
             List<Header> headers = message.getHeaders();
-            headers.add(new Header(new QName(node.getNamespaceURI(), node.getLocalName()), node));
+            headers.add(header);
         } catch (JAXBException je) {
             LOG.log(Level.WARNING, "SOAP_HEADER_ENCODE_FAILURE_MSG", je);
         }

http://git-wip-us.apache.org/repos/asf/cxf/blob/3d85f317/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/v200502/package-info.java
----------------------------------------------------------------------
diff --git a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/v200502/package-info.java b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/v200502/package-info.java
new file mode 100644
index 0000000..b891c8e
--- /dev/null
+++ b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/v200502/package-info.java
@@ -0,0 +1,25 @@
+/**
+ * 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.
+ */
+@javax.xml.bind.annotation.XmlSchema(
+    namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm",
+    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
+    xmlns = { @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://schemas.xmlsoap.org/ws/2005/02/rm",
+                                               prefix = "wsrm") })
+package org.apache.cxf.ws.rm.v200502;
+

http://git-wip-us.apache.org/repos/asf/cxf/blob/3d85f317/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/v200502wsa15/package-info.java
----------------------------------------------------------------------
diff --git a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/v200502wsa15/package-info.java b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/v200502wsa15/package-info.java
new file mode 100644
index 0000000..b115768
--- /dev/null
+++ b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/v200502wsa15/package-info.java
@@ -0,0 +1,25 @@
+/**
+ * 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.
+ */
+@javax.xml.bind.annotation.XmlSchema(
+    namespace = "http://schemas.xmlsoap.org/ws/2005/02/rm",
+    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
+    xmlns = { @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://schemas.xmlsoap.org/ws/2005/02/rm",
+                                               prefix = "wsrm") })
+package org.apache.cxf.ws.rm.v200502wsa15;
+

http://git-wip-us.apache.org/repos/asf/cxf/blob/3d85f317/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/v200702/package-info.java
----------------------------------------------------------------------
diff --git a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/v200702/package-info.java b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/v200702/package-info.java
new file mode 100644
index 0000000..1862fbf
--- /dev/null
+++ b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/v200702/package-info.java
@@ -0,0 +1,25 @@
+/**
+ * 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.
+ */
+@javax.xml.bind.annotation.XmlSchema(
+    namespace = "http://docs.oasis-open.org/ws-rx/wsrm/200702",
+    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
+    xmlns = { @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://docs.oasis-open.org/ws-rx/wsrm/200702",
+                                               prefix = "wsrm") })
+package org.apache.cxf.ws.rm.v200702;
+

http://git-wip-us.apache.org/repos/asf/cxf/blob/3d85f317/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/soap/RMSoapOutInterceptorTest.java
----------------------------------------------------------------------
diff --git a/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/soap/RMSoapOutInterceptorTest.java b/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/soap/RMSoapOutInterceptorTest.java
index 846af6b..62399ce 100644
--- a/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/soap/RMSoapOutInterceptorTest.java
+++ b/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/soap/RMSoapOutInterceptorTest.java
@@ -257,53 +257,41 @@ public class RMSoapOutInterceptorTest extends Assert {
     }
 
     private void verifyHeaders(SoapMessage message, String... names) {
-        List<Header> header = message.getHeaders();
+        List<Header> headers = new ArrayList<Header>(message.getHeaders());
 
         // check all expected headers are present
 
         for (String name : names) {
             boolean found = false;
-            Iterator<Header> iter = header.iterator();
+            Iterator<Header> iter = headers.iterator();
             while (iter.hasNext()) {
-                Object obj = iter.next().getObject();
+                Header header = iter.next();
+                Object obj = header.getObject();
+                String namespace = header.getName().getNamespaceURI();
+                String localName = header.getName().getLocalPart();
                 if (obj instanceof Element) {
                     Element elem = (Element) obj;
-                    String namespace = elem.getNamespaceURI();
-                    String localName = elem.getLocalName();
-                    if (RM10Constants.NAMESPACE_URI.equals(namespace)
-                        && localName.equals(name)) {
-                        found = true;
-                        break;
-                    } else if (Names.WSA_NAMESPACE_NAME.equals(namespace)
-                        && localName.equals(name)) {
-                        found = true;
-                        break;
-                    }
+                    namespace = elem.getNamespaceURI();
+                    localName = elem.getLocalName();
+                }
+                if (RM10Constants.NAMESPACE_URI.equals(namespace)
+                    && localName.equals(name)) {
+                    found = true;
+                    iter.remove();
+                    break;
+                } else if (Names.WSA_NAMESPACE_NAME.equals(namespace)
+                    && localName.equals(name)) {
+                    found = true;
+                    iter.remove();
+                    break;
                 }
             }
             assertTrue("Could not find header element " + name, found);
         }
 
         // no other headers should be present
-
-        Iterator<Header> iter1 = header.iterator();
-        while (iter1.hasNext()) {
-            Object obj = iter1.next().getObject();
-            if (obj instanceof Element) {
-                Element elem = (Element) obj;
-                String namespace = elem.getNamespaceURI();
-                String localName = elem.getLocalName();
-                assertTrue(RM10Constants.NAMESPACE_URI.equals(namespace)
-                    || Names.WSA_NAMESPACE_NAME.equals(namespace));
-                boolean found = false;
-                for (String name : names) {
-                    if (localName.equals(name)) {
-                        found = true;
-                        break;
-                    }
-                }
-                assertTrue("Unexpected header element " + localName, found);
-            }
+        if (!headers.isEmpty()) {
+            assertTrue("Unexpected header element " + headers.get(0).getName(), false);
         }
     }
 }


[2/2] cxf git commit: [CXF-7392] Optimize RM fault encoding to not bounce through DOM, avoids needing transformer as well

Posted by dk...@apache.org.
[CXF-7392] Optimize RM fault encoding to not bounce through DOM, avoids needing transformer as well


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/4fb07119
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/4fb07119
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/4fb07119

Branch: refs/heads/master
Commit: 4fb071197127482933e43ad92ec6d979520f3844
Parents: 7054ae6
Author: Daniel Kulp <dk...@apache.org>
Authored: Thu Jun 8 07:57:21 2017 -0400
Committer: Daniel Kulp <dk...@apache.org>
Committed: Thu Jun 8 11:28:25 2017 -0400

----------------------------------------------------------------------
 .../org/apache/cxf/ws/rm/EncoderDecoder10AImpl.java  | 11 +++--------
 .../org/apache/cxf/ws/rm/EncoderDecoder10Impl.java   | 11 +++--------
 .../org/apache/cxf/ws/rm/EncoderDecoder11Impl.java   | 15 ++-------------
 .../cxf/systest/ws/rm/WSRM12ServerCycleTest.java     |  1 -
 4 files changed, 8 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/4fb07119/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10AImpl.java
----------------------------------------------------------------------
diff --git a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10AImpl.java b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10AImpl.java
index ccd362e..084e9db 100644
--- a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10AImpl.java
+++ b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10AImpl.java
@@ -137,19 +137,14 @@ public final class EncoderDecoder10AImpl extends EncoderDecoder {
             new org.apache.cxf.ws.rm.v200502wsa15.SequenceFaultType();
         flt.setFaultCode(sf.getFaultCode());
         Object detail = sf.getDetail();
-        Document doc = DOMUtils.createDocument();
         if (detail instanceof Element) {
             flt.getAny().add(detail);
         } else if (detail instanceof Identifier) {
-            marshaller.marshal(VersionTransformer.convert200502wsa15((Identifier)detail), doc);
+            flt.getAny().add(VersionTransformer.convert200502wsa15((Identifier)detail));
         } else if (detail instanceof SequenceAcknowledgement) {
-            marshaller.marshal(VersionTransformer.convert200502wsa15((SequenceAcknowledgement)detail), doc);
-        }
-        Element data = doc.getDocumentElement();
-        if (data != null) {
-            flt.getAny().add(data);
+            flt.getAny().add(VersionTransformer.convert200502wsa15((SequenceAcknowledgement)detail));
         }
-        data = sf.getExtraDetail();
+        Element data = sf.getExtraDetail();
         if (data != null) {
             flt.getAny().add(data);
         }

http://git-wip-us.apache.org/repos/asf/cxf/blob/4fb07119/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10Impl.java
----------------------------------------------------------------------
diff --git a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10Impl.java b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10Impl.java
index d203e1a..35ec94c 100644
--- a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10Impl.java
+++ b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder10Impl.java
@@ -135,19 +135,14 @@ public final class EncoderDecoder10Impl extends EncoderDecoder {
         org.apache.cxf.ws.rm.v200502.SequenceFaultType flt = new org.apache.cxf.ws.rm.v200502.SequenceFaultType();
         flt.setFaultCode(sf.getFaultCode());
         Object detail = sf.getDetail();
-        Document doc = DOMUtils.createDocument();
         if (detail instanceof Element) {
             flt.getAny().add(detail);
         } else if (detail instanceof Identifier) {
-            marshaller.marshal(VersionTransformer.convert200502((Identifier)detail), doc);
+            flt.getAny().add(VersionTransformer.convert200502((Identifier)detail));
         } else if (detail instanceof SequenceAcknowledgement) {
-            marshaller.marshal(VersionTransformer.convert200502((SequenceAcknowledgement)detail), doc);
-        }
-        Element data = doc.getDocumentElement();
-        if (data != null) {
-            flt.getAny().add(data);
+            flt.getAny().add(VersionTransformer.convert200502((SequenceAcknowledgement)detail));
         }
-        data = sf.getExtraDetail();
+        Element data = sf.getExtraDetail();
         if (data != null) {
             flt.getAny().add(data);
         }

http://git-wip-us.apache.org/repos/asf/cxf/blob/4fb07119/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder11Impl.java
----------------------------------------------------------------------
diff --git a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder11Impl.java b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder11Impl.java
index 77f5f36..72153ad 100644
--- a/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder11Impl.java
+++ b/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/EncoderDecoder11Impl.java
@@ -133,19 +133,8 @@ public final class EncoderDecoder11Impl extends EncoderDecoder {
         SequenceFaultType flt = new SequenceFaultType();
         flt.setFaultCode(sf.getFaultCode());
         Object detail = sf.getDetail();
-        Document doc = DOMUtils.createDocument();
-        if (detail instanceof Element) {
-            flt.getAny().add(detail);
-        } else if (detail instanceof Identifier) {
-            marshaller.marshal(detail, doc);
-        } else if (detail instanceof SequenceAcknowledgement) {
-            marshaller.marshal(detail, doc);
-        }
-        Element data = doc.getDocumentElement();
-        if (data != null) {
-            addDetail(flt, data);
-        }
-        data = sf.getExtraDetail();
+        flt.getAny().add(detail);
+        Element data = sf.getExtraDetail();
         if (data != null) {
             addDetail(flt, data);
         }

http://git-wip-us.apache.org/repos/asf/cxf/blob/4fb07119/systests/ws-rm/src/test/java/org/apache/cxf/systest/ws/rm/WSRM12ServerCycleTest.java
----------------------------------------------------------------------
diff --git a/systests/ws-rm/src/test/java/org/apache/cxf/systest/ws/rm/WSRM12ServerCycleTest.java b/systests/ws-rm/src/test/java/org/apache/cxf/systest/ws/rm/WSRM12ServerCycleTest.java
index de471b7..72bdcfa 100644
--- a/systests/ws-rm/src/test/java/org/apache/cxf/systest/ws/rm/WSRM12ServerCycleTest.java
+++ b/systests/ws-rm/src/test/java/org/apache/cxf/systest/ws/rm/WSRM12ServerCycleTest.java
@@ -146,7 +146,6 @@ public class WSRM12ServerCycleTest extends AbstractBusClientServerTestBase {
     }
 
     @Test
-    @org.junit.Ignore 
     public void testNonPersistentSequenceNoTransformer() throws Exception {
         try {
             //CXF-7392