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 + } + } + +}