View Javadoc

1   package org.woopi.ant.taskdefs.junit;
2   import com.sun.javadoc.*;
3   import java.util.Hashtable;
4   import java.util.Map;
5   import java.io.FileOutputStream;
6   import java.io.InputStream;
7   import java.io.File;
8   import java.io.ObjectInputStream;
9   import java.io.ObjectOutputStream;
10  import java.util.regex.Matcher;
11  import java.util.regex.Pattern;
12  // import com.thoughtworks.xstream.XStream;
13  // import com.thoughtworks.xstream.io.xml.DomDriver;
14  
15  public class JavadocExtractor {
16  
17    public static String testMethodName;
18    public static String testMethodJavadocText;
19    public static Map<String,String> methodNameToJavadocsMap;
20    public static String destDir = null;
21    
22    public static boolean start(RootDoc root) {
23        ClassDoc[] classes = root.classes();
24        if (destDir == null) {
25          setDestDir(root);
26        }
27        handleClassDocs(classes);
28        classes =	root.specifiedClasses();
29        handleClassDocs(classes);
30        return true;
31    }
32    
33    public static void setDestDir(RootDoc root) {
34      /*
35      String[][] opts = root.options();
36      for (int i=0;i<opts.length;i++) {
37        if (opts[i][0].equals("-d")) {
38          if (opts[i].length >= 2)
39            this.destDir = opts[i][1];
40          System.out.println(".. destination dir option found : "+destDir);
41        }
42      }
43      */
44      destDir = System.getProperty("JavadocExtractor.destDir");
45      System.out.println(".. destination dir option found : "+destDir);
46    }
47    
48    public static String getMethodDocByObject(Object o, String methodName){
49      System.out.println("[JavadocExtractor] getMethodDoc(Object,String) called)");
50      String result = "";
51      String className = o.getClass().getName();
52      String classDocObjectstreamResourceName = "/"+className.replace(".","/")+".objectstream";
53      InputStream is = o.getClass().getResourceAsStream(classDocObjectstreamResourceName);
54      if (is != null) {
55        try {
56          ObjectInputStream ois  = new ObjectInputStream(is);
57          Map<String,String> docMap = (Map<String,String>)ois.readObject();
58          result = docMap.get(methodName);
59          if (result == null) result = "";
60          
61          /*
62          XStream xstream = new XStream(new DomDriver());
63          ClassDoc classDoc = (ClassDoc)xstream.fromXML(is);
64          result = getMethodDocByClassDoc(classDoc,methodName);
65          */
66        } catch (Exception ee) {
67          ee.printStackTrace();
68        }
69      } else {
70        System.out.println("[JavadocExtractor] Object InputStream was NULL"); 
71      }
72      // result = "Test";
73      return result;
74    }
75  
76    public static void setDestDir(String destDirP) {
77      destDir = destDirP;
78    }
79    
80    public static void handleClassDocs(ClassDoc[] classes) {
81        for (int i = 0; i < classes.length; ++i) {
82          methodNameToJavadocsMap = new Hashtable<String,String>();
83          System.out.println("\n\ngoing to handle class "+classes[i]);
84          MethodDoc[] methDocs = classes[i].methods();
85          for (int k=0;k<methDocs.length;k++) {
86            methodNameToJavadocsMap.put(methDocs[k].name(),methDocs[k].commentText());
87          }
88          if (destDir != null) {
89            serialize(classes[i].qualifiedName(),methodNameToJavadocsMap);
90            serialize(classes[i].qualifiedName(),classes[i]);
91          }
92        }
93    }
94  
95    public static String getMethodDocByClassDoc(ClassDoc classDoc,String methodName) {
96      System.out.println("[JavadocExtractor]getMethodDoc(ClassDoc,String) called)");
97      String result = "";
98      MethodDoc[] methDocs = classDoc.methods();
99      System.out.println("[JavadocExtractor][getMethodDoc(ClassDoc,String)] methDocs.length "+methDocs.length);
100     for (int k=0;k<methDocs.length;k++) {
101       System.out.println("[JavadocExtractor][getMethodDoc(ClassDoc,String)] methodNames "+methDocs[k].name()+" / "+methodName);
102       if (methDocs[k].name().equals(methodName)) {
103         result = methDocs[k].commentText();
104         break;
105       }
106     }
107     // result = "test ClassDoc";
108     return result;
109   }
110 
111   public static void serialize(String fqcn, Map<String,String> map) {
112     try {
113       String classPath = fqcn.replace(".","/")+".objectstream";
114       System.out.println(".. going to serialize data for class "+classPath);
115       String destFile = destDir+"/"+classPath;
116       mkdirs(destFile);
117       FileOutputStream fos = new FileOutputStream(destFile);
118       /*
119       XStream xstream = new XStream(new DomDriver());
120       xstream.toXML(map, fos);
121       fos.close();
122       
123       java.beans.XMLEncoder enc = new java.beans.XMLEncoder(fos);
124       enc.writeObject(map);
125       enc.close();
126       */
127       ObjectOutputStream oos = new ObjectOutputStream(fos);
128       oos.writeObject(map);
129       oos.close();
130       
131     } catch (Exception e) {
132       e.printStackTrace();
133     }
134   }
135 
136   public static void serialize(String fqcn, ClassDoc classDoc) {
137     try {
138       String classPath = fqcn.replace(".","/")+".ClassDoc.objectstream";
139       System.out.println(".. going to serialize data for class "+classPath);
140       String destFile = destDir+"/"+classPath;
141       mkdirs(destFile);
142       FileOutputStream fos = new FileOutputStream(destFile);
143       fos.close();
144       /*
145       XStream xstream = new XStream(new DomDriver());
146       xstream.toXML(classDoc, fos);
147       fos.close();
148       
149       java.beans.XMLEncoder enc = new java.beans.XMLEncoder(fos);
150       enc.writeObject(classDoc);
151       enc.close();
152       
153       ObjectOutputStream oos = new ObjectOutputStream(fos);
154       oos.writeObject(classDoc);
155       oos.close();
156       */
157     } catch (Exception e) {
158       e.printStackTrace();
159     }
160   }
161   
162   public static void mkdirs(String file) {
163     Pattern p = Pattern.compile("(.*)/([^/]+)");
164     Matcher m = p.matcher(file);
165     String dirPart = "";
166     if (m.matches()) {
167       dirPart = m.group(1); // group 0 is everything that matches!
168       System.out.println("... pattern matches  "+m.group(1)+" -- "+m.group(2));
169     }
170     System.out.println("... going to check dir "+dirPart);
171     File dirPartFile = new File(dirPart);
172     try {
173       if (!dirPartFile.exists()) {
174         System.out.println("... going to create dir "+dirPart);
175         dirPartFile.mkdirs();
176       }
177     } catch (Exception ee) {
178       ee.printStackTrace();
179     }
180   }
181   
182   public String getJavadocText(String pathToClassSource, String testMethodName) {
183     String result = null;
184     this.destDir = null;
185     this.testMethodName = testMethodName;
186     getJavadocText(pathToClassSource);
187     result = methodNameToJavadocsMap.get(testMethodName);
188     if (result==null) result = "";
189     return result;
190   }    
191 
192   public Map<String,String> getJavadocText(String pathToClassSource) {
193     Map<String,String> result = null;
194     this.destDir = null;
195     this.methodNameToJavadocsMap = new Hashtable<String,String>();
196     String[] cmdLineParameters = 
197       new String[] {"-docletpath", "",
198                     "-doclet", "org.woopi.ant.taskdefs.junit.JavadocExtractor", 
199                     // "-sourcepath", "/home/usr/src", 
200                     pathToClassSource};
201     com.sun.tools.javadoc.Main.execute(cmdLineParameters);    
202     result = methodNameToJavadocsMap;
203     return result;
204   }    
205   
206   public void generateJavadocText(String destDir, String sourceDir, String[] subpackages) {
207     this.destDir = destDir;
208     String subpackagesConcated = "";
209     for (int i=0;i<subpackages.length;i++) {
210       if (i>0) subpackagesConcated += ":";
211       subpackagesConcated += subpackages[i];
212     }
213     String[] cmdLineParameters = 
214       new String[] {"-docletpath", "",
215                     "-doclet", "org.woopi.ant.taskdefs.junit.JavadocExtractor", 
216                     "-sourcepath", sourceDir,
217                     "-subpackages", subpackagesConcated};
218     com.sun.tools.javadoc.Main.execute(cmdLineParameters);    
219   }  
220   
221 }