tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

カスタムドックレットを作る

Javadocのカスタムドックレットの簡単なサンプルを作ってみました。
クラス毎にメソッドの一覧、ソースファイル名、ソース行数を標準出力へ出力します。
ソース行数まで出せるとはなかなか面白いです。


ちなみにコンパイルにはJAVA_HOME\lib\tools.jarが必要なので、ビルドパスに通しておくこと。

DocletTest.java

package jp.co.doclet;
import java.io.IOException;
import java.util.Arrays;

import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.Doclet;
import com.sun.javadoc.LanguageVersion;
import com.sun.javadoc.MethodDoc;
import com.sun.javadoc.Parameter;
import com.sun.javadoc.RootDoc;
import com.sun.javadoc.SourcePosition;
import com.sun.javadoc.Type;

public class DocletTest extends Doclet {

	/**
	 * 処理開始
	 */
	public static boolean start(RootDoc rootDoc){
		try {
			DocletTest test = new DocletTest();
			test.printOption(rootDoc);
			test.printDoclet(rootDoc);
		}catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	/**
	 * 起動オプションの表示
	 */
	private void printOption(RootDoc rootDoc) {
		System.out.println("Options:");
		for (String[] param : rootDoc.options()) {
			System.out.format("\t%s\r\n", Arrays.toString(param));
		}
	}
	
	/**
	 * Docletの表示
	 */
	private void printDoclet(RootDoc rootDoc) throws IOException {
		for (ClassDoc classDoc : rootDoc.classes()) {
			System.out.format("Class: %s\r\n", classDoc.name());
			for (MethodDoc methodDoc : classDoc.methods()) {
				
				//ソース位置
				SourcePosition position = methodDoc.position();
				int line = position.line();
				String path = position.file().getCanonicalPath();
				
				//修飾子
				String modifiersName = methodDoc.modifiers();
				
				//戻り値
				Type returnType = methodDoc.returnType();
				String returnName = returnType.typeName();
				if (returnType.dimension()!=null) {
					returnName += returnType.dimension();
				}
				
				//メソッド名
				String methodName = methodDoc.name();
				
				//パラメータ
				String paramName = "";
				for (Parameter parameter : methodDoc.parameters()) {
					paramName += "".equals(paramName) ? parameter.toString() : ", " + parameter.toString();
				}
				
				System.out.format("\t[%s:%03d]", path, line);
				System.out.format("%s %s %s(%s)\r\n", modifiersName, returnName, methodName, paramName);
			}
		}
	}
	
	/**
	 * JDKバージョンの指定
	 */
	public static LanguageVersion languageVersion() {
		return LanguageVersion.JAVA_1_5;
	}
}

build.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<project name="DocletTest" default="javadoc"  basedir=".">
  <target name="clean">
    <delete dir="classes" />
    <delete dir="javadoc" />
  </target>

  <target name="compile" depends="clean">
    <mkdir dir="classes" />
    <javac srcdir="src" destdir="classes"/>
  </target>

  <target name="default_javadoc" depends="compile">
    <javadoc destdir="javadoc">
      <fileset dir="src"/>
    </javadoc>
  </target>

  <target name="javadoc" depends="compile">
    <javadoc doclet="jp.co.doclet.DocletTest" docletpath="classes" access="private" additionalparam="-J-Dparam1=value1 -J-Dparam2=value2">
      <sourcepath>
        <pathelement location="src"/>
      </sourcepath>
    </javadoc>
  </target>
</project>

実行結果

Buildfile: C:\eclipse3.3\workspace\DocletTest\build.xml
clean:
   [delete] Deleting directory C:\eclipse3.3\workspace\DocletTest\classes
compile:
    [mkdir] Created dir: C:\eclipse3.3\workspace\DocletTest\classes
    [javac] Compiling 2 source files to C:\eclipse3.3\workspace\DocletTest\classes
javadoc:
  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
  [javadoc] パッケージ jp.co.doclet のソースファイルを読み込んでいます...
  [javadoc] Javadoc 情報を構築しています...
  [javadoc] Options:
  [javadoc] 	[-doclet, jp.co.doclet.DocletTest]
  [javadoc] 	[-docletpath, C:\eclipse3.3\workspace\DocletTest\classes]
  [javadoc] 	[-private]
  [javadoc] 	[-classpath, C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-antlr.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-apache-bcel.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-apache-bsf.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-apache-log4j.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-apache-oro.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-apache-regexp.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-apache-resolver.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-commons-logging.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-commons-net.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-jai.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-javamail.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-jdepend.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-jmf.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-jsch.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-junit.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-launcher.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-netrexx.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-nodeps.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-starteam.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-stylebook.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-swing.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-trax.jar;C:\eclipse3.3\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant-weblogic.jar;C:\eclipse3.3\configuration\org.eclipse.osgi\bundles\17\1\.cp\lib\remoteAnt.jar;C:\Program Files\Java\jdk1.6.0_05\lib\tools.jar;C:\eclipse3.3\plugins\org.eclipse.swt.win32.win32.x86_3.3.3.v3349.jar]
  [javadoc] 	[-sourcepath, C:\eclipse3.3\workspace\DocletTest\src]
  [javadoc] Class: DocletTest
  [javadoc] 	[C:\eclipse3.3\workspace\DocletTest\src\jp\co\doclet\DocletTest.java:020]public static LanguageVersion languageVersion()
  [javadoc] 	[C:\eclipse3.3\workspace\DocletTest\src\jp\co\doclet\DocletTest.java:027]public static boolean start(RootDoc rootDoc)
  [javadoc] 	[C:\eclipse3.3\workspace\DocletTest\src\jp\co\doclet\DocletTest.java:043]private void printOption(RootDoc rootDoc)
  [javadoc] 	[C:\eclipse3.3\workspace\DocletTest\src\jp\co\doclet\DocletTest.java:054]private void printDoclet(RootDoc rootDoc)
BUILD SUCCESSFUL
Total time: 1 second