View Javadoc

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 }