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

Commit 3cf8a57

Browse files
zlxs1317169linwumingshi
authored andcommitted
Optimize the code of the Dubbo Interface Word Feature
1 parent 05e8f91 commit 3cf8a57

File tree

5 files changed

+119
-166
lines changed

5 files changed

+119
-166
lines changed

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

Lines changed: 10 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,14 @@
2727
import com.ly.doc.model.ApiDoc;
2828
import com.ly.doc.model.ApiSchema;
2929
import com.ly.doc.template.IDocBuildTemplate;
30+
import com.ly.doc.utils.DocUtil;
3031
import com.power.common.util.DateTimeUtil;
3132
import com.power.common.util.FileUtil;
3233
import com.thoughtworks.qdox.JavaProjectBuilder;
3334
import org.beetl.core.Template;
3435

35-
import java.io.InputStream;
36-
import java.nio.charset.StandardCharsets;
37-
import java.nio.file.Files;
38-
import java.nio.file.Paths;
3936
import java.util.List;
4037
import java.util.Objects;
41-
import java.util.zip.ZipEntry;
42-
import java.util.zip.ZipInputStream;
43-
import java.util.zip.ZipOutputStream;
4438

4539
/**
4640
* Word doc builder
@@ -113,65 +107,27 @@ public static void buildApiDoc(ApiConfig config, JavaProjectBuilder javaProjectB
113107
FileUtil.mkdirs(outPath);
114108
Template tpl = builderTemplate.buildAllRenderDocTemplate(apiDocList, config, javaProjectBuilder,
115109
DocGlobalConstants.ALL_IN_ONE_WORD_XML_TPL, null, null);
116-
copyAndReplaceDocx(tpl.render(), outPath + DocGlobalConstants.FILE_SEPARATOR + docName);
110+
DocUtil.copyAndReplaceDocx(tpl.render(), outPath + DocGlobalConstants.FILE_SEPARATOR + docName,
111+
TEMPLATE_DOCX);
117112
}
118113
else {
119114
FileUtil.mkdir(config.getOutPath());
120115
for (ApiDoc doc : apiDocList) {
121116
Template template = builderTemplate.buildApiDocTemplate(doc, config, DocGlobalConstants.WORD_XML_TPL);
122-
copyAndReplaceDocx(template.render(),
123-
config.getOutPath() + DocGlobalConstants.FILE_SEPARATOR + doc.getName() + BUILD_DOCX);
117+
DocUtil.copyAndReplaceDocx(template.render(),
118+
config.getOutPath() + DocGlobalConstants.FILE_SEPARATOR + doc.getName() + BUILD_DOCX,
119+
TEMPLATE_DOCX);
124120
}
125121
Template errorCodeDocTemplate = builderTemplate.buildErrorCodeDocTemplate(config,
126122
DocGlobalConstants.WORD_ERROR_XML_TPL, javaProjectBuilder);
127-
copyAndReplaceDocx(errorCodeDocTemplate.render(),
128-
config.getOutPath() + DocGlobalConstants.FILE_SEPARATOR + BUILD_ERROR_DOCX);
123+
DocUtil.copyAndReplaceDocx(errorCodeDocTemplate.render(),
124+
config.getOutPath() + DocGlobalConstants.FILE_SEPARATOR + BUILD_ERROR_DOCX, TEMPLATE_DOCX);
129125

130126
Template directoryDataDocTemplate = builderTemplate.buildDirectoryDataDocTemplate(config,
131127
javaProjectBuilder, DocGlobalConstants.WORD_DICT_XML_TPL);
132-
copyAndReplaceDocx(directoryDataDocTemplate.render(),
133-
config.getOutPath() + DocGlobalConstants.FILE_SEPARATOR + BUILD_DICT_DOCX);
128+
DocUtil.copyAndReplaceDocx(directoryDataDocTemplate.render(),
129+
config.getOutPath() + DocGlobalConstants.FILE_SEPARATOR + BUILD_DICT_DOCX, TEMPLATE_DOCX);
134130
}
135131
}
136132

137-
/**
138-
* replace docx content
139-
* @param content doc content
140-
* @param docxOutputPath docx output path
141-
* @throws Exception exception
142-
* @since 1.0.0
143-
*/
144-
public static void copyAndReplaceDocx(String content, String docxOutputPath) throws Exception {
145-
InputStream resourceAsStream = WordDocBuilder.class.getClassLoader().getResourceAsStream(TEMPLATE_DOCX);
146-
Objects.requireNonNull(resourceAsStream, "word template docx is not found");
147-
148-
ZipInputStream zipInputStream = new ZipInputStream(resourceAsStream);
149-
ZipOutputStream zipOutputStream = new ZipOutputStream(Files.newOutputStream(Paths.get(docxOutputPath)));
150-
// Traverse the files in the compressed package
151-
ZipEntry entry;
152-
while ((entry = zipInputStream.getNextEntry()) != null) {
153-
String entryName = entry.getName();
154-
// copy fix the bug: invalid entry compressed size
155-
zipOutputStream.putNextEntry(new ZipEntry(entryName));
156-
if ("word/document.xml".equals(entryName)) {
157-
byte[] bytes = content.getBytes(StandardCharsets.UTF_8);
158-
zipOutputStream.write(bytes, 0, bytes.length);
159-
}
160-
else {
161-
// copy
162-
byte[] buffer = new byte[1024];
163-
int len;
164-
while ((len = zipInputStream.read(buffer)) > 0) {
165-
zipOutputStream.write(buffer, 0, len);
166-
}
167-
}
168-
169-
zipOutputStream.closeEntry();
170-
zipInputStream.closeEntry();
171-
}
172-
173-
zipInputStream.close();
174-
zipOutputStream.close();
175-
}
176-
177133
}

