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