in testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLSubject.java [273:353]
private Traverser createTraverser(XML xml) throws TraverserException {
Traverser traverser = xml.createTraverser(expandEntityReferences);
if (ignoreWhitespaceInPrologAndEpilog || ignorePrologAndEpilog) {
final boolean onlyWhitespace = !ignorePrologAndEpilog;
traverser =
new Filter(traverser) {
private int depth;
@Override
public Event next() throws TraverserException {
Event event;
while ((event = super.next()) != null) {
switch (event) {
case START_ELEMENT:
depth++;
break;
case END_ELEMENT:
depth--;
break;
default:
if (onlyWhitespace) {
break;
}
// Fall through
case WHITESPACE:
if (depth == 0) {
continue;
}
}
break;
}
return event;
}
};
}
final Set<Event> ignoredEvents = new HashSet<>();
if (ignoreComments) {
ignoredEvents.add(Event.COMMENT);
}
if (ignoreWhitespace || ignoreElementContentWhitespace) {
ignoredEvents.add(Event.WHITESPACE);
}
if (!ignoredEvents.isEmpty()) {
traverser =
new Filter(traverser) {
@Override
public Event next() throws TraverserException {
Event event;
while (ignoredEvents.contains(event = super.next())) {
// loop
}
return event;
}
};
}
traverser = new CoalescingFilter(traverser);
if (ignoreWhitespace) {
traverser =
new Filter(traverser) {
@Override
public Event next() throws TraverserException {
Event event = super.next();
if (event == Event.TEXT) {
String text = getText();
for (int i = 0; i < text.length(); i++) {
if (" \r\n\t".indexOf(text.charAt(i)) == -1) {
return Event.TEXT;
}
}
return super.next();
} else {
return event;
}
}
};
}
if (ignoreRedundantNamespaceDeclarations && !ignoreNamespaceDeclarations) {
traverser = new RedundantNamespaceDeclarationFilter(traverser);
}
return traverser;
}