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("could not find source file for "
102 + m_className
103 + " (have you specified the correct srcDir)");
104 }
105 return m_class;
106 }
107
108 /***
109 * Returns all classes.
110 *
111 * @return a collections with all classes
112 */
113 public String[] getAllClassNames() {
114 Collection classes = m_builder.getClassLibrary().all();
115 Collection classNames = new ArrayList();
116 String className = null;
117 for (Iterator it = classes.iterator(); it.hasNext();) {
118 className = (String) it.next();
119 if ("java.lang.Object".equals(className)) {
120 continue;
121 }
122 classNames.add(className);
123 }
124 return (String[]) classNames.toArray(new String[] {});
125 }
126
127 /***
128 * Parses a specific class A returns an array with the methods.
129 *
130 * @return an array with the methods
131 */
132 public JavaMethod[] getJavaMethods() {
133 if ((m_class == null) && (m_className == null)) {
134 throw new DefinitionException("no class has been parsed, call parse(..) first");
135 }
136 if (m_class == null) {
137 throw new DefinitionException("could not find source file for "
138 + m_className
139 + " (have you specified the correct srcDir)");
140 }
141 return m_class.getMethods();
142 }
143
144 /***
145 * Parses a specific class A returns an array with the methods.
146 *
147 * @return an array with the methods
148 */
149 public JavaField[] getJavaFields() {
150 if ((m_class == null) && (m_className == null)) {
151 throw new DefinitionException("no class has been parsed, call parse(..) first");
152 }
153 if (m_class == null) {
154 throw new DefinitionException("could not find source file for "
155 + m_className
156 + " (have you specified the correct srcDir)");
157 }
158 return m_class.getFields();
159 }
160 }