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
13
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
36
37
38
39
40
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
63
64
65
66 } catch (Exception ee) {
67 ee.printStackTrace();
68 }
69 } else {
70 System.out.println("[JavadocExtractor] Object InputStream was NULL");
71 }
72
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
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
120
121
122
123
124
125
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
146
147
148
149
150
151
152
153
154
155
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);
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
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 }