diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidation.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidation.java index a0160b565..9f945ddbe 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidation.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataValidation.java @@ -35,6 +35,8 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataValidationOpera * */ public class XSSFDataValidation implements DataValidation { + private static final int MAX_TEXT_LENGTH = 255; + private CTDataValidation ctDdataValidation; private XSSFDataValidationConstraint validationConstraint; private CellRangeAddressList regions; @@ -43,15 +45,13 @@ public class XSSFDataValidation implements DataValidation { static Map operatorTypeReverseMappings = new HashMap(); static Map validationTypeMappings = new HashMap(); static Map validationTypeReverseMappings = new HashMap(); - static Map errorStyleMappings = new HashMap(); + static Map errorStyleMappings = new HashMap(); + static { errorStyleMappings.put(DataValidation.ErrorStyle.INFO, STDataValidationErrorStyle.INFORMATION); errorStyleMappings.put(DataValidation.ErrorStyle.STOP, STDataValidationErrorStyle.STOP); errorStyleMappings.put(DataValidation.ErrorStyle.WARNING, STDataValidationErrorStyle.WARNING); - } - - - static { + operatorTypeMappings.put(DataValidationConstraint.OperatorType.BETWEEN,STDataValidationOperator.BETWEEN); operatorTypeMappings.put(DataValidationConstraint.OperatorType.NOT_BETWEEN,STDataValidationOperator.NOT_BETWEEN); operatorTypeMappings.put(DataValidationConstraint.OperatorType.EQUAL,STDataValidationOperator.EQUAL); @@ -64,9 +64,7 @@ public class XSSFDataValidation implements DataValidation { for( Map.Entry entry : operatorTypeMappings.entrySet() ) { operatorTypeReverseMappings.put(entry.getValue(),entry.getKey()); } - } - static { validationTypeMappings.put(DataValidationConstraint.ValidationType.FORMULA,STDataValidationType.CUSTOM); validationTypeMappings.put(DataValidationConstraint.ValidationType.DATE,STDataValidationType.DATE); validationTypeMappings.put(DataValidationConstraint.ValidationType.DECIMAL,STDataValidationType.DECIMAL); @@ -81,7 +79,6 @@ public class XSSFDataValidation implements DataValidation { } } - XSSFDataValidation(CellRangeAddressList regions,CTDataValidation ctDataValidation) { this(getConstraint(ctDataValidation), regions, ctDataValidation); } @@ -104,10 +101,10 @@ public class XSSFDataValidation implements DataValidation { */ public void createErrorBox(String title, String text) { // the spec does not specify a length-limit, however Excel reports files as "corrupt" if they exceed 255 bytes for these texts... - if(title != null && title.length() > 255) { + if(title != null && title.length() > MAX_TEXT_LENGTH) { throw new IllegalStateException("Error-title cannot be longer than 32 characters, but had: " + title); } - if(text != null && text.length() > 255) { + if(text != null && text.length() > MAX_TEXT_LENGTH) { throw new IllegalStateException("Error-text cannot be longer than 255 characters, but had: " + text); } ctDdataValidation.setErrorTitle(encodeUtf(title)); @@ -119,10 +116,10 @@ public class XSSFDataValidation implements DataValidation { */ public void createPromptBox(String title, String text) { // the spec does not specify a length-limit, however Excel reports files as "corrupt" if they exceed 255 bytes for these texts... - if(title != null && title.length() > 255) { + if(title != null && title.length() > MAX_TEXT_LENGTH) { throw new IllegalStateException("Error-title cannot be longer than 32 characters, but had: " + title); } - if(text != null && text.length() > 255) { + if(text != null && text.length() > MAX_TEXT_LENGTH) { throw new IllegalStateException("Error-text cannot be longer than 255 characters, but had: " + text); } ctDdataValidation.setPromptTitle(encodeUtf(title)); @@ -143,6 +140,10 @@ public class XSSFDataValidation implements DataValidation { * @return the encoded string */ private String encodeUtf(String text) { + if(text == null) { + return null; + } + StringBuilder builder = new StringBuilder(); for(char c : text.toCharArray()) { // for now only encode characters below 32, we can add more here if needed diff --git a/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java b/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java index 4d465499a..a1f296355 100644 --- a/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java +++ b/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java @@ -1805,6 +1805,9 @@ public abstract class BaseTestBugzillaIssues { checkFailures(dataValidation, TEST_256, TEST_32, true); checkFailures(dataValidation, TEST_32, TEST_256, true); + // null does work + checkFailures(dataValidation, null, null, false); + // more than 32 title fail for HSSFWorkbook checkFailures(dataValidation, TEST_255, TEST_32, wb instanceof HSSFWorkbook); @@ -1838,16 +1841,16 @@ public abstract class BaseTestBugzillaIssues { private void checkFailures(DataValidation dataValidation, String title, String text, boolean shouldFail) { try { dataValidation.createPromptBox(title, text); - assertFalse("Should fail in a length-check, had " + title.length() + " and " + text.length(), shouldFail); + assertFalse("Should fail in a length-check, had " + (title == null ? null : title.length()) + " and " + (text == null ? null : text.length()), shouldFail); } catch (IllegalStateException e) { - assertTrue("Should not fail in a length-check, had " + title.length() + " and " + text.length(), shouldFail); + assertTrue("Should not fail in a length-check, had " + (title == null ? null : title.length()) + " and " + (text == null ? null : text.length()), shouldFail); // expected here } try { dataValidation.createErrorBox(title, text); - assertFalse("Should fail in a length-check, had " + title.length() + " and " + text.length(), shouldFail); + assertFalse("Should fail in a length-check, had " + (title == null ? null : title.length()) + " and " + (text == null ? null : text.length()), shouldFail); } catch (IllegalStateException e) { - assertTrue("Should not fail in a length-check, had " + title.length() + " and " + text.length(), shouldFail); + assertTrue("Should not fail in a length-check, had " + (title == null ? null : title.length()) + " and " + (text == null ? null : text.length()), shouldFail); } }