private void translateAnnotation()

in ti/phase2/jars/compiler-xdoclet/src/java/org/apache/ti/compiler/xdoclet/internal/tools/AnnotationsToXDoclet.java [217:301]


    private void translateAnnotation(StreamTokenizer tok, PrintWriter out, String firstToken, String indent,
                                     ArrayList tags)
            throws IOException {
        for (int i = 0; i < QUALIFIED_ANNOTATIONS.length; i++) {
            String qualifiedAnnotation = QUALIFIED_ANNOTATIONS[i];
            if (firstToken.startsWith(qualifiedAnnotation)) {
                firstToken = '@' + firstToken.substring(qualifiedAnnotation.length());
            }
        }

        String nextToken = getToken(tok);

        if (! nextToken.equals("(")) {
            tok.pushBack();
            tags.add(firstToken);
            return;
        } else {
            StringBuffer tag = new StringBuffer(firstToken);
            int thisTagPos = tags.size();
            tags.add("");

            while (! (nextToken = getToken(tok)).equals(")")) {
                if (nextToken.equals(",")) nextToken = getToken(tok);
                String attrName = nextToken;
                expectToken(tok, "=");
                String value = getToken(tok);
                int pos;

                if (value.charAt(0) == '@') {
                    if (attrName.equals("validationErrorForward")) {
                        // Special case:
                        //     validationErrorForward=@ti.forward(...)
                        // goes to
                        //     @ti.validationErrorForward(...)
                        value = "@ti.validationErrorForward";
                    }

                    translateAnnotation(tok, out, value, indent, tags);
                    value = null;
                } else if (value.equals("{")) {
                    StringBuffer stringArray = null;

                    while (! (nextToken = getToken(tok)).equals("}")) {
                        if (nextToken.equals(",")) nextToken = getToken(tok);

                        if (nextToken.charAt(0) == '@') {
                            translateAnnotation(tok, out, nextToken, indent, tags);
                        } else {
                            // We're expecting a string array element here.
                            assert nextToken.length() > 1 && nextToken.charAt(0) == '"'
                                    && nextToken.charAt(nextToken.length() - 1) == '"' : nextToken;
                            if (stringArray == null) {
                                stringArray = new StringBuffer("\"");
                            } else {
                                stringArray.append(',');
                            }
                            stringArray.append(nextToken.substring(1, nextToken.length() - 1));
                        }
                    }

                    value = stringArray != null ? stringArray.append('"').toString() : null;
                } else if (value.equals("true") || value.equals("false")) {
                    value = '"' + value + '"';
                } else if (value.endsWith(".class")) {
                    value = '"' + value.substring(0, value.length() - 6) + '"';
                } else if ((pos = value.indexOf("ti.NavigateTo.")) != -1) {
                    value = '"' + value.substring(pos + 14) + '"';
                } else if ((pos = value.indexOf("ti.validatorVersion.")) != -1) {
                    value = '"' + value.substring(pos + 20) + '"';
                } else if (isNumber(value)) {
                    value = '"' + value + '"';
                } else {
                    assert value.charAt(0) == '"' && value.charAt(value.length() - 1) == '"' : value;
                    if (value.charAt(0) != '"') value = '"' + value;
                    if (value.charAt(value.length() - 1) != '"') value += '"';
                }

                if (value != null) {
                    tag.append(' ').append(attrName).append('=').append(value);
                }
            }

            tags.set(thisTagPos, tag.toString());
        }
    }