in ruta-core/src/main/java/org/apache/uima/ruta/resource/TreeWordList.java [237:311]
private boolean recursiveContains(TextNode pointer, String text, int index, boolean ignoreCase,
boolean fragment, char[] ignoreChars, int maxIgnoreChars, boolean ignoreWS) {
if (pointer == null) {
return false;
}
if (index == text.length()) {
return fragment || pointer.isWordEnd();
}
char charAt = text.charAt(index);
boolean charAtIgnored = false;
if (ignoreChars != null) {
for (char each : ignoreChars) {
if (each == charAt) {
charAtIgnored = true;
maxIgnoreChars--;
break;
}
}
charAtIgnored &= index != 0;
if (maxIgnoreChars < 0) {
return false;
}
}
int next = ++index;
boolean result = false;
if (ignoreCase) {
TextNode childNodeL = pointer.getChildNode(Character.toLowerCase(charAt));
TextNode childNodeU = pointer.getChildNode(Character.toUpperCase(charAt));
TextNode wsNode = pointer.getChildNode(' ');
if (ignoreWS && wsNode != null) {
result |= recursiveContains(wsNode, text, next - 1, ignoreCase, fragment, ignoreChars,
maxIgnoreChars, ignoreWS);
}
if (childNodeL == null && ignoreWS) {
childNodeL = skipWS(pointer, charAt);
}
if (childNodeU == null && ignoreWS) {
childNodeU = skipWS(pointer, charAt);
}
if (charAtIgnored && childNodeL == null && childNodeU == null) {
result |= recursiveContains(pointer, text, next, ignoreCase, fragment, ignoreChars,
maxIgnoreChars, ignoreWS);
} else {
result |= recursiveContains(childNodeL, text, next, ignoreCase, fragment, ignoreChars,
maxIgnoreChars, ignoreWS);
if (childNodeL != childNodeU) { // Do not go into the same tree.
result |= recursiveContains(childNodeU, text, next, ignoreCase, fragment, ignoreChars,
maxIgnoreChars, ignoreWS);
}
}
} else {
TextNode wsNode = pointer.getChildNode(' ');
if (ignoreWS && wsNode != null) {
result |= recursiveContains(wsNode, text, next - 1, ignoreCase, fragment, ignoreChars,
maxIgnoreChars, ignoreWS);
}
TextNode childNode = pointer.getChildNode(charAt);
if (childNode == null && ignoreWS) {
childNode = skipWS(pointer, charAt);
}
if (charAtIgnored && childNode == null) {
result |= recursiveContains(pointer, text, next, ignoreCase, fragment, ignoreChars,
maxIgnoreChars, ignoreWS);
} else {
result |= recursiveContains(childNode, text, next, ignoreCase, fragment, ignoreChars,
maxIgnoreChars, ignoreWS);
}
}
return result;
}