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/07 18:52:36 UTC

svn commit: r1728994 - in /webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder: AbstractBuilder.java StAXOMBuilder.java

Author: veithen
Date: Sun Feb  7 17:52:36 2016
New Revision: 1728994

URL: http://svn.apache.org/viewvc?rev=1728994&view=rev
Log:
Prepare the code in AbstractBuilder and StAXOMBuilder for adding filters around BuilderHandler.

Modified:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractBuilder.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractBuilder.java?rev=1728994&r1=1728993&r2=1728994&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractBuilder.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/AbstractBuilder.java Sun Feb  7 17:52:36 2016
@@ -23,25 +23,29 @@ import org.apache.axiom.om.OMDocument;
 import org.apache.axiom.om.OMXMLParserWrapper;
 import org.apache.axiom.om.impl.intf.AxiomDocument;
 import org.apache.axiom.om.impl.intf.AxiomSourcedElement;
+import org.apache.axiom.om.impl.stream.XmlHandler;
 
 public abstract class AbstractBuilder implements OMXMLParserWrapper {
-    protected final BuilderHandler handler;
+    protected final BuilderHandler builderHandler;
+    protected final XmlHandler handler;
 
     public AbstractBuilder(NodeFactory nodeFactory, Model model, AxiomSourcedElement root, boolean repairNamespaces) {
-        handler = new BuilderHandler(nodeFactory, model, root, this, repairNamespaces);
+        builderHandler = new BuilderHandler(nodeFactory, model, root, this, repairNamespaces);
+        // TODO: eventually the namespace repairing filter XmlHandler will be added here
+        handler = builderHandler;
     }
 
     public final void addNodePostProcessor(NodePostProcessor nodePostProcessor) {
-        handler.addNodePostProcessor(nodePostProcessor);
+        builderHandler.addNodePostProcessor(nodePostProcessor);
     }
 
     public final boolean isCompleted() {
-        return handler.isCompleted();
+        return builderHandler.isCompleted();
     }
 
     public final OMDocument getDocument() {
         AxiomDocument document;
-        while ((document = handler.getDocument()) == null) {
+        while ((document = builderHandler.getDocument()) == null) {
             next();
         }
         return document;

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=1728994&r1=1728993&r2=1728994&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 Sun Feb  7 17:52:36 2016
@@ -35,6 +35,7 @@ import org.apache.axiom.om.impl.intf.Axi
 import org.apache.axiom.om.impl.intf.AxiomElement;
 import org.apache.axiom.om.impl.intf.AxiomSourcedElement;
 import org.apache.axiom.om.impl.intf.TextContent;
+import org.apache.axiom.om.impl.stream.StreamException;
 import org.apache.axiom.util.stax.XMLEventUtils;
 import org.apache.axiom.util.stax.XMLStreamReaderUtils;
 import org.apache.axiom.util.xml.QNameMap;
@@ -157,7 +158,7 @@ public class StAXOMBuilder extends Abstr
         return s == null ? "" : s;
     }
     
-    private void createOMText(int textType) {
+    private void createOMText(int textType) throws StreamException {
         if (textType == XMLStreamConstants.CHARACTERS && dataHandlerReader != null && dataHandlerReader.isBinary()) {
             TextContent data;
             if (dataHandlerReader.isDeferred()) {
@@ -202,14 +203,14 @@ public class StAXOMBuilder extends Abstr
 
     private void discarded(AxiomContainer container) {
         container.discarded();
-        if (handler.discardTracker != null) {
-            handler.discardTracker.put(container, new Throwable());
+        if (builderHandler.discardTracker != null) {
+            builderHandler.discardTracker.put(container, new Throwable());
         }
     }
     
     public final void debugDiscarded(Object container) {
-        if (log.isDebugEnabled() && handler.discardTracker != null) {
-            Throwable t = handler.discardTracker.get(container);
+        if (log.isDebugEnabled() && builderHandler.discardTracker != null) {
+            Throwable t = builderHandler.discardTracker.get(container);
             if (t != null) {
                 log.debug("About to throw NodeUnavailableException. Location of the code that caused the node to be discarded/consumed:", t);
             }
@@ -223,15 +224,15 @@ public class StAXOMBuilder extends Abstr
     }
     
     public final void discard(OMContainer container) {
-        int targetElementLevel = handler.elementLevel;
-        AxiomContainer current = handler.target;
+        int targetElementLevel = builderHandler.elementLevel;
+        AxiomContainer current = builderHandler.target;
         while (current != container) {
             targetElementLevel--;
             current = (AxiomContainer)((OMElement)current).getParent();
         }
-        if (targetElementLevel == 0 || targetElementLevel == 1 && handler.document == null) {
+        if (targetElementLevel == 0 || targetElementLevel == 1 && builderHandler.document == null) {
             close();
-            current = handler.target;
+            current = builderHandler.target;
             while (true) {
                 discarded(current);
                 if (current == container) {
@@ -251,25 +252,25 @@ public class StAXOMBuilder extends Abstr
                     if (skipDepth > 0) {
                         skipDepth--;
                     } else {
-                        discarded(handler.target);
-                        boolean found = container == handler.target;
-                        handler.target = (AxiomContainer)((OMElement)handler.target).getParent();
-                        handler.elementLevel--;
+                        discarded(builderHandler.target);
+                        boolean found = container == builderHandler.target;
+                        builderHandler.target = (AxiomContainer)((OMElement)builderHandler.target).getParent();
+                        builderHandler.elementLevel--;
                         if (found) {
                             break loop;
                         }
                     }
                     break;
                 case XMLStreamReader.END_DOCUMENT:
-                    if (skipDepth != 0 || handler.elementLevel != 0) {
+                    if (skipDepth != 0 || builderHandler.elementLevel != 0) {
                         throw new OMException("Unexpected END_DOCUMENT");
                     }
-                    if (handler.target != handler.document) {
+                    if (builderHandler.target != builderHandler.document) {
                         throw new OMException("Called discard for an element that is not being built by this builder");
                     }
-                    discarded(handler.target);
-                    handler.target = null;
-                    handler.done = true;
+                    discarded(builderHandler.target);
+                    builderHandler.target = null;
+                    builderHandler.done = true;
                     break loop;
             }
         }
@@ -289,14 +290,14 @@ public class StAXOMBuilder extends Abstr
             throw new UnsupportedOperationException(
                     "parser accessed. cannot set cache");
         }
-        handler.cache = b;
+        builderHandler.cache = b;
     }
     
     /**
      * @return true if caching
      */
     public final boolean isCache() {
-        return handler.cache;
+        return builderHandler.cache;
     }
 
     public final String getLocalName() {
@@ -331,19 +332,19 @@ public class StAXOMBuilder extends Abstr
             throw new IllegalStateException(
                     "Parser already accessed!");
         }
-        if (!handler.cache) {
+        if (!builderHandler.cache) {
             parserAccessed = true;
             // Mark all containers in the hierarchy as discarded because they can no longer be built
-            AxiomContainer current = handler.target;
-            while (handler.elementLevel > 0) {
+            AxiomContainer current = builderHandler.target;
+            while (builderHandler.elementLevel > 0) {
                 discarded(current);
                 current = (AxiomContainer)((OMElement)current).getParent();
-                handler.elementLevel--;
+                builderHandler.elementLevel--;
             }
-            if (current != null && current == handler.document) {
+            if (current != null && current == builderHandler.document) {
                 discarded(current);
             }
-            handler.target = null;
+            builderHandler.target = null;
             return parser;
         } else {
             throw new IllegalStateException(
@@ -352,12 +353,12 @@ public class StAXOMBuilder extends Abstr
     }
 
     public final XMLStreamReader disableCaching() {
-        handler.cache = false;
+        builderHandler.cache = false;
         // Always advance to the event right after the current node; this also takes
         // care of lookahead
         parserNext();
         if (log.isDebugEnabled()) {
-            log.debug("Caching disabled; current element level is " + handler.elementLevel);
+            log.debug("Caching disabled; current element level is " + builderHandler.elementLevel);
         }
         return parser;
     }
@@ -365,42 +366,42 @@ public class StAXOMBuilder extends Abstr
     // This method expects that the parser is currently positioned on the
     // end event corresponding to the container passed as parameter
     public final void reenableCaching(OMContainer container) {
-        AxiomContainer current = handler.target;
+        AxiomContainer current = builderHandler.target;
         while (true) {
             discarded(current);
-            if (handler.elementLevel == 0) {
-                if (current != container || current != handler.document) {
+            if (builderHandler.elementLevel == 0) {
+                if (current != container || current != builderHandler.document) {
                     throw new IllegalStateException();
                 }
                 break;
             }
-            handler.elementLevel--;
+            builderHandler.elementLevel--;
             if (current == container) {
                 break;
             }
             current = (AxiomContainer)((OMElement)current).getParent();
         }
         // Note that at this point current == container
-        if (container == handler.document) {
-            handler.target = null;
-            handler.done = true;
-        } else if (handler.elementLevel == 0 && handler.document == null) {
+        if (container == builderHandler.document) {
+            builderHandler.target = null;
+            builderHandler.done = true;
+        } else if (builderHandler.elementLevel == 0 && builderHandler.document == null) {
             // Consume the remaining event; for the rationale, see StAXOMBuilder#next()
             while (parserNext() != XMLStreamConstants.END_DOCUMENT) {
                 // Just loop
             }
-            handler.target = null;
-            handler.done = true;
+            builderHandler.target = null;
+            builderHandler.done = true;
         } else {
-            handler.target = (AxiomContainer)((OMElement)container).getParent();
+            builderHandler.target = (AxiomContainer)((OMElement)container).getParent();
         }
         if (log.isDebugEnabled()) {
-            log.debug("Caching re-enabled; new element level: " + handler.elementLevel + "; done=" + handler.done);
+            log.debug("Caching re-enabled; new element level: " + builderHandler.elementLevel + "; done=" + builderHandler.done);
         }
-        if (handler.done && autoClose) {
+        if (builderHandler.done && autoClose) {
             close();
         }
-        handler.cache = true;
+        builderHandler.cache = true;
     }
 
     public final CustomBuilder registerCustomBuilder(QName qName, int maxDepth, CustomBuilder customBuilder) {
@@ -425,7 +426,7 @@ public class StAXOMBuilder extends Abstr
     }
     
     public final String getCharsetEncoding() {
-        return handler.document.getCharsetEncoding();
+        return builderHandler.document.getCharsetEncoding();
     }
 
     public final void close() {
@@ -445,7 +446,7 @@ public class StAXOMBuilder extends Abstr
             }
         } finally {
             _isClosed = true;
-            handler.done = true;
+            builderHandler.done = true;
             // Release the parser so that it can be GC'd or reused. This is important because the
             // object model keeps a reference to the builder even after the builder is complete.
             parser = null;
@@ -478,7 +479,7 @@ public class StAXOMBuilder extends Abstr
         if (detachable != null) {
             detachable.detach();
         } else {
-            while (!handler.done) {
+            while (!builderHandler.done) {
                 next();
             }
         }
@@ -494,58 +495,62 @@ public class StAXOMBuilder extends Abstr
      * @throws OMException
      */
     public int next() throws OMException {
-        if (!handler.cache) {
+        if (!builderHandler.cache) {
             throw new IllegalStateException("Can't process next node because caching is disabled");
         }
         // We need a loop here because we may decide to skip an event
         while (true) {
-            if (handler.done) {
+            if (builderHandler.done) {
                 throw new OMException();
             }
             int token = parserNext();
-            if (!handler.cache) {
+            if (!builderHandler.cache) {
                 return token;
             }
            
             // Note: if autoClose is enabled, then the parser may be null at this point
             
-            switch (token) {
-                case XMLStreamConstants.START_DOCUMENT:
-                    handler.startDocument(charEncoding, parser.getVersion(), parser.getCharacterEncodingScheme(), parser.isStandalone());
-                    break;
-                case XMLStreamConstants.START_ELEMENT: {
-                    createNextOMElement();
-                    break;
+            try {
+                switch (token) {
+                    case XMLStreamConstants.START_DOCUMENT:
+                        handler.startDocument(charEncoding, parser.getVersion(), parser.getCharacterEncodingScheme(), parser.isStandalone());
+                        break;
+                    case XMLStreamConstants.START_ELEMENT: {
+                        createNextOMElement();
+                        break;
+                    }
+                    case XMLStreamConstants.CHARACTERS:
+                    case XMLStreamConstants.CDATA:
+                    case XMLStreamConstants.SPACE:
+                        createOMText(token);
+                        break;
+                    case XMLStreamConstants.END_ELEMENT:
+                        handler.endElement();
+                        break;
+                    case XMLStreamConstants.END_DOCUMENT:
+                        handler.endDocument();
+                        break;
+                    case XMLStreamConstants.COMMENT:
+                        handler.processComment(parser.getText());
+                        break;
+                    case XMLStreamConstants.DTD:
+                        createDTD();
+                        break;
+                    case XMLStreamConstants.PROCESSING_INSTRUCTION:
+                        handler.processProcessingInstruction(parser.getPITarget(), parser.getPIData());
+                        break;
+                    case XMLStreamConstants.ENTITY_REFERENCE:
+                        handler.processEntityReference(parser.getLocalName(), parser.getText());
+                        break;
+                    default :
+                        throw new OMException();
                 }
-                case XMLStreamConstants.CHARACTERS:
-                case XMLStreamConstants.CDATA:
-                case XMLStreamConstants.SPACE:
-                    createOMText(token);
-                    break;
-                case XMLStreamConstants.END_ELEMENT:
-                    handler.endElement();
-                    break;
-                case XMLStreamConstants.END_DOCUMENT:
-                    handler.endDocument();
-                    break;
-                case XMLStreamConstants.COMMENT:
-                    handler.processComment(parser.getText());
-                    break;
-                case XMLStreamConstants.DTD:
-                    createDTD();
-                    break;
-                case XMLStreamConstants.PROCESSING_INSTRUCTION:
-                    handler.processProcessingInstruction(parser.getPITarget(), parser.getPIData());
-                    break;
-                case XMLStreamConstants.ENTITY_REFERENCE:
-                    handler.processEntityReference(parser.getLocalName(), parser.getText());
-                    break;
-                default :
-                    throw new OMException();
+            } catch (StreamException ex) {
+                throw new OMException(ex);
             }
             
             // TODO: this will fail if there is whitespace before the document element
-            if (token != XMLStreamConstants.START_DOCUMENT && handler.target == null && !handler.done) {
+            if (token != XMLStreamConstants.START_DOCUMENT && builderHandler.target == 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
@@ -561,7 +566,7 @@ public class StAXOMBuilder extends Abstr
                 while (parserNext() != XMLStreamConstants.END_DOCUMENT) {
                     // Just loop
                 }
-                handler.done = true;
+                builderHandler.done = true;
             }
             
             return token;
@@ -571,16 +576,17 @@ public class StAXOMBuilder extends Abstr
     /**
      * Creates a new OMElement using either a CustomBuilder or 
      * the default Builder mechanism.
+     * @throws StreamException 
      */
-    private void createNextOMElement() {
+    private void createNextOMElement() throws StreamException {
         String namespaceURI = normalize(parser.getNamespaceURI());
         String localName = parser.getLocalName();
         String prefix = normalize(parser.getPrefix());
         OMElement newElement = null;
-        if (customBuilderForPayload != null && payloadSelector.isPayload(handler.elementLevel+1, handler.target)) {
+        if (customBuilderForPayload != null && payloadSelector.isPayload(builderHandler.elementLevel+1, builderHandler.target)) {
             newElement = createWithCustomBuilder(customBuilderForPayload);
         }
-        if (newElement == null && customBuilders != null && handler.elementLevel < this.maxDepthForCustomBuilders) {
+        if (newElement == null && customBuilders != null && builderHandler.elementLevel < this.maxDepthForCustomBuilders) {
             CustomBuilder customBuilder = customBuilders.get(namespaceURI, localName);
             if (customBuilder != null) {
                 newElement = createWithCustomBuilder(customBuilder);
@@ -625,13 +631,13 @@ public class StAXOMBuilder extends Abstr
         // build the parent node. We temporarily set complete to true to avoid this.
         // There is really an incompatibility between the contract of addNode and the
         // custom builder API. This should be fixed in Axiom 1.3.
-        handler.target.setComplete(true);
+        builderHandler.target.setComplete(true);
         
         // Use target.getOMFactory() because the factory may actually be a SOAPFactory
-        OMElement node = customBuilder.create(namespace, localPart, handler.target, parser, handler.target.getOMFactory());
+        OMElement node = customBuilder.create(namespace, localPart, builderHandler.target, parser, builderHandler.target.getOMFactory());
         
         // TODO: dirty hack part 2
-        handler.target.setComplete(false);
+        builderHandler.target.setComplete(false);
         
         if (log.isDebugEnabled()) {
             if (node != null) {
@@ -646,7 +652,7 @@ public class StAXOMBuilder extends Abstr
         return node;
     }
     
-    private void createDTD() throws OMException {
+    private void createDTD() throws StreamException {
         DTDReader dtdReader;
         try {
             dtdReader = (DTDReader)parser.getProperty(DTDReader.PROPERTY);
@@ -705,7 +711,7 @@ public class StAXOMBuilder extends Abstr
         OMElement element = getDocument().getOMDocumentElement();
         if (discardDocument) {
             ((AxiomElement)element).detachAndDiscardParent();
-            handler.document = null;
+            builderHandler.document = null;
         }
         return element;
     }
@@ -743,7 +749,7 @@ public class StAXOMBuilder extends Abstr
                     throw ex;
                 }
                 if (event == XMLStreamConstants.END_DOCUMENT) {
-                    if (handler.cache && handler.elementLevel != 0) {
+                    if (builderHandler.cache && builderHandler.elementLevel != 0) {
                         throw new OMException("Unexpected END_DOCUMENT event");
                     }
                     if (autoClose) {
@@ -774,6 +780,6 @@ public class StAXOMBuilder extends Abstr
     }
 
     public final AxiomContainer getTarget() {
-        return handler.target;
+        return builderHandler.target;
     }
 }