Author: veithen Date: Wed Mar 18 22:46:24 2009 New Revision: 755766 URL: http://svn.apache.org/viewvc?rev=755766&view=rev Log: * Added some tests comparing the output produced by a native XMLStreamReader (Woodstox) and an OMStAXWrapper. * Modified OMStAXWrapper to throw an IllegalStateException as required by the StAX specs when a method is called that is not valid for the current event.
Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/XMLStreamReaderComparator.java (with props) Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/OMStAXWrapperTestBase.java Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java?rev=755766&r1=755765&r2=755766&view=diff ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/OMStAXWrapper.java Wed Mar 18 22:46:24 2009 @@ -249,17 +249,17 @@ * @see javax.xml.stream.XMLStreamReader#getPrefix() */ public String getPrefix() { - String returnStr = null; if (parser != null) { - returnStr = parser.getPrefix(); + return parser.getPrefix(); } else { if ((currentEvent == START_ELEMENT) || (currentEvent == END_ELEMENT)) { OMNamespace ns = ((OMElement) getNode()).getNamespace(); - returnStr = (ns == null) ? null : ns.getPrefix(); + return (ns == null) ? null : ns.getPrefix(); + } else { + throw new IllegalStateException(); } } - return returnStr; } /** @@ -267,7 +267,7 @@ * @see javax.xml.stream.XMLStreamReader#getNamespaceURI() */ public String getNamespaceURI() { - String returnStr = null; + String returnStr; if (parser != null) { returnStr = parser.getNamespaceURI(); } else { @@ -276,6 +276,8 @@ || (currentEvent == NAMESPACE)) { OMNamespace ns = ((OMElement) getNode()).getNamespace(); returnStr = (ns == null) ? null : ns.getNamespaceURI(); + } else { + throw new IllegalStateException(); } } @@ -308,17 +310,17 @@ * @see javax.xml.stream.XMLStreamReader#getLocalName() */ public String getLocalName() { - String returnStr = null; if (parser != null) { - returnStr = parser.getLocalName(); + return parser.getLocalName(); } else { if ((currentEvent == START_ELEMENT) || (currentEvent == END_ELEMENT) || (currentEvent == ENTITY_REFERENCE)) { - returnStr = ((OMElement) getNode()).getLocalName(); + return ((OMElement) getNode()).getLocalName(); + } else { + throw new IllegalStateException(); } } - return returnStr; } /** @@ -326,16 +328,16 @@ * @see javax.xml.stream.XMLStreamReader#getName() */ public QName getName() { - QName returnName = null; if (parser != null) { - returnName = parser.getName(); + return parser.getName(); } else { if ((currentEvent == START_ELEMENT) || (currentEvent == END_ELEMENT)) { - returnName = getQName((OMElement) getNode()); + return getQName((OMElement) getNode()); + } else { + throw new IllegalStateException(); } } - return returnName; } /** @@ -357,8 +359,7 @@ if (parser != null) { return parser.getTextLength(); } else { - String text = getTextFromNode(); - return text == null ? 0 : text.length(); + return getTextFromNode().length(); } } @@ -395,13 +396,9 @@ } } else { String text = getTextFromNode(); - if (text != null) { - int copied = Math.min(length, text.length()-sourceStart); - text.getChars(sourceStart, sourceStart + copied, target, targetStart); - return copied; - } else { - return 0; - } + int copied = Math.min(length, text.length()-sourceStart); + text.getChars(sourceStart, sourceStart + copied, target, targetStart); + return copied; } } @@ -413,8 +410,7 @@ if (parser != null) { return parser.getTextCharacters(); } else { - String text = getTextFromNode(); - return text == null ? null : text.toCharArray(); + return getTextFromNode().toCharArray(); } } @@ -431,15 +427,16 @@ } private String getTextFromNode() { - if (hasText()) { - OMNode node = getNode(); - if (node instanceof OMText) { - return ((OMText)node).getText(); - } else if (node instanceof OMComment) { - return ((OMComment)node).getValue(); - } + switch (currentEvent) { + case CHARACTERS: + case CDATA: + case SPACE: + return ((OMText)getNode()).getText(); + case COMMENT: + return ((OMComment)getNode()).getValue(); + default: + throw new IllegalStateException(); } - return null; } /** @@ -509,17 +506,17 @@ * @see javax.xml.stream.XMLStreamReader#getNamespaceCount() */ public int getNamespaceCount() { - int returnCount = 0; if (parser != null) { - returnCount = parser.getNamespaceCount(); + return parser.getNamespaceCount(); } else { if (isStartElement() || isEndElement() || (currentEvent == NAMESPACE)) { - returnCount = getCount(((OMElement) getNode()) + return getCount(((OMElement) getNode()) .getAllDeclaredNamespaces()); + } else { + throw new IllegalStateException(); } } - return returnCount; } /** Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/OMStAXWrapperTestBase.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/OMStAXWrapperTestBase.java?rev=755766&r1=755765&r2=755766&view=diff ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/OMStAXWrapperTestBase.java (original) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/OMStAXWrapperTestBase.java Wed Mar 18 22:46:24 2009 @@ -20,6 +20,7 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.io.StringReader; import java.util.Arrays; import javax.xml.namespace.NamespaceContext; @@ -36,6 +37,7 @@ import org.apache.axiom.om.OMText; import org.apache.axiom.om.impl.builder.StAXOMBuilder; import org.apache.axiom.om.util.AXIOMUtil; +import org.apache.axiom.om.util.StAXUtils; public class OMStAXWrapperTestBase extends TestCase { protected final OMMetaFactory omMetaFactory; @@ -200,4 +202,18 @@ public void testGetNamespaceContextWithoutCaching() throws Exception { testGetNamespaceContext(false); } + + private void testWithComparator(String xml) throws Exception { + XMLStreamReader expected = StAXUtils.createXMLStreamReader(new StringReader(xml)); + XMLStreamReader actual = AXIOMUtil.stringToOM(omMetaFactory.getOMFactory(), xml).getXMLStreamReader(); + new XMLStreamReaderComparator(expected, actual).compare(); + } + + public void testProcessingInstruction() throws Exception { + testWithComparator("<root><?pi data?></root>"); + } + + public void testNamespaces() throws Exception { + testWithComparator("<a xmlns='urn:ns1' xmlns:ns2='urn:ns2' ns2:att='test'><ns2:b att='test'/></a>"); + } } Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/XMLStreamReaderComparator.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/XMLStreamReaderComparator.java?rev=755766&view=auto ============================================================================== --- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/XMLStreamReaderComparator.java (added) +++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/XMLStreamReaderComparator.java Wed Mar 18 22:46:24 2009 @@ -0,0 +1,158 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.axiom.om.impl; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.stream.XMLStreamReader; + +import junit.framework.Assert; + +import org.apache.axiom.om.util.StAXUtils; + +/** + * Helper class that compares the events produced by two {...@link XMLStreamReader} objects. + */ +public class XMLStreamReaderComparator extends Assert { + private final XMLStreamReader expected; + private final XMLStreamReader actual; + + public XMLStreamReaderComparator(XMLStreamReader expected, XMLStreamReader actual) { + this.expected = expected; + this.actual = actual; + } + + private Object[] invoke(String methodName, Object[] args) throws Exception { + if (args == null) { + args = new Object[0]; + } + Method[] methods = XMLStreamReader.class.getMethods(); + Method method = null; + for (int i=0; i<methods.length; i++) { + Method candidate = methods[i]; + if (candidate.getName().equals(methodName) && + candidate.getParameterTypes().length == args.length) { + method = candidate; + break; + } + } + if (method == null) { + fail("Method " + methodName + " not found"); + } + + Object expectedResult; + Throwable expectedException; + try { + expectedResult = method.invoke(expected, args); + expectedException = null; + } catch (InvocationTargetException ex) { + expectedResult = null; + expectedException = ex.getCause(); + } + + Object actualResult; + Throwable actualException; + try { + actualResult = method.invoke(actual, args); + actualException = null; + } catch (InvocationTargetException ex) { + actualResult = null; + actualException = ex.getCause(); + } + + if (expectedException == null) { + if (actualException != null) { + fail("Method " + methodName + " threw unexpected exception " + + actualException.getClass().getName() + "; event type was " + + StAXUtils.getEventTypeString(expected.getEventType())); + } else { + return new Object[] { expectedResult, actualResult }; + } + } else { + if (actualException == null) { + fail("Expected " + methodName + " to throw " + + expectedException.getClass().getName() + + ", but the method retuned normally; event type was " + + StAXUtils.getEventTypeString(expected.getEventType())); + } else { + assertEquals(expectedException.getClass(), actualException.getClass()); + } + } + return null; + } + + private Object assertSameResult(String methodName, Object[] args) throws Exception { + Object[] results = invoke(methodName, args); + if (results != null) { + assertEquals("Return value of " + methodName + " (event type " + + StAXUtils.getEventTypeString(expected.getEventType()) + ")", + results[0], results[1]); + return results[0]; + } else { + return null; + } + } + + public void compare() throws Exception { + while (expected.next() != XMLStreamReader.END_DOCUMENT) { + actual.next(); + Integer attributeCount = (Integer)assertSameResult("getAttributeCount", null); + if (attributeCount != null) { + for (int i=0; i<attributeCount.intValue(); i++) { + Object[] args = { Integer.valueOf(i) }; + assertSameResult("getAttributeLocalName", args); + assertSameResult("getAttributeName", args); + assertSameResult("getAttributeNamespace", args); + assertSameResult("getAttributePrefix", args); + assertSameResult("getAttributeType", args); + assertSameResult("getAttributeValue", args); + } + } + assertSameResult("getLocalName", null); + assertSameResult("getName", null); + Integer namespaceCount = (Integer)assertSameResult("getNamespaceCount", null); + if (namespaceCount != null) { + Map expectedNamespaces = new HashMap(); + Map actualNamespaces = new HashMap(); + for (int i=0; i<namespaceCount.intValue(); i++) { + expectedNamespaces.put(expected.getNamespacePrefix(i), + expected.getNamespaceURI(i)); + actualNamespaces.put(actual.getNamespacePrefix(i), + actual.getNamespaceURI(i)); + } +// assertEquals(expectedNamespaces, actualNamespaces); + } + assertSameResult("getNamespaceURI", null); + assertSameResult("getPIData", null); + assertSameResult("getPITarget", null); +// assertSameResult("getPrefix", null); + assertSameResult("getText", null); + assertSameResult("getTextLength", null); + assertSameResult("hasName", null); + assertSameResult("hasText", null); + assertSameResult("isCharacters", null); + assertSameResult("isEndElement", null); + assertSameResult("isStartElement", null); + assertSameResult("isWhiteSpace", null); + } + } +} Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/om/impl/XMLStreamReaderComparator.java ------------------------------------------------------------------------------ svn:eol-style = native