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/02/03 22:07:47 UTC

svn commit: r1728374 - in /webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom: om/impl/common/builder/ soap/impl/common/builder/ soap/impl/mixin/

Author: veithen
Date: Wed Feb  3 21:07:47 2016
New Revision: 1728374

URL: http://svn.apache.org/viewvc?rev=1728374&view=rev
Log:
Implement a more straightforward way to initialize the SOAPFactory on a SOAPMessage.

Added:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/NodePostProcessor.java   (with props)
Modified:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/builder/StAXSOAPModelBuilder.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPMessageSupport.aj

Added: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/NodePostProcessor.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/NodePostProcessor.java?rev=1728374&view=auto
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/NodePostProcessor.java (added)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/NodePostProcessor.java Wed Feb  3 21:07:47 2016
@@ -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.
+ */
+package org.apache.axiom.om.impl.common.builder;
+
+import org.apache.axiom.om.OMSerializable;
+
+public interface NodePostProcessor {
+    void postProcessNode(OMSerializable node);
+}

Propchange: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/NodePostProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java?rev=1728374&r1=1728373&r2=1728374&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java Wed Feb  3 21:07:47 2016
@@ -31,6 +31,7 @@ import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
+import org.apache.axiom.om.OMSerializable;
 import org.apache.axiom.om.OMText;
 import org.apache.axiom.om.impl.builder.Builder;
 import org.apache.axiom.om.impl.builder.CustomBuilder;
@@ -53,6 +54,7 @@ import javax.xml.namespace.QName;
 import javax.xml.stream.Location;
 
 import java.io.Closeable;
+import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
@@ -169,6 +171,8 @@ public class StAXOMBuilder implements Bu
     
     private int lookAheadToken = -1;
     
+    private ArrayList<NodePostProcessor> nodePostProcessors;
+    
     private StAXOMBuilder(OMFactory omFactory, XMLStreamReader parser, String encoding,
             boolean autoClose, Detachable detachable, Closeable closeable, PayloadSelector payloadSelector) {
         omfactory = (OMFactoryEx)omFactory;
@@ -532,6 +536,7 @@ public class StAXOMBuilder implements Bu
             document.setXMLEncoding(parser.getCharacterEncodingScheme());
             document.setStandalone(parser.isStandalone() ? "yes" : "no");
             target = (AxiomContainer)document;
+            postProcessNode(document);
         }
     }
     
@@ -632,11 +637,12 @@ public class StAXOMBuilder implements Bu
             }
            
             // Note: if autoClose is enabled, then the parser may be null at this point
