Stroap tweaks

This commit is contained in:
Arjen Poutsma
2010-09-10 08:04:59 +00:00
parent f77bc0776c
commit 586266850d
13 changed files with 189 additions and 83 deletions

View File

@@ -83,12 +83,19 @@
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sun.xml.messaging.saaj</groupId>
<artifactId>saaj-impl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-impl</artifactId>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
@@ -99,5 +106,10 @@
<artifactId>xsom</artifactId>
<version>20070515</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>

View File

@@ -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<XMLEventReader> getChildEventReaders() {
List<XMLEventReader> eventReaders = new LinkedList<XMLEventReader>();
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<XMLEventReader> getChildEventReaders() {
return Collections.<XMLEventReader>singletonList(new ListBasedXMLEventReader(characters));
protected XMLEventReader[] getChildEventReaders() {
return new XMLEventReader[]{new ListBasedXMLEventReader(characters)};
}
}
}

View File

@@ -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<XMLEventReader> getChildEventReaders() {
return Collections.emptyList();
}
}

View File

@@ -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<XMLEventReader> getChildEventReaders() {
return Collections.singletonList(payload.getEventReader());
protected final XMLEventReader[] getChildEventReaders() {
return new XMLEventReader[]{payload.getEventReader()};
}
@Override

View File

@@ -65,15 +65,16 @@ abstract class StroapContainer extends StroapElement {
@Override
protected XMLEventReader getEventReader() {
List<XMLEventReader> eventReaders = new LinkedList<XMLEventReader>();
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<XMLEventReader> getChildEventReaders();
protected abstract XMLEventReader[] getChildEventReaders();
// Attributes

View File

@@ -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<XMLEventReader> getChildEventReaders() {
List<XMLEventReader> result = new ArrayList<XMLEventReader>(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;
}
}

View File

@@ -107,12 +107,13 @@ abstract class StroapHeader extends StroapContainer implements SoapHeader {
}
@Override
protected List<XMLEventReader> getChildEventReaders() {
List<XMLEventReader> result = new LinkedList<XMLEventReader>();
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() {

View File

@@ -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<XMLEventReader> getChildEventReaders() {
return Collections.<XMLEventReader>singletonList(new ListBasedXMLEventReader(events));
protected XMLEventReader[] getChildEventReaders() {
return new XMLEventReader[]{new ListBasedXMLEventReader(events)};
}

View File

@@ -124,5 +124,24 @@ public class StroapMessageFactory implements SoapMessageFactory<StroapMessage> {
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();
}
}

View File

@@ -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<XMLEventReader> 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<XMLEventReader> 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;
}
}

View File

@@ -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<XMLEvent> 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<XMLEvent> 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;
}
}

View File

@@ -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<XMLEvent> events1 = new ArrayList<XMLEvent>();
private List<XMLEvent> events3 = new ArrayList<XMLEvent>();
@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
}
}
}