diff --git a/sandbox/pom.xml b/sandbox/pom.xml
index a4b31d60..0d0dd353 100644
--- a/sandbox/pom.xml
+++ b/sandbox/pom.xml
@@ -83,12 +83,19 @@
org.codehaus.woodstox
woodstox-core-asl
- test
com.sun.xml.messaging.saaj
saaj-impl
+
+ org.apache.ws.commons.axiom
+ axiom-api
+
+
+ org.apache.ws.commons.axiom
+ axiom-impl
+
commons-httpclient
commons-httpclient
@@ -99,5 +106,10 @@
xsom
20070515
+
+ log4j
+ log4j
+ runtime
+
diff --git a/sandbox/src/main/java/org/springframework/ws/soap/stroap/Stroap11Fault.java b/sandbox/src/main/java/org/springframework/ws/soap/stroap/Stroap11Fault.java
index 4f3acbba..0576b3c8 100644
--- a/sandbox/src/main/java/org/springframework/ws/soap/stroap/Stroap11Fault.java
+++ b/sandbox/src/main/java/org/springframework/ws/soap/stroap/Stroap11Fault.java
@@ -16,9 +16,6 @@
package org.springframework.ws.soap.stroap;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
import java.util.Locale;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
@@ -102,12 +99,12 @@ class Stroap11Fault extends StroapFault implements Soap11Fault {
}
@Override
- protected List getChildEventReaders() {
- List eventReaders = new LinkedList();
- eventReaders.add(faultCode.getEventReader());
- eventReaders.add(faultString.getEventReader());
+ protected XMLEventReader[] getChildEventReaders() {
+ XMLEventReader[] eventReaders = (faultActor != null) ? new XMLEventReader[2] : new XMLEventReader[3];
+ eventReaders[0] = faultCode.getEventReader();
+ eventReaders[1] = faultString.getEventReader();
if (faultActor != null) {
- eventReaders.add(faultActor.getEventReader());
+ eventReaders[2] = faultActor.getEventReader();
}
return eventReaders;
}
@@ -152,8 +149,8 @@ class Stroap11Fault extends StroapFault implements Soap11Fault {
}
@Override
- protected List getChildEventReaders() {
- return Collections.singletonList(new ListBasedXMLEventReader(characters));
+ protected XMLEventReader[] getChildEventReaders() {
+ return new XMLEventReader[]{new ListBasedXMLEventReader(characters)};
}
}
}
diff --git a/sandbox/src/main/java/org/springframework/ws/soap/stroap/Stroap11Header.java b/sandbox/src/main/java/org/springframework/ws/soap/stroap/Stroap11Header.java
index e49cacf6..472970b1 100644
--- a/sandbox/src/main/java/org/springframework/ws/soap/stroap/Stroap11Header.java
+++ b/sandbox/src/main/java/org/springframework/ws/soap/stroap/Stroap11Header.java
@@ -16,12 +16,10 @@
package org.springframework.ws.soap.stroap;
-import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.xml.soap.SOAPConstants;
-import javax.xml.stream.XMLEventReader;
import javax.xml.stream.events.StartElement;
import org.springframework.util.ObjectUtils;
@@ -72,8 +70,4 @@ class Stroap11Header extends StroapHeader implements Soap11Header {
return false;
}
- @Override
- protected List getChildEventReaders() {
- return Collections.emptyList();
- }
}
diff --git a/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapBody.java b/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapBody.java
index 9bf621c7..5feaf5fc 100644
--- a/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapBody.java
+++ b/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapBody.java
@@ -16,8 +16,6 @@
package org.springframework.ws.soap.stroap;
-import java.util.Collections;
-import java.util.List;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLStreamException;
@@ -107,8 +105,8 @@ abstract class StroapBody extends StroapContainer implements SoapBody {
}
@Override
- protected final List getChildEventReaders() {
- return Collections.singletonList(payload.getEventReader());
+ protected final XMLEventReader[] getChildEventReaders() {
+ return new XMLEventReader[]{payload.getEventReader()};
}
@Override
diff --git a/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapContainer.java b/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapContainer.java
index 45a57c74..d052cb86 100644
--- a/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapContainer.java
+++ b/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapContainer.java
@@ -65,15 +65,16 @@ abstract class StroapContainer extends StroapElement {
@Override
protected XMLEventReader getEventReader() {
- List eventReaders = new LinkedList();
- eventReaders.add(new ListBasedXMLEventReader(startElement));
- eventReaders.addAll(getChildEventReaders());
- eventReaders.add(new ListBasedXMLEventReader(endElement));
+ XMLEventReader[] childEventReaders = getChildEventReaders();
+ XMLEventReader[] eventReaders = new XMLEventReader[childEventReaders.length + 2];
+ eventReaders[0] = new ListBasedXMLEventReader(startElement);
+ System.arraycopy(childEventReaders, 0, eventReaders, 1, childEventReaders.length);
+ eventReaders[eventReaders.length - 1] = new ListBasedXMLEventReader(endElement);
return new CompositeXMLEventReader(eventReaders);
}
- protected abstract List getChildEventReaders();
+ protected abstract XMLEventReader[] getChildEventReaders();
// Attributes
diff --git a/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapEnvelope.java b/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapEnvelope.java
index b7cfd692..1fb22179 100644
--- a/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapEnvelope.java
+++ b/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapEnvelope.java
@@ -16,8 +16,6 @@
package org.springframework.ws.soap.stroap;
-import java.util.ArrayList;
-import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLStreamException;
@@ -114,15 +112,13 @@ class StroapEnvelope extends StroapContainer implements SoapEnvelope {
}
@Override
- protected List getChildEventReaders() {
- List result = new ArrayList(2);
+ protected XMLEventReader[] getChildEventReaders() {
if (header != null) {
- result.add(header.getEventReader());
+ return new XMLEventReader[]{header.getEventReader(), body.getEventReader()};
}
- if (body != null) {
- result.add(body.getEventReader());
+ else {
+ return new XMLEventReader[]{body.getEventReader()};
}
- return result;
}
}
diff --git a/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapHeader.java b/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapHeader.java
index 5e06f476..845dbddc 100644
--- a/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapHeader.java
+++ b/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapHeader.java
@@ -107,12 +107,13 @@ abstract class StroapHeader extends StroapContainer implements SoapHeader {
}
@Override
- protected List getChildEventReaders() {
- List result = new LinkedList();
- for (StroapHeaderElement headerElement : headerElements) {
- result.add(headerElement.getEventReader());
+ protected XMLEventReader[] getChildEventReaders() {
+ XMLEventReader[] eventReaders = new XMLEventReader[headerElements.size()];
+ for (int i = 0; i < headerElements.size(); i++) {
+ StroapHeaderElement headerElement = headerElements.get(i);
+ eventReaders[i] = headerElement.getEventReader();
}
- return result;
+ return eventReaders;
}
public Result getResult() {
diff --git a/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapHeaderElement.java b/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapHeaderElement.java
index c826384b..9ef36267 100644
--- a/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapHeaderElement.java
+++ b/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapHeaderElement.java
@@ -16,7 +16,6 @@
package org.springframework.ws.soap.stroap;
-import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import javax.xml.namespace.QName;
@@ -105,8 +104,8 @@ class StroapHeaderElement extends StroapContainer implements SoapHeaderElement {
}
@Override
- protected List getChildEventReaders() {
- return Collections.singletonList(new ListBasedXMLEventReader(events));
+ protected XMLEventReader[] getChildEventReaders() {
+ return new XMLEventReader[]{new ListBasedXMLEventReader(events)};
}
diff --git a/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapMessageFactory.java b/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapMessageFactory.java
index c2ce7c9b..004f84aa 100644
--- a/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapMessageFactory.java
+++ b/sandbox/src/main/java/org/springframework/ws/soap/stroap/StroapMessageFactory.java
@@ -124,5 +124,24 @@ public class StroapMessageFactory implements SoapMessageFactory {
return XMLEventFactory.newFactory();
}
+ public String toString() {
+ StringBuilder builder = new StringBuilder("StroapMessageFactory[");
+ if (getSoapVersion() == SoapVersion.SOAP_11) {
+ builder.append("SOAP 1.1");
+ }
+ else if (getSoapVersion() == SoapVersion.SOAP_12) {
+ builder.append("SOAP 1.2");
+ }
+ builder.append(',');
+ if (payloadCaching) {
+ builder.append("PayloadCaching enabled");
+ }
+ else {
+ builder.append("PayloadCaching disabled");
+ }
+ builder.append(']');
+ return builder.toString();
+ }
+
}
diff --git a/sandbox/src/main/java/org/springframework/xml/stream/CompositeXMLEventReader.java b/sandbox/src/main/java/org/springframework/xml/stream/CompositeXMLEventReader.java
index 77a3a71c..b50ec8bc 100644
--- a/sandbox/src/main/java/org/springframework/xml/stream/CompositeXMLEventReader.java
+++ b/sandbox/src/main/java/org/springframework/xml/stream/CompositeXMLEventReader.java
@@ -16,10 +16,7 @@
package org.springframework.xml.stream;
-import java.util.Arrays;
-import java.util.Collections;
import java.util.List;
-import java.util.NoSuchElementException;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;
@@ -31,58 +28,64 @@ import org.springframework.util.Assert;
*/
public class CompositeXMLEventReader extends AbstractXMLEventReader {
- private List eventReaders;
+ private final XMLEventReader[] eventReaders;
private int cursor = 0;
public CompositeXMLEventReader(XMLEventReader eventReader) {
Assert.notNull(eventReader, "'eventReader' must not be null");
- this.eventReaders = Collections.singletonList(eventReader);
+ this.eventReaders = new XMLEventReader[]{eventReader};
}
public CompositeXMLEventReader(XMLEventReader... eventReaders) {
Assert.notNull(eventReaders, "'eventReaders' must not be null");
- this.eventReaders = Arrays.asList(eventReaders);
+ this.eventReaders = eventReaders;
}
public CompositeXMLEventReader(List eventReaders) {
Assert.notNull(eventReaders, "'eventReaders' must not be null");
- this.eventReaders = eventReaders;
+ this.eventReaders = eventReaders.toArray(new XMLEventReader[eventReaders.size()]);
}
public XMLEvent nextEvent() throws XMLStreamException {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- else {
- return eventReaders.get(cursor).nextEvent();
+ XMLEvent event = null;
+ while (cursor < eventReaders.length) {
+ event = eventReaders[cursor].nextEvent();
+ if (cursor != eventReaders.length - 1 && event.isEndDocument()) {
+ cursor++;
+ }
+ else {
+ break;
+ }
}
+ return event;
}
public boolean hasNext() {
- try {
- while (cursor < eventReaders.size()) {
- if (cursor != eventReaders.size() - 1) {
- XMLEvent event = eventReaders.get(cursor).peek();
- if (event == null || event.isEndDocument()) {
- cursor++;
- continue;
- }
+ while (cursor < eventReaders.length) {
+ if (cursor != eventReaders.length - 1) {
+ if (!eventReaders[cursor].hasNext()) {
+ cursor++;
+ continue;
}
- return eventReaders.get(cursor).hasNext();
}
- }
- catch (XMLStreamException ex) {
- // ignored
+ return eventReaders[cursor].hasNext();
}
return false;
}
public XMLEvent peek() throws XMLStreamException {
- if (hasNext()) {
- return eventReaders.get(cursor).peek();
+ XMLEvent event = null;
+ while (cursor < eventReaders.length) {
+ event = eventReaders[cursor].peek();
+ if (cursor != eventReaders.length - 1 && (event == null || event.isEndDocument())) {
+ cursor++;
+ }
+ else {
+ break;
+ }
}
- return null;
+ return event;
}
}
diff --git a/sandbox/src/main/java/org/springframework/xml/stream/ListBasedXMLEventReader.java b/sandbox/src/main/java/org/springframework/xml/stream/ListBasedXMLEventReader.java
index fd964634..77fc0a45 100644
--- a/sandbox/src/main/java/org/springframework/xml/stream/ListBasedXMLEventReader.java
+++ b/sandbox/src/main/java/org/springframework/xml/stream/ListBasedXMLEventReader.java
@@ -16,8 +16,6 @@
package org.springframework.xml.stream;
-import java.util.Arrays;
-import java.util.Collections;
import java.util.List;
import java.util.NoSuchElementException;
import javax.xml.stream.events.XMLEvent;
@@ -29,44 +27,52 @@ import org.springframework.util.Assert;
*/
public class ListBasedXMLEventReader extends AbstractXMLEventReader {
- private final List events;
+ private final XMLEvent[] events;
private int cursor = 0;
+ public ListBasedXMLEventReader() {
+ this.events = new XMLEvent[0];
+ }
+
public ListBasedXMLEventReader(XMLEvent event) {
- Assert.notNull(event, "'event' must not be null");
- this.events = Collections.singletonList(event);
+ if (event != null) {
+ this.events = new XMLEvent[]{event};
+ }
+ else {
+ this.events = new XMLEvent[0];
+ }
}
public ListBasedXMLEventReader(XMLEvent... events) {
Assert.notNull(events, "'events' must not be null");
- this.events = Arrays.asList(events);
+ this.events = events;
}
public ListBasedXMLEventReader(List events) {
Assert.notNull(events, "'events' must not be null");
- this.events = events;
+ this.events = events.toArray(new XMLEvent[events.size()]);
}
public boolean hasNext() {
Assert.notNull(events, "'events' must not be null");
- return cursor != events.size();
+ return cursor != events.length;
}
public XMLEvent nextEvent() {
- try {
- return events.get(cursor++);
+ if (cursor < events.length) {
+ return events[cursor++];
}
- catch (IndexOutOfBoundsException e) {
+ else {
throw new NoSuchElementException();
}
}
public XMLEvent peek() {
- try {
- return events.get(cursor);
+ if (cursor < events.length) {
+ return events[cursor];
}
- catch (IndexOutOfBoundsException e) {
+ else {
return null;
}
}
diff --git a/sandbox/src/test/resources/log4j.properties b/sandbox/src/main/resources/log4j.properties
similarity index 100%
rename from sandbox/src/test/resources/log4j.properties
rename to sandbox/src/main/resources/log4j.properties
diff --git a/sandbox/src/test/java/org/springframework/xml/stream/CompositeXMLEventReaderTest.java b/sandbox/src/test/java/org/springframework/xml/stream/CompositeXMLEventReaderTest.java
new file mode 100644
index 00000000..e9e3539b
--- /dev/null
+++ b/sandbox/src/test/java/org/springframework/xml/stream/CompositeXMLEventReaderTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2005-2010 the original author or authors.
+ *
+ * Licensed 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.springframework.xml.stream;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.NoSuchElementException;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLEventFactory;
+import javax.xml.stream.XMLEventReader;
+import javax.xml.stream.events.XMLEvent;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * @author Arjen Poutsma
+ */
+public class CompositeXMLEventReaderTest {
+
+ private CompositeXMLEventReader chain;
+
+ private List events1 = new ArrayList();
+
+ private List events3 = new ArrayList();
+
+ @Before
+ public void createChainUp() throws Exception {
+ XMLEventFactory eventFactory = XMLEventFactory.newInstance();
+ events1.add(eventFactory.createStartElement(new QName("event1-1"), null, null));
+ events1.add(eventFactory.createEndDocument());
+ events1.add(eventFactory.createStartElement(new QName("event1-2"), null, null));
+ XMLEventReader reader1 = new ListBasedXMLEventReader(events1);
+ XMLEventReader reader2 = new ListBasedXMLEventReader();
+ events3.add(eventFactory.createStartElement(new QName("event2-1"), null, null));
+ events3.add(eventFactory.createEndElement(new QName("event2-2"), null));
+ XMLEventReader reader3 = new ListBasedXMLEventReader(events3);
+ XMLEventReader reader4 = new ListBasedXMLEventReader();
+ chain = new CompositeXMLEventReader(reader1, reader2, reader3, reader4);
+ }
+
+ @Test
+ public void testChain() throws Exception {
+ assertEquals("peek returns invalid result", events1.get(0), chain.peek());
+ assertTrue("hasNext returns false", chain.hasNext());
+ assertEquals("nextEvent returns invalid result", events1.get(0), chain.nextEvent());
+ assertEquals("peek returns invalid result", events3.get(0), chain.peek());
+ assertTrue("hasNext returns false", chain.hasNext());
+ assertEquals("nextEvent returns invalid result", events3.get(0), chain.nextEvent());
+ assertEquals("peek returns invalid result", events3.get(1), chain.peek());
+ assertTrue("hasNext returns false", chain.hasNext());
+ assertEquals("nextEvent returns invalid result", events3.get(1), chain.nextEvent());
+ assertFalse("hasNext returns true", chain.hasNext());
+ assertNull("peek returns element", chain.peek());
+ try {
+ chain.nextEvent();
+ fail("NoSuchElementElementException expected");
+ }
+ catch (NoSuchElementException e) {
+ // expected
+ }
+ }
+
+}