SSISO Community

시소당

javadoc Doclet 구현 하기....

javadoc  Doclet  구현  하기....

  

Doclet은  javadoc  툴의  내용과  출력  형식을  기술하기위하여  Doclet  API를  사용하는  자바  프로그램입니다.  디폴트로  javadoc  툴은  HTML  형식의  API  문서를  생성하기  위하여  Sun에서  제공하는  표준  doclet을  사용합니다.
그러나  필요에  따라  javadoc  출력을  변경하기위하여  커스터마이징  된  docket을  제공할  수도  있습니다.

Docket은  Doclet  API를  이용하여  Doclet을  새로  구현하거나  기존에  작성된  doclet을  요구에  따라  수정하여  구현  할  수도  있습니다.

  

doclet  API  클래스는  JDK  설치  디렉터리의  lib/tools.jar  파일에  포함되어  있습니다.  따라서  Doclet  컴파일  시에는  tools.jar이  CLASSPATH  환경  변수에  추가하거나  javac  명령행의  -classpath  옵션을  이용할  수  있습니다.

  

Doclet  구현  순서:

  

  1.  import  com.sun.javadoc.*
  2.  extends  Doclet
  3.  public  static  boolean  start(RootDoc  root)  메소드  구현
  4.  Doclet  컴파일        

        컴파일  시에는  lib/tools.jar가  클래스  패스에  설정되어  있어야

        합니다.


  5.  -doclet  startingclass  옵션으로  javadoc  툴  실행

  

        예)  javadoc  -doclet  ListClass  -docletpath  .    MyClass.java

  

  

Doclet  Class  :

  

public  abstract  class  Doclet
extends  Object
{
      /**  Doclet이  지원하는  자바언어  버젼을  리턴합니다.  */
      static  LanguageVersion  languageVersion();
      
      /**  옵션  인자의  갯수를  길이를  체크합니다.

          *    javadoc  툴은  optionLength에서  체크되지않은  옵션이  있을  경우  에러를  출력합니다.

          *    리턴값은  옵션  이름을  포함한  옵션인자의  갯수입니다.

          *

          *    javadoc에서  사용자  정의  인자를  추가  할  경우  구현  해야합니다.  

          */
      static  int  optionLength(String  option);
                                        
      /**  javadoc  문서를  생성하는  메소드  :  대부분의  경우  start  메소드만  구현합니다.  */
      static  boolean  start(RootDoc  root);

  

      /**  옵션이  유효한지를  검증합니다.  옵션을  처리하는  코드를  작성하면  됩니다.

          *      javadoc에서  사용자  정의  인자를  추가  할  경우  구현  해야합니다.

          */
      static  boolean  validOptions(String[][]  options,  DocErrorReporter  reporter)
}

  

  
  

예제  소스  :  SimpleDoclet

예제는  클래스  정보와  주석들을  간단한  택스트  파일로  출력합니다.

  

import  java.io.File;
import  java.io.FileWriter;
import  java.util.Arrays;

import  com.sun.javadoc.ClassDoc;
import  com.sun.javadoc.ConstructorDoc;
import  com.sun.javadoc.Doclet;
import  com.sun.javadoc.FieldDoc;
import  com.sun.javadoc.MethodDoc;
import  com.sun.javadoc.RootDoc;
import  com.sun.javadoc.Type;

  

/**
  *  사용자정의  Doclet  셈플  코드
  */
public  class  SimpleDoclet  extends  Doclet
{
      /**
        *  start메소드는  시작  메소드로  RootDoc  객체를  인자로  받아  JavaDoc  문서를  생성한다.
        *  RootDoc  클래스는  javadoc  실행시  모든  정보(패키지,  클래스,  메소드,  etc)를
        *  포함합니다.
        *
        *  @return  true  성공
        *  @return  false  실패
        */
      public  static  boolean  start(RootDoc  root)
      {
              FileWriter  fwriter_  =  null;
              try
              {
                    File  file_  =  new  File("C:\\test.txt");
                    if(file_.exists())  file_.delete();
                    fwriter_  =  new  FileWriter(file_);
    

                  //  RootDoc으로부터  클래스들을  얻어와서  각  클래스  별로  축력합니다.  
                  ClassDoc[]  classes  =  root.classes();
      
                  StringBuffer  sb  =  new  StringBuffer();
      
                  sb.append("\n---------------------------------------------------------\n");
                  sb.append("  Java  Doc  출력  시작\n");
  
                  for  (int  i  =  0;  i  <  classes.length;  ++i)
                  {
                        sb.append("\n---------------------------------------------------------\n");
                        ClassDoc  cd  =  classes[i];
                        sb.append(  printName(cd)  );
                        sb.append(  printFields(cd.fields())  );
                        sb.append(  printConstructors(cd.constructors())  );
                        sb.append(  printMethods(cd.methods())  );
                  }
      
                  fwriter_.write(sb.toString());
                  fwriter_.flush();
                  fwriter_.close();
            }
            catch(Exception  e)
            {
                  e.printStackTrace();
            }
            return  true;
      }

  

