private static AnnotationTypeDeclarationImpl readAnnotation()

in ti/phase2/jars/compiler-xdoclet/src/java/org/apache/ti/compiler/xdoclet/internal/typesystem/impl/declaration/AnnotationInterfaceParser.java [200:277]


    private static AnnotationTypeDeclarationImpl readAnnotation(StreamTokenizer tok, String interfaceQualifier,
                                                                String packageName, HashMap enums)
            throws IOException {
        String annotationName = assertWord(tok);
        ArrayList memberDecls = new ArrayList();
        assertChar(tok, '{');

        while (tok.nextToken() == StreamTokenizer.TT_WORD) {
            String memberType = tok.sval;
            HashSet enumVals = (HashSet) enums.get(memberType);

            tok.nextToken();
            if (tok.ttype == '<') // ignore generics
            {
                while (tok.nextToken() != '>') {
                    assert tok.ttype != StreamTokenizer.TT_EOF;
                    assert tok.ttype != ';';
                }
                tok.nextToken();
            }
            assert tok.ttype == StreamTokenizer.TT_WORD;
            String memberName = tok.sval;
            assertChar(tok, '(');
            assertChar(tok, ')');

            Object defaultVal = null;

            if (tok.nextToken() == StreamTokenizer.TT_WORD) {
                assert tok.sval.equals("default");

                tok.nextToken();
                if (tok.ttype == '{') {
                    assertChar(tok, '}');
                    defaultVal = new ArrayList();
                } else {
                    assert tok.ttype == StreamTokenizer.TT_WORD || tok.ttype == StreamTokenizer.TT_NUMBER : tok.ttype;

                    if (tok.ttype == StreamTokenizer.TT_NUMBER) {
                        defaultVal = getNumericDefaultVal(memberType, tok.nval);
                    } else {
                        String defaultString = tok.sval;

                        if (defaultString.charAt(0) == '@') {
                            // It's a default value that is an annotation.  We ignore these for now.
                            ignoreAnnotation(tok);
                        } else {
                            if (memberType.equals("String")) {
                                assert defaultString.charAt(0) == '"' : defaultString;
                                int len = defaultString.length();
                                assert len > 1 && defaultString.charAt(len - 1) == '"' : defaultString;
                                defaultVal = defaultString.substring(0, len - 1);
                            } else if (memberType.equals("boolean")) {
                                defaultVal = Boolean.valueOf(defaultString);
                            } else if (memberType.equals("Class")) {
                                assert defaultString.endsWith(".class");
                                defaultVal = defaultString.substring(0, defaultString.indexOf(".class"));
                            } else {
                                defaultVal = readDefaultEnumVal(defaultString, memberType, enumVals);
                            }
                        }
                    }
                }

                tok.nextToken();
            }

            assert tok.ttype == ';';

            if (enumVals != null) memberType = "String";
            memberDecls.add(new AnnotationTypeElementDeclarationImpl(memberName, memberType, defaultVal, enumVals));
        }

        assert tok.ttype == '}';

        AnnotationTypeElementDeclaration[] memberArray = (AnnotationTypeElementDeclaration[])
                memberDecls.toArray(new AnnotationTypeElementDeclaration[ memberDecls.size() ]);
        return new AnnotationTypeDeclarationImpl(annotationName, interfaceQualifier, packageName, memberArray);
    }