}
@Override
public boolean parse(int level, Source source, boolean parentNot, boolean caseSensitive, boolean receive) {
level++;
Recorder recorder = source.getRecorder();
int bookmark = source.getBookmark();
int recIndex = recorder.getIndex();
for (Iterator i = list.iterator(); i.hasNext();) {
source.setBookmark(bookmark);
ElementOutputList.ElementOutput elementOutput = (ElementOutputList.ElementOutput)i.next();
Element element = elementOutput.getElement();
Output output = elementOutput.getOutput();
boolean elementNot = elementOutput.isNot();
if (this.caseSensitive != null) {
caseSensitive = this.caseSensitive.booleanValue();
}
if (elementOutput.isCaseSensitive() != null) {
caseSensitive = elementOutput.isCaseSensitive().booleanValue();
}
boolean match = false;
if (output.receive()) {
if (receive) {
match = recorder.playMatch(element, source.getBookmark());
source.setBookmark(recorder.playBookmark());
} else {
output.init(source);
int mindex = recorder.reserveMatchIndex(level, element, source.getBookmark(), parentNot, elementNot);
int bindex = recorder.reserveBookmarkIndex();
match = element.parse(level, source, not|parentNot|elementNot, caseSensitive, false);
match = match != elementNot;
recorder.set(level, source, element, bookmark, source.getBookmark(), source.getBestIndex(), mindex, bindex, match, parentNot, elementNot);
output.set(source, bookmark);
}
} else {
if (receive) {
match = recorder.playMatch(element, source.getBookmark());
} else {
int index = recorder.reserveMatchIndex(level, element, source.getBookmark(), parentNot, elementNot);
match = element.parse(level, source, not|parentNot|elementNot, caseSensitive, false);
match = (match != elementNot);
recorder.set(level, source, element, bookmark, source.getBookmark(), source.getBestIndex(), index, match, parentNot, elementNot);
}
}
if (match) {
if (receive && !elementNot && !not) {
source.setBookmark(bookmark);
output.init(source);
element.parse(level, source, not|parentNot|elementNot, caseSensitive, receive);
output.set(source, bookmark);
}
output = list.getOutput();
if (output != null && receive) {
output.init(source);
output.set(source, bookmark);
}
return !not;
}
}
if (not) {
source.setBookmark(bookmark);
source.skipCharacter();
Output output = list.getOutput();
if (output != null && receive) {
output.init(source);
output.set(source, bookmark);
}
} else {
recorder.setIndex(recIndex);
}
return not;
}