      /**
        *  클래스  명을  출력한다.
        *
        *  @param  cd  클래스  정보를  포함하는  ClassDoc  객체
        */
      static  String  printName(ClassDoc  cd)
      {
              StringBuffer  sb_  =  new  StringBuffer("");
    
              sb_.append("0.  Class  Information\n");
              sb_.append("\tClass  Name  :  "  +  cd.typeName());
              sb_.append("\n");
              sb_.append("\tModifier  :  "  +  cd.modifiers());
              sb_.append("\n");
              sb_.append("\tInterface  or  Class  ?  :  "  +  (cd.isClass()  ?  "  class  "  :  "  interface  "));
              sb_.append("\n");
              sb_.append("\tClass  Comment  :  "  +cd.commentText());
              sb_.append("\n");
    
              return  sb_.toString();
      }

  

      /**
        *  클래스  맴버  변수  정보를  출력한다.
        *
        *  @param  fields  맴버  변수  정보를  포함하는  FieldDoc  객체
        */
      static  String  printFields(FieldDoc  fields[])
      {
            StringBuffer  sb_  =  new  StringBuffer("");
            sb_.append("\n2.  Fields  Detail");
            sb_.append("\n");  
    
            if  (fields.length  >  0)
            {      
                  Arrays.sort(fields);
            }
    
            for  (int  i=0,  n=fields.length;  i<n;  i++)
            {
                  if(fields[i].commentText().length()  >  0)
                  {
                        Type  type  =  fields[i].type();    
                        sb_.append("\tField  Name  :  "  +  fields[i].name());
                        sb_.append("\n");
                        sb_.append("\tModifier  :  "  +  fields[i].modifiers());
                        sb_.append("\n");
                        sb_.append("\tType  :  "  +  type.qualifiedTypeName());
                        sb_.append("\n");
                        sb_.append("\tField  Comment  :  "  +  fields[i].commentText());  
                        sb_.append("\n\n");
                  }
            }
    
            return  sb_.toString();
      }

  

      /**
        *  생성자를  출력한다.
        *
        *  @param  cons  생성자  정보를  포함하는  ConstructorDoc  객체
        */
      static  String  printConstructors(ConstructorDoc  cons[])
      {
            StringBuffer  sb_  =  new  StringBuffer("");


            if  (cons.length  >  0)
            {
                  sb_.append("\n1.  Constructors  Info\n");
                  Arrays.sort(cons);
            }
      
            for  (int  i=0,  n=cons.length;  i<n;  i++)
            {
                  if(cons[i].commentText().length()  >  0)
                  {
                        sb_.append("\tMethod  Name  :  "  +  cons[i].name());
                        sb_.append("\n");
                        sb_.append("\tModifier  :  "  +  cons[i].modifiers());
                        sb_.append("\n");
                        sb_.append("\tFlat  Signature  :  "  +  cons[i].flatSignature());
                        sb_.append("\n");
                        sb_.append("\tMethod  Comment  :  "  +  cons[i].commentText());  
                        sb_.append("\n\n");
                  }
            }
    
            return  sb_.toString();
      }
  
