in metacat-common/src/main/java/com/netflix/metacat/common/type/TypeSignature.java [106:207]
public static TypeSignature parseTypeSignature(final String signature) {
if (!signature.contains("<") && !signature.contains("(")) {
return new TypeSignature(signature, new ArrayList<TypeSignature>(), new ArrayList<>());
}
String baseName = null;
final List<TypeSignature> parameters = new ArrayList<>();
final List<Object> literalParameters = new ArrayList<>();
int parameterStart = -1;
int bracketCount = 0;
boolean inLiteralParameters = false;
for (int i = 0; i < signature.length(); i++) {
final char c = signature.charAt(i);
if (c == '<') {
if (bracketCount == 0) {
if (baseName != null) {
throw new IllegalArgumentException("Expected baseName to be null");
}
if (parameterStart != -1) {
throw new IllegalArgumentException("Expected parameter start to be -1");
}
baseName = signature.substring(0, i);
parameterStart = i + 1;
}
bracketCount++;
} else if (c == '>') {
bracketCount--;
if (bracketCount < 0) {
throw new IllegalArgumentException(String.format("Bad type signature: '%s'", signature));
}
if (bracketCount == 0) {
if (parameterStart < 0) {
throw new IllegalArgumentException(String.format("Bad type signature: '%s'", signature));
}
parameters.add(parseTypeSignature(signature.substring(parameterStart, i)));
parameterStart = i + 1;
if (i == signature.length() - 1) {
return new TypeSignature(baseName, parameters, literalParameters);
}
}
} else if (c == ',') {
if (bracketCount == 1 && !inLiteralParameters) {
if (parameterStart < 0) {
throw new IllegalArgumentException(String.format("Bad type signature: '%s'", signature));
}
parameters.add(parseTypeSignature(signature.substring(parameterStart, i)));
parameterStart = i + 1;
} else if (bracketCount == 0 && inLiteralParameters) {
if (parameterStart < 0) {
throw new IllegalArgumentException(String.format("Bad type signature: '%s'", signature));
}
literalParameters.add(parseLiteral(signature.substring(parameterStart, i)));
parameterStart = i + 1;
}
} else if (c == '(') {
if (inLiteralParameters) {
throw new IllegalArgumentException(String.format("Bad type signature: '%s'", signature));
}
inLiteralParameters = true;
if (bracketCount == 0) {
if (baseName == null) {
if (!parameters.isEmpty()) {
throw new IllegalArgumentException("Expected no parameters");
}
if (parameterStart != -1) {
throw new IllegalArgumentException("Expected parameter start to be -1");
}
baseName = signature.substring(0, i);
}
parameterStart = i + 1;
}
} else if (c == ')') {
if (!inLiteralParameters) {
throw new IllegalArgumentException(String.format("Bad type signature: '%s'", signature));
}
inLiteralParameters = false;
if (bracketCount == 0) {
if (i != signature.length() - 1) {
throw new IllegalArgumentException(String.format("Bad type signature: '%s'", signature));
}
if (parameterStart < 0) {
throw new IllegalArgumentException(String.format("Bad type signature: '%s'", signature));
}
literalParameters.add(parseLiteral(signature.substring(parameterStart, i)));
return new TypeSignature(baseName, parameters, literalParameters);
}
}
}
throw new IllegalArgumentException(String.format("Bad type signature: '%s'", signature));
}