You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by sk...@apache.org on 2008/03/11 23:44:42 UTC
svn commit: r636134 [2/2] - in
/myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin: ./
src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/
src/main/java/org/apache/myfaces/ src/main/java/org/apache/myfaces/buil...
Added: myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java
URL: http://svn.apache.org/viewvc/myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java?rev=636134&view=auto
==============================================================================
--- myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java (added)
+++ myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java Tue Mar 11 15:44:26 2008
@@ -0,0 +1,256 @@
+package org.apache.myfaces.buildtools.maven2.plugin.builder.qdox;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.project.MavenProject;
+import org.apache.myfaces.buildtools.maven2.plugin.builder.ModelBuilder;
+import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentModel;
+import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
+import org.apache.myfaces.buildtools.maven2.plugin.builder.model.PropertyModel;
+
+import com.thoughtworks.qdox.JavaDocBuilder;
+import com.thoughtworks.qdox.model.AbstractJavaEntity;
+import com.thoughtworks.qdox.model.DocletTag;
+import com.thoughtworks.qdox.model.JavaClass;
+import com.thoughtworks.qdox.model.JavaField;
+import com.thoughtworks.qdox.model.JavaMethod;
+import com.thoughtworks.qdox.model.JavaSource;
+
+public class QdoxModelBuilder implements ModelBuilder
+{
+
+ private static final String DOC_CONVERTER = "mfp.converter";
+ private static final String DOC_VALIDATOR = "mfp.validator";
+ private static final String DOC_COMPONENT = "mfp.component";
+ private static final String DOC_RENDERER = "mfp.renderer";
+ private static final String DOC_RENDERKIT = "mfp.renderkit";
+
+ private static final String DOC_PROPERTY = "mfp.property";
+
+ /**
+ * Scan the source tree for annotations. Sets
+ */
+ public void buildModel(Model model, MavenProject project) throws MojoExecutionException
+ {
+ JavaDocBuilder builder = new JavaDocBuilder();
+
+ // need a File object representing the original source tree
+ List roots = project.getCompileSourceRoots();
+ System.out.println("CompileSourceRoots begin..");
+ for(Iterator i = roots.iterator(); i.hasNext(); ) {
+ String srcDir = (String) i.next();
+ System.out.println("==" + srcDir);
+ builder.addSourceTree(new File(srcDir));
+ }
+ System.out.println("CompileSourceRoots end..");
+
+ JavaSource[] sources = builder.getSources();
+ JavaClass[] classes = builder.getClasses();
+ for(int i=0; i<classes.length; ++i)
+ {
+ JavaClass clazz = classes[i];
+ processClass(clazz, model);
+ }
+ }
+
+
+ // remove all leading whitespace and a quotemark if it exists.
+ //
+ // Qdox comments like <code>@foo val= "bar"</code> return a value
+ // with leading whitespace and quotes, so remove them.
+ private String clean(String src)
+ {
+ if (src == null)
+ {
+ return null;
+ }
+
+ int start = 0;
+ int end = src.length();
+ while (start <= end)
+ {
+ char c = src.charAt(start);
+ if (!Character.isWhitespace(c) && (c != '"'))
+ {
+ break;
+ }
+ ++start;
+ }
+ while (end >= start)
+ {
+ char c = src.charAt(end-1);
+ if (!Character.isWhitespace(c) && (c != '"'))
+ {
+ break;
+ }
+ --end;
+ }
+ return src.substring(start, end);
+ }
+
+ private String getString(JavaClass clazz, DocletTag tag, String key)
+ {
+ String val = clean(tag.getNamedParameter(key));
+ if (val == null)
+ {
+ throw new IllegalStateException(
+ "missing key " + key + " in tag " + tag.getName()
+ + " on line " + tag.getLineNumber()
+ + " of class " + clazz.getName());
+ }
+ return val;
+ }
+
+ private String getString(JavaClass clazz, DocletTag tag, String key, String dflt)
+ {
+ String val = clean(tag.getNamedParameter(key));
+ if (val == null)
+ {
+ return dflt;
+ }
+ return val;
+ }
+
+ private Boolean getBoolean(JavaClass clazz, DocletTag tag, String key, Boolean dflt)
+ {
+ String val = clean(tag.getNamedParameter(key));
+ if (val == null)
+ {
+ return dflt;
+ }
+ return Boolean.valueOf(val);
+ }
+
+ private void processClass(JavaClass clazz, Model model)
+ {
+ System.out.println("class:" + clazz.getName());
+
+ DocletTag tag;
+
+ tag = clazz.getTagByName(DOC_CONVERTER, false);
+ if (tag != null)
+ {
+ processComponent(tag, clazz, model);
+ }
+
+ tag = clazz.getTagByName(DOC_VALIDATOR, false);
+ if (tag != null)
+ {
+ processValidator(tag, clazz, model);
+ }
+
+ tag = clazz.getTagByName(DOC_COMPONENT, false);
+ if (tag != null)
+ {
+ processComponent(tag, clazz, model);
+ }
+
+ }
+
+ private void processConverter(DocletTag tag, JavaClass clazz, Model model)
+ {
+ }
+
+ private void processValidator(DocletTag tag, JavaClass clazz, Model model)
+ {
+ }
+
+ private void processComponent(DocletTag tag, JavaClass clazz, Model model)
+ {
+ String componentTypeDflt = null;
+ JavaField fieldComponentType = clazz.getFieldByName("COMPONENT_TYPE");
+ if (fieldComponentType != null)
+ {
+ componentTypeDflt = clean(fieldComponentType.getInitializationExpression());
+ }
+
+ String rendererTypeDflt = null;
+ JavaField fieldRendererType = clazz.getFieldByName("DEFAULT_RENDERER_TYPE");
+ if (fieldRendererType != null)
+ {
+ rendererTypeDflt = clean(fieldRendererType.getInitializationExpression());
+ }
+
+ String descDflt = "no description";
+ // TODO: here, set the default description to the first sentence of the
+ // class javadoc.
+
+ String componentFamily = getString(clazz, tag, "family");
+ String componentType = getString(clazz, tag, "type", componentTypeDflt);
+ String rendererType = getString(clazz, tag, "defaultRendererType", rendererTypeDflt);
+ String shortDescription = getString(clazz, tag, "desc", descDflt);
+ Boolean canHaveChildren = getBoolean(clazz, tag, "canHaveChildren", Boolean.TRUE);
+ String tagName = getString(clazz, tag, "tagName", null);
+ String tagClass = getString(clazz, tag, "tagClass", null);
+ String tagSuperclass = getString(clazz, tag, "tagSuperclass", null);
+ String tagHandler = getString(clazz, tag, "tagHandler", null);
+
+ String longDescription = clazz.getComment();
+
+ ComponentModel component = new ComponentModel();
+ component.setComponentClass(clazz.getName());
+ component.setComponentType(componentType);
+ component.setComponentFamily(componentFamily);
+ component.setRendererType(rendererType);
+ component.setDescription(shortDescription);
+ component.setLongDescription(longDescription);
+ component.setChildren(canHaveChildren.booleanValue());
+
+ boolean namingContainer = false;
+ JavaClass[] interfaces = clazz.getImplementedInterfaces();
+ for(int i=0; i<interfaces.length; ++i)
+ {
+ JavaClass iface = interfaces[i];
+ if (iface.getName().equals("javax.faces.component.NamingContainer"))
+ {
+ namingContainer = true;
+ break;
+ }
+ }
+ component.setNamingContainer(namingContainer);
+
+ component.setTagName(tagName);
+ component.setTagClass(tagClass);
+ component.setTagSuperclass(tagSuperclass);
+ component.setTagHandler(tagHandler);
+
+ // Now here walk the component and all its ancestors
+ // looking for property annotations.
+ processClassProperties(clazz, component);
+
+ model.addComponent(component);
+ }
+
+ private void processClassProperties(JavaClass clazz, ComponentModel component)
+ {
+ JavaMethod[] methods = clazz.getMethods();
+ for(int i=0; i<methods.length; ++i)
+ {
+ JavaMethod method = methods[i];
+ System.out.println("Inspecting method " + method.getName());
+ DocletTag tag = method.getTagByName(DOC_PROPERTY, true);
+ if (tag != null)
+ {
+ System.out.println("found method" + method.getName());
+ Boolean required = getBoolean(clazz, tag, "required", Boolean.FALSE);
+ Boolean transientProp = getBoolean(clazz, tag, "transient", Boolean.FALSE);
+ Boolean literalOnly = getBoolean(clazz, tag, "literalOnly", Boolean.FALSE);
+
+ AbstractJavaEntity ctx = tag.getContext();
+
+ PropertyModel p = new PropertyModel();
+ p.setPropertyName(ctx.getName());
+ p.setPropertyClass("java.lang.String"); // TODO
+ p.setRequired(required.booleanValue());
+ p.setTransient(transientProp.booleanValue());
+ p.setLiteralOnly(literalOnly.booleanValue());
+ p.setDescription(ctx.getComment());
+
+ component.addProperty(p);
+ }
+ }
+ }
+}
\ No newline at end of file
Propchange: myfaces/myfaces-build-tools/branches/skitching/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java
------------------------------------------------------------------------------
svn:eol-style = native