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();
+ }
}