      /**
        *  메소드  정보를  출력한다.
        *
        *  @param  methods  메소드  정보를  포함하는  MethodDoc  객체
        */
      static  String  printMethods(MethodDoc  methods[])
      {
              StringBuffer  sb_  =  new  StringBuffer("");
              if  (methods.length  >  0)
              {
                    sb_.append("\n3.  Methods  Detail");
                    Arrays.sort(methods);
              }
    
              for  (int  i=0,  n=methods.length;  i<n;  i++)
              {
                    if(methods[i].commentText().length()  >  0)
                    {
                          Type  type  =  methods[i].returnType();
    
                          sb_.append("\tMethod  Name  :  "  +  methods[i].name());
                          sb_.append("\n");
                          sb_.append("\tReturn  Type  :  "  +  type.qualifiedTypeName());
                          sb_.append("\n");
                          sb_.append("\tModifier  :  "  +  methods[i].modifiers());
                          sb_.append("\n");
                          sb_.append("\tFlat  Signature  :  "  +  methods[i].flatSignature());
                          sb_.append("\n");
                          sb_.append("\tMethod  Comment  :  "  +  methods[i].commentText());  
                          sb_.append("\n\n");  
                    }
              }
    
              return  sb_.toString();
      }
  
      public  static  void  main(String[]  args)
      {
              //  출력  디렉터리  생성
              File  htmlDirectory_  =  new  File("com/ymtech/examples/javadoc/html");


              if(!htmlDirectory_.exists())
                    htmlDirectory_.mkdirs();
    
              //  참조  :  How  do  I  run  Javadoc  from  within  a  Java  application?
              //  http://java.sun.com/j2se/javadoc/faq/index.html
              com.sun.tools.javadoc.Main.execute("Sample  Doclet",
                                                              "lim.ho.sun.tools.SimpleDoclet",
              new  String[]  {"-private",  "Friend.java"});
        }
}

  

예제  소스  :  SimpleDoclet

테스트  용  클래스  소스로  javadoc  입력  파일로  사용됩니다.


/**
  *  JavaDoc  Doclet  태스트용  Friend  클래스  입니다.
  *  @author  hslim
  *
  */
public  class  Friend
{
      /**  이름  */
      private  String  name;
  
      /**  생일  */
      private  String  birthDay;
  
      /**
        *    Friend  클래스  생성자  입니다.
        */
      public  Friend(){}
  
      /**
        *  이름을  리턴  합니다.
        *  @return  이름
        */
      public  String  getName(){return  "Hosun  Lim";}
  
      /**
        *  생일을  리턴  합니다.
        *  @return  생일
        */
      public  String  getBirthDay(){return  "1972-5-22";}
  
      /**
        *  이름을  설정  합니다.
        *  @return  이름
        */
      public  void  setName(String  name){this.name  =  name;}
  
      /**
        *  생일을  설정  합니다.
        *  @return  생일
        */
      public  void  setBirthDay(String  birthDay){this.birthDay  =  birthDay;}  
}

  

실행  콘솔  출력  :

  

Loading  source  file  lim/ho/sun/tools/Friend.java...
Constructing  Javadoc  information...

  

  

실행  결과  파일  내용  :


-----------------------------------------------------------
  Java  Doc  출력  시작

-----------------------------------------------------------
0.  Class  Information
  Class  Name  :  Friend
  Modifier  :  public
  Interface  or  Class  ?  :    class
  Class  Comment  :  JavaDoc  Doclet  태스트용  Friend  클래스  입니다.

2.  Fields  Detail
  Field  Name  :  birthDay
  Modifier  :  private
  Type  :  java.lang.String
  Field  Comment  :  생일

  Field  Name  :  name
  Modifier  :  private
  Type  :  java.lang.String
  Field  Comment  :  이름


1.  Constructors  Info
  Method  Name  :  Friend
  Modifier  :  public
  Flat  Signature  :  ()
  Method  Comment  :  Friend  클래스  생성자  입니다.


3.  Methods  Detail  Method  Name  :  getBirthDay
  Return  Type  :  java.lang.String
  Modifier  :  public
  Flat  Signature  :  ()
  Method  Comment  :  생일을  리턴  합니다.

  Method  Name  :  getName
  Return  Type  :  java.lang.String
  Modifier  :  public
  Flat  Signature  :  ()
  Method  Comment  :  이름을  리턴  합니다.

  Method  Name  :  setBirthDay
  Return  Type  :  void
  Modifier  :  public
  Flat  Signature  :  (String)
  Method  Comment  :  생일을  설정  합니다.

  Method  Name  :  setName
  Return  Type  :  void
  Modifier  :  public
  Flat  Signature  :  (String)
  Method  Comment  :  이름을  설정  합니다.

[출처]  javadoc  Doclet  구현  하기....|작성자  지원아빠
http://blog.naver.com/estern?Redirect=Log&logNo=110007338078

655 view

4.0 stars