in src/java/org/apache/ivy/core/IvyPatternHelper.java [231:335]
private static String substituteTokens(String pattern, Map<String, Object> tokens, boolean external) {
Map<String, Object> tokensCopy = external ? tokens : new HashMap<>(tokens);
if (tokensCopy.containsKey(ORGANISATION_KEY) && !tokensCopy.containsKey(ORGANISATION_KEY2)) {
tokensCopy.put(ORGANISATION_KEY2, tokensCopy.get(ORGANISATION_KEY));
}
if (tokensCopy.containsKey(ORGANISATION_KEY)
&& !tokensCopy.containsKey(ORGANISATION_PATH_KEY)) {
String org = (String) tokensCopy.get(ORGANISATION_KEY);
tokensCopy.put(ORGANISATION_PATH_KEY, org == null ? "" : org.replace('.', '/'));
}
StringBuilder buffer = new StringBuilder();
StringBuffer optionalPart = null;
StringBuffer tokenBuffer = null;
boolean insideOptionalPart = false;
boolean insideToken = false;
boolean tokenSeen = false;
boolean tokenHadValue = false;
for (char ch : pattern.toCharArray()) {
int i = pattern.indexOf(ch);
switch (ch) {
case '(':
if (insideOptionalPart) {
throw new IllegalArgumentException(
"invalid start of optional part at position " + i + " in pattern "
+ pattern);
}
optionalPart = new StringBuffer();
insideOptionalPart = true;
tokenSeen = false;
tokenHadValue = false;
break;
case ')':
if (!insideOptionalPart || insideToken) {
throw new IllegalArgumentException(
"invalid end of optional part at position " + i + " in pattern "
+ pattern);
}
if (tokenHadValue) {
buffer.append(optionalPart.toString());
} else if (!tokenSeen) {
buffer.append('(').append(optionalPart.toString()).append(')');
}
insideOptionalPart = false;
break;
case '[':
if (insideToken) {
throw new IllegalArgumentException("invalid start of token at position "
+ i + " in pattern " + pattern);
}
tokenBuffer = new StringBuffer();
insideToken = true;
break;
case ']':
if (!insideToken) {
throw new IllegalArgumentException("invalid end of token at position " + i
+ " in pattern " + pattern);
}
String token = tokenBuffer.toString();
Object tokenValue = tokensCopy.get(token);
String value = (tokenValue == null) ? null : tokenValue.toString();
if (insideOptionalPart) {
tokenHadValue = !isNullOrEmpty(value);
optionalPart.append(value);
} else {
if (value == null) { // the token wasn't set, it's kept as is
value = "[" + token + "]";
}
buffer.append(value);
}
insideToken = false;
tokenSeen = true;
break;
default:
if (insideToken) {
tokenBuffer.append(ch);
} else if (insideOptionalPart) {
optionalPart.append(ch);
} else {
buffer.append(ch);
}
break;
}
}
if (insideToken) {
throw new IllegalArgumentException("last token hasn't been closed in pattern "
+ pattern);
}
if (insideOptionalPart) {
throw new IllegalArgumentException("optional part hasn't been closed in pattern "
+ pattern);
}
String afterTokenSubstitution = buffer.toString();
checkAgainstPathTraversal(pattern, afterTokenSubstitution);
return afterTokenSubstitution;
}