From c69196edae6c086a998dce9a941199918651ca4f Mon Sep 17 00:00:00 2001 From: Rivaldi Date: Wed, 13 Aug 2025 20:11:48 +0700 Subject: [PATCH 1/2] fix: avoid ArrayIndexOutOfBoundsException when currentRow length more than column names length Signed-off-by: Rivaldi --- .../excel/support/rowset/DefaultRowSet.java | 3 ++ .../support/rowset/DefaultRowSetTest.java | 51 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSetTest.java diff --git a/spring-batch-excel/src/main/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSet.java b/spring-batch-excel/src/main/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSet.java index 6aa2bd47..a74f4649 100644 --- a/spring-batch-excel/src/main/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSet.java +++ b/spring-batch-excel/src/main/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSet.java @@ -80,6 +80,9 @@ public Properties getProperties() { for (int i = 0; i < this.currentRow.length; i++) { String value = this.currentRow[i]; if (value != null) { + if (i > names.length - 1) { + break; + } props.setProperty(names[i], value); } } diff --git a/spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSetTest.java b/spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSetTest.java new file mode 100644 index 00000000..900f7152 --- /dev/null +++ b/spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSetTest.java @@ -0,0 +1,51 @@ +package org.springframework.batch.extensions.excel.support.rowset; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; +import org.springframework.batch.extensions.excel.MockSheet; +import org.springframework.batch.extensions.excel.Sheet; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.BDDMockito.given; + +class DefaultRowSetTest { + + private DefaultRowSet rowSet; + + @BeforeEach + void setUp() { + rowSet = new DefaultRowSet(new MockSheet( + "Sheet1", + Arrays.asList("col1a,col1b,col1c".split(","), "col2a,col2b,col2c".split(","), "col3a,col3b,col3c".split(",")) + ), new RowSetMetaData() { + @Override + public String[] getColumnNames() { + return new String[]{ "cola", "colb"}; + } + + @Override + public String getSheetName() { + return "Sheet1"; + } + }); + } + + @Test + void shouldReturnPropsSizeEqualsToMetadataColumns() { + rowSet.next(); + var properties = rowSet.getProperties(); + + assertThat(properties.size()).isEqualTo(2); + assertThat(properties.getProperty("cola")).isEqualTo("col1a"); + assertThat(properties.getProperty("colb")).isEqualTo("col1b"); + assertThat(properties.getProperty("colc")).isNull(); + } +} From 288c398aa51fe43bd1ca64043197ffe523be67a0 Mon Sep 17 00:00:00 2001 From: Marten Deinum Date: Mon, 18 Aug 2025 11:31:13 +0200 Subject: [PATCH 2/2] Polish contribution - Adhere to rules from Checkstyle - Simplify implementation - Fix bug in other test-case (apparent after simplifying the implementation) Signed-off-by: Marten Deinum --- .../excel/support/rowset/DefaultRowSet.java | 5 +-- .../streaming/StreamingXlsxMappingTests.java | 2 +- ...owSetTest.java => DefaultRowSetTests.java} | 39 ++++++++++++------- 3 files changed, 26 insertions(+), 20 deletions(-) rename spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/support/rowset/{DefaultRowSetTest.java => DefaultRowSetTests.java} (52%) diff --git a/spring-batch-excel/src/main/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSet.java b/spring-batch-excel/src/main/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSet.java index a74f4649..af3b9a04 100644 --- a/spring-batch-excel/src/main/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSet.java +++ b/spring-batch-excel/src/main/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSet.java @@ -77,12 +77,9 @@ public Properties getProperties() { } Properties props = new Properties(); - for (int i = 0; i < this.currentRow.length; i++) { + for (int i = 0; i < names.length; i++) { String value = this.currentRow[i]; if (value != null) { - if (i > names.length - 1) { - break; - } props.setProperty(names[i], value); } } diff --git a/spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/streaming/StreamingXlsxMappingTests.java b/spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/streaming/StreamingXlsxMappingTests.java index 3751c18d..567525e9 100644 --- a/spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/streaming/StreamingXlsxMappingTests.java +++ b/spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/streaming/StreamingXlsxMappingTests.java @@ -34,7 +34,7 @@ class StreamingXlsxMappingTests { @Test void readAndMapRowsUsingRowMapper() throws Exception { - var columns = new String[] {"id", "position", "lastName", "firstName", "birthYear", "debutYear", "comment"}; + var columns = new String[] {"id", "position", "lastName", "firstName", "birthYear", "debutYear"}; var rowSetFactory = new DefaultRowSetFactory(); rowSetFactory.setColumnNameExtractor(new StaticColumnNameExtractor(columns)); diff --git a/spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSetTest.java b/spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSetTests.java similarity index 52% rename from spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSetTest.java rename to spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSetTests.java index 900f7152..05bcf870 100644 --- a/spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSetTest.java +++ b/spring-batch-excel/src/test/java/org/springframework/batch/extensions/excel/support/rowset/DefaultRowSetTests.java @@ -1,28 +1,37 @@ +/* + * Copyright 2025-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.springframework.batch.extensions.excel.support.rowset; +import java.util.Arrays; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mockito; -import org.springframework.batch.extensions.excel.MockSheet; -import org.springframework.batch.extensions.excel.Sheet; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Properties; +import org.springframework.batch.extensions.excel.MockSheet; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.BDDMockito.given; +import static org.assertj.core.api.Assertions.assertThat; -class DefaultRowSetTest { +class DefaultRowSetTests { private DefaultRowSet rowSet; @BeforeEach void setUp() { - rowSet = new DefaultRowSet(new MockSheet( + this.rowSet = new DefaultRowSet(new MockSheet( "Sheet1", Arrays.asList("col1a,col1b,col1c".split(","), "col2a,col2b,col2c".split(","), "col3a,col3b,col3c".split(",")) ), new RowSetMetaData() { @@ -40,8 +49,8 @@ public String getSheetName() { @Test void shouldReturnPropsSizeEqualsToMetadataColumns() { - rowSet.next(); - var properties = rowSet.getProperties(); + this.rowSet.next(); + var properties = this.rowSet.getProperties(); assertThat(properties.size()).isEqualTo(2); assertThat(properties.getProperty("cola")).isEqualTo("col1a");