11package com .hsjfans .github .parser ;
22
3- import com .github .javaparser .ast .CompilationUnit ;
43import com .github .javaparser .ast .body .FieldDeclaration ;
54import com .github .javaparser .ast .body .MethodDeclaration ;
65import com .github .javaparser .ast .body .TypeDeclaration ;
1615import com .hsjfans .github .util .*;
1716
1817import java .io .File ;
19- import java .lang .reflect .*;
18+ import java .lang .reflect .Method ;
19+ import java .lang .reflect .Modifier ;
20+ import java .lang .reflect .Parameter ;
21+ import java .lang .reflect .Type ;
2022import java .util .Arrays ;
2123import java .util .List ;
2224import java .util .Optional ;
2628 * @author hsjfans[hsjfans.scholar@gmail.com]
2729 */
2830
29- public abstract class AbstractParser implements Parser {
31+ public abstract class AbstractParser implements Parser {
3032
31- public static ClassLoader classLoader ;
33+ public static ClassLoader classLoader ;
3234
3335 protected final Config config ;
3436
3537 private final ApiTree apiTree ;
3638
37- public AbstractParser (Config config ){
39+ public AbstractParser (Config config ) {
3840 this .config = config ;
39- classLoader = new GradleClassLoader (config );
41+ classLoader = new ApiClassLoader (config );
4042 this .apiTree = new ApiTree ();
4143 }
4244
@@ -47,17 +49,18 @@ public AbstractParser(Config config){
4749
4850
4951 /**
50- * 解析单个 controllerClass 文件
52+ * 解析单个 controllerClass 文件
53+ *
5154 * @param cl not null
5255 * @return the controllerMethod
5356 * @see ControllerClass
5457 */
55- protected ControllerClass parseControllerClass (Class <?> cl ){
58+ protected ControllerClass parseControllerClass (Class <?> cl ) {
5659
57- ControllerClass controllerClass =ControllerClass .of (cl );
60+ ControllerClass controllerClass = ControllerClass .of (cl );
5861
5962 //第一步 解析 controller 注释
60- parseControllerClassDoc (cl ,controllerClass );
63+ parseControllerClassDoc (cl , controllerClass );
6164
6265 //第二步 解析 设置 method
6366 controllerClass .setControllerMethod (parseControllerMethods (cl ));
@@ -68,21 +71,22 @@ protected ControllerClass parseControllerClass(Class<?> cl){
6871
6972
7073 /**
71- * 解析 class 的 methods
74+ * 解析 class 的 methods
75+ *
7276 * @param cl not null
7377 * @return ControllerMethods
7478 */
75- protected List <ControllerMethod > parseControllerMethods (Class <?> cl ){
79+ protected List <ControllerMethod > parseControllerMethods (Class <?> cl ) {
7680
7781 Method [] methods = cl .getDeclaredMethods ();
7882 TypeDeclaration <?> typeDeclaration = ClassCache .getTypeDeclaration (cl .getName ());
7983 List <ControllerMethod > controllerMethods = Lists .newArrayListWithCapacity (methods .length );
8084 // just public method
8185 // and has PostMapping GetMapping ...
8286 Arrays .stream (methods ).filter (SpringUtil ::isSpringMethods ).forEach (method -> {
83- List <MethodDeclaration > methodDeclarations = typeDeclaration .getMethodsBySignature (method .getName (),ClassUtils .methodSignature (method ));
84- if (methodDeclarations .size ()> 0 ) {
85- Optional .ofNullable (parseControllerMethod (methodDeclarations .get (0 ),method )).ifPresent (controllerMethods ::add );
87+ List <MethodDeclaration > methodDeclarations = typeDeclaration .getMethodsBySignature (method .getName (), ClassUtils .methodSignature (method ));
88+ if (methodDeclarations .size () > 0 ) {
89+ Optional .ofNullable (parseControllerMethod (methodDeclarations .get (0 ), method )).ifPresent (controllerMethods ::add );
8690 }
8791 });
8892 return controllerMethods ;
@@ -91,30 +95,30 @@ protected List<ControllerMethod> parseControllerMethods(Class<?> cl){
9195 protected abstract List <ClassField > parseParameterClassField (Parameter parameter );
9296
9397
94- protected abstract ControllerMethod parseControllerMethod (MethodDeclaration methodDeclaration , Method method );
98+ protected abstract ControllerMethod parseControllerMethod (MethodDeclaration methodDeclaration , Method method );
9599
96100
97101 /**
98- * 过滤 java 文件
102+ * 过滤 java 文件
99103 */
100- protected Set <Class <?>> parseJavaFiles (Set <File > javaFiles ){
104+ protected Set <Class <?>> parseJavaFiles (Set <File > javaFiles ) {
101105
102106 final Set <Class <?>> controllerClasses = Sets .newHashSet ();
103- javaFiles .forEach (file -> {
104- if (!FileUtil .filterTest (config .getPackageName (),file )){
107+ javaFiles .forEach (file -> {
108+ if (!FileUtil .filterTest (config .getPackageName (), file )) {
105109 Optional .ofNullable (ClassUtils .parseJavaFile (file )).ifPresent (compilationUnit -> {
106110 compilationUnit .getPackageDeclaration ().ifPresent (packageDeclaration -> {
107111 String packageName = packageDeclaration .getNameAsString ();
108112 compilationUnit .getPrimaryType ().ifPresent (typeDeclaration -> {
109- String className = packageName + "." + typeDeclaration .getName ();
110- Class <?> cl ;
113+ String className = packageName + "." + typeDeclaration .getName ();
114+ Class <?> cl ;
111115 try {
112116 cl = classLoader .loadClass (className );
113- ClassCache .putTypeDeclaration (className ,typeDeclaration );
114- ClassCache .putClass (className ,cl );
117+ ClassCache .putTypeDeclaration (className , typeDeclaration );
118+ ClassCache .putClass (className , cl );
115119 controllerClasses .add (cl );
116120 } catch (ClassNotFoundException e ) {
117- LogUtil .error (" 加载类失败 e={} " ,e );
121+ LogUtil .error (" 加载类失败 e={} " , e );
118122 }
119123 });
120124 });
@@ -130,20 +134,20 @@ protected Set<Class<?>> parseJavaFiles(Set<File> javaFiles){
130134
131135 @ Override
132136 public ApiTree parse (String projectPath , boolean recursive ) throws ParserException {
133- LogUtil .info ("开始解析 projectPath = %s " ,projectPath );
134- Set <File > javaFiles = ClassUtils .scan (projectPath ,true );
137+ LogUtil .info ("开始解析 projectPath = %s " , projectPath );
138+ Set <File > javaFiles = ClassUtils .scan (projectPath , true );
135139 Set <ControllerClass > controllerClasses = Sets .newHashSet ();
136- getAllControllerClass (javaFiles ).forEach (cl -> controllerClasses .add (this .parseControllerClass (cl )));
140+ getAllControllerClass (javaFiles ).forEach (cl -> controllerClasses .add (this .parseControllerClass (cl )));
137141 this .apiTree .insertAll (controllerClasses );
138142 return apiTree ;
139143 }
140144
141145
142146 @ Override
143147 public ApiTree parse (List <String > projectPaths , boolean recursive ) throws ParserException {
144- projectPaths .forEach (path -> {
148+ projectPaths .forEach (path -> {
145149 try {
146- this .apiTree .union (this .parse (path ,recursive ));
150+ this .apiTree .union (this .parse (path , recursive ));
147151 } catch (ParserException e ) {
148152 e .printStackTrace ();
149153 }
@@ -152,115 +156,113 @@ public ApiTree parse(List<String> projectPaths, boolean recursive) throws Parser
152156 }
153157
154158
155-
156159 /**
157- *
158160 * 解析 field 参数
159161 * 支持`request`请求以及`response`返回值
162+ *
160163 * @param request the request param class
161164 */
162- protected static List <ClassField > parserClassFields (Type type ,Class <?> request , boolean response ){
165+ protected static List <ClassField > parserClassFields (Type type , Class <?> request , boolean response ) {
163166
164167 List <ClassField > classFields = Lists .newArrayList ();
165168
166- if (request .isEnum ()){
169+ if (request .isEnum ()) {
167170 ClassField classField = new ClassField ();
168171 Object [] enumValues = ClassUtils .getEnumValues (request );
169172 classField .setType ("String" );
170173 classField .setEnumValues (enumValues );
171174 classField .setEnumType (true );
172175 classFields .add (classField );
173176 return classFields ;
174- } else if (request .isArray ()){
177+ } else if (request .isArray ()) {
175178 ClassField classField = new ClassField ();
176179 classField .setType (request .getTypeName ());
177180 classField .setName (request .getSimpleName ());
178181 classField .setArray (true );
179- classField .setFields (parserClassFields (type ,request .getComponentType (),response ));
182+ classField .setFields (parserClassFields (type , request .getComponentType (), response ));
180183 classFields .add (classField );
181184 return classFields ;
182- }else {
185+ } else {
183186 // 如果是标准库的集合类型
184- Class <?> c = ClassUtils .isCollection (type );
185- if ( c != null ){
187+ Class <?> c = ClassUtils .isCollection (type );
188+ if ( c != null ) {
186189 ClassField classField = new ClassField ();
187190 classField .setType (request .getTypeName ());
188191 classField .setName (request .getSimpleName ());
189192 classField .setArray (true );
190- classField .setFields (parserClassFields (c .getComponentType (),c , response ));
193+ classField .setFields (parserClassFields (c .getComponentType (), c , response ));
191194 classFields .add (classField );
192195 return classFields ;
193196 }
194197
195198 }
196199
197200 TypeDeclaration typeDeclaration = ClassCache .getTypeDeclaration (request .getName ());
198- if (typeDeclaration == null ){
199- LogUtil .error (" 没有找到对应的 typeDeclaration key= %s " ,request .getName ());
201+ if (typeDeclaration == null ) {
202+ LogUtil .error (" 没有找到对应的 typeDeclaration key= %s " , request .getName ());
200203 return classFields ;
201204 }
202205
203206 // 结构字段解析
204207 Arrays .stream (request .getDeclaredFields ()).filter (
205- field -> !field .isSynthetic ()&&
208+ field -> !field .isSynthetic () &&
206209 (field .getModifiers () & Modifier .FINAL ) == 0
207- && (field .getModifiers () & Modifier .STATIC )== 0
208- && (field .getModifiers () & Modifier .NATIVE )== 0
209- && (field .getModifiers () & Modifier .ABSTRACT )== 0
210- && (field .getModifiers () & Modifier .INTERFACE )== 0
211- && (field .getModifiers () & Modifier .TRANSIENT )== 0
210+ && (field .getModifiers () & Modifier .STATIC ) == 0
211+ && (field .getModifiers () & Modifier .NATIVE ) == 0
212+ && (field .getModifiers () & Modifier .ABSTRACT ) == 0
213+ && (field .getModifiers () & Modifier .INTERFACE ) == 0
214+ && (field .getModifiers () & Modifier .TRANSIENT ) == 0
212215 ).forEach (field -> {
213216 // 类型信息,这里填充
214217 ClassField classField = new ClassField ();
215218 classField .setType (field .getType ().getTypeName ());
216219 classField .setName (field .getName ());
217220 // 先填充注释信息
218221 typeDeclaration .getFieldByName (field .getName ()).ifPresent (fieldDeclaration -> {
219- if (((FieldDeclaration )fieldDeclaration ).getComment ().isPresent ()){
220- Javadoc javadoc = ((FieldDeclaration )fieldDeclaration ).getComment ().get ().parse ();
222+ if (((FieldDeclaration ) fieldDeclaration ).getComment ().isPresent ()) {
223+ Javadoc javadoc = ((FieldDeclaration ) fieldDeclaration ).getComment ().get ().parse ();
221224
222- Optional <JavadocBlockTag > ignoreOpt = CollectionUtil .contains (javadoc .getBlockTags (),JavadocBlockTag .Type .IGNORE );
225+ Optional <JavadocBlockTag > ignoreOpt = CollectionUtil .contains (javadoc .getBlockTags (), JavadocBlockTag .Type .IGNORE );
223226 ignoreOpt .ifPresent (javadocBlockTag -> {
224227 classField .setIgnore (true );
225228 classField .setDescription (javadocBlockTag .getContent ().toText ());
226229 });
227- if (classField .isIgnore ()){
230+ if (classField .isIgnore ()) {
228231 return ;
229232 }
230233 // if contains `@name`
231- CollectionUtil .contains (javadoc .getBlockTags (),JavadocBlockTag .Type .NAME ).ifPresent (javadocBlockTag -> {
234+ CollectionUtil .contains (javadoc .getBlockTags (), JavadocBlockTag .Type .NAME ).ifPresent (javadocBlockTag -> {
232235 classField .setName (javadocBlockTag .getContent ().toText ());
233236 classField .setDescription (javadocBlockTag .getContent ().toText ());
234237 });
235238 // if contains `@fuzzy`
236- CollectionUtil .contains (javadoc .getBlockTags (),JavadocBlockTag .Type .FUZZY ).ifPresent (javadocBlockTag -> {
239+ CollectionUtil .contains (javadoc .getBlockTags (), JavadocBlockTag .Type .FUZZY ).ifPresent (javadocBlockTag -> {
237240 classField .setFuzzy (true );
238241 classField .setDescription (javadocBlockTag .getContent ().toText ());
239242 });
240243 // if contains `@nullable`
241- CollectionUtil .contains (javadoc .getBlockTags (),JavadocBlockTag .Type .NULLABLE ).ifPresent (javadocBlockTag -> {
244+ CollectionUtil .contains (javadoc .getBlockTags (), JavadocBlockTag .Type .NULLABLE ).ifPresent (javadocBlockTag -> {
242245 classField .setNullable (true );
243246 classField .setDescription (javadocBlockTag .getContent ().toText ());
244247 });
245- if (!javadoc .getDescription ().toText ().isEmpty ()){
248+ if (!javadoc .getDescription ().toText ().isEmpty ()) {
246249 classField .setDescription (javadoc .getDescription ().toText ());
247250 }
248251 }
249252 });
250253
251254 // 如果 参数被忽略,跳过
252- if (classField .isIgnore ()&& !response ){
255+ if (classField .isIgnore () && !response ) {
253256 return ;
254257 }
255258 // 如果是基本类型,这里直接进行解析
256- if (ClassUtils .isFieldPrimitive (field )|| field .getType ().equals (String .class )| ClassUtils .isTime (field .getType ())){
259+ if (ClassUtils .isFieldPrimitive (field ) || field .getType ().equals (String .class ) | ClassUtils .isTime (field .getType ())) {
257260 // nothing to do
258261 classFields .add (classField );
259262 return ;
260- }
261- else {
262- classField .setFields (parserClassFields (field .getGenericType (),field .getType (),response ));
263- if (field .getType ().isEnum ()){
263+ } else {
264+ classField .setFields (parserClassFields (field .getGenericType (), field .getType (), response ));
265+ if (field .getType ().isEnum ()) {
264266 classField .setEnumType (true );
265267 classField .setEnumValues (classField .getFields ().get (0 ).getEnumValues ());
266268 }
0 commit comments