src/main/java/com/ly/doc/builder/rpc/RpcWordDocBuilder.java

Lines changed: 4 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,11 @@
2424
import com.ly.doc.helper.JavaProjectBuilderHelper;
2525
import com.ly.doc.model.ApiConfig;
2626
import com.ly.doc.model.rpc.RpcApiDoc;
27+
import com.ly.doc.utils.DocUtil;
2728
import com.thoughtworks.qdox.JavaProjectBuilder;
2829
import org.beetl.core.Template;
2930

30-
import java.io.InputStream;
31-
import java.nio.charset.StandardCharsets;
32-
import java.nio.file.Files;
33-
import java.nio.file.Paths;
3431
import java.util.List;
35-
import java.util.Objects;
36-
import java.util.zip.ZipEntry;
37-
import java.util.zip.ZipInputStream;
38-
import java.util.zip.ZipOutputStream;
3932

4033
/**
4134
* Dubbo Word doc builder
@@ -48,7 +41,7 @@ public class RpcWordDocBuilder {
4841
/**
4942
* template docx
5043
*/
51-
private static final String TEMPLATE_DOCX = "template/dubbo/template.docx";
44+
private static final String TEMPLATE_DOCX = "template/word/template.docx";
5245

5346
/**
5447
* build docx file name
@@ -100,49 +93,10 @@ public static void buildApiDoc(ApiConfig config, JavaProjectBuilder javaProjectB
10093
DocGlobalConstants.RPC_ALL_IN_ONE_WORD_TPL, docName);
10194

10295
String outPath = config.getOutPath();
103-
copyAndReplaceDocx(tpl.render(), outPath + DocGlobalConstants.FILE_SEPARATOR + docName);
96+
DocUtil.copyAndReplaceDocx(tpl.render(), outPath + DocGlobalConstants.FILE_SEPARATOR + docName,
97+
TEMPLATE_DOCX);
10498
}
10599

106100
}
107101

108-
/**
109-
* replace docx content
110-
* @param content doc content
111-
* @param docxOutputPath docx output path
112-
* @throws Exception exception
113-
* @since 1.0.0
114-
*/
115-
public static void copyAndReplaceDocx(String content, String docxOutputPath) throws Exception {
116-
InputStream resourceAsStream = RpcWordDocBuilder.class.getClassLoader().getResourceAsStream(TEMPLATE_DOCX);
117-
Objects.requireNonNull(resourceAsStream, "dubbo word template docx is not found");
118-
119-
ZipInputStream zipInputStream = new ZipInputStream(resourceAsStream);
120-
ZipOutputStream zipOutputStream = new ZipOutputStream(Files.newOutputStream(Paths.get(docxOutputPath)));
121-
// Traverse the files in the compressed package
122-
ZipEntry entry;
123-
while ((entry = zipInputStream.getNextEntry()) != null) {
124-
String entryName = entry.getName();
125-
// copy fix the bug: invalid entry compressed size
126-
zipOutputStream.putNextEntry(new ZipEntry(entryName));
127-
if ("word/document.xml".equals(entryName)) {
128-
byte[] bytes = content.getBytes(StandardCharsets.UTF_8);
129-
zipOutputStream.write(bytes, 0, bytes.length);
130-
}
131-
else {
132-
// copy
133-
byte[] buffer = new byte[1024];
134-
int len;
135-
while ((len = zipInputStream.read(buffer)) > 0) {
136-
zipOutputStream.write(buffer, 0, len);
137-
}
138-
}
139-
140-
zipOutputStream.closeEntry();
141-
zipInputStream.closeEntry();
142-
}
143-
144-
zipInputStream.close();
145-
zipOutputStream.close();
146-
}
147-
148102
}

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

