From 86153c0ea65d5820b4659b0209ffc5f95ca5ad3a Mon Sep 17 00:00:00 2001
From: Nick Burch <nick@apache.org>
Date: Mon, 15 Feb 2016 14:58:16 +0000
Subject: [PATCH] Add details of the ignored errors where the HSSF spec
 provides a good description, and a bit more refactoring. #56892

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1730543 13f79535-47bb-0310-9956-ffa450edef68
---
 .../hssf/record/common/FeatFormulaErr2.java   |  3 +-
 .../poi/ss/usermodel/IgnoredErrorType.java    | 44 +++++++++++++++++--
 .../apache/poi/xssf/usermodel/XSSFSheet.java  | 18 +-------
 .../helpers/XSSFIgnoredErrorHelper.java       | 23 +++++++++-
 .../poi/xssf/usermodel/TestXSSFSheet.java     |  1 +
 5 files changed, 68 insertions(+), 21 deletions(-)

diff --git a/src/java/org/apache/poi/hssf/record/common/FeatFormulaErr2.java b/src/java/org/apache/poi/hssf/record/common/FeatFormulaErr2.java
index b3a9a96ad..866c311fc 100644
--- a/src/java/org/apache/poi/hssf/record/common/FeatFormulaErr2.java
+++ b/src/java/org/apache/poi/hssf/record/common/FeatFormulaErr2.java
@@ -32,7 +32,8 @@ import org.apache.poi.util.LittleEndianOutput;
  *  for a sheet, stored as part of a Shared Feature. It can be found in 
  *  records such as {@link FeatRecord}.
  * For the full meanings of the flags, see pages 669 and 670
