Skip to content

Commit 80b6bfa

Browse files
committed
update jar
1 parent 1abb338 commit 80b6bfa

File tree

5 files changed

+153
-149
lines changed

5 files changed

+153
-149
lines changed

build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,5 @@ dependencies {
3030
compileOnly "org.projectlombok:lombok:1.16.16"
3131
annotationProcessor "org.projectlombok:lombok:1.16.16"
3232
implementation 'com.github.javaparser:javaparser-symbol-solver-core:3.14.4-SNAPSHOT'
33-
3433

3534
}

src/main/java/com/hsjfans/github/config/Config.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,24 @@
99
public class Config {
1010

1111
/**
12-
* package name
12+
* package name
1313
*/
1414
private String packageName;
1515

1616
/**
1717
* the path to store the generated docs
18-
*
18+
* <p>
1919
* default is src/static/
2020
*/
2121
private String outPath = "src/static/";
2222

2323
/**
24-
* the path of classes files
24+
* the default build jar path
25+
*/
26+
private String jarPath = "build/libs/";
27+
28+
/**
29+
* the path of classes files
2530
*/
2631
private String classPath;
2732

@@ -30,30 +35,29 @@ public class Config {
3035

3136

3237
/**
33-
* the repository of gradle
38+
* the repository of gradle
3439
*/
3540
private String gradlePath;
3641

3742

3843
/**
39-
* the repository of maven
44+
* the repository of maven
4045
*/
4146
private String mvnPath;
4247

4348

4449
/**
45-
* api doc name - xxx 接口文档
50+
* api doc name - xxx 接口文档
4651
*/
4752
private String docName;
4853

4954

5055
private String apiName;
5156

5257

53-
public String getOutPath(){
54-
return this.outPath+this.apiName+"/";
58+
public String getOutPath() {
59+
return this.outPath + this.apiName + "/";
5560
}
5661

5762

58-
5963
}

src/main/java/com/hsjfans/github/parser/AbstractParser.java

Lines changed: 64 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.hsjfans.github.parser;
22

3-
import com.github.javaparser.ast.CompilationUnit;
43
import com.github.javaparser.ast.body.FieldDeclaration;
54
import com.github.javaparser.ast.body.MethodDeclaration;
65
import com.github.javaparser.ast.body.TypeDeclaration;
@@ -16,7 +15,10 @@
1615
import com.hsjfans.github.util.*;
1716

1817
import 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;
2022
import java.util.Arrays;
2123
import java.util.List;
2224
import java.util.Optional;
@@ -26,17 +28,17 @@
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

Comments
 (0)