My father was interested in a JavaDoc doclet which simply pumps out the available information about the classes, their methods, etc. into an XML file. So here is a 15 minutes quick&dirty hack version doing exactly that. Click here to see the code.
[sourcecode language='java']
package net.t32leaves.xmldoclet;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributeListImpl;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.MethodDoc;
import com.sun.javadoc.ParamTag;
import com.sun.javadoc.Parameter;
import com.sun.javadoc.RootDoc;
import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
public class XmlDoclet {
public static boolean start(RootDoc root) {
FileOutputStream out = null;
try {
out = new FileOutputStream(“doc.xml”);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
OutputFormat of = new OutputFormat(“XML”,”ISO-8859-1″,true);
of.setIndent(1);
of.setIndenting(true);
XMLSerializer serializer = new XMLSerializer(out, of);
try {
serializer.startDocument();
serializer.startElement(“doc”, new AttributeListImpl());
XmlDoclet doclet = new XmlDoclet(serializer);
for(ClassDoc clasz : root.classes()) doclet.visitClass(clasz);
serializer.endElement(“doc”);
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
private final XMLSerializer serializer;
public XmlDoclet(XMLSerializer serializer) {
this.serializer = serializer;
}
public void visitClass(ClassDoc classDoc) throws SAXException {
AttributeListImpl attrs = new AttributeListImpl();
attrs.addAttribute(“name”, “string”, classDoc.qualifiedName());
attrs.addAttribute(“abstract”, “string”, classDoc.isAbstract() ? “true” : “false”);
serializer.startElement(“class”, attrs);
serializer.startElement(“desc”, new AttributeListImpl());
serializer.startCDATA();
serializer.characters(classDoc.getRawCommentText().toCharArray(), 0, classDoc.getRawCommentText().length());
serializer.endCDATA();
serializer.endElement(“desc”);
serializer.startElement(“innerClasses”, new AttributeListImpl());
for(ClassDoc innerClass : classDoc.innerClasses()) visitClass(innerClass);
serializer.endElement(“innerClasses”);
serializer.startElement(“implementedInterfaces”, new AttributeListImpl());
for(ClassDoc interfaceDoc : classDoc.interfaces()) visitClass(interfaceDoc);
serializer.endElement(“implementedInterfaces”);
serializer.startElement(“superclass”, new AttributeListImpl());
if(classDoc.superclass() != null) visitClass(classDoc.superclass());
serializer.endElement(“superclass”);
serializer.startElement(“methods”, new AttributeListImpl());
for(MethodDoc method : classDoc.methods()) visitMethod(method);
serializer.endElement(“methods”);
serializer.endElement(“class”);
}
private void visitMethod(MethodDoc method) throws SAXException {
AttributeListImpl attrs = new AttributeListImpl();
attrs.addAttribute(“modifiers”, “string”, method.modifiers());
attrs.addAttribute(“name”, “string”, method.name());
attrs.addAttribute(“signature”, “string”, method.signature());
attrs.addAttribute(“returns”, “string”, method.returnType().qualifiedTypeName());
attrs.addAttribute(“isConstructor”, “string”, method.isConstructor() ? “true” : “false”);
serializer.startElement(“method”, attrs);
serializer.startElement(“comment”, new AttributeListImpl());
serializer.startCDATA();
serializer.characters(method.commentText().toCharArray(), 0, method.commentText().length());
serializer.endCDATA();
serializer.endElement(“comment”);
serializer.startElement(“parameters”, new AttributeListImpl());
for(Parameter parameter : method.parameters()) visitParameter(parameter);
for(ParamTag paramTag : method.paramTags()) visitParamTag(paramTag);
serializer.endElement(“parameters”);
serializer.endElement(“method”);
}
private void visitParameter(Parameter parameter) throws SAXException {
AttributeListImpl attrs = new AttributeListImpl();
attrs.addAttribute(“name”, “string”, parameter.name());
attrs.addAttribute(“type”, “string”, parameter.type().qualifiedTypeName());
serializer.startElement(“parameter”, attrs);
serializer.endElement(“parameter”);
}
private void visitParamTag(ParamTag parameter) throws SAXException {
AttributeListImpl attrs = new AttributeListImpl();
attrs.addAttribute(“name”, “string”, parameter.parameterName());
serializer.startElement(“paramDoc”, attrs);
serializer.startCDATA();
serializer.characters(parameter.parameterComment().toCharArray(), 0, parameter.parameterComment().length());
serializer.endCDATA();
serializer.endElement(“paramDoc”);
}
}
[/sourcecode]
Just pump this little thing in your classpath and run JavaDoc with this doclet. The code is free for whatever you want to do with it. But bear in mind that it uses deprecated interfaces and has no real exception handling.