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 17:02:50 UTC

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

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/2555920e
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/2555920e
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/2555920e

Branch: refs/heads/3.1.x-fixes
Commit: 2555920e2d61a28423117d32e5411475132b9802
Parents: ae27ee6
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:48:59 2017 -0400

----------------------------------------------------------------------
 .../org/apache/cxf/binding/soap/SoapHeader.java |  15 +-
 rt/ws/rm/pom.xml                                |  12 ++
 .../org/apache/cxf/ws/rm/EncoderDecoder.java    | 172 +++++++++----------
 .../apache/cxf/ws/rm/EncoderDecoder10AImpl.java |  42 +++--
 .../apache/cxf/ws/rm/EncoderDecoder10Impl.java  |  41 +++--
 .../apache/cxf/ws/rm/EncoderDecoder11Impl.java  |  38 ++--
 .../cxf/ws/rm/soap/RMSoapOutInterceptor.java    |  37 +---
 .../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    |  38 ++--
 11 files changed, 278 insertions(+), 192 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/2555920e/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 39ff6bc..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,20 +33,29 @@ 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;
     }
     public void setActor(String actor) {
         this.actor = actor;
     }
-    
+
     public boolean isMustUnderstand() {
         return mustUnderstand;
     }
     public void setMustUnderstand(boolean mustUnderstand) {
         this.mustUnderstand = mustUnderstand;
     }
-    
+
 
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/2555920e/rt/ws/rm/pom.xml
----------------------------------------------------------------------
diff --git a/rt/ws/rm/pom.xml b/rt/ws/rm/pom.xml
index cc44ec3..d1751d9 100644
--- a/rt/ws/rm/pom.xml
+++ b/rt/ws/rm/pom.xml
@@ -162,6 +162,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>
@@ -170,6 +173,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>
@@ -178,6 +184,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>
@@ -186,6 +195,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/2555920e/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 5515a79..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,131 +46,129 @@ 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.
-     * 
+     *
      * @return context
      * @throws JAXBException
      */
     protected abstract JAXBContext getContext() throws JAXBException;
-    
+        
+
     /**
      * Get the WS-ReliableMessaging namespace used by this encoder/decoder.
-     * 
+     *
      * @return URI
      */
     public abstract String getWSRMNamespace();
-    
+
     /**
      * Get the WS-Addressing namespace used by this encoder/decoder.
-     * 
+     *
      * @return URI
      */
     public abstract String getWSANamespace();
-    
+
     /**
      * Get the WS-ReliableMessaging constants used by this encoder/decoder.
-     * 
+     *
      * @return
      */
     public abstract RMConstants getConstants();
-    
+
     /**
      * Get the class used for the CreateSequenceType.
-     * 
+     *
      * @return class
      */
     public abstract Class<?> getCreateSequenceType();
-    
+
     /**
      * Get the class used for the CreateSequenceResponseType.
-     * 
+     *
      * @return class
      */
     public abstract Class<?> getCreateSequenceResponseType();
-    
+
     /**
      * Get the class used for the TerminateSequenceType.
-     * 
+     *
      * @return class
      */
     public abstract Class<?> getTerminateSequenceType();
-    
+
     /**
      * Get the class used for the TerminateSequenceResponseType.
-     * 
+     *
      * @return class
      */
     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.
-     * 
+     *
      * @param rmps
      * @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);
     }
-    
+
     /**
      * Builds an element containing a WS-RM Fault. This adds the appropriate WS-RM namespace declaration to
      * the element, and then adds the Fault as a child element.
-     * 
+     *
      * @param sf
      * @param qname constructed element name
      * @return element
      */
