From: <ki...@us...> - 2009-11-29 04:29:49
|
Revision: 10349 http://wonder.svn.sourceforge.net/wonder/?rev=10349&view=rev Author: kiddyr Date: 2009-11-29 04:29:39 +0000 (Sun, 29 Nov 2009) Log Message: ----------- Add new "d2wKeys" page, similar to Components page. Refactored, a bit. Modified Paths: -------------- trunk/Wonder/Build/build/build-doc.xml trunk/Wonder/Build/taglets/ComponentDoclet.java trunk/Wonder/Build/taglets/PageInstaller.java Added Paths: ----------- trunk/Wonder/Build/build/components-pageHead.html trunk/Wonder/Build/build/components-pageTail.html trunk/Wonder/Build/build/d2wlist-pageHead.html trunk/Wonder/Build/build/d2wlist-pageTail.html trunk/Wonder/Build/taglets/D2WKeyDoclet.java trunk/Wonder/Build/taglets/PageGenerator.java Modified: trunk/Wonder/Build/build/build-doc.xml =================================================================== --- trunk/Wonder/Build/build/build-doc.xml 2009-11-29 04:28:34 UTC (rev 10348) +++ trunk/Wonder/Build/build/build-doc.xml 2009-11-29 04:29:39 UTC (rev 10349) @@ -60,6 +60,7 @@ <mkdir dir="${dist}/Documentation" /> <mkdir dir="${dist}/Documentation/api" /> <mkdir dir="${build.root}/Build/lib" /> + <mkdir dir="${build.root}/Build/build" /> </target> <!-- ==================================================== --> @@ -81,8 +82,15 @@ </fileset> </copy> + <copy todir="${build.root}/Build/build"> + <fileset dir="Build/build"> + <include name="*.html"/> + </fileset> + </copy> + <javac srcdir="Build/taglets" destdir="${build.root}/Build/lib" debug="true"> <compilerarg value="-Xlint:deprecation" /> + <compilerarg value="-Xlint:unchecked" /> <classpath> <fileset dir="${build.root}/Build/lib"> <include name="*.jar"/> @@ -168,6 +176,7 @@ </javadoc> <echo>javadoc generation finished</echo> <antcall target="componentsOnly" /> + <antcall target="d2wOnly" /> <java classname="PageInstaller" fork="true"> <jvmarg value="-Dwonder.root=${wonder.root}" /> <jvmarg value="-Dwonder.version=${project.name}-${project.version}" /> @@ -196,8 +205,34 @@ </dirset> </sourcepath> <doclet name="ComponentDoclet" path="${build.root}/Build/lib:${build.root}/Build/lib/jdom-b7.jar" /> + <arg line="-J-Dbuild.root=${build.root}" /> </javadoc> <echo>components javadoc page generation finished</echo> </target> + <target name="d2wOnly" depends="build"> + <javadoc packagenames="er.*, com.gammastream.*, org.svgobjects.*, com.webobjects.jdbcadaptor.*, com.webobjects.woextensions.*" + destdir="${dist}/Documentation/api" + defaultexcludes="yes" + author="true" + version="true" + verbose="false" + maxmemory="128m"> + + <classpath refid="classpath"/> + <sourcepath> + <dirset dir="${wonder.root}"> + <include name="Frameworks/**/Sources/" /> + <exclude name="**/*Example*/**" /> + <exclude name="**/Applications/**" /> + </dirset> + </sourcepath> + <doclet name="D2WKeyDoclet" path="${build.root}/Build/lib:${build.root}/Build/lib/jdom-b7.jar" /> + <arg line="-J-Dbuild.root=${build.root}" /> + <!-- arg line="-J-Xmx32m -J-Xms32m -J-Dbuild.root=${build.root}" / --> + + </javadoc> + <echo>d2wkeys javadoc page generation finished</echo> + </target> + </project> Added: trunk/Wonder/Build/build/components-pageHead.html =================================================================== --- trunk/Wonder/Build/build/components-pageHead.html (rev 0) +++ trunk/Wonder/Build/build/components-pageHead.html 2009-11-29 04:29:39 UTC (rev 10349) @@ -0,0 +1,88 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<!--NewPage--> +<HTML> +<HEAD> +<!-- Generated by javadoc (build 1.5.0_16) on Mon Nov 16 02:48:13 EST 2009 --> +<TITLE> +WOComponent List (Project Wonder Reference Documentation) +</TITLE> + + +<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style"> + +<SCRIPT type="text/javascript"> +function windowTitle() +{ + parent.document.title="WOComponent List (Project Wonder Reference Documentation)"; +} +</SCRIPT> +<NOSCRIPT> +</NOSCRIPT> + +</HEAD> + +<BODY BGCOLOR="white" onload="windowTitle();"> + + +<!-- ========= START OF TOP NAVBAR ======= --> +<A NAME="navbar_top"><!-- --></A> +<A HREF="#skip-navbar_top" title="Skip navigation links"></A> +<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> +<TR> +<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> +<A NAME="navbar_top_firstrow"><!-- --></A> +<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> + <TR ALIGN="center" VALIGN="top"> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD> + + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Use</FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD> + <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Components</B></FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="d2wlist.html"><FONT CLASS="NavBarFont1"><B>D2WKeys</B></FONT></A> </TD> + + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD> + </TR> +</TABLE> +</TD> +<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> +<em>Project Wonder 5.0</em></EM> +</TD> +</TR> + +<TR> +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> + PREV + NEXT</FONT></TD> +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> + <A HREF="index.html?deprecated-list.html" target="_top"><B>FRAMES</B></A> + <A HREF="deprecated-list.html" target="_top"><B>NO FRAMES</B></A> + <SCRIPT type="text/javascript"> + <!-- + if(window==top) { + document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); + } + //--> +</SCRIPT> + +<NOSCRIPT> + <A HREF="allclasses-noframe.html"><B>All Classes</B></A> +</NOSCRIPT> + + +</FONT></TD> +</TR> +</TABLE> +<A NAME="skip-navbar_top"></A> +<!-- ========= END OF TOP NAVBAR ========= --> + +<HR> +<CENTER> +<H2> +<B>WOComponents</B></H2> +</CENTER> +<HR SIZE="4" NOSHADE> + Added: trunk/Wonder/Build/build/components-pageTail.html =================================================================== --- trunk/Wonder/Build/build/components-pageTail.html (rev 0) +++ trunk/Wonder/Build/build/components-pageTail.html 2009-11-29 04:29:39 UTC (rev 10349) @@ -0,0 +1,64 @@ +<P> + <HR> + +<!-- ======= START OF BOTTOM NAVBAR ====== --> +<A NAME="navbar_bottom"><!-- --></A> +<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A> +<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> +<TR> +<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> +<A NAME="navbar_bottom_firstrow"><!-- --></A> +<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> + <TR ALIGN="center" VALIGN="top"> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD> + + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Use</FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD> + <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Components</B></FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="d2wlist.html"><FONT CLASS="NavBarFont1"><B>D2WKeys</B></FONT></A> </TD> + + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD> + </TR> +</TABLE> +</TD> +<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> + +Last updated: Mon, Nov 16, 2009 • 08:19 AM PST</EM> +</TD> +</TR> + +<TR> +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> + PREV + NEXT</FONT></TD> +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> + <A HREF="index.html?overview-summary.html" target="_top"><B>FRAMES</B></A> + + <A HREF="overview-summary.html" target="_top"><B>NO FRAMES</B></A> + <SCRIPT type="text/javascript"> + <!-- + if(window==top) { + document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); + } + //--> +</SCRIPT> +<NOSCRIPT> + <A HREF="allclasses-noframe.html"><B>All Classes</B></A> +</NOSCRIPT> + + +</FONT></TD> +</TR> +</TABLE> +<A NAME="skip-navbar_bottom"></A> +<!-- ======== END OF BOTTOM NAVBAR ======= --> + +<HR> +Copyright © 2002 – 2007 Project Wonder. + +</BODY> +</HTML> Added: trunk/Wonder/Build/build/d2wlist-pageHead.html =================================================================== --- trunk/Wonder/Build/build/d2wlist-pageHead.html (rev 0) +++ trunk/Wonder/Build/build/d2wlist-pageHead.html 2009-11-29 04:29:39 UTC (rev 10349) @@ -0,0 +1,88 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<!--NewPage--> +<HTML> +<HEAD> +<!-- Generated by javadoc (build 1.5.0_16) on Mon Nov 16 02:48:13 EST 2009 --> +<TITLE> +D2W Keyed Components List (Project Wonder Reference Documentation) +</TITLE> + + +<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style"> + +<SCRIPT type="text/javascript"> +function windowTitle() +{ + parent.document.title="D2W Keyed Components List (Project Wonder Reference Documentation)"; +} +</SCRIPT> +<NOSCRIPT> +</NOSCRIPT> + +</HEAD> + +<BODY BGCOLOR="white" onload="windowTitle();"> + + +<!-- ========= START OF TOP NAVBAR ======= --> +<A NAME="navbar_top"><!-- --></A> +<A HREF="#skip-navbar_top" title="Skip navigation links"></A> +<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> +<TR> +<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> +<A NAME="navbar_top_firstrow"><!-- --></A> +<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> + <TR ALIGN="center" VALIGN="top"> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD> + + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Use</FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="components.html"><FONT CLASS="NavBarFont1"><B>Components</B></FONT></A> </TD> + <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>D2WKeys</B></FONT> </TD> + + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD> + </TR> +</TABLE> +</TD> +<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> +<em>Project Wonder 5.0</em></EM> +</TD> +</TR> + +<TR> +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> + PREV + NEXT</FONT></TD> +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> + <A HREF="index.html?deprecated-list.html" target="_top"><B>FRAMES</B></A> + <A HREF="deprecated-list.html" target="_top"><B>NO FRAMES</B></A> + <SCRIPT type="text/javascript"> + <!-- + if(window==top) { + document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); + } + //--> +</SCRIPT> + +<NOSCRIPT> + <A HREF="allclasses-noframe.html"><B>All Classes</B></A> +</NOSCRIPT> + + +</FONT></TD> +</TR> +</TABLE> +<A NAME="skip-navbar_top"></A> +<!-- ========= END OF TOP NAVBAR ========= --> + +<HR> +<CENTER> +<H2> +<B>D2W Keyed Components</B></H2> +</CENTER> +<HR SIZE="4" NOSHADE> + Added: trunk/Wonder/Build/build/d2wlist-pageTail.html =================================================================== --- trunk/Wonder/Build/build/d2wlist-pageTail.html (rev 0) +++ trunk/Wonder/Build/build/d2wlist-pageTail.html 2009-11-29 04:29:39 UTC (rev 10349) @@ -0,0 +1,64 @@ +<P> + <HR> + +<!-- ======= START OF BOTTOM NAVBAR ====== --> +<A NAME="navbar_bottom"><!-- --></A> +<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A> +<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""> +<TR> +<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> +<A NAME="navbar_bottom_firstrow"><!-- --></A> +<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> + <TR ALIGN="center" VALIGN="top"> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD> + + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Use</FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="components.html"><FONT CLASS="NavBarFont1"><B>Components</B></FONT></A> </TD> + <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>D2WKeys</B></FONT> </TD> + + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD> + </TR> +</TABLE> +</TD> +<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM> + +Last updated: Mon, Nov 16, 2009 • 08:19 AM PST</EM> +</TD> +</TR> + +<TR> +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> + PREV + NEXT</FONT></TD> +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> + <A HREF="index.html?overview-summary.html" target="_top"><B>FRAMES</B></A> + + <A HREF="overview-summary.html" target="_top"><B>NO FRAMES</B></A> + <SCRIPT type="text/javascript"> + <!-- + if(window==top) { + document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>'); + } + //--> +</SCRIPT> +<NOSCRIPT> + <A HREF="allclasses-noframe.html"><B>All Classes</B></A> +</NOSCRIPT> + + +</FONT></TD> +</TR> +</TABLE> +<A NAME="skip-navbar_bottom"></A> +<!-- ======== END OF BOTTOM NAVBAR ======= --> + +<HR> +Copyright © 2002 – 2007 Project Wonder. + +</BODY> +</HTML> Modified: trunk/Wonder/Build/taglets/ComponentDoclet.java =================================================================== --- trunk/Wonder/Build/taglets/ComponentDoclet.java 2009-11-29 04:28:34 UTC (rev 10348) +++ trunk/Wonder/Build/taglets/ComponentDoclet.java 2009-11-29 04:29:39 UTC (rev 10349) @@ -41,198 +41,38 @@ static HashMap<String,HashMap<String,Object>> comps; + static String[] prefixes = new String[] { "Selenium", "ERDAjax", "PayPal", "ERD2W", "ERDIV", "ERIUI", "ERNEU", + "ERPDF", "ERXJS", "Ajax", "SEEO", "UJAC", "D2W", "ERC", "ERD", "ERO", "ERP", "ERX", + "GSV", "WOL", "YUI", "ER", "GC", "IM", "JS", "SC", "SE", "WO", "WR", "WX" }; + @SuppressWarnings("unchecked") public static boolean start(RootDoc root) { - test(); + // test(); ClassDoc[] classes = root.classes(); - String[] prefixes = new String[] { "Selenium", "ERDAjax", "PayPal", "ERD2W", "ERDIV", "ERIUI", "ERNEU", - "ERPDF", "ERXJS", "Ajax", "SEEO", "UJAC", "D2W", "ERC", "ERD", "ERO", "ERP", "ERX", - "GSV", "WOL", "YUI", "ER", "GC", "IM", "JS", "SC", "SE", "WO", "WR", "WX" }; + comps = PageGenerator.findSubClassesFromAvailable(classes, "com.webobjects.appserver.WOElement"); - comps = new HashMap<String,HashMap<String,Object>>(); + PageGenerator.gatherAllComments(comps); - // Collect into comps{} new hashes for classes that are sub-classes of WOComponent. - // - for (int i = 0; i < classes.length; i++) { + TreeMap<String,TreeSet<String>> classNamePrefixes = PageGenerator.gatherClassesByPrefix(comps, prefixes); - ClassDoc aCD = classes[i]; + PageGenerator.findSourceFiles(comps, srcDirs); - if (!aCD.toString().startsWith("com.webobjects")) { - ClassDoc parent = aCD.superclass(); - boolean done = false; + PageGenerator.findApiFiles(comps, compDirs); - while (parent != null && !done) { - if (parent.toString().equals("com.webobjects.appserver.WOElement")) { - // System.out.println("found component: "+aCD); - comps.put(aCD.toString(), new HashMap<String,Object>()); - done = true; - } - if (parent.toString().equals("java.lang.Object")) - done = true; - else - parent = parent.superclass(); - } - } - } + PageGenerator.findPackages(comps); - // Gather the classnames by prefix. - // - TreeSet<String> classNames = new TreeSet<String>(comps.keySet()); - Iterator<String> names = classNames.iterator(); + PageGenerator.gatherAllComments(comps); - TreeMap<String,TreeSet<String>> classNamePrefixes = new TreeMap<String,TreeSet<String>>(); + PageGenerator.findTagComments(comps, "@binding"); - while (names.hasNext()) { - String current = names.next(); - String[] parts = current.split("\\."); - String lastName = parts[parts.length-1]; - - String prefixFound = null; + gatherBindingsFromApi(comps); - for (int idx = 0; idx < prefixes.length && prefixFound == null; idx++) { - if (lastName.startsWith(prefixes[idx])) prefixFound = prefixes[idx]; - } - - if (prefixFound == null) prefixFound = "NONE"; - - // System.out.println("name: \""+current+"\", lastName = \""+lastName+"\", prefix = \""+prefixFound+"\""); - - TreeSet<String> classesForPrefix = classNamePrefixes.get(prefixFound); - if (classesForPrefix == null) { - classNamePrefixes.put(prefixFound, new TreeSet<String>()); - classesForPrefix = classNamePrefixes.get(prefixFound); - } - classesForPrefix.add(current); - } - - // For each subclass of WOComponent that had been found, get its source file name - // and api file name (if one exists) and component name and put it in the hashmap pointed - // to by the class name in comps. - // - Iterator keys = comps.keySet().iterator(); - while (keys.hasNext()) { - String key = keys.next().toString(); - - int lastDot = 0; - int currentDot = key.indexOf(".", lastDot); - while (currentDot > lastDot) { - lastDot = currentDot; - currentDot = key.indexOf(".", lastDot+1); - } - String leaf = key.substring(lastDot+1); - comps.get(key).put("componentName", leaf); - - boolean found = false; - - for (int jdx = 0; !found && jdx < compDirs.size(); jdx++) { - String apiFilename = compDirs.get(jdx)+leaf+".api"; - File apiFile = new File(apiFilename); - if (apiFile.exists()) - comps.get(key).put("apiFile", apiFilename); - } - - found = false; - - String srcDir = key.replaceAll("\\.", File.separator); - - for (int jdx = 0; !found && jdx < srcDirs.size(); jdx++) { - String srcFilename = srcDirs.get(jdx)+File.separator+leaf+".java"; - if ((new File(srcFilename)).exists()) - comps.get(key).put("sourceFile", srcFilename); - } - } - - // Gather the class comments, binding comments and package name for the classes of the components. - // - keys = comps.keySet().iterator(); - while (keys.hasNext()) { - String key = keys.next().toString(); - - // For null-safety later on - // - comps.get(key).put("package", "NONE"); - - FileReader fRdr = null; - String srcFilename = (String)comps.get(key).get("sourceFile"); - if (srcFilename != null) { - try { - fRdr = new FileReader(srcFilename); - } catch (java.io.FileNotFoundException fnfe) { System.out.println(fnfe.getMessage()); System.exit(1); } - - LineNumberReader rdr = new LineNumberReader(fRdr); - - boolean done = false; - boolean inComment = false; - - ArrayList<String> comments = new ArrayList<String>(); - - String line = ""; - - while (line != null && !done) { - try { - line = rdr.readLine(); - if (line != null) { - if (line.startsWith("package ")) { - String pName = line.substring("package ".length()); - while (pName.endsWith(";")) pName = pName.substring(0,pName.length()-1); - comps.get(key).put("package", pName); - - pName = pName.replace('.','/'); - comps.get(key).put("classDocURL",pName+"/"+comps.get(key).get("componentName")+".html"); - } - if (line.indexOf("/**") >= 0) { inComment = true; } - - // xxxxx - if (line.startsWith("public class")) { done = true; } - if (inComment && line.indexOf("*/") >= 0) { done = true; } - if (inComment) { comments.add(line); } - } - } catch (java.io.IOException ioe) { line = null; } - } - - comps.get(key).put("comments", findBindingComments(comments)); - comps.get(key).put("classComment", findClassComment(comments)); - } else { - comps.get(key).put("comments", new HashMap<String,String>()); - comps.get(key).put("classComment", ""); - } - } - - // Gather the bindings for the component from the api file. - // - keys = comps.keySet().iterator(); - while (keys.hasNext()) { - String key = keys.next().toString(); - - String apiFilename = (String)comps.get(key).get("apiFile"); - if (apiFilename != null) { - - File apiFile = new File(apiFilename); - SAXBuilder builder = new SAXBuilder(); - Document doc = null; - - ArrayList<String> bindingNames = new ArrayList<String>(); - - try { - doc = builder.build(apiFile); - } catch (org.jdom.JDOMException jde) { System.out.println(jde.getMessage()); System.exit(1); } - Element parent = doc.getRootElement().getChild("wo"); - Iterator bindings = parent.getChildren("binding").iterator(); - while (bindings.hasNext()) { - Attribute attr = ((Element)bindings.next()).getAttribute("name"); - bindingNames.add(attr.getValue()); - } - comps.get(key).put("apiBindings", bindingNames); - } else - comps.get(key).put("apiBindings", new ArrayList<String>()); - } - // Check the condition of the bindings documentation. // - keys = comps.keySet().iterator(); + Iterator<String> keys = comps.keySet().iterator(); while (keys.hasNext()) { String key = keys.next().toString(); @@ -290,7 +130,7 @@ out = new FileWriter("components.html"); check = new FileWriter("components.txt"); - writeHead(out); + PageGenerator.writeFileToWriter(System.getProperty("build.root")+"/Build/build/components-pageHead.html", out); out.write("<ul>\n"); out.write("<li><a href=\"#ListedByPrefix\">Prefixes</a></li>\n"); @@ -305,14 +145,10 @@ while (prefxs.hasNext()) { String prefix = prefxs.next(); - out.write("<table border=\"1\" width=\"100%\" cellpadding=\"3\" cellspacing=\"0\" summary=\"\">\n"); - out.write("<tr bgcolor=\"#CCCCFF\" class=\"TableHeadingColor\">\n"); - out.write("<th ALIGN=\"left\" colspan=\"2\"><font size=\"+2\">\n"); - + out.write(PageGenerator.TABLE_TOP_START); out.write("<b>Prefix: "+prefix+"</b></font></th>\n"); + out.write(PageGenerator.TABLE_TOP_END); - out.write("</tr>\n"); - StringBuffer str = new StringBuffer(); Iterator<String> namesForPrefix = classNamePrefixes.get(prefix).iterator(); while (namesForPrefix.hasNext()) { @@ -339,14 +175,10 @@ // System.out.println("writing for key: "+key); - out.write("<table border=\"1\" width=\"100%\" cellpadding=\"3\" cellspacing=\"0\" summary=\"\">\n"); - out.write("<tr bgcolor=\"#CCCCFF\" class=\"TableHeadingColor\">\n"); - out.write("<th ALIGN=\"left\" colspan=\"2\"><font size=\"+2\">\n"); - + out.write(PageGenerator.TABLE_TOP_START); out.write("<b>Package: "+key+"</b></font></th>\n"); + out.write(PageGenerator.TABLE_TOP_END); - out.write("</tr>\n"); - Iterator<String> compKeys = (new TreeSet(packageInfo.get(key))).iterator(); while (compKeys.hasNext()) { String compKey = compKeys.next(); @@ -372,13 +204,13 @@ String key = (String)keys.next(); out.write("<a name=\"packagename\"><!-- --></A>\n"); - out.write("<table border=\"1\" width=\"100%\" celppadding=\"3\" cellspacing=\"0\" summary=\"\">\n"); - out.write("<tr bgcolor=\"#CCCCFF\" class=\"TableHeadingColor\">\n"); - out.write("<th align=\"left\" colspan=\"1\"><font size=\"+2\">\n"); + + out.write(PageGenerator.TABLE_TOP_START); out.write("<b>Package: "+key+"</b></font></th>\n"); - out.write("</tr>\n"); - out.write("</table>\n"); + out.write(PageGenerator.TABLE_TOP_END); + out.write(PageGenerator.TABLE_END); + Iterator<String> compKeys = (new TreeSet(packageInfo.get(key))).iterator(); while (compKeys.hasNext()) { String compKey = compKeys.next(); @@ -476,7 +308,7 @@ } } - writeTail(out); + PageGenerator.writeFileToWriter(System.getProperty("build.root")+"/Build/build/components-pageTail.html", out); out.close(); @@ -486,149 +318,39 @@ return false; } - - /** Returns the first sentence of the javadoc for a component's - * class. It is a shame that we cannot leverage javadoc for this, but - * there are no hooks for this. We are looking for "end" strings from - * the ends array, below. So far, this contains ". ", ".<", and ".\" ". - */ - static String findClassComment(List<String> comments) { - - // System.out.println("start: comments: "+comments); - - if (comments == null || comments.size() == 0) - return ""; - - boolean done = false; - - // Coalesce the lines of the comment into one string. - // - String str = comments.get(0).replaceFirst("/\\*\\*", "").trim(); - for (int idx = 1; idx < comments.size(); idx++) { - String other = comments.get(idx).trim(); - - // this does not work the same as the while after... - //other.replace("^\\**", ""); - - while (other.startsWith("*")) { other = other.substring(1); } - str = (str.trim()+" "+other.trim()).trim(); - } - - if (str.equals("") || str.startsWith("@")) return ""; - - // Locate the end markers. - // - String[] ends = new String[] { ". ", ".<", ".\" ", " @", ".*/", ".*<" }; - - int end = str.length(); - String endMarker = null; - - for (int idx = 0; idx < ends.length; idx++) { - if (str.indexOf(ends[idx]) >= 0 && str.indexOf(ends[idx]) < end) { - end = str.indexOf(ends[idx]); - endMarker = ends[idx]; - } - } - - if (endMarker != null) - str = str.substring(0,end+endMarker.length()-1).trim(); - // System.out.println("done: str: \""+str+"\""); - return str; - } + static void gatherBindingsFromApi(HashMap<String,HashMap<String,Object>> comps) { - /** - * Take a list of comment strings, eg ("/**", "Something", "", " * @binding some", "\*\/"), - * and return a dictionary of binding names to binding comment structures. - */ - static HashMap<String,HashMap<String,String>> findBindingComments(List<String> comments) { - - // System.out.println("start: comments = "+comments); - - ArrayList<String> found = new ArrayList<String>(); - - boolean inBinding = false; - - // Start with the class comment block and turn this into an array of lines that - // all start with a @binding tag. + // Gather the bindings for the component from the api file. // - // TODO: we do not get rid of tabs.... (or do we now, with trim()) - // - for (int idx = 0; idx < comments.size(); idx++) { - String line = comments.get(idx); - line = line.trim(); - if (line.startsWith("*") && !line.startsWith("*/")) line = line.substring(1); - line = line.trim(); + Iterator<String> keys = comps.keySet().iterator(); + while (keys.hasNext()) { + String key = keys.next().toString(); - if (line.startsWith("@binding")) inBinding = true; + String apiFilename = (String)comps.get(key).get("apiFile"); + if (apiFilename != null) { - if (line.indexOf("*/") >= 0) inBinding = false; - if (line.length() == 0) inBinding = false; - if (line.startsWith("@") && !line.startsWith("@binding")) inBinding = false; + File apiFile = new File(apiFilename); + SAXBuilder builder = new SAXBuilder(); + Document doc = null; - if (inBinding) found.add(line); - } - // System.out.println("found: "+found); + ArrayList<String> bindingNames = new ArrayList<String>(); - ArrayList<String> found2 = new ArrayList<String>(); - - // This will collapse multi-line comments to one line. - // - int jdx = -1; - for (int idx = 0; idx < found.size(); idx++) { - if (found.get(idx).startsWith("@")) { jdx++; found2.add(found.get(idx)); } - else { found2.set(jdx, found2.get(jdx)+" "+found.get(idx)); } + try { + doc = builder.build(apiFile); + } catch (org.jdom.JDOMException jde) { System.out.println(jde.getMessage()); System.exit(1); } + Element parent = doc.getRootElement().getChild("wo"); + Iterator bindings = parent.getChildren("binding").iterator(); + while (bindings.hasNext()) { + Attribute attr = ((Element)bindings.next()).getAttribute("name"); + bindingNames.add(attr.getValue()); + } + comps.get(key).put("apiBindings", bindingNames); + } else + comps.get(key).put("apiBindings", new ArrayList<String>()); } - - // System.out.println("found2: "+found2); - - HashMap<String,HashMap<String,String>> finished = new HashMap<String,HashMap<String,String>>(); - - // Construct the HashMap that holds the bindings. Fix the key, if needed. - // - for (int idx = 0; idx < found2.size(); idx++) { - String line = found2.get(idx); - - line = line.substring("@binding".length()); - line = line.trim(); - - String name; - if (line.indexOf(" ") > 0) - name = line.substring(0,line.indexOf(" ")); - else - name = line; - -// XXX - why did adding this make me start to get unchecked warnings? -// - Character c = name.charAt(name.length()-1); - while (!Character.isJavaIdentifierPart(c)) { - name = name.substring(0,name.length()-1); - c = name.charAt(name.length()-1); - } - - if (line.indexOf(" ") > 0) - line = line.substring(line.indexOf(" ")); - else - line = ""; - line = line.trim(); - - HashMap<String,String> data = new HashMap<String,String>(); - data.put("name", name); - data.put("comment", line); - data.put("order", paddedNumber(idx, 3)); - finished.put(name, data); - } - - // System.out.println("finished: "+finished); - return finished; } - static String paddedNumber(int num, int width) { - String str = ""+num; - while (str.length() < width) str = "0"+str; - return str; - } - static void test() { int result = 0; @@ -653,9 +375,9 @@ oneComment.put("order", "000"); expectedComment.put(oneComment.get("name"), oneComment); - foundComment = findBindingComments(tester); + //foundComment = PageGenerator.findTagComments(tester, "@binding"); - result += checkTest("test1", tester, expectedComment, foundComment); + //result += checkTest("test1", tester, expectedComment, foundComment); /* XXX - If I put a * at the start of a line, or multiple *'s, does it break things? */ @@ -728,12 +450,12 @@ oneComment.put("order", "006"); expectedComment.put(oneComment.get("name"), oneComment); - foundComment = findBindingComments(tester); + //foundComment = PageGenerator.findTagComments(tester, "@binding"); - result += checkTest("test2", tester, expectedComment, foundComment); + //result += checkTest("test2", tester, expectedComment, foundComment); String expected = "AjaxSocialNetworkLink creates a link to the submission URL for a social network around the social network's icon."; - String found = findClassComment(tester); + String found = PageGenerator.findClassComment(tester); result += checkTest("test3", tester, expected, found); @@ -750,7 +472,7 @@ tester.add("*/"); expected = "Component that generates a mailto href of the form: \"<a href=mailto:fo...@ba...>fo...@ba...</a>\"."; - found = findClassComment(tester); + found = PageGenerator.findClassComment(tester); result += checkTest("test4", tester, expected, found); @@ -761,7 +483,7 @@ tester.add("*/"); expected = "Component that generates a mailto href of the form: \"<a href=mailto:fo...@ba...>fo...@ba...</a>.\""; - found = findClassComment(tester); + found = PageGenerator.findClassComment(tester); result += checkTest("test5", tester, expected, found); @@ -771,7 +493,7 @@ tester.add(" * @binding progressID the id of the AjaxProgress"); expected = ""; - found = findClassComment(tester); + found = PageGenerator.findClassComment(tester); result += checkTest("test6", tester, expected, found); @@ -781,7 +503,7 @@ tester.add(" * @binding progressID the id of the AjaxProgress"); expected = "I can check here also"; - found = findClassComment(tester); + found = PageGenerator.findClassComment(tester); result += checkTest("test7", tester, expected, found); @@ -795,7 +517,7 @@ tester.add(" */"); expected = "XHTML version of WORadioButtonList"; - found = findClassComment(tester); + found = PageGenerator.findClassComment(tester); result += checkTest("test8", tester, expected, found); @@ -823,7 +545,7 @@ try { out.write("<html><head>\n"); out.write("<meta name=\"ROBOTS\" content=\"NOINDEX\" />\n"); - out.write("<title>WOComponents</title>\n"); + out.write("<title>Components with D2W Keys</title>\n"); out.write("<link rel=\"stylesheet\" type=\"text/css\" href=\"stylesheet.css\" title=\"Style\">\n"); out.write("<script type=\"text/javascript\">\n"); out.write("function windowTitle()\n"); Added: trunk/Wonder/Build/taglets/D2WKeyDoclet.java =================================================================== --- trunk/Wonder/Build/taglets/D2WKeyDoclet.java (rev 0) +++ trunk/Wonder/Build/taglets/D2WKeyDoclet.java 2009-11-29 04:29:39 UTC (rev 10349) @@ -0,0 +1,331 @@ + +import java.util.ArrayList; +import java.util.List; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.TreeMap; +import java.util.TreeSet; +import java.util.Set; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.LineNumberReader; + +import com.sun.javadoc.FieldDoc; +import com.sun.javadoc.MethodDoc; +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.RootDoc; +import com.sun.javadoc.DocErrorReporter; + +import org.jdom.Attribute; +import org.jdom.Document; +import org.jdom.Element; + +import org.jdom.input.SAXBuilder; + +/** + * Doclet for generating the "D2WKeys-able" page..... + */ +public class D2WKeyDoclet extends com.sun.javadoc.Doclet { + + static ArrayList<String> srcDirs; + static ArrayList<String> compDirs; + + static HashMap<String,HashMap<String,Object>> comps; + + @SuppressWarnings("unchecked") + public static boolean start(RootDoc root) { + + // test(); + + ClassDoc[] classes = root.classes(); + + comps = PageGenerator.findSubClassesFromAvailable(classes, "com.webobjects.directtoweb.D2WComponent"); + + PageGenerator.gatherAllComments(comps); + + PageGenerator.findClassDocURLs(comps); + + PageGenerator.findSourceFiles(comps, srcDirs); + + PageGenerator.findPackages(comps); + + PageGenerator.gatherAllComments(comps); + + PageGenerator.findTagComments(comps, "@d2wKey"); + + PageGenerator.findClassComments(comps); + + // Check the condition of the bindings documentation. + // + Iterator<String> keys = comps.keySet().iterator(); + while (keys.hasNext()) { + String key = keys.next().toString(); + + HashMap<String,Object> map = comps.get(key); + + // What is there to do here? Not sure.... + } + + TreeMap<String,ArrayList<String>> packageInfo = new TreeMap<String,ArrayList<String>>(); + + keys = comps.keySet().iterator(); + while (keys.hasNext()) { + String key = keys.next().toString(); + + ArrayList<String> aPackage = packageInfo.get((String)comps.get(key).get("package")); + if (aPackage == null) { + packageInfo.put((String)comps.get(key).get("package"), new ArrayList<String>()); + aPackage = packageInfo.get((String)comps.get(key).get("package")); + } + aPackage.add(key); + } + + // System.out.println("packageInfo: "+packageInfo); + + // + // Start writing out the html page + // + + FileWriter out = null; + FileWriter check = null; + + try { + out = new FileWriter("d2wlist.html"); + check = new FileWriter("d2wlist.txt"); + + PageGenerator.writeFileToWriter(System.getProperty("build.root")+"/Build/build/d2wlist-pageHead.html", out); + + out.write("<ul>\n"); + out.write("<li><a href=\"#ListedByPackage\">Packages/Classnames</a></li>\n"); + out.write("<li><a href=\"#ComponentDetails\">Component Details</a></li>\n"); + out.write("</ul>\n"); + + keys = packageInfo.keySet().iterator(); + + out.write("<a name=\"ListedByPackage\"/>\n"); + + while (keys.hasNext()) { + String key = (String)keys.next(); + + System.out.println("writing for key: "+key); + + out.write(PageGenerator.TABLE_TOP_START); + out.write("<b>Package: "+key+"</b></font></th>\n"); + out.write(PageGenerator.TABLE_TOP_END); + + Iterator<String> compKeys = (new TreeSet(packageInfo.get(key))).iterator(); + while (compKeys.hasNext()) { + String compKey = compKeys.next(); + + out.write("<tr bgcolor=\"white\" CLASS=\"TableRowColor\">\n"); + + out.write("<td><a href=\"#"+compKey+"\" title=\""+compKey+"\">"+comps.get(compKey).get("componentName")+"</a>\n"); + + out.write("<br/>\n"); + + out.write(" <I>class "+compKey+"</I> </td>\n"); + out.write("</tr>\n"); + } + out.write("</table>\n <p>\n"); + } + + out.write("<hr size=\"4\" noshade>\n"); + + out.write("<a name=\"ComponentDetails\"/>\n"); + + keys = packageInfo.keySet().iterator(); + while (keys.hasNext()) { + String key = (String)keys.next(); + + out.write("<a name=\"packagename\"><!-- --></A>\n"); + + // The "Package" header in the list of component detail entries + // + out.write(PageGenerator.TABLE_TOP_START); + out.write("<b>Package: "+key+"</b></font></th>\n"); + out.write(PageGenerator.TABLE_TOP_END); + out.write(PageGenerator.TABLE_END); + + Iterator<String> compKeys = (new TreeSet(packageInfo.get(key))).iterator(); + while (compKeys.hasNext()) { + String compKey = compKeys.next(); + HashMap map = comps.get(compKey); + + String bindingCheck = ""; + + out.write("<a name=\""+compKey+"\"><!-- --></a>\n"); + out.write("<h3>"+comps.get(compKey).get("componentName")+"</h3>\n"); + + out.write("<p>From <a href=\""+comps.get(compKey).get("classDocURL")+"\">"); + out.write(map.get("package")+"."+map.get("componentName")); + out.write("</a>:\n"); + bindingCheck += " warning: No package defined for class\n"; + + if (map.get("classComment") != null && ((String)map.get("classComment")).length() != 0) + out.write((String)map.get("classComment")); + else { + out.write("<i>Class documentation missing.</i>"); + bindingCheck += " warning: No class comment defined for class\n"; + } + out.write("</p>\n"); + + HashMap<String,HashMap<String,String>> commentsMap = (HashMap<String,HashMap<String,String>>)map.get("comments"); + + /* In the block below, I write out the bindings from the commentsSet first, and then the bindings from the api set. + Therefore I only need to worry about the sort order in the commentsSet. -rrk */ + + Set<String> commentsSet = commentsMap.keySet(); + + ArrayList<String> apiBindings = (ArrayList<String>)map.get("apiBindings"); + + if (commentsSet.size() == 0) + out.write("<i>No d2wKeys for Component.</i>\n"); + else { + out.write("<table border=\"1\">\n"); + out.write("<tr><th><i>d2wKey</i></th><th><i>comment</i></th></tr>\n"); + out.write("<tr>\n"); + + TreeMap<String,String> orderingMap = new TreeMap<String,String>(); + Iterator<String> comments = commentsSet.iterator(); + while (comments.hasNext()) { + String foundName = comments.next(); + HashMap<String,String> commentInfo = commentsMap.get(foundName); + orderingMap.put(commentInfo.get("order"), commentInfo.get("name")); + } + + Iterator<String> ordering = orderingMap.keySet().iterator(); + + while (ordering.hasNext()) { + String bindingName = orderingMap.get(ordering.next()); + out.write("<td>"+bindingName+"</td>\n"); + + String bindingComment = (String)((HashMap<String,String>)commentsMap.get(bindingName)).get("comment"); + + if (bindingComment == null || bindingComment.length() == 0) { + out.write("<td> </td>\n"); + bindingCheck += " Binding: \""+bindingName+"\": binding tag in javadoc but no/empty comment\n"; + } else { + out.write("<td>"+bindingComment+"</td>\n"); + } + out.write("</tr>\n"); + } + + out.write("</table>\n"); + } + + check.write(" componentName: \""+map.get("componentName")+"\"\n"); + check.write(" package: \""+map.get("package")+"\"\n"); + check.write(" sourceFile: \""+map.get("sourceFile")+"\"\n"); + check.write(" comments: \""+map.get("comments")+"\"\n"); + check.write(" classComment: \""+map.get("classComment")+"\"\n"); + check.write(" classDocURL: \""+map.get("classDocURL")+"\"\n"); + check.write(" allComments: \""+map.get("allComments")+"\"\n"); + check.write(" condition: \""+map.get("Ok")+"\"\n"); + if (!bindingCheck.equals("")) + check.write(bindingCheck); + check.write("\n"); + + out.write("<hr/>\n\n"); + } + } + + PageGenerator.writeFileToWriter(System.getProperty("build.root")+"/Build/build/d2wlist-pageTail.html", out); + + out.close(); + + } catch (java.io.IOException ioe) { + System.err.println("Error writing to /tmp/foo.html"); System.exit(1); + } + + return false; + } + + static void test() { + + int result = 0; +/* + ArrayList<String> tester = new ArrayList<String>(); + HashMap<String,HashMap<String,String>> foundComment = null; + HashMap<String,HashMap<String,String>> expectedComment = null; + HashMap<String,String> oneComment = null; + + tester.add("/**"); + tester.add(" * Given an object displays a link to show information about the editing context of that object.*<br />"); + tester.add(" *"); + tester.add(" * @binding object"); + tester.add(" * /"); + tester.add(""); + + expectedComment = new HashMap<String,HashMap<String,String>>(); + + oneComment = new HashMap<String,String>(); + oneComment.put("name", "object"); + oneComment.put("comment", ""); + oneComment.put("order", "000"); + expectedComment.put(oneComment.get("name"), oneComment); + + foundComment = PageGenerator.findBindingComments(tester); + + result += checkTest("test1", tester, expectedComment, foundComment); +*/ + if (result > 0) { System.exit(1); } + } + + static int checkTest(String name, ArrayList<String> tester, Object expected, Object found) { + + if (name == null | name.length() == 0 || tester == null || expected == null || found == null) return 1; + + if (!found.equals(expected)) { + System.err.println("ERROR:"); + System.err.println("\n"+name+":\n"+tester+"\n"); + System.err.println("expected: \""+expected+"\"\n"); + System.err.println(" found: \""+found+"\"\n"); + return 1; + } else { + System.out.println(name+": ok"); + return 0; + } + } + + public static boolean validOptions(String[][] options, DocErrorReporter reporter) { + + srcDirs = new ArrayList<String>(); + + // System.out.println("options:"); + for (int idx = 0; idx < options.length; idx++) { + String[] opt = options[idx]; + for (int jdx = 0; jdx < opt.length; jdx++) { + if (jdx > 0 && options[idx][jdx-1].equals("-sourcepath")) { + int start = 0; + int end = options[idx][jdx].indexOf(":"); + while (end > 0) { + String dir = options[idx][jdx].substring(start, end); + srcDirs.add(dir); + start = end + 1; + end = options[idx][jdx].indexOf(":", start); + } + } + } + } + + java.util.HashMap<String,String> dirs = new java.util.HashMap<String,String>(); + + for (int idx = 0; idx < srcDirs.size(); idx++) { + //System.out.println("srcDirs["+idx+"] = \""+srcDirs.get(idx)+"\""); + int found = srcDirs.get(idx).indexOf("/Sources/"); + if (found > 0) + dirs.put(srcDirs.get(idx).substring(0,found)+File.separator+"Components"+File.separator, "ok"); + } + + compDirs = new ArrayList<String>(dirs.keySet()); + return true; + } + + public static int optionLength(String option) { + if (option.equals("-d")) return 2; + return 1; + } +} Added: trunk/Wonder/Build/taglets/PageGenerator.java =================================================================== --- trunk/Wonder/Build/taglets/PageGenerator.java (rev 0) +++ trunk/Wonder/Build/taglets/PageGenerator.java 2009-11-29 04:29:39 UTC (rev 10349) @@ -0,0 +1,420 @@ + +import java.util.ArrayList; +import java.util.List; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.TreeMap; +import java.util.TreeSet; +import java.util.Set; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.LineNumberReader; + +import com.sun.javadoc.FieldDoc; +import com.sun.javadoc.MethodDoc; +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.RootDoc; +import com.sun.javadoc.DocErrorReporter; + +import org.jdom.Attribute; +import org.jdom.Document; +import org.jdom.Element; + +import org.jdom.input.SAXBuilder; + +/** + * Doclet for generating the "Components" page. It searches for classes + * which have WOComponent as an ancestor and finds the resources associated + * with the component and pulls them together for the list. + * + * There is a test() method which, internally, checks the logic of the + * extractions. An new problemmatic comments are found, they can be added to + * that method. + */ +public class PageGenerator { + + static final String TABLE_TOP_START = "<table border=\"1\" width=\"100%\" cellpadding=\"3\" cellspacing=\"0\" summary=\"\">\n"+ + "<tr bgcolor=\"#CCCCFF\" class=\"TableHeadingColor\">\n"+ + "<th ALIGN=\"left\" colspan=\"2\"><font size=\"+2\">\n"; + + static final String TABLE_TOP_END = "</tr>\n"; + + static final String TABLE_END = "</table>\n"; + + static void dumpComps(HashMap<String,HashMap<String,Object>> comps) { + System.out.println(""); + Iterator<String> keys = comps.keySet().iterator(); + while (keys.hasNext()) { + String key = keys.next(); + System.out.println("key: \""+key+"\" -> "+comps.get(key)); + } + System.out.println(""); + } + + static void writeFileToWriter(String filename, FileWriter out) { + + File src = new File(filename); + FileReader fRdr = null; + + try { + fRdr = new FileReader(src); + } catch (java.io.FileNotFoundException fnfe) { throw new IllegalArgumentException(fnfe.getMessage()); } + + LineNumberReader rdr = new LineNumberReader(fRdr); + + String line = ""; + while (line != null) { + try { + line = rdr.readLine(); + } catch (java.io.IOException ioe) { line = null; } + + try { + if (line != null) out.write(line+"\n"); + } catch (java.io.IOException ioe) { throw new IllegalArgumentException(ioe.getMessage()); } + } + } + + /** + * Find the classes for the page being generated and return a HashMap that uses the classname + * as a key which points to another HashMap that contains data about the class. + */ + static HashMap<String,HashMap<String,Object>> findSubClassesFromAvailable(ClassDoc[] classes, String classname) { + + HashMap<String,HashMap<String,Object>> found = new HashMap<String,HashMap<String,Object>>(); + + for (int i = 0; i < classes.length; i++) { + + ClassDoc aCD = classes[i]; + + if (!aCD.toString().startsWith("com.webobjects")) { + ClassDoc parent = aCD.superclass(); + boolean done = false; + + while (parent != null && !done) { + if (parent.toString().equals(classname)) { + // System.out.println("found component: "+aCD); + found.put(aCD.toString(), new HashMap<String,Object>()); + done = true; + } + if (parent.toString().equals("java.lang.Object")) + done = true; + else + parent = parent.superclass(); + } + } + } + + return found; + } + + static void findSourceFiles(HashMap<String,HashMap<String,Object>> comps, ArrayList<String> srcDirs) { + + Iterator<String> keys = comps.keySet().iterator(); + while (keys.hasNext()) { + String key = keys.next(); + + int lastDot = 0; + int currentDot = key.indexOf(".", lastDot); + while (currentDot > lastDot) { + lastDot = currentDot; + currentDot = key.indexOf(".", lastDot+1); + } + String leaf = key.substring(lastDot+1); + comps.get(key).put("componentName", leaf); + + boolean found = false; + + String srcDir = key.replaceAll("\\.", File.separator); + + for (int jdx = 0; !found && jdx < srcDirs.size(); jdx++) { + String srcFilename = srcDirs.get(jdx)+File.separator+leaf+".java"; + if ((new File(srcFilename)).exists()) + comps.get(key).put("sourceFile", srcFilename); + } + } + } + + static void findPackages(HashMap<String,HashMap<String,Object>> comps) { + + Iterator<String> keys = comps.keySet().iterator(); + while (keys.hasNext()) { + String key = keys.next(); + String[] parts = key.split("\\."); + if (parts.length == 0) + comps.get(key).put("package", "NONE"); + else { + comps.get(key).put("package", key.substring(0,key.length()-parts[parts.length-1].length()-1)); + } + } + } + + static void findApiFiles(HashMap<String,HashMap<String,Object>> comps, ArrayList<String> compDirs) { + + Iterator keys = comps.keySet().iterator(); + while (keys.hasNext()) { + String key = keys.next().toString(); + + int lastDot = 0; + int currentDot = key.indexOf(".", lastDot); + while (currentDot > lastDot) { + lastDot = currentDot; + currentDot = key.indexOf(".", lastDot+1); + } + String leaf = key.substring(lastDot+1); + comps.get(key).put("componentName", leaf); + + boolean found = false; + + for (int jdx = 0; !found && jdx < compDirs.size(); jdx++) { + String apiFilename = compDirs.get(jdx)+leaf+".api"; + File apiFile = new File(apiFilename); + if (apiFile.exists()) + comps.get(key).put("apiFile", apiFilename); + } + } + } + + static void gatherAllComments(HashMap<String,HashMap<String,Object>> comps) { + + Iterator<String> keys = comps.keySet().iterator(); + while (keys.hasNext()) { + String key = keys.next().toString(); + + FileReader fRdr = null; + String srcFilename = (String)comps.get(key).get("sourceFile"); + if (srcFilename != null) { + try { + fRdr = new FileReader(srcFilename); + } catch (java.io.FileNotFoundException fnfe) { System.out.println(fnfe.getMessage()); System.exit(1); } + + LineNumberReader rdr = new LineNumberReader(fRdr); + + boolean done = false; + boolean inComment = false; + + ArrayLi... [truncated message content] |