/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.build.doclet;
import java.io.IOException;
import org.h2.build.doc.XMLParser;
import org.h2.build.indexer.HtmlConverter;
import org.h2.util.SortedProperties;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.Doc;
import com.sun.javadoc.MethodDoc;
import com.sun.javadoc.RootDoc;
import com.sun.javadoc.Tag;
/**
* This custom doclet generates resources from javadoc comments.
* Only comments that contain 'at resource' are included.
* Only class level and method level comments are supported.
*/
public class ResourceDoclet {
private String destFile = System.getProperty("h2.javadocResourceFile", "src/main/org/h2/res/javadoc.properties");
private SortedProperties resources = new SortedProperties();
/**
* This method is called by the javadoc framework and is required for all
* doclets.
*
* @param root the root
* @return true if successful
*/
public static boolean start(RootDoc root) throws IOException {
return new ResourceDoclet().startDoc(root);
}
private boolean startDoc(RootDoc root) throws IOException {
ClassDoc[] classes = root.classes();
String[][] options = root.options();
for (String[] op : options) {
if (op[0].equals("dest")) {
destFile = op[1];
}
}
for (ClassDoc clazz : classes) {
processClass(clazz);
}
resources.store(destFile);
return true;
}
private void processClass(ClassDoc clazz) {
String packageName = clazz.containingPackage().name();
String className = clazz.name();
addResource(packageName + "." + className, clazz);
for (MethodDoc method : clazz.methods()) {
String name = method.name();
addResource(packageName + "." + className + "." + name, method);
}
}
private void addResource(String key, Doc doc) {
if (!isResource(doc)) {
return;
}
String xhtml = doc.commentText();
XMLParser p = new XMLParser(xhtml);
StringBuilder buff = new StringBuilder();
int column = 0;
int firstColumnSize = 0;
boolean inColumn = false;
while (p.hasNext()) {
String s;
switch(p.next()) {
case XMLParser.END_ELEMENT:
s = p.getName();
if ("p".equals(s) || "tr".equals(s) || "br".equals(s)) {
buff.append('\n');
}
break;
case XMLParser.START_ELEMENT:
s = p.getName();
if ("table".equals(s)) {
buff.append('\n');
} else if ("tr".equals(s)) {
column = 0;
} else if ("td".equals(s)) {
inColumn = true;
column++;
if (column == 2) {
buff.append('\t');
}
}
break;
case XMLParser.CHARACTERS:
s = HtmlConverter.convertHtmlToString(p.getText().trim());
if (inColumn && column == 1) {
firstColumnSize = Math.max(s.length(), firstColumnSize);
}
buff.append(s);
break;
}
}
for (int i = 0; i < buff.length(); i++) {
if (buff.charAt(i) == '\t') {
buff.deleteCharAt(i);
int length = i - buff.lastIndexOf("\n", i - 1);
for (int k = length; k < firstColumnSize + 3; k++) {
buff.insert(i, ' ');
}
}
}
String text = buff.toString().trim();
resources.setProperty(key, text);
}
private static boolean isResource(Doc doc) {
for (Tag t : doc.tags()) {
if (t.kind().equals("@h2.resource")) {
return true;
}
}
return false;
}
}