?? doclet.java
字號:
/*
* Copyright 2004-2008 H2 Group. Licensed under the H2 License, Version 1.0
* (license2)
* Initial Developer: H2 Group
*/
package org.h2.tools.doclet;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import org.h2.util.StringUtils;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.FieldDoc;
import com.sun.javadoc.MethodDoc;
import com.sun.javadoc.ParamTag;
import com.sun.javadoc.Parameter;
import com.sun.javadoc.RootDoc;
import com.sun.javadoc.Tag;
import com.sun.javadoc.ThrowsTag;
import com.sun.javadoc.Type;
/**
* This class is a custom doclet implementation to generate the
* Javadoc for this product.
*/
public class Doclet {
private static final boolean INTERFACES_ONLY = Boolean.getBoolean("h2.interfacesOnly");
private int errorCount;
private HashSet errors = new HashSet();
public static boolean start(RootDoc root) throws IOException {
return new Doclet().startDoc(root);
}
public boolean startDoc(RootDoc root) throws IOException {
ClassDoc[] classes = root.classes();
String[][] options = root.options();
String destDir = System.getProperty("h2.destDir", "docs/javadoc");
for (int i = 0; i < options.length; i++) {
if (options[i][0].equals("destdir")) {
destDir = options[i][1];
}
}
for (int i = 0; i < classes.length; ++i) {
ClassDoc clazz = classes[i];
processClass(destDir, clazz);
}
if (errorCount > 0) {
throw new IOException("FAILED: " + errorCount + " errors found");
}
return true;
}
private static String getClass(String name) {
if (name.startsWith("Jdbc")) {
return name.substring(4);
}
return name;
}
private void processClass(String destDir, ClassDoc clazz) throws IOException {
String packageName = clazz.containingPackage().name();
String dir = destDir + "/" + packageName.replace('.', '/');
(new File(dir)).mkdirs();
String fileName = dir + "/" + clazz.name() + ".html";
String className = getClass(clazz.name());
FileWriter out = new FileWriter(fileName);
PrintWriter writer = new PrintWriter(new BufferedWriter(out));
writer.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" " +
"\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
String language = "en";
writer.println("<html xmlns=\"http://www.w3.org/1999/xhtml\" " +
"lang=\"" + language + "\" xml:lang=\"" + language + "\">");
writer.println("<head><meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" /><title>");
writer.println(className);
writer.println("</title><link rel=\"stylesheet\" type=\"text/css\" href=\"../../../stylesheet.css\" /></head><body>");
writer.println("<table class=\"content\"><tr class=\"content\"><td class=\"content\"><div class=\"contentDiv\">");
writer.println("<h1>" + className + "</h1>");
writer.println(formatText(clazz.commentText()) + "<br /><br />");
// method overview
MethodDoc[] methods = clazz.methods();
Arrays.sort(methods, new Comparator() {
public int compare(Object a, Object b) {
return ((MethodDoc) a).name().compareTo(((MethodDoc) b).name());
}
});
boolean hasMethods = false;
for (int i = 0; i < methods.length; i++) {
MethodDoc method = methods[i];
String name = method.name();
if (skipMethod(method)) {
continue;
}
if (!hasMethods) {
writer.println("<table><tr><th colspan=\"2\">Methods</th></tr>");
hasMethods = true;
}
String type = getTypeName(method.isStatic(), method.returnType());
writer.println("<tr><td class=\"return\">" + type + "</td><td class=\"method\">");
Parameter[] params = method.parameters();
StringBuffer buff = new StringBuffer();
buff.append('(');
for (int j = 0; j < params.length; j++) {
if (j > 0) {
buff.append(", ");
}
buff.append(getTypeName(false, params[j].type()));
buff.append(' ');
buff.append(params[j].name());
}
buff.append(')');
if (isDeprecated(method)) {
name = "<span class=\"deprecated\">" + name + "</span>";
}
writer.println("<a href=\"#r" + i + "\">" + name + "</a>" + buff.toString());
String firstSentence = getFirstSentence(method.firstSentenceTags());
if (firstSentence != null) {
writer.println("<div class=\"methodText\">" + formatText(firstSentence) + "</div>");
}
writer.println("</td></tr>");
}
if (hasMethods) {
writer.println("</table>");
}
// field overview
FieldDoc[] fields = clazz.fields();
if (clazz.interfaces().length > 0) {
fields = clazz.interfaces()[0].fields();
}
Arrays.sort(fields, new Comparator() {
public int compare(Object a, Object b) {
return ((FieldDoc) a).name().compareTo(((FieldDoc) b).name());
}
});
int fieldId = 0;
for (int i = 0; i < fields.length; i++) {
FieldDoc field = fields[i];
if (skipField(clazz, field)) {
continue;
}
String name = field.name();
String text = field.commentText();
if (text == null || text.trim().length() == 0) {
addError("Undocumented field (" + clazz.name() + ".java:" + field.position().line() + ") " + name);
}
if (text.startsWith("INTERNAL")) {
continue;
}
if (fieldId == 0) {
writer.println("<br /><table><tr><th colspan=\"2\">Fields</th></tr>");
}
String type = getTypeName(true, field.type());
writer.println("<tr><td class=\"return\">" + type + "</td><td class=\"method\">");
String constant = field.constantValueExpression();
// add a link (a name) if there is a <code> tag
String link = getFieldLink(text, constant, clazz, name);
writer.print("<a href=\"#" + link + "\">" + name + "</a>");
if (constant == null) {
writer.println();
} else {
writer.println(" = " + constant);
}
writer.println("</td></tr>");
fieldId++;
}
if (fieldId > 0) {
writer.println("</table>");
}
// message details
for (int i = 0; i < methods.length; i++) {
MethodDoc method = methods[i];
String name = method.name();
if (skipMethod(method)) {
continue;
}
String type = getTypeName(method.isStatic(), method.returnType());
writer.println("<a name=\"r" + i + "\"></a>");
Parameter[] params = method.parameters();
StringBuffer buff = new StringBuffer();
buff.append('(');
for (int j = 0; j < params.length; j++) {
if (j > 0) {
buff.append(", ");
}
buff.append(getTypeName(false, params[j].type()));
buff.append(' ');
buff.append(params[j].name());
}
buff.append(')');
ClassDoc[] exceptions = method.thrownExceptions();
if (exceptions.length > 0) {
buff.append(" throws ");
for (int k = 0; k < exceptions.length; k++) {
if (k > 0) {
buff.append(", ");
}
buff.append(exceptions[k].typeName());
}
}
if (isDeprecated(method)) {
name = "<span class=\"deprecated\">" + name + "</span>";
}
writer.println("<h4>" + type + " <span class=\"methodName\">" + name + "</span>" + buff.toString()
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -