in testing/testutils/src/main/java/org/apache/axiom/testutils/stax/XMLStreamReaderComparator.java [287:438]
public void compare() throws Exception {
if (sortAttributes) {
expected = new AttributeSortingXMLStreamReaderFilter(expected);
actual = new AttributeSortingXMLStreamReaderFilter(actual);
}
if (treatSpaceAsCharacters) {
expected = new SpaceAsCharactersXMLStreamReaderFilter(expected);
actual = new SpaceAsCharactersXMLStreamReaderFilter(actual);
}
while (true) {
int eventType = assertSameResult(Integer.class, "getEventType");
if (eventType == XMLStreamReader.START_ELEMENT) {
path.addLast(expected.getName());
}
if (compareCharacterEncodingScheme) {
assertSameResult(String.class, "getCharacterEncodingScheme");
}
if (compareEncoding) {
assertSameResult(String.class, "getEncoding", Normalizer.LOWER_CASE);
}
Integer attributeCount = assertSameResult(Integer.class, "getAttributeCount");
// Test the behavior of the getAttributeXxx methods for all types of events,
// to check that an appropriate exception is thrown for events other than
// START_ELEMENT
for (int i = 0; i < (attributeCount == null ? 1 : attributeCount.intValue()); i++) {
Class<?>[] paramTypes = {Integer.TYPE};
Object[] args = {new Integer(i)};
assertSameResult(String.class, "getAttributeLocalName", paramTypes, args);
assertSameResult(QName.class, "getAttributeName", paramTypes, args);
namespaceURIs.add(
assertSameResult(String.class, "getAttributeNamespace", paramTypes, args));
prefixes.add(
assertSameResult(
String.class,
"getAttributePrefix",
paramTypes,
args,
Normalizer.EMPTY_STRING_TO_NULL));
assertSameResult(String.class, "getAttributeType", paramTypes, args);
assertSameResult(String.class, "getAttributeValue", paramTypes, args);
assertSameResult(Boolean.class, "isAttributeSpecified", paramTypes, args);
}
if (attributeCount != null) {
for (int i = 0; i < attributeCount.intValue(); i++) {
QName qname = expected.getAttributeName(i);
assertSameResult(
String.class,
"getAttributeValue",
new Class[] {String.class, String.class},
new Object[] {qname.getNamespaceURI(), qname.getLocalPart()});
}
}
assertSameResult(String.class, "getLocalName");
assertSameResult(QName.class, "getName");
Integer namespaceCount = assertSameResult(Integer.class, "getNamespaceCount");
if (namespaceCount != null) {
Map<String, String> expectedNamespaces = new HashMap<>();
Map<String, String> actualNamespaces = new HashMap<>();
for (int i = 0; i < namespaceCount.intValue(); i++) {
String expectedPrefix = expected.getNamespacePrefix(i);
String expectedNamespaceURI = expected.getNamespaceURI(i);
if (expectedNamespaceURI != null && expectedNamespaceURI.length() == 0) {
expectedNamespaceURI = null;
}
String actualPrefix = actual.getNamespacePrefix(i);
String actualNamespaceURI = actual.getNamespaceURI(i);
if (actualNamespaceURI != null && actualNamespaceURI.length() == 0) {
actualNamespaceURI = null;
}
expectedNamespaces.put(expectedPrefix, expectedNamespaceURI);
actualNamespaces.put(actualPrefix, actualNamespaceURI);
prefixes.add(expectedPrefix);
namespaceURIs.add(expectedNamespaceURI);
}
assertEquals(expectedNamespaces, actualNamespaces);
}
namespaceURIs.add(assertSameResult(String.class, "getNamespaceURI"));
assertSameResult(String.class, "getPIData");
assertSameResult(String.class, "getPITarget");
prefixes.add(assertSameResult(String.class, "getPrefix"));
if ((eventType != XMLStreamReader.DTD || compareInternalSubset)
&& (eventType != XMLStreamReader.ENTITY_REFERENCE
|| compareEntityReplacementValue)) {
assertSameResult(
String.class,
"getText",
eventType == XMLStreamReader.DTD ? Normalizer.DTD : null);
}
Integer textLength = assertSameResult(Integer.class, "getTextLength");
InvocationResults<Integer> textStart = invoke(Integer.class, "getTextStart");
InvocationResults<char[]> textCharacters = invoke(char[].class, "getTextCharacters");
if (textLength != null) {
assertEquals(
new String(
textCharacters.getExpected(), textStart.getExpected(), textLength),
new String(textCharacters.getActual(), textStart.getActual(), textLength));
}
assertSameResult(Boolean.class, "hasName");
assertSameResult(Boolean.class, "hasText");
assertSameResult(Boolean.class, "isCharacters");
assertSameResult(Boolean.class, "isEndElement");
assertSameResult(Boolean.class, "isStartElement");
assertSameResult(Boolean.class, "isWhiteSpace");
// Only check getNamespaceURI(String) for START_ELEMENT and END_ELEMENT. The Javadoc
// of XMLStreamReader suggests that this method is valid for all states, but Woodstox
// only allows it for some states.
if (eventType == XMLStreamReader.START_ELEMENT
|| eventType == XMLStreamReader.END_ELEMENT) {
for (String prefix : prefixes) {
// The StAX specs are not clear about the expected result of getNamespaceURI
// when called with prefix "xml" (which doesn't require an explicit declaration)
if (prefix != null && !prefix.equals("xml")) {
assertSameResult(
String.class,
"getNamespaceURI",
new Class[] {String.class},
new Object[] {prefix});
}
}
}
compareNamespaceContexts(expected.getNamespaceContext(), actual.getNamespaceContext());
if (eventType == XMLStreamReader.END_ELEMENT) {
path.removeLast();
}
assertSameResult(Boolean.class, "hasNext");
int expectedNextEvent;
try {
expectedNextEvent = expected.next();
} catch (IllegalStateException ex) {
expectedNextEvent = -1;
} catch (NoSuchElementException ex) {
expectedNextEvent = -1;
}
if (expectedNextEvent == -1) {
try {
actual.next();
} catch (IllegalStateException ex) {
break;
} catch (NoSuchElementException ex) {
break;
}
fail("Expected reader to throw IllegalStateException or NoSuchElementException");
} else {
assertEquals("Event type at " + getLocation(), expectedNextEvent, actual.next());
}
}
}