001    package org.mesopotamia.lang.java;
002    
003    import java.io.StringReader;
004    import java.util.ArrayList;
005    import java.util.Collections;
006    import java.util.List;
007    
008    import org.mesopotamia.MesopotamiaRuntimeException;
009    import org.mesopotamia.lang.java.javadoc.JavaDocLexer;
010    import org.mesopotamia.lang.java.javadoc.JavaDocParser;
011    import org.mesopotamia.lang.java.javadoc.JavaDocTokenTypes;
012    import org.mesopotamia.lang.java.javadoc.Tag;
013    
014    import antlr.ASTFactory;
015    import antlr.collections.AST;
016    
017    /**
018     * 
019     * @author Pavel
020     *
021     */
022    public class JavaDocComment extends MultiLineComment {
023    
024            private Exception exception;
025            private biz.hammurapi.antlr.AST ast;
026            private List<Tag> tags = new ArrayList<Tag>();
027            private String stringDescription;
028            private List<String> description = new ArrayList<String>();
029    
030            public JavaDocComment(int line, int col, String text) {
031                    super(line, col, text);
032                    try {
033                            StringReader r=new StringReader(text);
034                            JavaDocLexer lexer=new JavaDocLexer(r);
035                            lexer.setTokenObjectClass(biz.hammurapi.antlr.Token.class.getName());
036                            JavaDocParser parser=new JavaDocParser(lexer);
037                            ASTFactory astFactory = new ASTFactory();
038                            astFactory.setASTNodeClass(biz.hammurapi.antlr.AST.class);
039                            parser.setASTFactory(astFactory);
040                            parser.specificationBlock();
041                            this.ast=(biz.hammurapi.antlr.AST) parser.getAST();
042    //                      ast.showWithSiblings("JavaDoc", parser.getTokenNames());
043                            
044                            for (AST node=this.ast; node!=null; node=node.getNextSibling()) {
045                                    switch (node.getType()) {
046                                            case JavaDocTokenTypes.DESCRBLOCK:
047                                                    readDescription(node);
048                                                    break;
049                                            case JavaDocTokenTypes.TAGBLOCK:
050                                                    tags.add(new Tag(node));
051                                                    break;
052                                            default:
053                                                    throw new MesopotamiaRuntimeException("Invalid javadoc token type: "+node.getType()+" for "+text); 
054                                            
055                                    }
056                            }
057                    } catch (Exception e) {
058                            this.exception=e;
059                    }
060                    
061            }
062            
063            /**
064             * @param ast
065             */
066            private void readDescription(AST ast) {
067                    StringBuffer sd=new StringBuffer();
068                    for (AST node=ast.getFirstChild(); node!=null; node=node.getNextSibling()) {
069                            description  .add(node.getText());
070                            sd.append(node.getText());
071                            if (node.getNextSibling()!=null) {
072                                    sd.append(" ");
073                            }
074                    }
075                    stringDescription=sd.toString();
076            }
077            
078            
079            public Exception getException() {
080                    return exception;
081            }
082    
083            public List<String> getDescription() {
084                    return Collections.unmodifiableList(description);
085            }
086            
087            public String getDescriptionAsString() {
088                    return stringDescription;
089            }
090            
091            public List<Tag> getTags() {
092                    return Collections.unmodifiableList(tags);
093            }
094    }