You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2016/03/01 22:03:02 UTC

svn commit: r1733153 - in /webservices/axiom/trunk: aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/ aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/factory/ aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/...

Author: veithen
Date: Tue Mar  1 21:03:02 2016
New Revision: 1733153

URL: http://svn.apache.org/viewvc?rev=1733153&view=rev
Log:
Don't override addChild in SOAPEnvelope implementations because super calls don't play nicely with mixins and the contract of the addChild method specifies that the child is always added at the end.

Modified:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomElementSupport.aj
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/factory/SOAPFactoryImpl.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultClassifierSupport.aj
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultSupport.aj
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultSupport.aj
    webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java
    webservices/axiom/trunk/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPEnvelopeImpl.java

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomElementSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomElementSupport.aj?rev=1733153&r1=1733152&r2=1733153&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomElementSupport.aj (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomElementSupport.aj Tue Mar  1 21:03:02 2016
@@ -256,11 +256,12 @@ public aspect AxiomElementSupport {
         coreSetNextSibling(null);
     }
     
-    public <T extends OMElement> void AxiomElement.insertChild(Sequence sequence, int pos, T newChild) {
+    public <T extends OMElement> void AxiomElement.insertChild(Sequence sequence, int pos, T newChild, boolean allowReplace) {
         if (!sequence.item(pos).isInstance(newChild)) {
             throw new IllegalArgumentException();
         }
         OMNode child = getFirstOMChild();
+        Class<? extends OMElement> type = sequence.item(pos);
         while (child != null) {
             if (child instanceof OMElement) {
                 if (child == newChild) {
@@ -268,10 +269,14 @@ public aspect AxiomElementSupport {
                     // the right position
                     return;
                 }
-                if (sequence.item(pos).isInstance(child)) {
+                if (type.isInstance(child)) {
                     // Replace the existing child
-                    child.insertSiblingAfter(newChild);
-                    child.detach();
+                    if (allowReplace) {
+                        child.insertSiblingAfter(newChild);
+                        child.detach();
+                    } else {
+                        throw new OMException("The element already has a child of type " + type.getName());
+                    }
                     return;
                 }
                 // isAfter indicates if the new child should be inserted after the current child

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/factory/SOAPFactoryImpl.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/factory/SOAPFactoryImpl.java?rev=1733153&r1=1733152&r2=1733153&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/factory/SOAPFactoryImpl.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/factory/SOAPFactoryImpl.java Tue Mar  1 21:03:02 2016
@@ -26,7 +26,8 @@ import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMMetaFactory;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.impl.common.factory.OMFactoryImpl;
-import org.apache.axiom.om.impl.intf.AxiomContainer;
+import org.apache.axiom.om.impl.intf.AxiomElement;
+import org.apache.axiom.om.impl.intf.Sequence;
 import org.apache.axiom.soap.SOAPBody;
 import org.apache.axiom.soap.SOAPConstants;
 import org.apache.axiom.soap.SOAPEnvelope;
@@ -46,6 +47,8 @@ import org.apache.axiom.soap.impl.intf.A
 import org.apache.axiom.soap.impl.intf.SOAPHelper;
 
 public abstract class SOAPFactoryImpl extends OMFactoryImpl implements SOAPFactory {
+    private static final Sequence envelopeSequence = new Sequence(SOAPHeader.class, SOAPBody.class);
+    
     public SOAPFactoryImpl(OMMetaFactory metaFactory, NodeFactory nodeFactory) {
         super(metaFactory, nodeFactory);
     }
@@ -65,9 +68,17 @@ public abstract class SOAPFactoryImpl ex
     }
     
     protected final <T extends AxiomSOAPElement> T createSOAPElement(Class<T> type, OMElement parent, QName qname) {
+        return createSOAPElement(type, parent, qname, null, -1);
+    }
+    
+    protected final <T extends AxiomSOAPElement> T createSOAPElement(Class<T> type, OMElement parent, QName qname, Sequence sequence, int pos) {
         T element = createNode(type);
         if (parent != null) {
-            ((AxiomContainer)parent).addChild(element);
+            if (sequence != null) {
+                ((AxiomElement)parent).insertChild(sequence, pos, element, false);
+            } else {
+                ((AxiomElement)parent).addChild(element);
+            }
         }
         if (qname.getNamespaceURI().length() == 0) {
             element.initName(qname.getLocalPart(), null, true);
@@ -95,7 +106,7 @@ public abstract class SOAPFactoryImpl ex
 
     public final SOAPHeader createSOAPHeader(SOAPEnvelope parent) {
         SOAPHelper helper = getSOAPHelper();
-        return createSOAPElement(helper.getHeaderClass(), parent, helper.getHeaderQName());
+        return createSOAPElement(helper.getHeaderClass(), parent, helper.getHeaderQName(), envelopeSequence, 0);
     }
 
     public final SOAPHeader createSOAPHeader() {
@@ -124,7 +135,7 @@ public abstract class SOAPFactoryImpl ex
 
     public final SOAPBody createSOAPBody(SOAPEnvelope parent) {
         SOAPHelper helper = getSOAPHelper();
-        return createSOAPElement(helper.getBodyClass(), parent, helper.getBodyQName());
+        return createSOAPElement(helper.getBodyClass(), parent, helper.getBodyQName(), envelopeSequence, 1);
     }
 
     public final SOAPBody createSOAPBody() {

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultClassifierSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultClassifierSupport.aj?rev=1733153&r1=1733152&r2=1733153&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultClassifierSupport.aj (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultClassifierSupport.aj Tue Mar  1 21:03:02 2016
@@ -40,7 +40,7 @@ public aspect AxiomSOAP12FaultClassifier
     }
 
     public final void AxiomSOAP12FaultClassifier.setValue(SOAPFaultValue value) {
-        insertChild(sequence, 0, value);
+        insertChild(sequence, 0, value, true);
     }
     
     public final SOAPFaultSubCode AxiomSOAP12FaultClassifier.getSubCode() {
@@ -48,7 +48,7 @@ public aspect AxiomSOAP12FaultClassifier
     }
     
     public final void AxiomSOAP12FaultClassifier.setSubCode(SOAPFaultSubCode subCode) {
-        insertChild(sequence, 1, subCode);
+        insertChild(sequence, 1, subCode, true);
     }
 
     public final QName AxiomSOAP12FaultClassifier.getValueAsQName() {

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultSupport.aj?rev=1733153&r1=1733152&r2=1733153&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultSupport.aj (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAP12FaultSupport.aj Tue Mar  1 21:03:02 2016
@@ -41,7 +41,7 @@ public aspect AxiomSOAP12FaultSupport {
     }
     
     public final void AxiomSOAP12Fault.setNode(SOAPFaultNode node) {
-        insertChild(sequence, 2, node);
+        insertChild(sequence, 2, node, true);
     }
 
     public final SOAPFaultCode AxiomSOAP12Fault.getCode() {

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultSupport.aj?rev=1733153&r1=1733152&r2=1733153&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultSupport.aj (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPFaultSupport.aj Tue Mar  1 21:03:02 2016
@@ -41,21 +41,21 @@ public aspect AxiomSOAPFaultSupport {
     }
 
     public final void AxiomSOAPFault.setCode(SOAPFaultCode soapFaultCode) {
-        insertChild(getSequence(), 0, soapFaultCode);
+        insertChild(getSequence(), 0, soapFaultCode, true);
     }
 
     public final void AxiomSOAPFault.setReason(SOAPFaultReason reason) {
-        insertChild(getSequence(), 1, reason);
+        insertChild(getSequence(), 1, reason, true);
     }
 
     public final void AxiomSOAPFault.setRole(SOAPFaultRole role) {
         Sequence sequence = getSequence();
-        insertChild(sequence, sequence.index(SOAPFaultRole.class), role);
+        insertChild(sequence, sequence.index(SOAPFaultRole.class), role, true);
     }
 
     public final void AxiomSOAPFault.setDetail(SOAPFaultDetail detail) {
         Sequence sequence = getSequence();
-        insertChild(sequence, sequence.index(SOAPFaultDetail.class), detail);
+        insertChild(sequence, sequence.index(SOAPFaultDetail.class), detail, true);
     }
 
     public final void AxiomSOAPFault.setException(Exception e) {

Modified: webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java?rev=1733153&r1=1733152&r2=1733153&view=diff
==============================================================================
--- webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java (original)
+++ webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java Tue Mar  1 21:03:02 2016
@@ -19,51 +19,13 @@
 
 package org.apache.axiom.soap.impl.dom;
 
-import org.apache.axiom.om.OMConstants;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.soap.SOAP11Version;
-import org.apache.axiom.soap.SOAPBody;
-import org.apache.axiom.soap.SOAPHeader;
 import org.apache.axiom.soap.impl.intf.AxiomSOAPEnvelope;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Node;
 
-public abstract class SOAPEnvelopeImpl extends SOAPElement implements AxiomSOAPEnvelope,
-        OMConstants {
-    public void addChild(OMNode child) {
-        if (child instanceof SOAPHeader) {
-            // The SOAPHeader is added before the SOAPBody
-            // We must be sensitive to the state of the parser.  It is possible that the
-            // has not been processed yet.
-            if (getState() == COMPLETE) {
-                // Parsing is complete, therefore it is safe to
-                // call getBody.
-                SOAPBody body = getBody();
-                if (body != null) {
-                    body.insertSiblingBefore(child);
-                    return;
-                }
-            } else {
-                // Flow to here indicates that we are still expanding the
-                // envelope.  The body or body contents may not be
-                // parsed yet.  We can't use getBody() yet...it will
-                // cause a failure.  So instead, carefully find the
-                // body and insert the header.  If the body is not found,
-                // this indicates that it has not been parsed yet...and
-                // the code will fall through to the super.addChild.
-                OMNode node = (OMNode)coreGetLastKnownChild();
-                while (node != null) {
-                    if (node instanceof SOAPBody) {
-                        node.insertSiblingBefore(child);
-                        return;
-                    }
-                    node = node.getPreviousOMSibling();
-                }
-            }
-        }
-        super.addChild(child);
-    }
-
+public abstract class SOAPEnvelopeImpl extends SOAPElement implements AxiomSOAPEnvelope {
     public Node insertBefore(Node newChild, Node refChild) throws DOMException {
         // Check that the child to be added is valid in the context of a SOAP envelope.
         // Note that this also covers the appendChild case, since that method

Modified: webservices/axiom/trunk/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPEnvelopeImpl.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPEnvelopeImpl.java?rev=1733153&r1=1733152&r2=1733153&view=diff
==============================================================================
--- webservices/axiom/trunk/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPEnvelopeImpl.java (original)
+++ webservices/axiom/trunk/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/SOAPEnvelopeImpl.java Tue Mar  1 21:03:02 2016
@@ -19,50 +19,9 @@
 
 package org.apache.axiom.soap.impl.llom;
 
-import org.apache.axiom.om.OMConstants;
-import org.apache.axiom.om.OMNode;
-import org.apache.axiom.soap.SOAPBody;
-import org.apache.axiom.soap.SOAPHeader;
 import org.apache.axiom.soap.impl.intf.AxiomSOAPEnvelope;
 
 /** Class SOAPEnvelopeImpl */
-public abstract class SOAPEnvelopeImpl extends SOAPElement
-        implements AxiomSOAPEnvelope, OMConstants {
-    /**
-     * Add a SOAPHeader or SOAPBody object
-     * @param child an OMNode to add - must be either a SOAPHeader or a SOAPBody
-     */
-    public void addChild(OMNode child) {
-        if (child instanceof SOAPHeader) {
-            // The SOAPHeader is added before the SOAPBody
-            // We must be sensitive to the state of the parser.  It is possible that the
-            // has not been processed yet.
-            if (getState() == COMPLETE) {
-                // Parsing is complete, therefore it is safe to
-                // call getBody.
-                SOAPBody body = getBody();
-                if (body != null) {
-                    body.insertSiblingBefore(child);
-                    return;
-                }
-            } else {
-                // Flow to here indicates that we are still expanding the
-                // envelope.  The body or body contents may not be
-                // parsed yet.  We can't use getBody() yet...it will
-                // cause a failure.  So instead, carefully find the
-                // body and insert the header.  If the body is not found,
-                // this indicates that it has not been parsed yet...and
-                // the code will fall through to the super.addChild.
-                OMNode node = (OMNode)coreGetLastKnownChild();
-                while (node != null) {
-                    if (node instanceof SOAPBody) {
-                        node.insertSiblingBefore(child);
-                        return;
-                    }
-                    node = node.getPreviousOMSibling();
-                }
-            }
-        }
-        super.addChild(child);
-    }
+public abstract class SOAPEnvelopeImpl extends SOAPElement implements AxiomSOAPEnvelope {
+
 }