- *  of the Excel binary file format documentation.
+ *  of the Excel binary file format documentation and/or
+ *  https://msdn.microsoft.com/en-us/library/dd924991%28v=office.12%29.aspx
  */
 public final class FeatFormulaErr2 implements SharedFeature {
 	static BitField checkCalculationErrors =
diff --git a/src/java/org/apache/poi/ss/usermodel/IgnoredErrorType.java b/src/java/org/apache/poi/ss/usermodel/IgnoredErrorType.java
index 183fe29f2..9939ec1cd 100644
--- a/src/java/org/apache/poi/ss/usermodel/IgnoredErrorType.java
+++ b/src/java/org/apache/poi/ss/usermodel/IgnoredErrorType.java
@@ -17,29 +17,67 @@
 
 package org.apache.poi.ss.usermodel;
 
-
 /**
  * Types of ignored workbook and worksheet error.
  * 
- * TODO Give more details on what these mean
+ * TODO Implement these for HSSF too, using FeatFormulaErr2,
+ *  see bugzilla bug #46136 for details
  */
 public enum IgnoredErrorType {
-
+    /**
+     * ????. Probably XSSF-only.
+     */
     CALCULATED_COLUMN,
     
+    /**
+     * Whether to check for references to empty cells.
+     * HSSF + XSSF.
+     */
     EMPTY_CELL_REFERENCE,
     
+    /**
+     * Whether to check for calculation/evaluation errors.
+     * HSSF + XSSF.
+     */
     EVALUATION_ERROR,
     
+    /**
+     * Whether to check formulas in the range of the shared feature 
+     *  that are inconsistent with formulas in neighbouring cells.
+     * HSSF + XSSF.
+     */
     FORMULA,
     
+    /**
+     * Whether to check formulas in the range of the shared feature 
+     * with references to less than the entirety of a range containing 
+     * continuous data.
+     * HSSF + XSSF.
+     */
     FORMULA_RANGE,
     
+    /**
+     * ????. Is this XSSF-specific the same as performDataValidation
+     *  in HSSF?
+     */
     LIST_DATA_VALIDATION,
     
+    /**
+     * Whether to check the format of string values and warn
+     *  if they look to actually be numeric values.
+     * HSSF + XSSF.
+     */
     NUMBER_STORED_AS_TEXT,
     
+    /**
+     * ????. Is this XSSF-specific the same as checkDateTimeFormats
+     *  in HSSF?
+     */
     TWO_DIGIT_TEXT_YEAR,
     
+    /**
+     * Whether to check for unprotected formulas.
+     * HSSF + XSSF.
+     */
     UNLOCKED_FORMULA;
 }
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
index 40d765a1d..ee83e78c6 100644
--- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
+++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
@@ -4133,7 +4133,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
         Map<IgnoredErrorType, Set<CellRangeAddress>> result = new LinkedHashMap<IgnoredErrorType, Set<CellRangeAddress>>();
         if (worksheet.isSetIgnoredErrors()) {
             for (CTIgnoredError err : worksheet.getIgnoredErrors().getIgnoredErrorList()) {
-                for (IgnoredErrorType errType : getErrorTypes(err)) {
+                for (IgnoredErrorType errType : XSSFIgnoredErrorHelper.getErrorTypes(err)) {
                     if (!result.containsKey(errType)) {
                         result.put(errType, new LinkedHashSet<CellRangeAddress>());
                     }
@@ -4149,20 +4149,6 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
     private void addIgnoredErrors(String ref, IgnoredErrorType... ignoredErrorTypes) {
         CTIgnoredErrors ctIgnoredErrors = worksheet.isSetIgnoredErrors() ? worksheet.getIgnoredErrors() : worksheet.addNewIgnoredErrors();
         CTIgnoredError ctIgnoredError = ctIgnoredErrors.addNewIgnoredError();
-        ctIgnoredError.setSqref(Arrays.asList(ref));
-        for (IgnoredErrorType errType : ignoredErrorTypes) {
-            XSSFIgnoredErrorHelper.set(errType, ctIgnoredError);
-        }
+        XSSFIgnoredErrorHelper.addIgnoredErrors(ctIgnoredError, ref, ignoredErrorTypes);
     }
-
-    private Set<IgnoredErrorType> getErrorTypes(CTIgnoredError err) {
-        Set<IgnoredErrorType> result = new LinkedHashSet<IgnoredErrorType>();
-        for (IgnoredErrorType errType : IgnoredErrorType.values()) {
-            if (XSSFIgnoredErrorHelper.isSet(errType, err)) {
-                result.add(errType);
-            }
-        }
-        return result;
-    }
-    
 }
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFIgnoredErrorHelper.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFIgnoredErrorHelper.java
index 4911a3532..d0dc0b760 100644
--- a/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFIgnoredErrorHelper.java
+++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFIgnoredErrorHelper.java
@@ -17,8 +17,12 @@
 
 package org.apache.poi.xssf.usermodel.helpers;
 
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTIgnoredError;
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
 import org.apache.poi.ss.usermodel.IgnoredErrorType;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTIgnoredError;
 
 /**
  * XSSF-specific code for working with ignored errors
@@ -82,4 +86,21 @@ public class XSSFIgnoredErrorHelper {
             throw new IllegalStateException();
         }
     }
+    
+    public static void addIgnoredErrors(CTIgnoredError err, String ref, IgnoredErrorType... ignoredErrorTypes) {
+        err.setSqref(Arrays.asList(ref));
+        for (IgnoredErrorType errType : ignoredErrorTypes) {
+            XSSFIgnoredErrorHelper.set(errType, err);
+        }
+    }
+
+    public static  Set<IgnoredErrorType> getErrorTypes(CTIgnoredError err) {
+        Set<IgnoredErrorType> result = new LinkedHashSet<IgnoredErrorType>();
+        for (IgnoredErrorType errType : IgnoredErrorType.values()) {
+            if (XSSFIgnoredErrorHelper.isSet(errType, err)) {
+                result.add(errType);
+            }
+        }
+        return result;
+    }
 }
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
index 158cc7501..f5ad27c81 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
@@ -49,6 +49,7 @@ import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellCopyPolicy;
 import org.apache.poi.ss.usermodel.ClientAnchor;
 import org.apache.poi.ss.usermodel.FormulaError;
+import org.apache.poi.ss.usermodel.IgnoredErrorType;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;