Author: fanningpj Date: Sun Aug 9 21:15:15 2020 New Revision: 1880727 URL: http://svn.apache.org/viewvc?rev=1880727&view=rev Log: [github-187] Add length validation for Excel DataValidations that are list literals. Thanks to Leo Webb. This closes #187
Added: poi/trunk/test-data/spreadsheet/DataValidationListTooLong.xlsx (with props) Modified: poi/trunk/src/multimodule/scratchpad/java9/module-info.class poi/trunk/src/multimodule/scratchpad/test9/module-info.class poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidationConstraint.java poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDataValidationConstraint.java Modified: poi/trunk/src/multimodule/scratchpad/java9/module-info.class URL: http://svn.apache.org/viewvc/poi/trunk/src/multimodule/scratchpad/java9/module-info.class?rev=1880727&r1=1880726&r2=1880727&view=diff ============================================================================== Binary files - no diff available. Modified: poi/trunk/src/multimodule/scratchpad/test9/module-info.class URL: http://svn.apache.org/viewvc/poi/trunk/src/multimodule/scratchpad/test9/module-info.class?rev=1880727&r1=1880726&r2=1880727&view=diff ============================================================================== Binary files - no diff available. Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidationConstraint.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidationConstraint.java?rev=1880727&r1=1880726&r2=1880727&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidationConstraint.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidationConstraint.java Sun Aug 9 21:15:15 2020 @@ -30,12 +30,14 @@ import org.openxmlformats.schemas.spread public class XSSFDataValidationConstraint implements DataValidationConstraint { /** * Excel validation constraints with static lists are delimited with optional whitespace and the Windows List Separator, - * which is typically comma, but can be changed by users. POI will just assume comma. + * which is typically comma, but can be changed by users. POI will just assume comma. + * In addition, Excel validation with static lists has a maximum size of 255 characters, including separators and excluding quotes. */ private static final String LIST_SEPARATOR = ","; private static final Pattern LIST_SPLIT_REGEX = Pattern.compile("\\s*" + LIST_SEPARATOR + "\\s*"); private static final String QUOTE = "\""; - + private static final int MAX_EXPLICIT_LIST_LENGTH = 257; + private String formula1; private String formula2; private int validationType = -1; @@ -204,6 +206,9 @@ public class XSSFDataValidationConstrain if (isFormulaEmpty(formula1)) { throw new IllegalArgumentException("A valid formula or a list of values must be specified for list validation."); } + if(formula1.length() > MAX_EXPLICIT_LIST_LENGTH) { + throw new IllegalArgumentException("A valid formula or a list of values must be less than or equal to 255 characters (including separators)."); + } } else { if( isFormulaEmpty(formula1) ) { throw new IllegalArgumentException("Formula is not specified. Formula is required for all validation types except explicit list validation."); Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDataValidationConstraint.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDataValidationConstraint.java?rev=1880727&r1=1880726&r2=1880727&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDataValidationConstraint.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDataValidationConstraint.java Sun Aug 9 21:15:15 2020 @@ -18,11 +18,18 @@ package org.apache.poi.xssf.usermodel; import static org.junit.Assert.*; +import org.apache.poi.ss.formula.DataValidationEvaluator; import org.apache.poi.ss.usermodel.DataValidationConstraint; import org.apache.poi.ss.usermodel.DataValidationConstraint.ValidationType; +import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.ss.usermodel.DataValidationConstraint.OperatorType; +import org.apache.poi.ss.util.CellReference; import org.junit.Test; +import java.util.Collections; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + public class TestXSSFDataValidationConstraint { static final int listType = ValidationType.LIST; static final int ignoredType = OperatorType.IGNORED; @@ -52,6 +59,20 @@ public class TestXSSFDataValidationConst } @Test + public void listLiteralsGreaterThan255CharactersThrows() { + String[] literal = IntStream.range(0, 129).mapToObj(i -> "a").toArray(String[]::new); + assertThrows(IllegalArgumentException.class, () -> new XSSFDataValidationConstraint(literal)); + } + + @Test + public void dataValidationListLiteralTooLongFromFile() { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("DataValidationListTooLong.xlsx"); + XSSFFormulaEvaluator fEval = wb.getCreationHelper().createFormulaEvaluator(); + DataValidationEvaluator dvEval = new DataValidationEvaluator(wb, fEval); + assertThrows(IllegalArgumentException.class, () -> dvEval.getValidationValuesForCell(new CellReference("Sheet0!A1"))); + } + + @Test public void rangeReference() { // (unnamed range) reference list String reference = "A1:A5"; Added: poi/trunk/test-data/spreadsheet/DataValidationListTooLong.xlsx URL: http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/DataValidationListTooLong.xlsx?rev=1880727&view=auto ============================================================================== Binary file - no diff available. Propchange: poi/trunk/test-data/spreadsheet/DataValidationListTooLong.xlsx ------------------------------------------------------------------------------ --- svn:mime-type (added) +++ svn:mime-type Sun Aug 9 21:15:15 2020 @@ -0,0 +1 @@ +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@poi.apache.org For additional commands, e-mail: commits-h...@poi.apache.org