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/11 20:30:10 UTC

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

Author: veithen
Date: Fri Mar 11 19:30:10 2016
New Revision: 1734618

URL: http://svn.apache.org/viewvc?rev=1734618&view=rev
Log:
Get rid of some of the remaining hacks in StAXOMBuilder.

Modified:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java
    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/om/impl/common/builder/UnwrappingContext.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/AxiomElement.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomElementSupport.aj

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java?rev=1734618&r1=1734617&r2=1734618&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java Fri Mar 11 19:30:10 2016
@@ -52,7 +52,7 @@ final class BuilderHandler implements Xm
     public int depth;
     
     private ArrayList<BuilderListener> listeners;
-    private Queue<Runnable> deferredListenerActions;
+    private Queue<Runnable> deferredActions;
 
     BuilderHandler(NodeFactory nodeFactory, Model model, AxiomSourcedElement root, Builder builder) {
         this.nodeFactory = nodeFactory;
@@ -78,19 +78,23 @@ final class BuilderHandler implements Xm
             for (int i=0, size=listeners.size(); i<size; i++) {
                 Runnable action = listeners.get(i).nodeAdded(node, depth);
                 if (action != null) {
-                    if (deferredListenerActions == null) {
-                        deferredListenerActions = new LinkedList<Runnable>();
-                    }
-                    deferredListenerActions.add(action);
+                    scheduleDeferredAction(action);
                 }
             }
         }
     }
 
-    void executeDeferredListenerActions() {
-        if (deferredListenerActions != null) {
+    private void scheduleDeferredAction(Runnable action) {
+        if (deferredActions == null) {
+            deferredActions = new LinkedList<Runnable>();
+        }
+        deferredActions.add(action);
+    }
+
+    void executeDeferredActions() {
+        if (deferredActions != null) {
             Runnable action;
-            while ((action = deferredListenerActions.poll()) != null) {
+            while ((action = deferredActions.poll()) != null) {
                 action.run();
             }
         }
@@ -102,7 +106,14 @@ final class BuilderHandler implements Xm
     
     void decrementActiveContextCount() {
         if (--activeContextCount == 0) {
-            builder.close();
+            scheduleDeferredAction(new Runnable() {
+                @Override
+                public void run() {
+                    while (!done) {
+                        builder.next();
+                    }
+                }
+            });
         }
     }
     

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=1734618&r1=1734617&r2=1734618&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 Fri Mar 11 19:30:10 2016
@@ -20,16 +20,16 @@
 package org.apache.axiom.om.impl.common.builder;
 
 import org.apache.axiom.core.NodeFactory;
+import org.apache.axiom.om.OMDocument;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.ds.custombuilder.CustomBuilder;
 import org.apache.axiom.om.ds.custombuilder.CustomBuilderSupport;
 import org.apache.axiom.om.ds.custombuilder.CustomBuilder.Selector;
 import org.apache.axiom.om.impl.builder.Detachable;
-import org.apache.axiom.om.impl.intf.AxiomElement;
+import org.apache.axiom.om.impl.intf.AxiomDocument;
 import org.apache.axiom.om.impl.intf.AxiomSourcedElement;
 
-import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamReader;
 
 import java.io.Closeable;
@@ -119,28 +119,8 @@ public class StAXOMBuilder extends Abstr
         if (builderHandler.done) {
             throw new OMException();
         }
-        int event = helper.next();
-        builderHandler.executeDeferredListenerActions();
-        
-        // TODO: this will fail if there is whitespace before the document element
-        if (event != XMLStreamConstants.START_DOCUMENT && builderHandler.depth == 0 && builderHandler.document == null && !builderHandler.done) {
-            // We get here if the document has been discarded (by getDocumentElement(true)
-            // or because the builder is linked to an OMSourcedElement) and
-            // we just processed the END_ELEMENT event for the root element. In this case, we consume
-            // the remaining events until we reach the end of the document. This serves several purposes:
-            //  * It allows us to detect documents that have an epilog that is not well formed.
-            //  * Many parsers will perform some cleanup when the end of the document is reached.
-            //    For example, Woodstox will recycle the symbol table if the parser gets past the
-            //    last END_ELEMENT. This improves performance because Woodstox by default interns
-            //    all symbols; if the symbol table can be recycled, then this reduces the number of
-            //    calls to String#intern().
-            //  * If autoClose is set, the parser will be closed so that even more resources
-            //    can be released.
-            while (helper.parserNext() != XMLStreamConstants.END_DOCUMENT) {
-                // Just loop
-            }
-            builderHandler.done = true;
-        }
+        helper.next();
+        builderHandler.executeDeferredActions();
     }
     
     public final OMElement getDocumentElement() {
@@ -148,9 +128,11 @@ public class StAXOMBuilder extends Abstr
     }
 
     public final OMElement getDocumentElement(boolean discardDocument) {
-        OMElement element = getDocument().getOMDocumentElement();
+        OMDocument document = getDocument();
+        OMElement element = document.getOMDocumentElement();
         if (discardDocument) {
-            ((AxiomElement)element).detachAndDiscardParent();
+            element.detach();
+            ((AxiomDocument)document).coreDiscard(false);
             builderHandler.document = null;
         }
         return element;

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/UnwrappingContext.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/UnwrappingContext.java?rev=1734618&r1=1734617&r2=1734618&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/UnwrappingContext.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/UnwrappingContext.java Fri Mar 11 19:30:10 2016
@@ -43,12 +43,15 @@ final class UnwrappingContext extends Co
     }
 
     @Override
-    BuildableContext startElement(String namespaceURI, String localName, String prefix)
+    Context startElement(String namespaceURI, String localName, String prefix)
             throws StreamException {
         root.validateName(prefix, localName, namespaceURI);
         root.initName(localName, builderHandler.nsCache.getOMNamespace(namespaceURI, prefix), false);
         root.coreSetState(CoreParentNode.ATTRIBUTES_PENDING);
-        return newContext(root);
+        Context nestedContext = newContext(root);
+        // We will basically ignore events in the epilog, so mark this context as inactive
+        builderHandler.decrementActiveContextCount();
+        return nestedContext;
     }
 
     @Override

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/AxiomElement.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/AxiomElement.java?rev=1734618&r1=1734617&r2=1734618&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/AxiomElement.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/AxiomElement.java Fri Mar 11 19:30:10 2016
@@ -39,7 +39,5 @@ public interface AxiomElement extends OM
      */
     OMNamespace addNamespaceDeclaration(String uri, String prefix);
     
-    void detachAndDiscardParent();
-    
     void addNamespaceDeclaration(OMNamespace ns);
 }

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=1734618&r1=1734617&r2=1734618&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 Fri Mar 11 19:30:10 2016
@@ -248,12 +248,6 @@ public aspect AxiomElementSupport {
         detach();
     }
     
-    public void AxiomElement.detachAndDiscardParent() {
-        internalUnsetParent(null);
-        coreSetPreviousSibling(null);
-        coreSetNextSibling(null);
-    }
-    
     public <T extends OMElement> void AxiomElement.insertChild(Sequence sequence, int pos, T newChild, boolean allowReplace) {
         if (!sequence.item(pos).isInstance(newChild)) {
             throw new IllegalArgumentException();