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

Commit 69b6093

Browse files
authored
Merge pull request #806 from shalousun/master
fix: Fix the bug where the sequence number sorting is incorrect when using the `@order` tag.
2 parents d22ed6e + 45b9410 commit 69b6093

7 files changed

Lines changed: 57 additions & 41 deletions

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ default List<ApiDoc> processApiData(ProjectDocConfigBuilder projectBuilder, Fram
6666
Collection<JavaClass> javaClasses) {
6767
ApiConfig apiConfig = projectBuilder.getApiConfig();
6868
List<ApiDoc> apiDocList = new ArrayList<>();
69-
int order = 0;
7069
boolean setCustomOrder = false;
70+
int maxOrder = 0;
7171
// exclude class is ignore
7272
for (JavaClass cls : javaClasses) {
7373
if (StringUtil.isNotEmpty(apiConfig.getPackageFilters())) {
@@ -86,12 +86,12 @@ default List<ApiDoc> processApiData(ProjectDocConfigBuilder projectBuilder, Fram
8686
if (!isEntryPoint(cls, frameworkAnnotations) || Objects.nonNull(ignoreTag)) {
8787
continue;
8888
}
89-
89+
int order = 0;
9090
String strOrder = JavaClassUtil.getClassTagsValue(cls, DocTags.ORDER, Boolean.TRUE);
91-
order++;
9291
if (ValidateUtil.isNonNegativeInteger(strOrder)) {
9392
setCustomOrder = true;
9493
order = Integer.parseInt(strOrder);
94+
maxOrder = Math.max(maxOrder, order);
9595
}
9696

9797
List<ApiMethodDoc> apiMethodDocs = this.buildEntryPointMethod(cls, apiConfig, projectBuilder,
@@ -102,13 +102,20 @@ default List<ApiDoc> processApiData(ProjectDocConfigBuilder projectBuilder, Fram
102102
this.handleApiDoc(cls, apiDocList, apiMethodDocs, order, apiConfig.isMd5EncryptedHtmlName());
103103
}
104104
apiDocList = this.handleTagsApiDoc(apiDocList);
105+
105106
if (apiConfig.isSortByTitle()) {
107+
// sort by title
106108
Collections.sort(apiDocList);
107109
} else if (setCustomOrder) {
110+
ATOMIC_INTEGER.getAndAdd(maxOrder);
108111
// while set custom oder
109-
return apiDocList.stream()
110-
.sorted(Comparator.comparing(ApiDoc::getOrder))
111-
.peek(p -> p.setOrder(ATOMIC_INTEGER.getAndAdd(1))).collect(Collectors.toList());
112+
final List<ApiDoc> tempList = new ArrayList<>(apiDocList);
113+
tempList.forEach(p -> {
114+
if (p.getOrder() == 0) {
115+
p.setOrder(ATOMIC_INTEGER.getAndAdd(1));
116+
}
117+
});
118+
return tempList.stream().sorted(Comparator.comparing(ApiDoc::getOrder)).collect(Collectors.toList());
112119
}
113120
return apiDocList;
114121
}
@@ -804,7 +811,7 @@ else if (javaClass.isEnum()) {
804811
String enumName = JavaClassUtil.getEnumParams(javaClass);
805812
Object value = JavaClassUtil.getEnumValue(javaClass, isPathVariable || queryParam);
806813
if (Boolean.TRUE.equals(builder.getApiConfig().getInlineEnum())) {
807-
comment.append("<br/>[Enum: "+StringUtil.removeQuotes(enumName)+"]");
814+
comment.append("<br/>[Enum: " + StringUtil.removeQuotes(enumName) + "]");
808815
}
809816
ApiParam param = ApiParam.of().setField(paramName)
810817
.setId(paramList.size() + 1)

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.ly.doc.handler.DefaultWebSocketRequestHandler;
2828
import com.ly.doc.handler.IWebSocketRequestHandler;
2929
import com.ly.doc.model.ApiConfig;
30+
import com.ly.doc.model.ApiDoc;
3031
import com.ly.doc.model.ApiParam;
3132
import com.ly.doc.model.WebSocketDoc;
3233
import com.ly.doc.model.annotation.FrameworkAnnotations;
@@ -67,7 +68,7 @@ default List<WebSocketDoc> processWebSocketData(ProjectDocConfigBuilder projectB
6768
Collection<JavaClass> candidateClasses) {
6869
ApiConfig apiConfig = projectBuilder.getApiConfig();
6970
List<WebSocketDoc> apiDocList = new ArrayList<>();
70-
int order = 0;
71+
int maxOrder = 0;
7172
boolean setCustomOrder = false;
7273
// exclude class is ignore
7374
for (JavaClass javaClass : candidateClasses) {
@@ -88,26 +89,31 @@ default List<WebSocketDoc> processWebSocketData(ProjectDocConfigBuilder projectB
8889
continue;
8990
}
9091
String strOrder = JavaClassUtil.getClassTagsValue(javaClass, DocTags.ORDER, Boolean.TRUE);
91-
order++;
92+
int order = 0;
9293
if (ValidateUtil.isNonNegativeInteger(strOrder)) {
9394
setCustomOrder = true;
9495
order = Integer.parseInt(strOrder);
96+
maxOrder = Math.max(maxOrder, order);
9597
}
9698
WebSocketDoc webSocketDoc = this.buildEntryPointWebSocketDoc(javaClass, apiConfig,
9799
webSocketRequestHandler, frameworkAnnotations, order);
98-
if (null != webSocketDoc) {
100+
if (Objects.nonNull(webSocketDoc)) {
99101
apiDocList.add(webSocketDoc);
100102
}
101103
}
102-
// if config sort by title
103104
if (apiConfig.isSortByTitle()) {
105+
// sort by title
104106
Collections.sort(apiDocList);
105107
} else if (setCustomOrder) {
108+
ATOMIC_INTEGER.getAndAdd(maxOrder);
106109
// while set custom oder
107-
return apiDocList.stream()
108-
.sorted(Comparator.comparing(WebSocketDoc::getOrder))
109-
.peek(p -> p.setOrder(ATOMIC_INTEGER.getAndAdd(1)))
110-
.collect(Collectors.toList());
110+
final List<WebSocketDoc> tempList = new ArrayList<>(apiDocList);
111+
tempList.forEach(p -> {
112+
if (p.getOrder() == 0) {
113+
p.setOrder(ATOMIC_INTEGER.getAndAdd(1));
114+
}
115+
});
116+
return tempList.stream().sorted(Comparator.comparing(WebSocketDoc::getOrder)).collect(Collectors.toList());
111117
}
112118
return apiDocList;
113119
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,6 @@ public List<ApiDoc> renderApi(ProjectDocConfigBuilder projectBuilder, Collection
7070
FrameworkAnnotations frameworkAnnotations = this.registeredAnnotations();
7171
List<ApiDoc> apiDocList = this.processApiData(projectBuilder, frameworkAnnotations,
7272
configApiReqParams, new SpringMVCRequestMappingHandler(), new SpringMVCRequestHeaderHandler(), candidateClasses);
73-
// sort
74-
if (apiConfig.isSortByTitle()) {
75-
Collections.sort(apiDocList);
76-
}
7773
return apiDocList;
7874
}
7975

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
import com.ly.doc.model.*;
2828
import com.ly.doc.model.annotation.FrameworkAnnotations;
2929
import com.ly.doc.model.javadoc.JavadocApiDoc;
30+
import com.ly.doc.model.rpc.RpcApiDoc;
3031
import com.ly.doc.utils.*;
32+
import com.power.common.util.CollectionUtil;
3133
import com.power.common.util.StringUtil;
3234
import com.power.common.util.ValidateUtil;
3335
import com.thoughtworks.qdox.model.*;
@@ -43,7 +45,7 @@ public class JavadocDocBuildTemplate implements IDocBuildTemplate<JavadocApiDoc>
4345
/**
4446
* api index
4547
*/
46-
private final AtomicInteger atomicInteger = new AtomicInteger(1);
48+
private final AtomicInteger ATOMIC_INTEGER = new AtomicInteger(1);
4749

4850
@Override
4951
public boolean addMethodModifiers() {
@@ -54,29 +56,35 @@ public boolean addMethodModifiers() {
5456
public List<JavadocApiDoc> renderApi(ProjectDocConfigBuilder projectBuilder, Collection<JavaClass> candidateClasses) {
5557
ApiConfig apiConfig = projectBuilder.getApiConfig();
5658
List<JavadocApiDoc> apiDocList = new ArrayList<>();
57-
int order = 0;
59+
int maxOrder = 0;
5860
boolean setCustomOrder = false;
5961
for (JavaClass cls : candidateClasses) {
6062
if (skipClass(apiConfig, cls, null)) {
6163
continue;
6264
}
6365
String strOrder = JavaClassUtil.getClassTagsValue(cls, DocTags.ORDER, Boolean.TRUE);
64-
order++;
66+
int order = 0;
6567
if (ValidateUtil.isNonNegativeInteger(strOrder)) {
6668
order = Integer.parseInt(strOrder);
69+
maxOrder = Math.max(maxOrder, order);
6770
setCustomOrder = true;
6871
}
6972
List<JavadocJavaMethod> apiMethodDocs = (List<JavadocJavaMethod>) buildServiceMethod(cls, apiConfig, projectBuilder);
7073
this.handleJavaApiDoc(cls, apiDocList, apiMethodDocs, order, projectBuilder);
7174
}
72-
// sort
7375
if (apiConfig.isSortByTitle()) {
76+
// sort by title
7477
Collections.sort(apiDocList);
7578
} else if (setCustomOrder) {
79+
ATOMIC_INTEGER.getAndAdd(maxOrder);
7680
// while set custom oder
77-
return apiDocList.stream()
78-
.sorted(Comparator.comparing(JavadocApiDoc::getOrder))
79-
.peek(p -> p.setOrder(atomicInteger.getAndAdd(1))).collect(Collectors.toList());
81+
final List<JavadocApiDoc> tempList = new ArrayList<>(apiDocList);
82+
tempList.forEach(p -> {
83+
if (p.getOrder() == 0) {
84+
p.setOrder(ATOMIC_INTEGER.getAndAdd(1));
85+
}
86+
});
87+
return tempList.stream().sorted(Comparator.comparing(JavadocApiDoc::getOrder)).collect(Collectors.toList());
8088
}
8189
return apiDocList;
8290
}

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,35 +51,42 @@ public boolean addMethodModifiers() {
5151
/**
5252
* api index
5353
*/
54-
private final AtomicInteger atomicInteger = new AtomicInteger(1);
54+
private final AtomicInteger ATOMIC_INTEGER = new AtomicInteger(1);
5555

5656
@Override
5757
public List<RpcApiDoc> renderApi(ProjectDocConfigBuilder projectBuilder, Collection<JavaClass> candidateClasses) {
5858
ApiConfig apiConfig = projectBuilder.getApiConfig();
5959
List<RpcApiDoc> apiDocList = new ArrayList<>();
60-
int order = 0;
60+
6161
boolean setCustomOrder = false;
62+
int maxOrder = 0;
6263
for (JavaClass cls : candidateClasses) {
6364
if (skipClass(apiConfig, cls, null)) {
6465
continue;
6566
}
6667
String strOrder = JavaClassUtil.getClassTagsValue(cls, DocTags.ORDER, Boolean.TRUE);
67-
order++;
68+
int order = 0;
6869
if (ValidateUtil.isNonNegativeInteger(strOrder)) {
6970
order = Integer.parseInt(strOrder);
7071
setCustomOrder = true;
72+
maxOrder = Math.max(maxOrder, order);
7173
}
7274
List<RpcJavaMethod> apiMethodDocs = (List<RpcJavaMethod>) buildServiceMethod(cls, apiConfig, projectBuilder);
7375
this.handleJavaApiDoc(cls, apiDocList, apiMethodDocs, order, projectBuilder);
7476
}
75-
// sort
7677
if (apiConfig.isSortByTitle()) {
78+
// sort by title
7779
Collections.sort(apiDocList);
7880
} else if (setCustomOrder) {
81+
ATOMIC_INTEGER.getAndAdd(maxOrder);
7982
// while set custom oder
80-
return apiDocList.stream()
81-
.sorted(Comparator.comparing(RpcApiDoc::getOrder))
82-
.peek(p -> p.setOrder(atomicInteger.getAndAdd(1))).collect(Collectors.toList());
83+
final List<RpcApiDoc> tempList = new ArrayList<>(apiDocList);
84+
tempList.forEach(p -> {
85+
if (p.getOrder() == 0) {
86+
p.setOrder(ATOMIC_INTEGER.getAndAdd(1));
87+
}
88+
});
89+
return tempList.stream().sorted(Comparator.comparing(RpcApiDoc::getOrder)).collect(Collectors.toList());
8390
}
8491
return apiDocList;
8592
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,6 @@ public List<ApiDoc> renderApi(ProjectDocConfigBuilder projectBuilder, Collection
5353
FrameworkAnnotations frameworkAnnotations = registeredAnnotations();
5454
List<ApiDoc> apiDocList = processApiData(projectBuilder, frameworkAnnotations, configApiReqParams,
5555
new SolonRequestMappingHandler(), new SolonRequestHeaderHandler(), candidateClasses);
56-
// sort
57-
if (apiConfig.isSortByTitle()) {
58-
Collections.sort(apiDocList);
59-
}
6056
return apiDocList;
6157
}
6258

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@ public List<ApiDoc> renderApi(ProjectDocConfigBuilder projectBuilder, Collection
5252
FrameworkAnnotations frameworkAnnotations = registeredAnnotations();
5353
List<ApiDoc> apiDocList = this.processApiData(projectBuilder, frameworkAnnotations,
5454
configApiReqParams, new SpringMVCRequestMappingHandler(), new SpringMVCRequestHeaderHandler(), candidateClasses);
55-
// sort
56-
if (apiConfig.isSortByTitle()) {
57-
Collections.sort(apiDocList);
58-
}
5955
return apiDocList;
6056
}
6157

0 commit comments

Comments
 (0)