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 2013/05/18 15:02:27 UTC

svn commit: r1484108 - /webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/

Author: veithen
Date: Sat May 18 13:02:27 2013
New Revision: 1484108

URL: http://svn.apache.org/r1484108
Log:
Simplified the state switching logic.

Modified:
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/AbstractWrapper.java
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/ClosedState.java
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/IncludeWrapper.java
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializer.java
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializerState.java
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullThroughWrapper.java
    webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/SwitchingWrapper.java

Modified: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/AbstractWrapper.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/AbstractWrapper.java?rev=1484108&r1=1484107&r2=1484108&view=diff
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/AbstractWrapper.java (original)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/AbstractWrapper.java Sat May 18 13:02:27 2013
@@ -35,7 +35,6 @@ import org.apache.axiom.util.stax.XMLStr
 abstract class AbstractWrapper extends PullSerializerState {
     protected final XMLStreamReader reader;
     private final PullSerializer serializer;
-    private final PullSerializerState nextState;
     private int depth;
     
     /**
@@ -50,11 +49,9 @@ abstract class AbstractWrapper extends P
      */
     private DataHandlerReader dataHandlerReader;
 
-    AbstractWrapper(PullSerializer serializer, PullSerializerState nextState,
-            XMLStreamReader reader, int startDepth) {
+    AbstractWrapper(PullSerializer serializer, XMLStreamReader reader, int startDepth) {
         this.reader = reader;
         this.serializer = serializer;
-        this.nextState = nextState;
         depth = startDepth;
     }
 
@@ -90,16 +87,12 @@ abstract class AbstractWrapper extends P
         return reader.hasNext();
     }
 
-    final int next() throws XMLStreamException {
+    final void next() throws XMLStreamException {
         if (depth == 0) {
             // We get here if the underlying XMLStreamReader is on the last END_ELEMENT event
-            // TODO: also do this if the reader is prematurely closed
-            release();
-            serializer.switchState(nextState);
-            return nextState.next();
+            serializer.popState();
         } else {
-            int event = reader.next();
-            switch (event) {
+            switch (reader.next()) {
                 case XMLStreamReader.START_ELEMENT:
                     depth++;
                     break;
@@ -107,7 +100,6 @@ abstract class AbstractWrapper extends P
                     depth--;
                     break;
             }
-            return event;
         }
     }
     
@@ -265,5 +257,6 @@ abstract class AbstractWrapper extends P
         return null;
     }
 
-    abstract void release() throws XMLStreamException;
+    final void restored() {
+    }
 }

Modified: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/ClosedState.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/ClosedState.java?rev=1484108&r1=1484107&r2=1484108&view=diff
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/ClosedState.java (original)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/ClosedState.java Sat May 18 13:02:27 2013
@@ -180,7 +180,7 @@ final class ClosedState extends PullSeri
         throw new IllegalStateException("Reader already closed");
     }
 
-    int next() throws XMLStreamException {
+    void next() throws XMLStreamException {
         throw new IllegalStateException("Reader already closed");
     }
 
@@ -195,4 +195,10 @@ final class ClosedState extends PullSeri
     OMDataSource getDataSource() {
         throw new IllegalStateException("Reader already closed");
     }
+
+    void released() throws XMLStreamException {
+    }
+
+    void restored() {
+    }
 }