Lines changed: 56 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -20,81 +20,34 @@
2020
*/
2121
package com.ly.doc.utils;
2222

23-
import com.ly.doc.constants.DocAnnotationConstants;
24-
import com.ly.doc.constants.DocGlobalConstants;
25-
import com.ly.doc.constants.DocTags;
26-
import com.ly.doc.constants.JAXRSAnnotations;
27-
import com.ly.doc.constants.JakartaJaxrsAnnotations;
28-
import com.ly.doc.constants.JavaTypeConstants;
29-
import com.ly.doc.constants.MediaType;
23+
import com.ly.doc.builder.WordDocBuilder;
24+
import com.ly.doc.constants.*;
3025
import com.ly.doc.extension.dict.DictionaryValuesResolver;
31-
import com.ly.doc.model.ApiConfig;
32-
import com.ly.doc.model.ApiDataDictionary;
33-
import com.ly.doc.model.ApiDocDict;
34-
import com.ly.doc.model.ApiErrorCode;
35-
import com.ly.doc.model.ApiErrorCodeDictionary;
36-
import com.ly.doc.model.ApiReqParam;
37-
import com.ly.doc.model.DataDict;
38-
import com.ly.doc.model.DocJavaField;
39-
import com.ly.doc.model.FormData;
40-
import com.ly.doc.model.SystemPlaceholders;
26+
import com.ly.doc.model.*;
4127
import com.ly.doc.model.request.RequestMapping;
4228
import com.mifmif.common.regex.Generex;
43-
import com.power.common.util.CollectionUtil;
44-
import com.power.common.util.DateTimeUtil;
45-
import com.power.common.util.EnumUtil;
46-
import com.power.common.util.IDCardUtil;
47-
import com.power.common.util.RandomUtil;
48-
import com.power.common.util.StringUtil;
29+
import com.power.common.util.*;
4930
import com.thoughtworks.qdox.JavaProjectBuilder;
50-
import com.thoughtworks.qdox.model.DocletTag;
51-
import com.thoughtworks.qdox.model.JavaAnnotation;
52-
import com.thoughtworks.qdox.model.JavaClass;
53-
import com.thoughtworks.qdox.model.JavaField;
54-
import com.thoughtworks.qdox.model.JavaMember;
55-
import com.thoughtworks.qdox.model.JavaMethod;
56-
import com.thoughtworks.qdox.model.expression.Add;
57-
import com.thoughtworks.qdox.model.expression.AnnotationValue;
58-
import com.thoughtworks.qdox.model.expression.Constant;
59-
import com.thoughtworks.qdox.model.expression.Expression;
60-
import com.thoughtworks.qdox.model.expression.FieldRef;
31+
import com.thoughtworks.qdox.model.*;
32+
import com.thoughtworks.qdox.model.expression.*;
6133
import net.datafaker.Faker;
6234
import org.apache.commons.codec.digest.DigestUtils;
6335
import org.apache.commons.lang3.StringUtils;
6436

37+
import java.io.InputStream;
38+
import java.nio.charset.StandardCharsets;
39+
import java.nio.file.Files;
40+
import java.nio.file.Paths;
6541
import java.text.DecimalFormat;
66-
import java.time.Instant;
67-
import java.time.LocalDate;
68-
import java.time.LocalDateTime;
69-
import java.time.LocalTime;
70-
import java.time.MonthDay;
71-
import java.time.OffsetDateTime;
72-
import java.time.Year;
73-
import java.time.YearMonth;
74-
import java.time.ZoneId;
42+
import java.time.*;
7543
import java.time.format.DateTimeFormatter;
76-
import java.util.ArrayList;
77-
import java.util.Arrays;
78-
import java.util.Collections;
79-
import java.util.Date;
80-
import java.util.HashMap;
81-
import java.util.HashSet;
82-
import java.util.IdentityHashMap;
83-
import java.util.Iterator;
84-
import java.util.LinkedHashMap;
85-
import java.util.LinkedHashSet;
86-
import java.util.List;
87-
import java.util.Locale;
88-
import java.util.Map;
89-
import java.util.Objects;
90-
import java.util.Optional;
91-
import java.util.Set;
92-
import java.util.Stack;
93-
import java.util.TimeZone;
94-
import java.util.UUID;
44+
import java.util.*;
9545
import java.util.logging.Logger;
9646
import java.util.regex.Pattern;
9747
import java.util.stream.Collectors;
48+
import java.util.zip.ZipEntry;
49+
import java.util.zip.ZipInputStream;
50+
import java.util.zip.ZipOutputStream;
9851

