in src/main/java/org/apache/maven/reporting/AbstractMavenReportRenderer.java [491:591]
private static List<String> applyPattern(String text) {
if (text == null || text.isEmpty()) {
return null;
}
// Map defined by key/value name/href
// If href == null, it means
List<String> segments = new ArrayList<>();
// TODO Special case http://jira.codehaus.org/browse/MEV-40
if (text.indexOf("${") != -1) {
int lastComma = text.lastIndexOf(",");
int lastSemi = text.lastIndexOf("}");
if (lastComma != -1 && lastSemi != -1 && lastComma < lastSemi) {
segments.add(text.substring(lastComma + 1, lastSemi).trim());
segments.add(null);
} else {
segments.add(text);
segments.add(null);
}
return segments;
}
boolean inQuote = false;
int braceStack = 0;
int lastOffset = 0;
for (int i = 0; i < text.length(); i++) {
char ch = text.charAt(i);
if (ch == '\'' && !inQuote && braceStack == 0) {
// handle: ''
if (i + 1 < text.length() && text.charAt(i + 1) == '\'') {
i++;
segments.add(text.substring(lastOffset, i));
segments.add(null);
lastOffset = i + 1;
} else {
inQuote = true;
}
} else {
switch (ch) {
case '{':
if (!inQuote) {
if (braceStack == 0) {
if (i != lastOffset) // handle { at first character
{
segments.add(text.substring(lastOffset, i));
segments.add(null);
}
lastOffset = i + 1;
}
braceStack++;
}
break;
case '}':
if (!inQuote) {
braceStack--;
if (braceStack == 0) {
String subString = text.substring(lastOffset, i);
lastOffset = i + 1;
int lastComma = subString.lastIndexOf(",");
if (lastComma != -1) {
segments.add(
subString.substring(0, lastComma).trim());
segments.add(
subString.substring(lastComma + 1).trim());
} else {
segments.add(subString);
segments.add(null);
}
}
}
break;
case '\'':
inQuote = false;
break;
default:
break;
}
}
}
if (!StringUtils.isEmpty(text.substring(lastOffset))) {
segments.add(text.substring(lastOffset));
segments.add(null);
}
if (braceStack != 0) {
throw new IllegalArgumentException("Unmatched braces in the pattern.");
}
if (inQuote) {
// throw new IllegalArgumentException( "Unmatched quote in the pattern." );
// TODO: warning...
}
return Collections.unmodifiableList(segments);
}