Skip to content

Commit bf3d23b

Browse files
authored
fix: custom converters not being inherited from parent write holders (#893)
* Fix custom converters not being inherited from parent write holders * Address review feedback
1 parent 95186b4 commit bf3d23b

3 files changed

Lines changed: 85 additions & 1 deletion

File tree

fesod-sheet/src/main/java/org/apache/fesod/sheet/write/metadata/holder/AbstractWriteHolder.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ
129129
*/
130130
private Boolean orderByIncludeColumn;
131131

132+
/**
133+
* Custom converters for this holder
134+
*/
135+
private List<Converter<?>> customConverterList;
136+
132137
/**
133138
* Write handler
134139
*/
@@ -261,12 +266,22 @@ public AbstractWriteHolder(WriteBasicParameter writeBasicParameter, AbstractWrit
261266

262267
// Set converterMap
263268
if (parentAbstractWriteHolder == null) {
264-
setConverterMap(DefaultConverterLoader.loadDefaultWriteConverter());
269+
setConverterMap(new HashMap<>(DefaultConverterLoader.loadDefaultWriteConverter()));
265270
} else {
266271
setConverterMap(new HashMap<>(parentAbstractWriteHolder.getConverterMap()));
272+
if (CollectionUtils.isNotEmpty(parentAbstractWriteHolder.getCustomConverterList())) {
273+
for (Converter<?> converter : parentAbstractWriteHolder.getCustomConverterList()) {
274+
getConverterMap()
275+
.put(
276+
ConverterKeyBuild.buildKey(
277+
converter.supportJavaTypeKey(), converter.supportExcelTypeKey()),
278+
converter);
279+
}
280+
}
267281
}
268282
if (writeBasicParameter.getCustomConverterList() != null
269283
&& !writeBasicParameter.getCustomConverterList().isEmpty()) {
284+
this.customConverterList = writeBasicParameter.getCustomConverterList();
270285
for (Converter<?> converter : writeBasicParameter.getCustomConverterList()) {
271286
getConverterMap()
272287
.put(

fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/CustomConverterTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.fesod.sheet.converters.ConverterKeyBuild;
3131
import org.apache.fesod.sheet.util.TestFileUtil;
3232
import org.apache.fesod.sheet.write.builder.ExcelWriterSheetBuilder;
33+
import org.apache.fesod.sheet.write.metadata.holder.WriteSheetHolder;
3334
import org.junit.jupiter.api.Assertions;
3435
import org.junit.jupiter.api.BeforeAll;
3536
import org.junit.jupiter.api.MethodOrderer;
@@ -42,12 +43,16 @@ public class CustomConverterTest {
4243
private static File converterCsvFile10;
4344
private static File converterExcelFile11;
4445
private static File converterExcelFile12;
46+
private static File converterExcelFile13;
47+
private static File converterCsvFile14;
4548

4649
@BeforeAll
4750
static void init() {
4851
converterCsvFile10 = TestFileUtil.createNewFile("converter10.csv");
4952
converterExcelFile11 = TestFileUtil.createNewFile("converter11.xls");
5053
converterExcelFile12 = TestFileUtil.createNewFile("converter12.xlsx");
54+
converterExcelFile13 = TestFileUtil.createNewFile("converter13.xlsx");
55+
converterCsvFile14 = TestFileUtil.createNewFile("converter14.csv");
5156
}
5257

5358
@Test
@@ -83,6 +88,28 @@ void t04Write12() throws Exception {
8388
writeFile(converterExcelFile12);
8489
}
8590

91+
@Test
92+
void t05GlobalConverterInSheetHolder() throws Exception {
93+
TimestampStringConverter timestampStringConverter = new TimestampStringConverter();
94+
ExcelWriter excelWriter = FesodSheet.write(converterExcelFile13)
95+
.registerConverter(timestampStringConverter)
96+
.build();
97+
excelWriter.write(data(), new ExcelWriterSheetBuilder().sheetNo(0).build());
98+
WriteSheetHolder sheetHolder = excelWriter.writeContext().writeSheetHolder();
99+
Map<ConverterKeyBuild.ConverterKey, Converter<?>> sheetConverterMap = sheetHolder.converterMap();
100+
excelWriter.finish();
101+
Assertions.assertTrue(sheetConverterMap.containsKey(ConverterKeyBuild.buildKey(
102+
timestampStringConverter.supportJavaTypeKey(), timestampStringConverter.supportExcelTypeKey())));
103+
}
104+
105+
@Test
106+
void t06GlobalConverterWriteWithoutFieldLevelConverter() throws Exception {
107+
FesodSheet.write(converterCsvFile14)
108+
.registerConverter(new TimestampStringConverter())
109+
.sheet()
110+
.doWrite(globalData());
111+
}
112+
86113
private void writeFile(File file) throws Exception {
87114
FesodSheet.write(file)
88115
.registerConverter(new TimestampNumberConverter())
@@ -91,6 +118,14 @@ private void writeFile(File file) throws Exception {
91118
.doWrite(data());
92119
}
93120

121+
private List<GlobalConverterWriteData> globalData() throws Exception {
122+
List<GlobalConverterWriteData> list = new ArrayList<>();
123+
GlobalConverterWriteData writeData = new GlobalConverterWriteData();
124+
writeData.setTimestampData(Timestamp.valueOf("2020-01-01 01:00:00"));
125+
list.add(writeData);
126+
return list;
127+
}
128+
94129
private List<CustomConverterWriteData> data() throws Exception {
95130
List<CustomConverterWriteData> list = new ArrayList<>();
96131
CustomConverterWriteData writeData = new CustomConverterWriteData();
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.apache.fesod.sheet.converter;
21+
22+
import java.sql.Timestamp;
23+
import lombok.EqualsAndHashCode;
24+
import lombok.Getter;
25+
import lombok.Setter;
26+
import org.apache.fesod.sheet.annotation.ExcelProperty;
27+
28+
@Getter
29+
@Setter
30+
@EqualsAndHashCode
31+
public class GlobalConverterWriteData {
32+
@ExcelProperty("时间戳-字符串")
33+
private Timestamp timestampData;
34+
}

0 commit comments

Comments
 (0)