Skip to content

Commit b1f98e8

Browse files
committed
refactor(easydocx): Objects.requireNonNull boundary checks (java-conventions)
- EasyDocx.write/read: model and listener rejected when null - DocxWriterBuilder.process(Map): null vars handled as empty (was NPE in new HashMap<>(null)) - DocxReaderBuilder ctor: model/listener requireNonNull - MarkdownConverter/DocxFields null->default already compliant Tests: EasyDocxTest 5 + DocxWriterBuilderTest 4 + ReaderBuilder 3 (11 green).
1 parent 4ef529b commit b1f98e8

5 files changed

Lines changed: 44 additions & 4 deletions

File tree

easydoc-core/src/main/java/io/github/easy4j/doc/easy/DocxReaderBuilder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.File;
44
import java.util.HashMap;
5+
import java.util.Objects;
56
import java.util.Map;
67

78
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
@@ -24,8 +25,8 @@ public final class DocxReaderBuilder<T> {
2425

2526
public DocxReaderBuilder(File templateFile, Class<T> model, DocxReadListener<T> listener) {
2627
this.templateFile = templateFile;
27-
this.model = model;
28-
this.listener = listener;
28+
this.model = Objects.requireNonNull(model, "model must not be null");
29+
this.listener = Objects.requireNonNull(listener, "listener must not be null");
2930
}
3031

3132
/**

easydoc-core/src/main/java/io/github/easy4j/doc/easy/DocxWriterBuilder.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.File;
44
import java.util.HashMap;
5+
import java.util.Objects;
56
import java.util.Map;
67

78
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
@@ -47,10 +48,12 @@ public WordprocessingMLPackage process(T data) throws Exception {
4748
return process(DocxFields.from(data));
4849
}
4950

50-
/** 原始 Map 渲染(兼容现有 API 的变量注入)。 */
51+
/** 原始 Map 渲染(兼容现有 API 的变量注入);vars 为 null 时按空变量处理。 */
5152
public WordprocessingMLPackage process(Map<String, Object> vars) throws Exception {
5253
WordprocessingMLTemplate template = DocxTemplates.create(mode);
53-
Map<String, Object> effective = new HashMap<String, Object>(vars);
54+
Map<String, Object> effective = vars != null
55+
? new HashMap<String, Object>(vars)
56+
: new HashMap<String, Object>();
5457
return template.process(templateFile, effective);
5558
}
5659
}

easydoc-core/src/main/java/io/github/easy4j/doc/easy/EasyDocx.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.github.easy4j.doc.easy;
22

33
import java.io.File;
4+
import java.util.Objects;
45

56
/**
67
* 类 EasyExcel / easyodf 的 easydoc 静态门面:链式构建 docx 模板渲染与读取。
@@ -13,20 +14,26 @@ private EasyDocx() {
1314
}
1415

1516
public static <T> DocxWriterBuilder<T> write(String templatePath, Class<T> model) {
17+
Objects.requireNonNull(model, "model must not be null");
1618
return new DocxWriterBuilder<T>(new File(templatePath), model);
1719
}
1820

1921
public static <T> DocxWriterBuilder<T> write(File templateFile, Class<T> model) {
22+
Objects.requireNonNull(model, "model must not be null");
2023
return new DocxWriterBuilder<T>(templateFile, model);
2124
}
2225

2326
public static <T> DocxReaderBuilder<T> read(String templatePath, Class<T> model,
2427
DocxReadListener<T> listener) {
28+
Objects.requireNonNull(model, "model must not be null");
29+
Objects.requireNonNull(listener, "listener must not be null");
2530
return new DocxReaderBuilder<T>(new File(templatePath), model, listener);
2631
}
2732

2833
public static <T> DocxReaderBuilder<T> read(File templateFile, Class<T> model,
2934
DocxReadListener<T> listener) {
35+
Objects.requireNonNull(model, "model must not be null");
36+
Objects.requireNonNull(listener, "listener must not be null");
3037
return new DocxReaderBuilder<T>(templateFile, model, listener);
3138
}
3239
}

easydoc-core/src/test/java/io/github/easy4j/doc/easy/DocxWriterBuilderTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ void processAcceptsRawMap() throws Exception {
5454
tmp.delete();
5555
}
5656

57+
@Test
58+
void processHandlesNullVarsAsEmpty() throws Exception {
59+
File tmp = tempTemplate();
60+
WordprocessingMLPackage pkg = new DocxWriterBuilder<Contract>(tmp, Contract.class)
61+
.process((java.util.Map<String, Object>) null);
62+
assertNotNull(pkg, "null vars must render as empty variables");
63+
tmp.delete();
64+
}
65+
5766
@Test
5867
void documentAndModeAreChainable() throws Exception {
5968
File tmp = tempTemplate();

easydoc-core/src/test/java/io/github/easy4j/doc/easy/EasyDocxTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.github.easy4j.doc.easy;
22

33
import static org.junit.jupiter.api.Assertions.assertNotNull;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
45

56
import java.io.File;
67

@@ -19,6 +20,25 @@ void writeReturnsWriterBuilder() {
1920
"write(file, model) must return a builder");
2021
}
2122

23+
@Test
24+
void writeRejectsNullModel() {
25+
assertThrows(NullPointerException.class,
26+
() -> EasyDocx.write("src/test/resources/tpl/template.docx", null),
27+
"null model must be rejected");
28+
}
29+
30+
@Test
31+
void readRejectsNullModelOrListener() {
32+
DocxReadListener<Model> l = (data, values) -> {
33+
};
34+
assertThrows(NullPointerException.class,
35+
() -> EasyDocx.read("src/test/resources/tpl/template.docx", null, l),
36+
"null model must be rejected");
37+
assertThrows(NullPointerException.class,
38+
() -> EasyDocx.read("src/test/resources/tpl/template.docx", Model.class, null),
39+
"null listener must be rejected");
40+
}
41+
2242
@Test
2343
void readReturnsReaderBuilder() {
2444
DocxReadListener<Model> l = new DocxReadListener<Model>() {

0 commit comments

Comments
 (0)