Modified: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/IncludeWrapper.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/IncludeWrapper.java?rev=1484108&r1=1484107&r2=1484108&view=diff
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/IncludeWrapper.java (original)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/IncludeWrapper.java Sat May 18 13:02:27 2013
@@ -22,11 +22,11 @@ import javax.xml.stream.XMLStreamExcepti
 import javax.xml.stream.XMLStreamReader;
 
 final class IncludeWrapper extends AbstractWrapper {
-    IncludeWrapper(PullSerializer serializer, PullSerializerState nextState, XMLStreamReader parent) {
-        super(serializer, nextState, parent, 1);
+    IncludeWrapper(PullSerializer serializer, XMLStreamReader parent) {
+        super(serializer, parent, 1);
     }
 
-    void release() throws XMLStreamException {
+    void released() throws XMLStreamException {
         reader.close();
     }
 }

Modified: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializer.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializer.java?rev=1484108&r1=1484107&r2=1484108&view=diff
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializer.java (original)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializer.java Sat May 18 13:02:27 2013
@@ -37,9 +37,17 @@ import org.apache.axiom.util.stax.XMLStr
  * {@link XMLStreamReader} implementation that generates events from a given Axiom tree.
  */
 public final class PullSerializer extends AbstractXMLStreamReader implements DataHandlerReader, DTDReader {
+    /**
+     * The current state of the serializer.
+     */
     private PullSerializerState state;
     
     /**
+     * The serializer state saved by {@link #pushState(PullSerializerState)}.
+     */
+    private PullSerializerState savedState;
+    
+    /**
      * Indicates if an OMSourcedElement with an OMDataSource should
      * be considered as an interior node or a leaf node.
      */
@@ -50,8 +58,49 @@ public final class PullSerializer extend
         state = new SwitchingWrapper(this, builder, startNode, cache, preserveNamespaceContext);
     }
     
-    void switchState(PullSerializerState state) {
-        this.state = state;
+    /**
+     * Switch the state of the serializer and release the old state. This method will use the
+     * {@link PullSerializerState#released()} method to inform the old state that it has been
+     * released.
+     * 
+     * @param newState
+     *            the new state
+     * @throws XMLStreamException
+     */
+    void switchState(PullSerializerState newState) throws XMLStreamException {
+        PullSerializerState oldState = state;
+        state = newState;
+        oldState.released();
+    }
+    
+    /**
+     * Save the current state of the serializer and switch to a new state. The old state can be
+     * restored with {@link #popState()}.
+     * 
+     * @param newState
+     *            the new state
+     */
+    void pushState(PullSerializerState newState) {
+        if (savedState != null) {
+            throw new IllegalStateException();
+        }
+        savedState = state;
+        state = newState;
+    }
+    
+    /**
+     * Release the current state and restore the state previously saved by
+     * {@link #pushState(PullSerializerState)}.
+     * 
+     * @throws XMLStreamException 
+     */
+    void popState() throws XMLStreamException {
+        if (savedState == null) {
+            throw new IllegalStateException();
+        }
+        switchState(savedState);
+        savedState = null;
+        state.restored();
     }
 
     OMDataSource getDataSource() {
@@ -75,7 +124,9 @@ public final class PullSerializer extend
     }
 
     public int next() throws XMLStreamException {
-        return state.next();
+        // Note: the state may change as a side effect of the call to next()
+        state.next();
+        return state.getEventType();
     }
 
     public int nextTag() throws XMLStreamException {

Modified: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializerState.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializerState.java?rev=1484108&r1=1484107&r2=1484108&view=diff
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializerState.java (original)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullSerializerState.java Sat May 18 13:02:27 2013
@@ -48,7 +48,7 @@ abstract class PullSerializerState {
 
     abstract boolean hasNext() throws XMLStreamException;
 
-    abstract int next() throws XMLStreamException;
+    abstract void next() throws XMLStreamException;
 
     /**
      * Skip to the next {@link XMLStreamConstants#START_ELEMENT} or
@@ -156,4 +156,20 @@ abstract class PullSerializerState {
      * @see OMXMLStreamReaderEx#getDataSource()
      */
     abstract OMDataSource getDataSource();
+
+    /**
+     * Inform this state object that it has been released due to a call to
+     * {@link PullSerializer#switchState(PullSerializerState)} or {@link PullSerializer#popState()}.
+     * 
+     * @throws XMLStreamException
+     */
+    abstract void released() throws XMLStreamException;
+    
+    /**
+     * Inform this state object that it has been restored by a call to
+     * {@link PullSerializer#popState()}.
+     * 
+     * @throws XMLStreamException 
+     */
+    abstract void restored() throws XMLStreamException;
 }

Modified: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullThroughWrapper.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullThroughWrapper.java?rev=1484108&r1=1484107&r2=1484108&view=diff
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullThroughWrapper.java (original)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/PullThroughWrapper.java Sat May 18 13:02:27 2013
@@ -28,14 +28,13 @@ final class PullThroughWrapper extends A
     private final StAXOMBuilder builder;
     private final OMContainer container;
 
-    PullThroughWrapper(PullSerializer serializer, PullSerializerState nextState,
-            StAXOMBuilder builder, OMContainer container, XMLStreamReader reader, int startDepth) {
-        super(serializer, nextState, reader, startDepth);
+    PullThroughWrapper(PullSerializer serializer, StAXOMBuilder builder, OMContainer container, XMLStreamReader reader, int startDepth) {
+        super(serializer, reader, startDepth);
         this.builder = builder;
         this.container = container;
     }
 
-    void release() throws XMLStreamException {
+    void released() throws XMLStreamException {
         builder.reenableCaching(container);
     }
 }

Modified: webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/SwitchingWrapper.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/SwitchingWrapper.java?rev=1484108&r1=1484107&r2=1484108&view=diff
==============================================================================
--- webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/SwitchingWrapper.java (original)
+++ webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/pull/SwitchingWrapper.java Sat May 18 13:02:27 2013
@@ -707,7 +707,7 @@ final class SwitchingWrapper extends Pul
         }
     }
 
-    int next() throws XMLStreamException {
+    void next() throws XMLStreamException {
         switch (state) {
             case DOCUMENT_COMPLETE:
                 throw new NoSuchElementException("End of the document reached");
@@ -764,9 +764,9 @@ final class SwitchingWrapper extends Pul
                                 while (reader.next() != START_ELEMENT) {
                                     // Just loop
                                 }
-                                serializer.switchState(new IncludeWrapper(serializer, this, reader));
+                                serializer.pushState(new IncludeWrapper(serializer, reader));
                                 visited = true;
-                                return START_ELEMENT;
+                                return;
                             }
                         }
                     }
@@ -800,17 +800,16 @@ final class SwitchingWrapper extends Pul
                         container = parent;
                         depth++;
                     }
-                    PullThroughWrapper wrapper = new PullThroughWrapper(serializer, this, builder, container, builder.disableCaching(), depth);
-                    serializer.switchState(wrapper);
+                    PullThroughWrapper wrapper = new PullThroughWrapper(serializer, builder, container, builder.disableCaching(), depth);
+                    serializer.pushState(wrapper);
                     node = container;
                     visited = true;
-                    currentEvent = wrapper.next();
+                    wrapper.next();
                 }
                 break;
             default:
                 throw new IllegalStateException("unsuppported state!");
         }
-        return currentEvent;
     }
 
     int nextTag() throws XMLStreamException {
@@ -1086,4 +1085,13 @@ final class SwitchingWrapper extends Pul
         }
         return ds;
     }
+
+    void released() throws XMLStreamException {
+        // TODO Auto-generated method stub
+        
+    }
+
+    void restored() throws XMLStreamException {
+        next();
+    }
 }