2121
2222import static org .junit .jupiter .api .Assertions .*;
2323import java .io .File ;
24+ import java .util .ArrayList ;
25+
26+ import org .apache .fesod .sheet .ExcelReader ;
2427import org .apache .fesod .sheet .ExcelWriter ;
2528import org .apache .fesod .sheet .FesodSheet ;
2629import org .apache .fesod .sheet .converters .Converter ;
2730import org .apache .fesod .sheet .enums .CellDataTypeEnum ;
2831import org .apache .fesod .sheet .metadata .GlobalConfiguration ;
32+ import org .apache .fesod .sheet .metadata .data .ReadCellData ;
2933import org .apache .fesod .sheet .metadata .data .WriteCellData ;
3034import org .apache .fesod .sheet .metadata .property .ExcelContentProperty ;
3135import org .apache .fesod .sheet .util .TestFileUtil ;
@@ -35,7 +39,7 @@ public class ConverterIsolationTest {
3539
3640 public static class TestData {}
3741
38- public static class ConverterA implements Converter <String > {
42+ public static class WriteConverterA implements Converter <String > {
3943
4044 @ Override
4145 public Class <String > supportJavaTypeKey () {
@@ -53,21 +57,64 @@ public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty p,
5357 }
5458 }
5559
60+ public static class ReadConverterA implements Converter <String > {
61+
62+ @ Override
63+ public Class <String > supportJavaTypeKey () {
64+ return String .class ;
65+ }
66+
67+ @ Override
68+ public CellDataTypeEnum supportExcelTypeKey () {
69+ return CellDataTypeEnum .STRING ;
70+ }
71+
72+ @ Override
73+ public String convertToJavaData (ReadCellData <?> cellData , ExcelContentProperty p , GlobalConfiguration g ) {
74+ return "A-" + cellData .getStringValue ();
75+ }
76+ }
77+
5678 @ Test
57- public void testConverterIsolation () {
79+ public void testWriterConverterIsolation () {
5880 ExcelWriter writer1 = FesodSheet .write (new File (TestFileUtil .getPath () + "writer1.xlsx" ), TestData .class )
59- .registerConverter (new ConverterA ())
81+ .registerConverter (new WriteConverterA ())
6082 .build ();
6183
6284 ExcelWriter writer2 = FesodSheet .write (new File (TestFileUtil .getPath () + "writer2.xlsx" ), TestData .class )
6385 .build ();
6486
6587 boolean writer2HasConverterA = writer2 .writeContext ().currentWriteHolder ().converterMap ().values ().stream ()
66- .anyMatch (c -> c instanceof ConverterA );
88+ .anyMatch (c -> c instanceof WriteConverterA );
6789
6890 writer1 .finish ();
6991 writer2 .finish ();
7092
7193 assertFalse (writer2HasConverterA , "Custom converter should not leak between ExcelWriter instances" );
7294 }
95+
96+ @ Test
97+ public void testReaderConverterIsolation () {
98+ File testFile = TestFileUtil .createNewFile ("converter_isolation_test.xlsx" );
99+
100+ FesodSheet .write (testFile , TestData .class )
101+ .sheet ()
102+ .doWrite (new ArrayList <>());
103+
104+ ExcelReader reader1 = FesodSheet .read (testFile , TestData .class , null )
105+ .registerConverter (new ReadConverterA ())
106+ .build ();
107+
108+ ExcelReader reader2 = FesodSheet .read (testFile , TestData .class , null )
109+ .build ();
110+
111+ boolean leaked = reader2 .analysisContext ().currentReadHolder ()
112+ .converterMap ().values ().stream ()
113+ .anyMatch (c -> c instanceof ReadConverterA );
114+
115+ reader1 .finish ();
116+ reader2 .finish ();
117+
118+ assertFalse (leaked );
119+ }
73120}
0 commit comments