-    public Element buildHeaderFault(SequenceFault sf, QName qname) throws JAXBException {
+    public Header buildHeaderFault(SequenceFault sf) throws JAXBException {
+        Object o = buildHeaderFaultObject(sf);
         
-        // 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;
+        return new Header(new QName(getConstants().getWSRMNamespace(),
+                                    RMConstants.SEQUENCE_FAULT_NAME),
+                          o, getDataBinding());
     }
 
     /**
      * Build all required headers, using the correct protocol variation.
-     * 
+     *
      * @param seq
      * @param acks
      * @param reqs
@@ -179,116 +178,113 @@ 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.
-     * 
+     *
      * @param ack
      * @return element
      * @throws JAXBException
      */
     public abstract Element encodeSequenceAcknowledgement(SequenceAcknowledgement ack) throws JAXBException;
-    
+
     /**
      * Marshals an Identifier to the appropriate external form.
-     * 
+     *
      * @param id
      * @return element
      * @throws JAXBException
      */
     public abstract Element encodeIdentifier(Identifier id) throws JAXBException;
-    
+
     /**
      * Unmarshals a SequenceType, converting it if necessary to the internal form.
-     * 
+     *
      * @param elem
      * @return
      * @throws JAXBException
      */
     public abstract SequenceType decodeSequenceType(Element elem) throws JAXBException;
-    
+
     /**
      * Generates a CloseSequenceType if a SequenceType represents a last message state.
-     * 
+     *
      * @param elem
      * @return CloseSequenceType if last message state, else <code>null</code>
      * @throws JAXBException
      */
     public abstract CloseSequenceType decodeSequenceTypeCloseSequence(Element elem) throws JAXBException;
-    
+
     /**
      * Unmarshals a SequenceAcknowledgement, converting it if necessary to the internal form.
-     * 
+     *
      * @param elem
      * @return
      * @throws JAXBException
      */
     public abstract SequenceAcknowledgement decodeSequenceAcknowledgement(Element elem) throws JAXBException;
-    
+
     /**
      * Unmarshals a AckRequestedType, converting it if necessary to the internal form.
-     * 
+     *
      * @param elem
      * @return
      * @throws JAXBException
      */
     public abstract AckRequestedType decodeAckRequestedType(Element elem) throws JAXBException;
-    
+
     /**
      * Convert a CreateSequence message to the correct format for transmission.
-     * 
+     *
      * @param create
      * @return converted
      */
     public abstract Object convertToSend(CreateSequenceType create);
-    
+
     /**
      * Convert a CreateSequenceResponse message to the correct format for transmission.
-     * 
+     *
      * @param create
      * @return converted
      */
     public abstract Object convertToSend(CreateSequenceResponseType create);
-    
+
     /**
      * Convert a TerminateSequence message to the correct format for transmission.
-     * 
+     *
      * @param term
      * @return converted
      */
     public abstract Object convertToSend(TerminateSequenceType term);
-    
+
     /**
      * Convert a received TerminateSequence message to internal form.
-     * 
+     *
      * @param term
      * @return converted
      */
     public abstract TerminateSequenceType convertReceivedTerminateSequence(Object term);
-    
+
     /**
      * Convert a received CreateSequence message to internal form.
-     * 
+     *
      * @param create
      * @return converted
      */
     public abstract CreateSequenceType convertReceivedCreateSequence(Object create);
-    
+
     /**
      * Convert a received CreateSequenceResponse message to internal form.
-     * 
+     *
      * @param create
      * @return converted
      */

http://git-wip-us.apache.org/repos/asf/cxf/blob/2555920e/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 630dec5..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;
@@ -51,16 +55,16 @@ import org.apache.cxf.ws.rm.v200702.TerminateSequenceType;
  * 1.0 representation using the WS-Addressing recommendation 200508 namespace.
  */
 public final class EncoderDecoder10AImpl extends EncoderDecoder {
-    
+
     public static final EncoderDecoder10AImpl INSTANCE = new EncoderDecoder10AImpl();
 
     private static AtomicReference<JAXBContext> jaxbContextReference = new AtomicReference<JAXBContext>();
 
     private static final Logger LOG = LogUtils.getL7dLogger(EncoderDecoder10AImpl.class);
-    
+
     private EncoderDecoder10AImpl() {
     }
-    
+
     public String getWSRMNamespace() {
         return RM10Constants.NAMESPACE_URI;
     }
@@ -105,34 +109,42 @@ 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);
             if (last) {
                 toseq.setLastMessage(new org.apache.cxf.ws.rm.v200502wsa15.SequenceType.LastMessage());
             }
-            JAXBElement<org.apache.cxf.ws.rm.v200502wsa15.SequenceType> element 
+            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 {
@@ -173,7 +183,7 @@ public final class EncoderDecoder10AImpl extends EncoderDecoder {
             = unmarshaller.unmarshal(elem, org.apache.cxf.ws.rm.v200502wsa15.SequenceType.class);
         return VersionTransformer.convert(jaxbElement.getValue());
     }
-    
+
     public CloseSequenceType decodeSequenceTypeCloseSequence(Element elem) throws JAXBException {
         Unmarshaller unmarshaller = getContext().createUnmarshaller();
         JAXBElement<org.apache.cxf.ws.rm.v200502wsa15.SequenceType> jaxbElement
@@ -206,7 +216,7 @@ public final class EncoderDecoder10AImpl extends EncoderDecoder {
     public Object convertToSend(CreateSequenceType create) {
         return VersionTransformer.convert200502wsa15(create);
     }
-    
+
     public Object convertToSend(TerminateSequenceType term) {
         return VersionTransformer.convert200502wsa15(term);
     }

http://git-wip-us.apache.org/repos/asf/cxf/blob/2555920e/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 1d3e8d2..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;
@@ -51,16 +55,16 @@ import org.apache.cxf.ws.rm.v200702.TerminateSequenceType;
  * 1.0 representation using the WS-Addressing 200408 namespace specified in the WS-RM 1.0 recommendation.
  */
 public final class EncoderDecoder10Impl extends EncoderDecoder {
-    
+
     public static final EncoderDecoder10Impl INSTANCE = new EncoderDecoder10Impl();
 
     private static AtomicReference<JAXBContext> jaxbContextReference = new AtomicReference<JAXBContext>();
 
     private static final Logger LOG = LogUtils.getL7dLogger(EncoderDecoder10Impl.class);
-    
+
     private EncoderDecoder10Impl() {
     }
-    
+
     public String getWSRMNamespace() {
         return RM10Constants.NAMESPACE_URI;
     }
@@ -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 {
@@ -171,7 +182,7 @@ public final class EncoderDecoder10Impl extends EncoderDecoder {
             = unmarshaller.unmarshal(elem, org.apache.cxf.ws.rm.v200502.SequenceType.class);
         return VersionTransformer.convert(jaxbElement.getValue());
     }
-    
+
     public CloseSequenceType decodeSequenceTypeCloseSequence(Element elem) throws JAXBException {
         Unmarshaller unmarshaller = getContext().createUnmarshaller();
         JAXBElement<org.apache.cxf.ws.rm.v200502.SequenceType> jaxbElement
@@ -208,7 +219,7 @@ public final class EncoderDecoder10Impl extends EncoderDecoder {
     public Object convertToSend(CreateSequenceResponseType create) {
         return VersionTransformer.convert200502(create);
     }
-    
+
     public Object convertToSend(TerminateSequenceType term) {
         return VersionTransformer.convert200502(term);
     }

http://git-wip-us.apache.org/repos/asf/cxf/blob/2555920e/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 7e868cc..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;
@@ -53,16 +57,16 @@ import org.apache.cxf.ws.rm.v200702.TerminateSequenceType;
  * WS-RM data structures.
  */
 public final class EncoderDecoder11Impl extends EncoderDecoder {
-    
+
     public static final EncoderDecoder11Impl INSTANCE = new EncoderDecoder11Impl();
 
     private static AtomicReference<JAXBContext> jaxbContextReference = new AtomicReference<JAXBContext>();
 
     private static final Logger LOG = LogUtils.getL7dLogger(EncoderDecoder11Impl.class);
-    
+
     private EncoderDecoder11Impl() {
     }
-    
+
     public String getWSRMNamespace() {
         return RM11Constants.NAMESPACE_URI;
     }
@@ -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) {
@@ -168,7 +178,7 @@ public final class EncoderDecoder11Impl extends EncoderDecoder {
         JAXBElement<SequenceType> jaxbElement = unmarshaller.unmarshal(elem, SequenceType.class);
         return jaxbElement.getValue();
     }
-    
+
     public CloseSequenceType decodeSequenceTypeCloseSequence(Element elem) throws JAXBException {
         return null;
     }
@@ -191,7 +201,7 @@ public final class EncoderDecoder11Impl extends EncoderDecoder {
     public Object convertToSend(CreateSequenceResponseType create) {
         return create;
     }
-    
+
     public Object convertToSend(TerminateSequenceType term) {
         return term;
     }

http://git-wip-us.apache.org/repos/asf/cxf/blob/2555920e/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 26342d4..cb070ad 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)) {
+            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);
                 }
-                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();
-                }
-            }
-
         } 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/2555920e/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/2555920e/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/2555920e/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/2555920e/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 3d10125..0056673 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();
+                    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);
         }
     }
 }