-           
+            
+            OMNode node;
             switch (token) {
                 case XMLStreamConstants.START_ELEMENT: {
                     elementLevel++;
-                    OMNode node = createNextOMElement();
+                    node = createNextOMElement();
                     // If the node was created by a custom builder, then it will be complete;
                     // in this case, the target doesn't change
                     if (!node.isComplete()) {
@@ -645,38 +651,41 @@ public class StAXOMBuilder implements Bu
                     break;
                 }
                 case XMLStreamConstants.CHARACTERS:
-                    createOMText(XMLStreamConstants.CHARACTERS);
+                    node = createOMText(XMLStreamConstants.CHARACTERS);
                     break;
                 case XMLStreamConstants.CDATA:
-                    createOMText(XMLStreamConstants.CDATA);
+                    node = createOMText(XMLStreamConstants.CDATA);
                     break;
                 case XMLStreamConstants.END_ELEMENT:
                     elementLevel--;
                     endElement();
+                    node = null;
                     break;
                 case XMLStreamConstants.END_DOCUMENT:
                     done = true;
                     ((AxiomContainer) this.document).setComplete(true);
                     target = null;
+                    node = null;
                     break;
                 case XMLStreamConstants.SPACE:
-                    createOMText(XMLStreamConstants.SPACE);
+                    node = createOMText(XMLStreamConstants.SPACE);
                     break;
                 case XMLStreamConstants.COMMENT:
-                    createComment();
+                    node = createComment();
                     break;
                 case XMLStreamConstants.DTD:
-                    createDTD();
+                    node = createDTD();
                     break;
                 case XMLStreamConstants.PROCESSING_INSTRUCTION:
-                    createPI();
+                    node = createPI();
                     break;
                 case XMLStreamConstants.ENTITY_REFERENCE:
-                    createEntityReference();
+                    node = createEntityReference();
                     break;
                 default :
                     throw new OMException();
             }
+            postProcessNode(node);
             
             if (target == null && !done) {
                 // We get here if the document has been discarded (by getDocumentElement(true)
@@ -1045,4 +1054,19 @@ public class StAXOMBuilder implements Bu
     public final AxiomContainer getTarget() {
         return target;
     }
+    
+    public final void addNodePostProcessor(NodePostProcessor nodePostProcessor) {
+        if (nodePostProcessors == null) {
+            nodePostProcessors = new ArrayList<NodePostProcessor>();
+        }
+        nodePostProcessors.add(nodePostProcessor);
+    }
+    
+    private void postProcessNode(OMSerializable node) {
+        if (nodePostProcessors != null) {
+            for (int i=0, size=nodePostProcessors.size(); i<size; i++) {
+                nodePostProcessors.get(i).postProcessNode(node);
+            }
+        }
+    }
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/builder/StAXSOAPModelBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/builder/StAXSOAPModelBuilder.java?rev=1728374&r1=1728373&r2=1728374&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/builder/StAXSOAPModelBuilder.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/builder/StAXSOAPModelBuilder.java Wed Feb  3 21:07:47 2016
@@ -27,7 +27,9 @@ import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMMetaFactory;
 import org.apache.axiom.om.OMNode;
+import org.apache.axiom.om.OMSerializable;
 import org.apache.axiom.om.impl.builder.Detachable;
+import org.apache.axiom.om.impl.common.builder.NodePostProcessor;
 import org.apache.axiom.om.impl.common.builder.StAXOMBuilder;
 import org.apache.axiom.om.impl.intf.AxiomElement;
 import org.apache.axiom.soap.SOAP11Constants;
@@ -41,6 +43,8 @@ import org.apache.axiom.soap.SOAPMessage
 import org.apache.axiom.soap.SOAPModelBuilder;
 import org.apache.axiom.soap.SOAPProcessingException;
 import org.apache.axiom.soap.impl.builder.OMMetaFactoryEx;
+import org.apache.axiom.soap.impl.intf.AxiomSOAPEnvelope;
+import org.apache.axiom.soap.impl.intf.AxiomSOAPMessage;
 import org.apache.axiom.soap.impl.intf.SOAPFactoryEx;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -76,6 +80,21 @@ public class StAXSOAPModelBuilder extend
             boolean autoClose, Detachable detachable, Closeable closeable) {
         super(metaFactory.getOMFactory(), parser, autoClose, detachable, closeable, SOAPPayloadSelector.INSTANCE);
         this.metaFactory = metaFactory;
+        // The SOAPFactory instance linked to the SOAPMessage is unknown until we reach the
+        // SOAPEnvelope. Register a post-processor that does the necessary updates on the
+        // SOAPMessage.
+        addNodePostProcessor(new NodePostProcessor() {
+            private AxiomSOAPMessage message;
+            
+            @Override
+            public void postProcessNode(OMSerializable node) {
+                if (node instanceof AxiomSOAPMessage) {
+                    message = (AxiomSOAPMessage)node;
+                } else if (message != null && node instanceof AxiomSOAPEnvelope) {
+                    message.initSOAPFactory((SOAPFactory)((AxiomSOAPEnvelope)node).getOMFactory());
+                }
+            }
+        });
     }
     
     public SOAPEnvelope getSOAPEnvelope() throws OMException {
@@ -203,11 +222,4 @@ public class StAXSOAPModelBuilder extend
     public SOAPMessage getSOAPMessage() {
         return (SOAPMessage)getDocument();
     }
-
-    public SOAPFactory getSOAPFactory() {
-        if (soapFactory == null) {
-            getSOAPEnvelope();
-        }
-        return soapFactory;
-    }
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPMessageSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPMessageSupport.aj?rev=1728374&r1=1728373&r2=1728374&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPMessageSupport.aj (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/mixin/AxiomSOAPMessageSupport.aj Wed Feb  3 21:07:47 2016
@@ -27,7 +27,6 @@ import org.apache.axiom.om.impl.common.s
 import org.apache.axiom.om.impl.intf.AxiomElement;
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axiom.soap.SOAPFactory;
-import org.apache.axiom.soap.impl.common.builder.StAXSOAPModelBuilder;
 import org.apache.axiom.soap.impl.intf.AxiomSOAPMessage;
 
 public aspect AxiomSOAPMessageSupport {
@@ -47,7 +46,8 @@ public aspect AxiomSOAPMessageSupport {
     
     public final OMFactory AxiomSOAPMessage.getOMFactory() {
         if (factory == null) {
-            factory = ((StAXSOAPModelBuilder)getBuilder()).getSOAPFactory();
+            // Force expansion up to the SOAP envelope; this will initialize the factory
+            getSOAPEnvelope();
         }
         return factory;
     }