/************************************************************************** /* Doclet for the bb.todo-Tag. Dump all todo-items to stdout. /* /* Copyright (c) 2004 by Bernhard Bablok (mail@bablokb.de) /* /* This library is free software; you can redistribute it and/or modify /* it under the terms of the GNU Lesser General Public License as published /* by the Free Software Foundation; either version 2 of the License or /* (at your option) any later version. /* /* This library is distributed in the hope that it will be useful, but /* WITHOUT ANY WARRANTY; without even the implied warranty of /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /* GNU Lesser General Public License for more details. /* /* You should have received a copy of the GNU Lesser General Public License /* along with this library; see the file COPYING.LESSER. If not, write to /* the Free Software Foundation Inc., 59 Temple Place - Suite 330, /* Boston, MA 02111-1307 USA /**************************************************************************/ package de.bablokb.tools; import java.io.*; import com.sun.javadoc.*; /** Doclet for the bb.todo-Tag. Dumps all bb.todo-Tags to stdout. You can subclass the {@link dumpTag}-method to create another kind of output.

The doclet accepts commandline-parameters: -tag tagname specifies the tag and -o file specifies the destination file. The default ist the bb.todo-tag and stdout.

@version $Revision: 1.1 $ @author $Author: bablokb $ */ public class BBToDoDoclet { private static String iTagName = "@bb.todo"; private static String iOutFile = null; private static PrintWriter iWriter = null; //////////////////////////////////////////////////////////////////////////// /** Entry point for doclet (required by Doclet-API). @param root The root of the documents @returns Always returns true */ public static boolean start(RootDoc root){ parseOptions(root.options()); ClassDoc[] classes = root.classes(); for (int i=0; i < classes.length; i++) { dumpTag(classes[i].tags(iTagName),classes[i].qualifiedName()); parseClass(classes[i]); } return true; } //////////////////////////////////////////////////////////////////////////// /** Iterate over all containing classes, fields, constructors and methods. This methods calls itself recursively for all inner classes. @param clazz The ClassDoc-object for the current class. */ private static void parseClass(ClassDoc clazz) { // inner classes ClassDoc[] classes = clazz.innerClasses(); for (int i=0; i < classes.length; i++) { dumpTag(classes[i].tags(iTagName),classes[i].qualifiedName()); parseClass(classes[i]); } // fields FieldDoc[] fields = clazz.fields(); for (int i=0; i < fields.length; i++) { dumpTag(fields[i].tags(iTagName),fields[i].qualifiedName()); } // constructors ConstructorDoc[] constructors = clazz.constructors(); for (int i=0; i < constructors.length; i++) { dumpTag(constructors[i].tags(iTagName),constructors[i].qualifiedName()); } // methods MethodDoc[] methods = clazz.methods(); for (int i=0; i < methods.length; i++) { dumpTag(methods[i].tags(iTagName),methods[i].qualifiedName()); } } //////////////////////////////////////////////////////////////////////////// /** Dump the contents of the bb.todo-tag to stdout. Override this method if you want to change the output-format (e.g. you could output some sql-statements to add the list of todos to a database). */ public static void dumpTag(Tag[] tags, String qualifiedName) { try { if (iWriter == null) { if (iOutFile == null) iWriter = new PrintWriter(System.out,true); else // append, flush iWriter = new PrintWriter(new FileWriter(iOutFile,true), true); } } catch (IOException e) { throw new Error(e); } for (int i=0; i < tags.length; i++) { iWriter.println(qualifiedName + ": " + tags[i].text()); } } //////////////////////////////////////////////////////////////////////////// /** Parse commandline-options. @param options Array of option-strings and arguments */ private static void parseOptions(String[][] options) { for (int i = 0; i < options.length; i++) { String[] opt = options[i]; if (opt[0].equals("-tag")) iTagName = "@" + opt[1]; else if (opt[0].equals("-o")) iOutFile = opt[1]; } } //////////////////////////////////////////////////////////////////////////// /** Define options length (required by Doclet-API). */ public static int optionLength(String option) { if(option.equals("-tag") || option.equals("-o")) return 2; else return 0; } }