in log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java [200:253]
private static int findLabeledLineStartIndex(final CharSequence buffer, final int startIndex) {
// Note that the index arithmetic in this method is not guarded.
// That is, there are no `Math.addExact()` or `Math.subtractExact()` usages.
// Since we know a priori that we are already operating within buffer limits.
final int bufferLength = buffer.length();
for (int bufferIndex = startIndex; bufferIndex < bufferLength; ) {
// Find the next line start, if exists.
final int lineStartIndex = findLineStartIndex(buffer, bufferIndex);
if (lineStartIndex < 0) {
break;
}
bufferIndex = lineStartIndex;
// Skip tabs.
while (bufferIndex < bufferLength && '\t' == buffer.charAt(bufferIndex)) {
bufferIndex++;
}
// Search for the `Caused by: ` occurrence.
if (bufferIndex < (bufferLength - 11)
&& buffer.charAt(bufferIndex) == 'C'
&& buffer.charAt(bufferIndex + 1) == 'a'
&& buffer.charAt(bufferIndex + 2) == 'u'
&& buffer.charAt(bufferIndex + 3) == 's'
&& buffer.charAt(bufferIndex + 4) == 'e'
&& buffer.charAt(bufferIndex + 5) == 'd'
&& buffer.charAt(bufferIndex + 6) == ' '
&& buffer.charAt(bufferIndex + 7) == 'b'
&& buffer.charAt(bufferIndex + 8) == 'y'
&& buffer.charAt(bufferIndex + 9) == ':'
&& buffer.charAt(bufferIndex + 10) == ' ') {
return lineStartIndex;
}
// Search for the `Suppressed: ` occurrence.
else if (bufferIndex < (bufferLength - 12)
&& buffer.charAt(bufferIndex) == 'S'
&& buffer.charAt(bufferIndex + 1) == 'u'
&& buffer.charAt(bufferIndex + 2) == 'p'
&& buffer.charAt(bufferIndex + 3) == 'p'
&& buffer.charAt(bufferIndex + 4) == 'r'
&& buffer.charAt(bufferIndex + 5) == 'e'
&& buffer.charAt(bufferIndex + 6) == 's'
&& buffer.charAt(bufferIndex + 7) == 's'
&& buffer.charAt(bufferIndex + 8) == 'e'
&& buffer.charAt(bufferIndex + 9) == 'd'
&& buffer.charAt(bufferIndex + 10) == ':'
&& buffer.charAt(bufferIndex + 11) == ' ') {
return lineStartIndex;
}
}
return -1;
}