package javadoc.api;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.RootDoc;
/**
* detail: JavaDoc 读取类
* @author Ttt
*/
public final class JavaDocReader {
private JavaDocReader() {
}
// Doc 信息临时存储
private static RootDoc mRoot;
/**
* detail: 一个简单 Doclet, 收到 RootDoc 对象保存起来供后续使用
* @author Ttt
*/
public static class Doclet {
public Doclet() {
}
/**
* Doclet 中, 方法 start 必须为静态
* @param root {@link RootDoc}
* @return true
*/
public static boolean start(final RootDoc root) {
mRoot = root;
return true;
}
}
// =============
// = 回调通知接口 =
// =============
/**
* detail: 读取回调
* @author Ttt
*/
public interface Callback {
/**
* 回调通知
* @param path 文件路径
* @param className 文件名 ( 类名 )
* @param rootDoc 根 Doc 信息
* @param classDocs 类 Doc 信息
* @return 处理后的文档信息
*/
String callback(
String path,
String className,
RootDoc rootDoc,
ClassDoc[] classDocs
);
/**
* 异常回调
* @param e 异常信息
*/
void error(Exception e);
}
// ==========
// = 读取处理 =
// ==========
/**
* 读取处理
* @param callback 读取回调
* @param path 文件路径
* @param className 文件名 ( 类名 )
* @return 处理后的文档信息
*/
private static String read(
final Callback callback,
final String path,
final String className
) {
// 类 Doc 信息
ClassDoc[] classDocs = null; // 如果有内部类, 则长度大于 1, 否则为 1 ( 指定的 className)
// 防止为 null
if (mRoot != null) {
classDocs = mRoot.classes();
}
// 触发回调
if (callback != null) {
return callback.callback(path, className, mRoot, classDocs);
}
return null;
}
// =============
// = 对外提供方法 =
// =============
/**
* 读取文档处理
* @param callback 读取回调
* @param path 文件路径
* @param className 文件名 ( 类名 )
* @param executeParams 执行参数
* @return 处理后的文档信息
*/
public static String readDoc(
final Callback callback,
final String path,
final String className,
final String[] executeParams
) {
try {
// 调用 com.sun.tools.javadoc.Main 执行 javadoc, 具体参数百度搜索
com.sun.tools.javadoc.Main.execute(executeParams);
// 进行读取
return read(callback, path, className);
} catch (Exception e) {
if (callback != null) {
callback.error(e);
}
}
return null;
}
// =
/**
* 创建执行参数
*
* 根据自己的需求创建, 对应需要的执行参数
* 该方法, 主要是示范, 并且自用
*
* @param readAll 是否读取全部 (-private 显示所有类和成员 )
* @param path 文件路径
* @param className 文件名 ( 类名 )
* @return 执行参数
*/
public static String[] getExecuteParams(
final boolean readAll,
final String path,
final String className
) {
if (readAll) {
return new String[]{
"-private", "-encoding", "utf-8",
"-doclet", Doclet.class.getName(), path + className};
} else {
return new String[]{
"-encoding", "utf-8",
"-doclet", Doclet.class.getName(), path + className};
}
}
}