9952
/**
10053
* Description: DocUtil
@@ -1810,4 +1763,45 @@ public static String getIndentByLevel(int level) {
18101763
return getStringBuilderByLevel(level).toString();
18111764
}
18121765

1766+
/**
1767+
* replace docx content
1768+
* @param content doc content
1769+
* @param docxOutputPath docx output path
1770+
* @param templateDocx docx template
1771+
* @throws Exception exception
1772+
* @since 3.0.8
1773+
*/
1774+
public static void copyAndReplaceDocx(String content, String docxOutputPath, String templateDocx) throws Exception {
1775+
InputStream resourceAsStream = WordDocBuilder.class.getClassLoader().getResourceAsStream(templateDocx);
1776+
Objects.requireNonNull(resourceAsStream, "word template docx is not found");
1777+
1778+
ZipInputStream zipInputStream = new ZipInputStream(resourceAsStream);
1779+
ZipOutputStream zipOutputStream = new ZipOutputStream(Files.newOutputStream(Paths.get(docxOutputPath)));
1780+
// Traverse the files in the compressed package
1781+
ZipEntry entry;
1782+
while ((entry = zipInputStream.getNextEntry()) != null) {
1783+
String entryName = entry.getName();
1784+
// copy fix the bug: invalid entry compressed size
1785+
zipOutputStream.putNextEntry(new ZipEntry(entryName));
1786+
if ("word/document.xml".equals(entryName)) {
1787+
byte[] bytes = content.getBytes(StandardCharsets.UTF_8);
1788+
zipOutputStream.write(bytes, 0, bytes.length);
1789+
}
1790+
else {
1791+
// copy
1792+
byte[] buffer = new byte[1024];
1793+
int len;
1794+
while ((len = zipInputStream.read(buffer)) > 0) {
1795+
zipOutputStream.write(buffer, 0, len);
1796+
}
1797+
}
1798+
1799+
zipOutputStream.closeEntry();
1800+
zipInputStream.closeEntry();
1801+
}
1802+
1803+
zipInputStream.close();
1804+
zipOutputStream.close();
1805+
}
1806+
18131807
}

src/main/resources/template/dubbo/DubboAllInOneWordTemplate.xml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,31 @@
876876
</w:r>
877877
</w:p>
878878
</w:tc>
879+
<w:tc>
880+
<w:tcPr>
881+
<w:tcW w:w="1210" w:type="dxa"/>
882+
<w:tcBorders>
883+
<w:top w:val="single" w:color="DFE2E5" w:sz="4" w:space="0"/>
884+
<w:left w:val="single" w:color="DFE2E5" w:sz="4" w:space="0"/>
885+
<w:bottom w:val="single" w:color="DFE2E5" w:sz="4" w:space="0"/>
886+
<w:right w:val="single" w:color="DFE2E5" w:sz="4" w:space="0"/>
887+
</w:tcBorders>
888+
<w:shd w:val="clear" w:color="auto" w:fill="F8F8F8"/>
889+
</w:tcPr>
890+
<w:p>
891+
<w:pPr>
892+
<w:pStyle w:val="24"/>
893+
<w:jc w:val="left"/>
894+
</w:pPr>
895+
<w:r>
896+
<w:rPr>
897+
<w:b/>
898+
<w:bCs/>
899+
</w:rPr>
900+
<w:t>Required</w:t>
901+
</w:r>
902+
</w:p>
903+
</w:tc>
879904
<w:tc>
880905
<w:tcPr>
881906
<w:tcBorders>
@@ -974,6 +999,30 @@
974999
</w:r>
9751000
</w:p>
9761001
</w:tc>
1002+
1003+
<w:tc>
1004+
<w:tcPr>
1005+
<w:tcW w:w="1210" w:type="dxa"/>
1006+
<w:tcBorders>
1007+
<w:top w:val="single" w:color="DFE2E5" w:sz="4" w:space="0"/>
1008+
<w:left w:val="single" w:color="DFE2E5" w:sz="4" w:space="0"/>
1009+
<w:bottom w:val="single" w:color="DFE2E5" w:sz="4" w:space="0"/>
1010+
<w:right w:val="single" w:color="DFE2E5" w:sz="4" w:space="0"/>
1011+
</w:tcBorders>
1012+
<%if (paramLP.index % 2 == 0) {%>
1013+
<w:shd w:val="clear" w:color="auto" w:fill="F8F8F8"/>
1014+
<%}%>
1015+
</w:tcPr>
1016+
<w:p>
1017+
<w:pPr>
1018+
<w:pStyle w:val="24"/>
1019+
<w:jc w:val="left"/>
1020+
</w:pPr>
1021+
<w:r>
1022+
<w:t>${wordXmlEscape(param.required)}</w:t>
1023+
</w:r>
1024+
</w:p>
1025+
</w:tc>
9771026
<w:tc>
9781027
<w:tcPr>
9791028
<w:tcBorders>
-14 KB
Binary file not shown.

0 commit comments

Comments
 (0)