1 /***************************************************************************************
2 * Copyright (c) Jonas BonŽr, Alexandre Vasseur. All rights reserved. *
3 * http://aspectwerkz.codehaus.org *
4 * ---------------------------------------------------------------------------------- *
5 * The software in this package is published under the terms of the LGPL license *
6 * a copy of which has been included with this distribution in the license.txt file. *
7 **************************************************************************************/
8 package org.codehaus.aspectwerkz.expression;
9
10 import com.thoughtworks.qdox.JavaDocBuilder;
11 import com.thoughtworks.qdox.model.JavaClass;
12 import com.thoughtworks.qdox.model.JavaField;
13 import com.thoughtworks.qdox.model.JavaMethod;
14 import com.thoughtworks.qdox.model.JavaParameter;
15 import com.thoughtworks.qdox.model.Type;
16
17 import org.codehaus.aspectwerkz.exception.DefinitionException;
18
19 import java.io.File;
20 import java.util.ArrayList;
21 import java.util.Collection;
22 import java.util.Iterator;
23
24 /***
25 * Parses a src tree with <code>QDox</code>.
26 *
27 * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a>
28 */
29 public class QDoxParser {
30 /***
31 * The QDox builder.
32 */
33 private JavaDocBuilder m_builder = new JavaDocBuilder();
34
35 /***
36 * The parsed java class.
37 */
38 private JavaClass m_class;
39
40 /***
41 * The name of the class.
42 */
43 private String m_className;
44
45 /***
46 * Transforms the QDox JavaMethod parameters to a String array with the types represented as strings.
47 *
48 * @param method the JavaMethod
49 * @return an array with the types as strings
50 */
51 public static String[] getJavaMethodParametersAsStringArray(final JavaMethod method) {
52 JavaParameter[] javaParameters = method.getParameters();
53 String[] parameters = new String[javaParameters.length];
54 for (int i = 0; i < javaParameters.length; i++) {
55 Type type = javaParameters[i].getType();
56 int dimensions = type.getDimensions();
57 StringBuffer parameter = new StringBuffer(type.getValue());
58 for (int j = 0; j < dimensions; j++) {
59 parameter.append("[]");
60 }
61 parameters[i] = parameter.toString();
62 }
63 return parameters;
64 }
65
66 /***
67 * Adds a source tree to the builder.
68 *
69 * @param srcDir the source tree
70 */
71 public QDoxParser(final String srcDir) {
72 m_builder.addSourceTree(new File(srcDir));
73 }
74
75 /***
76 * Parses a specific class.
77 *
78 * @param className the name of the class to compile
79 * @return true if class was found and false otherwise
80 * @todo QDox seems to have a problem retrieving inner classes => null
81 */
82 public boolean parse(final String className) {
83 m_class = m_builder.getClassByName(className);
84 if (m_class == null) {
85 return false;
86 }
87 m_className = m_class.getFullyQualifiedName();
88 return true;
89 }
90
91 /***
92 * Returns the QDox JavaClass.
93 *
94 * @return the QDox JavaClass
95 */
96 public JavaClass getJavaClass() {
97 if ((m_class == null) && (m_className == null)) {
98 throw new DefinitionException("no class has been parsed, call parse(..) first");
99 }
100 if (m_class == null) {
101 throw new DefinitionException(
102 "could not find source file for "
103 + m_className
104 + " (have you specified the correct srcDir)"
105 );
106 }
107 return m_class;
108 }
109
110 /***
111 * Returns all classes.
112 *
113 * @return a collections with all classes
114 */
115 public String[] getAllClassNames() {
116 Collection classes = m_builder.getClassLibrary().all();
117 Collection classNames = new ArrayList();
118 String className = null;
119 for (Iterator it = classes.iterator(); it.hasNext();) {
120 className = (String) it.next();
121 if ("java.lang.Object".equals(className)) {
122 continue;
123 }
124 classNames.add(className);
125 }
126 return (String[]) classNames.toArray(new String[]{});
127 }
128
129 /***
130 * Parses a specific class A returns an array with the methods.
131 *
132 * @return an array with the methods
133 */
134 public JavaMethod[] getJavaMethods() {
135 if ((m_class == null) && (m_className == null)) {
136 throw new DefinitionException("no class has been parsed, call parse(..) first");
137 }
138 if (m_class == null) {
139 throw new DefinitionException(
140 "could not find source file for "
141 + m_className
142 + " (have you specified the correct srcDir)"
143 );
144 }
145 return m_class.getMethods();
146 }
147
148 /***
149 * Parses a specific class A returns an array with the methods.
150 *
151 * @return an array with the methods
152 */
153 public JavaField[] getJavaFields() {
154 if ((m_class == null) && (m_className == null)) {
155 throw new DefinitionException("no class has been parsed, call parse(..) first");
156 }
157 if (m_class == null) {
158 throw new DefinitionException(
159 "could not find source file for "
160 + m_className
161 + " (have you specified the correct srcDir)"
162 );
163 }
164 return m_class.getFields();
165 }
166 }