package org.tldgen.factory;
import com.sun.javadoc.AnnotationDesc;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.MethodDoc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tldgen.model.Function;
import org.tldgen.model.Library;
import org.tldgen.model.LibrarySignature;
import org.tldgen.model.Listener;
import org.tldgen.model.Tag;
import static org.tldgen.util.JavadocUtils.getAnnotation;
/**
* Creates a {@link Library} instance from the javadoc information
* @author icoloma
*
*/
public class LibraryFactory {
private static Logger log = LoggerFactory.getLogger(LibraryFactory.class);
/**
* Create the intermediate memory model for the javadoc information
*/
public Library parse(ClassDoc[] classes, LibrarySignature librarySignature) {
log.info("Parsing " + librarySignature.getShortName() + "...");
Library library = new Library(librarySignature);
for (ClassDoc clazz : classes) {
Tag tag = parseTag(clazz);
Listener listener = parseListener(clazz);
if (tag != null) {
library.add(tag);
} else if(listener != null) {
library.addListener(listener);
} else {
recollectFunctionData(clazz, library);
}
}
library.validate();
return library;
}
/**
* Parse a Tag class from this class annotations
* @return the Tag class parsed for the provided class, null if none
*/
private Tag parseTag(ClassDoc doc) {
return !doc.isAbstract() && getAnnotation(doc, org.tldgen.annotations.Tag.class) != null? Tag.createInstance(doc) : null;
}
/**
* Parse the Listener from this class annotation
* @param doc the javadoc to parse
* @return the Listener class parsed for the provided class, null if none
*/
private Listener parseListener(ClassDoc doc) {
return !doc.isAbstract() && getAnnotation(doc, org.tldgen.annotations.Listener.class) != null? Listener.createInstance(doc) : null;
}
/**
* Parse the methods of a class and its superclasses
* @param clazz the class to parse
* @param library the library objecto to insert the {@link Function} instances
*/
private void recollectFunctionData(ClassDoc clazz, Library library) {
for (MethodDoc methodDoc : clazz.methods()) {
if (methodDoc.isStatic() && !methodDoc.isPrivate()) {
AnnotationDesc annotation = getAnnotation(methodDoc, org.tldgen.annotations.Function.class);
if (annotation != null){
library.add(Function.createinstance(methodDoc, annotation));
}
}
}
}
}