1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.james.mailet;
21
22 import org.apache.mailet.Mailet;
23 import org.apache.mailet.Matcher;
24 import org.apache.maven.artifact.DependencyResolutionRequiredException;
25 import org.apache.maven.plugin.logging.Log;
26 import org.apache.maven.project.MavenProject;
27
28 import com.thoughtworks.qdox.JavaDocBuilder;
29 import com.thoughtworks.qdox.model.JavaClass;
30
31 import java.io.File;
32 import java.lang.reflect.InvocationTargetException;
33 import java.net.MalformedURLException;
34 import java.net.URL;
35 import java.net.URLClassLoader;
36 import java.util.Iterator;
37 import java.util.LinkedList;
38 import java.util.List;
39 import java.util.Set;
40
41
42
43
44
45 public class DefaultDescriptorsExtractor implements DescriptorsExtractor {
46
47
48
49
50 public List extractDescriptors(MavenProject project, Log log) {
51
52 List res = new LinkedList();
53
54 JavaDocBuilder builder = new JavaDocBuilder();
55 for (Iterator i = project.getCompileSourceRoots().iterator(); i
56 .hasNext();) {
57 builder.addSourceTree(new File((String) i.next()));
58 }
59 JavaClass[] classes = builder.getClasses();
60
61 URL[] urls = null;
62 URLClassLoader classLoader = null;
63 try {
64 try {
65 List cpes = project.getCompileClasspathElements();
66 urls = new URL[cpes.size()];
67 for (int k = 0; k < cpes.size(); k++) {
68 log.debug("CPE: " + cpes.get(k));
69 urls[k] = new File((String) cpes.get(k)).toURI().toURL();
70 }
71 classLoader = new URLClassLoader(urls);
72 } catch (DependencyResolutionRequiredException e1) {
73 log.error(e1);
74 }
75 } catch (MalformedURLException e) {
76 log.error(e);
77 }
78 Set dependencies = project.getDependencyArtifacts();
79 if (dependencies != null)
80 for (Iterator i = dependencies.iterator(); i.hasNext();) {
81 log.debug("DEP: " + i.next());
82 }
83
84 log
85 .debug("OutDir: " + project.getBuild().getOutputDirectory());
86
87 for (int i = 0; i < classes.length; i++) {
88 log.debug("Class: " + classes[i].getFullyQualifiedName());
89 try {
90 Class klass = classLoader.loadClass(classes[i]
91 .getFullyQualifiedName());
92
93 log.debug("Constr: " + klass.getConstructor(null));
94
95 List zuper = getAllInterfaces(klass);
96 Class mailetClass = classLoader.loadClass(Mailet.class
97 .getName());
98 Class matcherClass = classLoader.loadClass(Matcher.class
99 .getName());
100 if (zuper.contains(mailetClass)) {
101 Object m = klass.newInstance();
102 String mailetInfo = (String) klass.getMethod(
103 "getMailetInfo", null).invoke(m, null);
104 log.info("Found a Mailet: " + klass.getName());
105 MailetMatcherDescriptor mmdesc = new MailetMatcherDescriptor();
106 mmdesc.setName(classes[i].getName());
107 mmdesc.setFullyQualifiedName(classes[i]
108 .getFullyQualifiedName());
109 mmdesc.setType(MailetMatcherDescriptor.TYPE_MAILET);
110 if (mailetInfo != null && mailetInfo.length() > 0) {
111 mmdesc.setInfo(mailetInfo);
112 }
113 mmdesc.setClassDocs(classes[i].getComment());
114 res.add(mmdesc);
115
116 } else if (zuper.contains(matcherClass)) {
117 Object m = klass.newInstance();
118 String matcherInfo = (String) klass.getMethod(
119 "getMatcherInfo", null).invoke(m, null);
120 log.info("Found a Matcher: " + klass.getName());
121 MailetMatcherDescriptor mmdesc = new MailetMatcherDescriptor();
122 mmdesc.setName(classes[i].getName());
123 mmdesc.setFullyQualifiedName(classes[i]
124 .getFullyQualifiedName());
125 mmdesc.setType(MailetMatcherDescriptor.TYPE_MATCHER);
126 if (matcherInfo != null && matcherInfo.length() > 0) {
127 mmdesc.setInfo(matcherInfo);
128 }
129 mmdesc.setClassDocs(classes[i].getComment());
130 res.add(mmdesc);
131 } else if (zuper.size() > 0) {
132 for (int k = 0; k < zuper.size(); k++) {
133 log.debug("I: " + ((Class) zuper.get(k)).getName());
134 }
135 } else {
136 log.debug("No interfaces for " + klass.getName());
137 }
138
139 } catch (ClassNotFoundException e) {
140 log.error("NotFound: " + e.getMessage());
141 } catch (InstantiationException e) {
142 log.info("IE: " + e.getMessage()+" / Probably an abstract mailet/matcher: "+classes[i].getName());
143 } catch (IllegalAccessException e) {
144 log.error("IAE: " + e.getMessage());
145 } catch (SecurityException e) {
146 log.error("SE: " + e.getMessage());
147 } catch (NoSuchMethodException e) {
148 log.error("NSME: " + e.getMessage());
149 } catch (IllegalArgumentException e) {
150 log.error("IAE2: " + e.getMessage());
151 } catch (InvocationTargetException e) {
152 log.error("ITE: " + e.getMessage());
153 }
154
155 List implementedInterfaces = getAllInterfacesQdox(classes[i]);
156 for (int k = 0; k < implementedInterfaces.size(); k++) {
157 log.info("I: " + implementedInterfaces.get(k));
158 }
159
160 }
161
162 return res;
163 }
164
165
166 private List getAllInterfacesQdox(JavaClass javaClass) {
167 List res = new LinkedList();
168 if (javaClass.getImplementedInterfaces() != null) {
169 JavaClass[] interfaces = javaClass.getImplementedInterfaces();
170 for (int n = 0; n < interfaces.length; n++) {
171 res.add(interfaces[n]);
172 }
173 }
174 if (javaClass.getSuperJavaClass() != null) {
175 res.addAll(getAllInterfacesQdox(javaClass.getSuperJavaClass()));
176 }
177 return res;
178 }
179
180 private List getAllInterfaces(Class klass) {
181 List res = new LinkedList();
182 if (klass.getInterfaces() != null) {
183 Class[] interfaces = klass.getInterfaces();
184 for (int n = 0; n < interfaces.length; n++) {
185 res.add(interfaces[n]);
186
187 res.addAll(getAllInterfaces(interfaces[n]));
188 }
189 }
190 if (klass.getSuperclass() != null) {
191 res.addAll(getAllInterfaces(klass.getSuperclass()));
192 }
193 return res;
194
195 }
196
197 }