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

Commit 9ab1ed5

Browse files
committed
refactor(build-template): ♻️ utilize ServiceLoader for dynamic loading
Refactored BuildTemplateFactory to use Java's ServiceLoader for dynamic loading of build templates. This change enhances modularity, simplifies maintenance, and eases the addition of new frameworks. Replaced hardcoded class instantiation with service discovery, improving the overall structure. Enhanced error messages to list supported frameworks when an unsupported one is specified.
1 parent 217a0c2 commit 9ab1ed5

22 files changed

Lines changed: 216 additions & 93 deletions

src/main/java/com/ly/doc/builder/AdocDocBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ public static void buildApiDoc(ApiConfig config, JavaProjectBuilder javaProjectB
6464
config.setParamsDataToTree(false);
6565
config.setAdoc(true);
6666
ProjectDocConfigBuilder configBuilder = new ProjectDocConfigBuilder(config, javaProjectBuilder);
67-
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(config.getFramework());
67+
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(
68+
config.getFramework(), config.getClassLoader());
6869
Objects.requireNonNull(docBuildTemplate, "doc build template is null");
6970
List<ApiDoc> apiDocList = docBuildTemplate.getApiData(configBuilder).getApiDatas();
7071
if (config.isAllInOne()) {

src/main/java/com/ly/doc/builder/ApiDocBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ public static void buildApiDoc(ApiConfig config, JavaProjectBuilder javaProjectB
6161
config.setAdoc(false);
6262
config.setParamsDataToTree(false);
6363
ProjectDocConfigBuilder configBuilder = new ProjectDocConfigBuilder(config, javaProjectBuilder);
64-
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(config.getFramework());
64+
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(
65+
config.getFramework(), config.getClassLoader());
6566
Objects.requireNonNull(docBuildTemplate, "doc build template is null");
6667
List<ApiDoc> apiDocList = docBuildTemplate.getApiData(configBuilder).getApiDatas();
6768
if (config.isAllInOne()) {

src/main/java/com/ly/doc/builder/DocBuilderTemplate.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ public void buildSearchJs(ApiConfig config, JavaProjectBuilder javaProjectBuilde
285285
ApiDoc apiDoc1 = new ApiDoc();
286286
int codeIndex = 0;
287287
if (isOnlyDefaultGroup) {
288-
if (apiDocs.size() > 0) {
288+
if (!apiDocs.isEmpty()) {
289289
codeIndex = apiDocs.get(0).getChildrenApiDocs().size();
290290
}
291291
} else {
@@ -320,7 +320,7 @@ public void buildSearchJs(ApiConfig config, JavaProjectBuilder javaProjectBuilde
320320
apiDoc1.setChildrenApiDocs(childrenApiDocs);
321321
apiDoc1.setList(methodDocs);
322322
if (isOnlyDefaultGroup) {
323-
if (apiDocs.size() > 0) {
323+
if (!apiDocs.isEmpty()) {
324324
apiDocs.get(0).getChildrenApiDocs().add(apiDoc1);
325325
}
326326
} else {
@@ -483,7 +483,8 @@ private List<ApiDoc> listOfApiData(ApiConfig config, JavaProjectBuilder javaProj
483483
this.checkAndInitForGetApiData(config);
484484
config.setMd5EncryptedHtmlName(true);
485485
ProjectDocConfigBuilder configBuilder = new ProjectDocConfigBuilder(config, javaProjectBuilder);
486-
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(config.getFramework());
486+
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(
487+
config.getFramework(), config.getClassLoader());
487488
Objects.requireNonNull(docBuildTemplate, "doc build template is null");
488489
return docBuildTemplate.getApiData(configBuilder).getApiDatas();
489490
}

src/main/java/com/ly/doc/builder/HtmlApiDocBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ public static void buildApiDoc(ApiConfig config, JavaProjectBuilder javaProjectB
6666
builderTemplate.checkAndInit(config, Boolean.TRUE);
6767
config.setParamsDataToTree(false);
6868
ProjectDocConfigBuilder configBuilder = new ProjectDocConfigBuilder(config, javaProjectBuilder);
69-
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(config.getFramework());
69+
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(
70+
config.getFramework(), config.getClassLoader());
7071
Objects.requireNonNull(docBuildTemplate, "doc build template is null");
7172
List<ApiDoc> apiDocList = docBuildTemplate.getApiData(configBuilder).getApiDatas();
7273
builderTemplate.copyJQueryAndCss(config);

src/main/java/com/ly/doc/builder/JMeterBuilder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,16 @@ public static void buildApiDoc(ApiConfig config, JavaProjectBuilder javaProjectB
6464
config.setShowJavaType(true);
6565
config.setParamsDataToTree(Boolean.FALSE);
6666
ProjectDocConfigBuilder configBuilder = new ProjectDocConfigBuilder(config, javaProjectBuilder);
67-
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(config.getFramework());
67+
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(
68+
config.getFramework(), config.getClassLoader());
6869
Objects.requireNonNull(docBuildTemplate, "doc build template is null");
6970
List<ApiDoc> apiDocList = docBuildTemplate.getApiData(configBuilder).getApiDatas();
7071
String version = config.isCoverOld() ? "" : "-V" + DateTimeUtil.long2Str(System.currentTimeMillis(), DocGlobalConstants.DATE_FORMAT_YYYY_MM_DD_HH_MM);
7172
String docName;
7273
if (StringUtil.isNotEmpty(config.getProjectName())) {
7374
docName = config.getProjectName() + version + JMETER_SCRIPT_EXTENSION;
7475
} else {
75-
docName = "jmeter-script"+ version + JMETER_SCRIPT_EXTENSION;
76+
docName = "jmeter-script" + version + JMETER_SCRIPT_EXTENSION;
7677
}
7778
builderTemplate.buildAllInOne(apiDocList, config, javaProjectBuilder, DocGlobalConstants.JMETER_TPL, docName);
7879
}

src/main/java/com/ly/doc/builder/PostmanJsonBuilder.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -192,14 +192,16 @@ private static UrlBean buildUrlBean(ApiMethodDoc apiMethodDoc) {
192192
private static BodyBean buildBodyBean(ApiMethodDoc apiMethodDoc) {
193193
BodyBean bodyBean;
194194
if (apiMethodDoc.getContentType().contains(MediaType.APPLICATION_JSON)) {
195-
bodyBean = new BodyBean(Boolean.FALSE);// Json request
195+
// Json request
196+
bodyBean = new BodyBean(Boolean.FALSE);
196197
bodyBean.setMode(convertContentTypeToPostmanType(apiMethodDoc.getContentType()));
197198
if (apiMethodDoc.getRequestExample() != null) {
198199
bodyBean.setRaw(apiMethodDoc.getRequestExample().getJsonBody());
199200
}
200201
} else {
201202
if (apiMethodDoc.getType().equals(Methods.POST.getValue())) {
202-
bodyBean = new BodyBean(Boolean.TRUE); // Formdata
203+
// Formdata
204+
bodyBean = new BodyBean(Boolean.TRUE);
203205
bodyBean.setMode(convertContentTypeToPostmanType(apiMethodDoc.getContentType()));
204206
if (CollectionUtil.isNotEmpty(apiMethodDoc.getRequestExample().getFormDataList())) {
205207
bodyBean.setFormdata(apiMethodDoc.getRequestExample().getFormDataList());
@@ -248,7 +250,8 @@ private static List<HeaderBean> buildHeaderBeanList(ApiMethodDoc apiMethodDoc) {
248250
}
249251

250252
private static void postManCreate(ApiConfig config, ProjectDocConfigBuilder configBuilder) {
251-
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(config.getFramework());
253+
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(
254+
config.getFramework(), config.getClassLoader());
252255
Objects.requireNonNull(docBuildTemplate, "doc build template is null");
253256
config.setShowJavaType(true);
254257
List<ApiDoc> apiDocList = docBuildTemplate.getApiData(configBuilder).getApiDatas();
@@ -270,13 +273,13 @@ private static void postManCreate(ApiConfig config, ProjectDocConfigBuilder conf
270273

271274
/**
272275
* Converts the request Content-Type to its corresponding Postman request type.
273-
*
276+
* <p>
274277
* Postman is a popular API testing tool that supports various request types. This method aims to map common
275278
* Content-Types to the formats recognized by Postman, facilitating more accurate HTTP request simulations.
276279
*
277280
* @param contentType The MIME type of the data in the request, indicating how it should be processed.
278281
* @return The Postman request type corresponding to the given Content-Type.
279-
*
282+
* <p>
280283
* Note: This mapping covers typical use cases and Postman's supported range; it may not include all possible Content-Types.
281284
*/
282285
private static String convertContentTypeToPostmanType(String contentType) {

src/main/java/com/ly/doc/builder/TornaBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ public static void buildApiDoc(ApiConfig config, JavaProjectBuilder javaProjectB
6868
DocBuilderTemplate builderTemplate = new DocBuilderTemplate();
6969
builderTemplate.checkAndInit(config, Boolean.FALSE);
7070
ProjectDocConfigBuilder configBuilder = new ProjectDocConfigBuilder(config, javaProjectBuilder);
71-
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(config.getFramework());
71+
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(
72+
config.getFramework(), config.getClassLoader());
7273
Objects.requireNonNull(docBuildTemplate, "doc build template is null");
7374
ApiSchema<ApiDoc> apiSchema = docBuildTemplate.getApiData(configBuilder);
7475
List<ApiDoc> apiDocList = docBuildTemplate.handleApiGroup(apiSchema.getApiDatas(), config);

src/main/java/com/ly/doc/builder/WordDocBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ public static void buildApiDoc(ApiConfig config, JavaProjectBuilder javaProjectB
7777
builderTemplate.checkAndInit(config, Boolean.TRUE);
7878
config.setParamsDataToTree(false);
7979
ProjectDocConfigBuilder configBuilder = new ProjectDocConfigBuilder(config, javaProjectBuilder);
80-
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(config.getFramework());
80+
IDocBuildTemplate<ApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(
81+
config.getFramework(), config.getClassLoader());
8182
Objects.requireNonNull(docBuildTemplate, "doc build template is null");
8283
ApiSchema<ApiDoc> apiSchema = docBuildTemplate.getApiData(configBuilder);
8384
List<ApiDoc> apiDocList = apiSchema.getApiDatas();

src/main/java/com/ly/doc/builder/javadoc/JavadocDocBuilderTemplate.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,16 @@
2727
import com.ly.doc.constants.FrameworkEnum;
2828
import com.ly.doc.constants.TemplateVariable;
2929
import com.ly.doc.factory.BuildTemplateFactory;
30-
import com.ly.doc.model.*;
30+
import com.ly.doc.model.ApiConfig;
31+
import com.ly.doc.model.ApiDocDict;
32+
import com.ly.doc.model.ApiErrorCode;
33+
import com.ly.doc.model.ApiSchema;
3134
import com.ly.doc.model.javadoc.JavadocApiAllData;
3235
import com.ly.doc.model.javadoc.JavadocApiDoc;
3336
import com.ly.doc.template.IDocBuildTemplate;
3437
import com.ly.doc.utils.BeetlTemplateUtil;
3538
import com.ly.doc.utils.DocUtil;
3639
import com.power.common.util.CollectionUtil;
37-
import com.power.common.util.DateTimeUtil;
3840
import com.power.common.util.FileUtil;
3941
import com.thoughtworks.qdox.JavaProjectBuilder;
4042
import org.beetl.core.Template;
@@ -44,6 +46,10 @@
4446
import java.util.Map;
4547
import java.util.Objects;
4648

49+
/**
50+
* java doc build template.
51+
* @author chenchuxin
52+
*/
4753
public class JavadocDocBuilderTemplate extends BaseDocBuilderTemplate {
4854

4955
private static final String DEPENDENCY_TITLE = "Add dependency";
@@ -92,7 +98,7 @@ public void buildAllInOne(List<JavadocApiDoc> apiDocList, ApiConfig config, Java
9298
Template tpl = BeetlTemplateUtil.getByName(template);
9399
tpl.binding(TemplateVariable.API_DOC_LIST.getVariable(), apiDocList);
94100
// binding common variable
95-
super.bindingCommonVariable(config,javaProjectBuilder,tpl, apiDocList.isEmpty());
101+
super.bindingCommonVariable(config, javaProjectBuilder, tpl, apiDocList.isEmpty());
96102

97103
FileUtil.nioWriteFile(tpl.render(), outPath + DocGlobalConstants.FILE_SEPARATOR + outPutFileName);
98104
}
@@ -176,7 +182,8 @@ private List<JavadocApiDoc> listOfApiData(ApiConfig config, JavaProjectBuilder j
176182
this.checkAndInitForGetApiData(config);
177183
config.setMd5EncryptedHtmlName(true);
178184
ProjectDocConfigBuilder configBuilder = new ProjectDocConfigBuilder(config, javaProjectBuilder);
179-
IDocBuildTemplate<JavadocApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(config.getFramework());
185+
IDocBuildTemplate<JavadocApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(
186+
config.getFramework(), config.getClassLoader());
180187
Objects.requireNonNull(docBuildTemplate, "doc build template is null");
181188
ApiSchema<JavadocApiDoc> apiSchema = docBuildTemplate.getApiData(configBuilder);
182189
return apiSchema.getApiDatas();
@@ -185,7 +192,8 @@ private List<JavadocApiDoc> listOfApiData(ApiConfig config, JavaProjectBuilder j
185192
public List<JavadocApiDoc> getJavadocApiDoc(ApiConfig config, JavaProjectBuilder javaProjectBuilder) {
186193
config.setShowJavaType(true);
187194
ProjectDocConfigBuilder configBuilder = new ProjectDocConfigBuilder(config, javaProjectBuilder);
188-
IDocBuildTemplate<JavadocApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(config.getFramework());
195+
IDocBuildTemplate<JavadocApiDoc> docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(
196+
config.getFramework(), config.getClassLoader());
189197
Objects.requireNonNull(docBuildTemplate, "doc build template is null");
190198
return docBuildTemplate.getApiData(configBuilder).getApiDatas();
191199
}

src/main/java/com/ly/doc/builder/openapi/AbstractOpenApiBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,8 @@ public ApiSchema<ApiDoc> getOpenApiDocs(ApiConfig config, JavaProjectBuilder pro
572572
builderTemplate.checkAndInit(config, Boolean.TRUE);
573573
ProjectDocConfigBuilder configBuilder = new ProjectDocConfigBuilder(config, projectBuilder);
574574
config.setParamsDataToTree(true);
575-
IDocBuildTemplate docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(config.getFramework());
575+
IDocBuildTemplate docBuildTemplate = BuildTemplateFactory.getDocBuildTemplate(
576+
config.getFramework(), config.getClassLoader());
576577
Objects.requireNonNull(docBuildTemplate, "doc build template is null");
577578
return docBuildTemplate.getApiData(configBuilder);
578579
}

0 commit comments

Comments
 (0)