//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.javadoc;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.FieldDoc;
import com.sun.javadoc.Tag;
import com.sun.tools.doclets.Taglet;
/**
* Provide a class level summary of Baleen configuration parameters and external resources
*
*
*/
public class BaleenJavadoc extends AbstractBaleenTaglet {
public static final String NAME = "baleen.javadoc";
@Override
public String getName() {
return NAME;
}
@Override
public boolean inType() {
return true;
}
@Override
public String toString(Tag[] tags) {
if(tags.length == 0)
return null;
ClassDoc classDoc = (ClassDoc) tags[0].holder();
return processExternalResources(classDoc) + processConfigurationParameters(classDoc);
}
protected static String processExternalResources(ClassDoc classDoc){
StringBuilder cpText = new StringBuilder("<dt><b>Configuration Parameters:</b></dt><dd><table><tr style=\"text-align: left\"><th>Parameter</th><th>Description</th><th>Default Value(s)</th></tr>");
Map<String, String> rows = new TreeMap<>();
for(FieldDoc field : getFields(classDoc)){
Entry<String, String> entry = createParameterRow(field);
if(entry != null){
rows.put(entry.getKey(), entry.getValue());
}
}
if(rows.isEmpty()){
cpText.setLength(0);
}else{
for(String s : rows.values()){
cpText.append(s);
}
}
cpText.append("</table></dd>");
return cpText.toString();
}
protected static String processConfigurationParameters(ClassDoc classDoc){
StringBuilder erText = new StringBuilder("<dt><b>External Resources:</b></dt><dd><ul>");
List<String> resources = new ArrayList<>();
for(FieldDoc field : getFields(classDoc)){
resources.addAll(createResourceItem(field));
}
if(resources.isEmpty()){
return null;
}else{
for(String s : resources){
erText.append(wrapWithTag("li", s, null));
}
}
erText.append("</ul></dd>");
return erText.toString();
}
private static Entry<String, String> createParameterRow(FieldDoc field){
Tag[] tags = field.tags("@"+ConfigurationParameters.NAME);
if(tags.length == 0){
return null;
}
String name = wrapWithTag("td", field.constantValue(), "padding-right: 20px");
String desc = wrapWithTag("td", field.commentText(), "padding-right: 20px");
StringBuilder defaultValues = new StringBuilder("");
for(Tag tag : tags){
defaultValues.append(tag.text());
defaultValues.append("<br />");
}
String values = wrapWithTag("td", defaultValues.toString(), null);
String row = wrapWithTag("tr", name + desc + values, null);
return new AbstractMap.SimpleEntry<String, String>(field.constantValue().toString(), row);
}
private static List<String> createResourceItem(FieldDoc field){
Tag[] tags = field.tags("@"+ExternalResources.NAME);
if(tags.length == 0){
return Collections.emptyList();
}
List<String> ret = new ArrayList<>();
String pkg = field.containingPackage().name();
int levels = pkg.length() - pkg.replaceAll("\\.", "").length() + 1;
StringBuilder linkLevels = new StringBuilder("");
for(int i = 0; i < levels; i++){
linkLevels.append("../");
}
for(Tag tag : tags){
ret.add("<a href=\""+linkLevels.toString()+tag.text().replaceAll("\\.", "/")+".html\">" + tag.text() + "</a> (key = " + field.constantValue() + ")");
}
return ret;
}
protected static String wrapWithTag(String tag, Object content, String style){
return "<" + tag + (style != null ? " style=\"" + style + "\"" : "") +">"
+ content +
"</" + tag + ">";
}
/**
* Register the Taglet
*/
public static void register(Map<String, Taglet> tagletMap){
if(tagletMap.containsKey(NAME)){
tagletMap.remove(NAME);
}
tagletMap.put(NAME, new BaleenJavadoc());
}
}