Skip to content
This repository was archived by the owner on Dec 4, 2025. It is now read-only.

Commit 20a427c

Browse files
authored
Merge pull request #784 from shalousun/master
feat: Optimize Duplicate Code
2 parents f4012af + e884bb7 commit 20a427c

5 files changed

Lines changed: 112 additions & 57 deletions

File tree

src/main/java/com/ly/doc/constants/FrameworkEnum.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public enum FrameworkEnum {
4747
/**
4848
* JAX-RS
4949
*/
50-
JAX_RS("JAX-RS", "com.ly.doc.template.JaxrsDocBuildTemplate");
50+
JAX_RS("JAX-RS", "com.ly.doc.template.JAXRSDocBuildTemplate");
5151

5252
/**
5353
* Framework name

src/main/java/com/ly/doc/template/IDocBuildTemplate.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ default List<T> getApiData(ProjectDocConfigBuilder projectBuilder) {
4646
DocBuildHelper docBuildHelper = DocBuildHelper.create(projectBuilder);
4747

4848
preRender(docBuildHelper);
49-
49+
// get candidate classes
5050
Collection<JavaClass> candidateClasses = getCandidateClasses(projectBuilder, docBuildHelper);
5151
List<T> apiList = renderApi(projectBuilder, candidateClasses);
5252

src/main/java/com/ly/doc/template/IRestDocTemplate.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,14 @@ default List<ApiDoc> processApiData(ProjectDocConfigBuilder projectBuilder, Fram
9393
order = Integer.parseInt(strOrder);
9494
}
9595

96-
List<ApiMethodDoc> apiMethodDocs = buildEntryPointMethod(cls, apiConfig, projectBuilder,
96+
List<ApiMethodDoc> apiMethodDocs = this.buildEntryPointMethod(cls, apiConfig, projectBuilder,
9797
frameworkAnnotations, configApiReqParams, baseMappingHandler, headerHandler);
9898
if (CollectionUtil.isEmpty(apiMethodDocs)) {
9999
continue;
100100
}
101101
this.handleApiDoc(cls, apiDocList, apiMethodDocs, order, apiConfig.isMd5EncryptedHtmlName());
102102
}
103-
apiDocList = handleTagsApiDoc(apiDocList);
103+
apiDocList = this.handleTagsApiDoc(apiDocList);
104104
if (apiConfig.isSortByTitle()) {
105105
Collections.sort(apiDocList);
106106
} else if (setCustomOrder) {
@@ -480,8 +480,7 @@ default List<ApiMethodDoc> buildEntryPointMethod(
480480
}
481481

482482
// build request json
483-
ApiRequestExample requestExample = buildReqJson(docJavaMethod, apiMethodDoc, requestMapping.getMethodType(),
484-
projectBuilder, frameworkAnnotations);
483+
ApiRequestExample requestExample = buildReqJson(docJavaMethod, apiMethodDoc, projectBuilder, frameworkAnnotations);
485484
String requestJson = requestExample.getExampleBody();
486485
// set request example detail
487486
apiMethodDoc.setRequestExample(requestExample);
@@ -823,8 +822,9 @@ else if (javaClass.isEnum()) {
823822
return ApiParamTreeUtil.buildMethodReqParam(paramList, queryReqParamMap, pathReqParamMap, requestBodyCounter);
824823
}
825824

826-
default ApiRequestExample buildReqJson(DocJavaMethod javaMethod, ApiMethodDoc apiMethodDoc, String methodType,
825+
default ApiRequestExample buildReqJson(DocJavaMethod javaMethod, ApiMethodDoc apiMethodDoc,
827826
ProjectDocConfigBuilder configBuilder, FrameworkAnnotations frameworkAnnotations) {
827+
String methodType = apiMethodDoc.getType();
828828
JavaMethod method = javaMethod.getJavaMethod();
829829
Map<String, String> pathParamsMap = new LinkedHashMap<>();
830830
Map<String, String> queryParamsMap = new LinkedHashMap<>();
@@ -1044,13 +1044,14 @@ default ApiRequestExample buildReqJson(DocJavaMethod javaMethod, ApiMethodDoc ap
10441044

10451045
// set content-type to fromData
10461046
boolean hasFormDataUploadFile = formDataList.stream().anyMatch(form -> Objects.equals(form.getType(), DocGlobalConstants.PARAM_TYPE_FILE));
1047-
Map<Boolean, List<FormData>> formDataGroupMap = formDataList.stream()
1048-
.collect(Collectors.groupingBy(e -> Objects.equals(e.getType(), DocGlobalConstants.PARAM_TYPE_FILE)));
1049-
List<FormData> fileFormDataList = formDataGroupMap.getOrDefault(Boolean.TRUE, new ArrayList<>());
10501047
if (hasFormDataUploadFile) {
10511048
apiMethodDoc.setContentType(FILE_CONTENT_TYPE);
10521049
}
10531050

1051+
Map<Boolean, List<FormData>> formDataGroupMap = formDataList.stream()
1052+
.collect(Collectors.groupingBy(e -> Objects.equals(e.getType(), DocGlobalConstants.PARAM_TYPE_FILE)));
1053+
List<FormData> fileFormDataList = formDataGroupMap.getOrDefault(Boolean.TRUE, new ArrayList<>());
1054+
10541055
requestExample.setFormDataList(formDataList);
10551056
String[] paths = apiMethodDoc.getPath().split(";");
10561057
String path = paths[0];

src/main/java/com/ly/doc/template/JaxrsDocBuildTemplate.java renamed to src/main/java/com/ly/doc/template/JAXRSDocBuildTemplate.java

Lines changed: 18 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@
2222

2323
import com.ly.doc.builder.ProjectDocConfigBuilder;
2424
import com.ly.doc.constants.*;
25-
import com.ly.doc.handler.DefaultWebSocketRequestHandler;
26-
import com.ly.doc.handler.JaxrsHeaderHandler;
27-
import com.ly.doc.handler.JaxrsPathHandler;
25+
import com.ly.doc.handler.*;
2826
import com.ly.doc.helper.FormDataBuildHelper;
2927
import com.ly.doc.helper.JsonBuildHelper;
3028
import com.ly.doc.helper.ParamsBuildHelper;
@@ -41,7 +39,6 @@
4139
import com.thoughtworks.qdox.model.*;
4240

4341
import java.util.*;
44-
import java.util.concurrent.atomic.AtomicInteger;
4542
import java.util.logging.Logger;
4643
import java.util.stream.Collectors;
4744
import java.util.stream.Stream;
@@ -54,14 +51,10 @@
5451
* @author Zxq
5552
* @since 2021/7/15
5653
*/
57-
public class JaxrsDocBuildTemplate implements IDocBuildTemplate<ApiDoc>, IWebSocketDocBuildTemplate<WebSocketDoc>, IRestDocTemplate, IWebSocketTemplate {
54+
public class JAXRSDocBuildTemplate implements IDocBuildTemplate<ApiDoc>, IWebSocketDocBuildTemplate<WebSocketDoc>, IRestDocTemplate, IWebSocketTemplate {
5855

59-
private static final Logger log = Logger.getLogger(JaxrsDocBuildTemplate.class.getName());
56+
private static final Logger log = Logger.getLogger(JAXRSDocBuildTemplate.class.getName());
6057

61-
/**
62-
* api index
63-
*/
64-
private final AtomicInteger atomicInteger = new AtomicInteger(1);
6558
/**
6659
* headers
6760
*/
@@ -71,45 +64,25 @@ public class JaxrsDocBuildTemplate implements IDocBuildTemplate<ApiDoc>, IWebSoc
7164
@Override
7265
public List<ApiDoc> renderApi(ProjectDocConfigBuilder projectBuilder, Collection<JavaClass> candidateClasses) {
7366
ApiConfig apiConfig = projectBuilder.getApiConfig();
74-
FrameworkAnnotations frameworkAnnotations = registeredAnnotations();
7567
this.headers = apiConfig.getRequestHeaders();
76-
List<ApiDoc> apiDocList = new ArrayList<>();
77-
int order = 0;
78-
boolean setCustomOrder = false;
79-
// exclude class is ignore
80-
for (JavaClass cls : candidateClasses) {
81-
if (StringUtil.isNotEmpty(apiConfig.getPackageFilters())) {
82-
// from smart config
83-
if (!DocUtil.isMatch(apiConfig.getPackageFilters(), cls)) {
84-
continue;
85-
}
86-
}
87-
// from tag
88-
DocletTag ignoreTag = cls.getTagByName(DocTags.IGNORE);
89-
if (!isEntryPoint(cls, frameworkAnnotations) || Objects.nonNull(ignoreTag)) {
90-
continue;
91-
}
92-
String strOrder = JavaClassUtil.getClassTagsValue(cls, DocTags.ORDER, Boolean.TRUE);
93-
order++;
94-
if (ValidateUtil.isNonNegativeInteger(strOrder)) {
95-
setCustomOrder = true;
96-
order = Integer.parseInt(strOrder);
97-
}
98-
List<ApiMethodDoc> apiMethodDocs = buildControllerMethod(cls, apiConfig, projectBuilder, frameworkAnnotations);
99-
this.handleApiDoc(cls, apiDocList, apiMethodDocs, order, apiConfig.isMd5EncryptedHtmlName());
100-
}
68+
List<ApiReqParam> configApiReqParams = Stream.of(apiConfig.getRequestHeaders(), apiConfig.getRequestParams()).filter(Objects::nonNull)
69+
.flatMap(Collection::stream).collect(Collectors.toList());
70+
FrameworkAnnotations frameworkAnnotations = this.registeredAnnotations();
71+
List<ApiDoc> apiDocList = this.processApiData(projectBuilder, frameworkAnnotations,
72+
configApiReqParams, new SpringMVCRequestMappingHandler(), new SpringMVCRequestHeaderHandler(), candidateClasses);
10173
// sort
10274
if (apiConfig.isSortByTitle()) {
10375
Collections.sort(apiDocList);
104-
} else if (setCustomOrder) {
105-
// while set custom oder
106-
return apiDocList.stream()
107-
.sorted(Comparator.comparing(ApiDoc::getOrder))
108-
.peek(p -> p.setOrder(atomicInteger.getAndAdd(1))).collect(Collectors.toList());
10976
}
11077
return apiDocList;
11178
}
11279

80+
@Override
81+
public List<ApiMethodDoc> buildEntryPointMethod(JavaClass cls, ApiConfig apiConfig, ProjectDocConfigBuilder projectBuilder,
82+
FrameworkAnnotations frameworkAnnotations, List<ApiReqParam> configApiReqParams, IRequestMappingHandler baseMappingHandler, IHeaderHandler headerHandler) {
83+
return buildControllerMethod(cls, apiConfig, projectBuilder, frameworkAnnotations);
84+
}
85+
11386
@Override
11487
public List<WebSocketDoc> renderWebSocketApi(ProjectDocConfigBuilder projectBuilder, Collection<JavaClass> candidateClasses) {
11588
FrameworkAnnotations frameworkAnnotations = registeredAnnotations();
@@ -215,7 +188,7 @@ private List<ApiMethodDoc> buildControllerMethod(final JavaClass cls, ApiConfig
215188
}
216189
List<ApiReqParam> allApiReqParams;
217190
allApiReqParams = apiReqParams;
218-
if (this.headers != null) {
191+
if (Objects.nonNull(this.headers)) {
219192
allApiReqParams = Stream.of(this.headers, apiReqParams)
220193
.flatMap(Collection::stream).distinct().collect(Collectors.toList());
221194
}
@@ -234,8 +207,7 @@ private List<ApiMethodDoc> buildControllerMethod(final JavaClass cls, ApiConfig
234207
apiMethodDoc.setRequestHeaders(allApiReqParams);
235208

236209
// build request json
237-
ApiRequestExample requestExample = buildReqJson(docJavaMethod, apiMethodDoc, jaxPathMapping.getMethodType(),
238-
projectBuilder);
210+
ApiRequestExample requestExample = buildReqJson(docJavaMethod, apiMethodDoc, projectBuilder);
239211
String requestJson = requestExample.getExampleBody();
240212
// set request example detail
241213
apiMethodDoc.setRequestExample(requestExample);
@@ -406,7 +378,6 @@ private ApiMethodReqParam requestParams(final DocJavaMethod docJavaMethod, Proje
406378
} else {
407379
isRequestBody = true;
408380
}
409-
410381
boolean required = Boolean.parseBoolean(strRequired);
411382
boolean queryParam = !isRequestBody && !isPathVariable;
412383
if (JavaClassValidateUtil.isCollection(fullyQualifiedName) || JavaClassValidateUtil.isArray(fullyQualifiedName)) {
@@ -556,8 +527,8 @@ else if (javaClass.isEnum()) {
556527
.setQueryParams(queryParams);
557528
}
558529

559-
private ApiRequestExample buildReqJson(DocJavaMethod javaMethod, ApiMethodDoc apiMethodDoc, String methodType,
560-
ProjectDocConfigBuilder configBuilder) {
530+
private ApiRequestExample buildReqJson(DocJavaMethod javaMethod, ApiMethodDoc apiMethodDoc, ProjectDocConfigBuilder configBuilder) {
531+
String methodType = apiMethodDoc.getType();
561532
JavaMethod method = javaMethod.getJavaMethod();
562533
Map<String, String> pathParamsMap = new LinkedHashMap<>();
563534
List<DocJavaParameter> parameterList = getJavaParameterList(configBuilder, javaMethod, null);

src/main/java/com/ly/doc/utils/CurlUtil.java

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,22 @@
2020
*/
2121
package com.ly.doc.utils;
2222

23+
import java.util.ArrayList;
2324
import java.util.List;
25+
import java.util.Map;
2426
import java.util.Objects;
27+
import java.util.stream.Collectors;
2528

2629
import com.ly.doc.constants.DocGlobalConstants;
30+
import com.ly.doc.constants.Methods;
31+
import com.ly.doc.model.ApiMethodDoc;
2732
import com.ly.doc.model.ApiReqParam;
2833
import com.ly.doc.model.FormData;
34+
import com.ly.doc.model.request.ApiRequestExample;
2935
import com.power.common.util.CollectionUtil;
3036
import com.power.common.util.StringUtil;
3137
import com.ly.doc.model.request.CurlRequest;
38+
import com.power.common.util.UrlUtil;
3239

3340
/**
3441
* @author yu 2020/12/21.
@@ -82,4 +89,80 @@ public static String toCurl(CurlRequest request) {
8289
}
8390
return sb.toString();
8491
}
92+
93+
public void setExampleBody(ApiMethodDoc apiMethodDoc, ApiRequestExample requestExample,
94+
List<FormData> formDataList,
95+
Map<String, String> pathParamsMap, Map<String, String> queryParamsMap) {
96+
String methodType = apiMethodDoc.getType();
97+
String[] paths = apiMethodDoc.getPath().split(";");
98+
String path = paths[0];
99+
String body;
100+
String exampleBody;
101+
String url;
102+
List<ApiReqParam> reqHeaderList = apiMethodDoc.getRequestHeaders();
103+
Map<Boolean, List<FormData>> formDataGroupMap = formDataList.stream()
104+
.collect(Collectors.groupingBy(e -> Objects.equals(e.getType(), DocGlobalConstants.PARAM_TYPE_FILE)));
105+
List<FormData> fileFormDataList = formDataGroupMap.getOrDefault(Boolean.TRUE, new ArrayList<>());
106+
// curl send file to convert
107+
final Map<String, String> formDataToMap = DocUtil.formDataToMap(formDataList);
108+
// formData add to params '--data'
109+
queryParamsMap.putAll(formDataToMap);
110+
if (Methods.POST.getValue().equals(methodType) || Methods.PUT.getValue().equals(methodType)) {
111+
// for post put
112+
path = DocUtil.formatAndRemove(path, pathParamsMap);
113+
body = UrlUtil.urlJoin(DocGlobalConstants.EMPTY, queryParamsMap)
114+
.replace("?", DocGlobalConstants.EMPTY);
115+
url = apiMethodDoc.getServerUrl() + "/" + path;
116+
url = UrlUtil.simplifyUrl(url);
117+
118+
if (requestExample.isJson()) {
119+
if (StringUtil.isNotEmpty(body)) {
120+
url = url + "?" + body;
121+
}
122+
CurlRequest curlRequest = CurlRequest.builder()
123+
.setBody(requestExample.getJsonBody())
124+
.setContentType(apiMethodDoc.getContentType())
125+
.setType(methodType)
126+
.setReqHeaders(reqHeaderList)
127+
.setUrl(url);
128+
exampleBody = CurlUtil.toCurl(curlRequest);
129+
} else {
130+
CurlRequest curlRequest;
131+
if (StringUtil.isNotEmpty(body)) {
132+
curlRequest = CurlRequest.builder()
133+
.setBody(body)
134+
.setContentType(apiMethodDoc.getContentType())
135+
.setFileFormDataList(fileFormDataList)
136+
.setType(methodType)
137+
.setReqHeaders(reqHeaderList)
138+
.setUrl(url);
139+
} else {
140+
curlRequest = CurlRequest.builder()
141+
.setBody(requestExample.getJsonBody())
142+
.setContentType(apiMethodDoc.getContentType())
143+
.setFileFormDataList(fileFormDataList)
144+
.setType(methodType)
145+
.setReqHeaders(reqHeaderList)
146+
.setUrl(url);
147+
}
148+
exampleBody = CurlUtil.toCurl(curlRequest);
149+
}
150+
requestExample.setExampleBody(exampleBody).setUrl(url);
151+
} else {
152+
// for get delete
153+
url = "";
154+
//formatRequestUrl(pathParamsMap, queryParamsMap, apiMethodDoc.getServerUrl(), path);
155+
CurlRequest curlRequest = CurlRequest.builder()
156+
.setBody(requestExample.getJsonBody())
157+
.setContentType(apiMethodDoc.getContentType())
158+
.setType(methodType)
159+
.setReqHeaders(reqHeaderList)
160+
.setUrl(url);
161+
exampleBody = CurlUtil.toCurl(curlRequest);
162+
163+
requestExample.setExampleBody(exampleBody)
164+
.setJsonBody(requestExample.isJson() ? requestExample.getJsonBody() : DocGlobalConstants.EMPTY)
165+
.setUrl(url);
166+
}
167+
}
85168
}

0 commit comments

Comments
 (0)