public static TypeSignature parseTypeSignature()

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));
    }