You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2015/02/08 16:37:15 UTC
svn commit: r1658190 - in /poi/trunk/src:
java/org/apache/poi/ss/formula/eval/ErrorEval.java
java/org/apache/poi/ss/usermodel/FormulaError.java
ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
Author: nick
Date: Sun Feb 8 15:37:14 2015
New Revision: 1658190
URL: http://svn.apache.org/r1658190
Log:
Finish converting ErrorEval to only use the FormulaError constants, and then finish unit test for 57535
Modified:
poi/trunk/src/java/org/apache/poi/ss/formula/eval/ErrorEval.java
poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaError.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
Modified: poi/trunk/src/java/org/apache/poi/ss/formula/eval/ErrorEval.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/eval/ErrorEval.java?rev=1658190&r1=1658189&r2=1658190&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/eval/ErrorEval.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/eval/ErrorEval.java Sun Feb 8 15:37:14 2015
@@ -17,13 +17,17 @@
package org.apache.poi.ss.formula.eval;
-import org.apache.poi.ss.usermodel.ErrorConstants;
+import java.util.HashMap;
+import java.util.Map;
+
import org.apache.poi.ss.usermodel.FormulaError;
/**
* Evaluations for formula errors
*/
public final class ErrorEval implements ValueEval {
+ private static final Map<FormulaError,ErrorEval> evals = new HashMap<FormulaError, ErrorEval>();
+
/** <b>#NULL!</b> - Intersection of two cell ranges is empty */
public static final ErrorEval NULL_INTERSECTION = new ErrorEval(FormulaError.NULL);
/** <b>#DIV/0!</b> - Division by zero */
@@ -40,29 +44,23 @@ public final class ErrorEval implements
public static final ErrorEval NA = new ErrorEval(FormulaError.NA);
// POI internal error codes
- private static final int CIRCULAR_REF_ERROR_CODE = 0xFFFFFFC4;
- private static final int FUNCTION_NOT_IMPLEMENTED_CODE = 0xFFFFFFE2;
+ public static final ErrorEval FUNCTION_NOT_IMPLEMENTED = new ErrorEval(FormulaError.FUNCTION_NOT_IMPLEMENTED);
// Note - Excel does not seem to represent this condition with an error code
- public static final ErrorEval CIRCULAR_REF_ERROR = new ErrorEval(CIRCULAR_REF_ERROR_CODE);
+ public static final ErrorEval CIRCULAR_REF_ERROR = new ErrorEval(FormulaError.CIRCULAR_REF);
/**
* Translates an Excel internal error code into the corresponding POI ErrorEval instance
* @param errorCode
*/
public static ErrorEval valueOf(int errorCode) {
- switch(errorCode) {
- case ErrorConstants.ERROR_NULL: return NULL_INTERSECTION;
- case ErrorConstants.ERROR_DIV_0: return DIV_ZERO;
- case ErrorConstants.ERROR_VALUE: return VALUE_INVALID;
- case ErrorConstants.ERROR_REF: return REF_INVALID;
- case ErrorConstants.ERROR_NAME: return NAME_INVALID;
- case ErrorConstants.ERROR_NUM: return NUM_ERROR;
- case ErrorConstants.ERROR_NA: return NA;
- // non-std errors (conditions modelled as errors by POI)
- case CIRCULAR_REF_ERROR_CODE: return CIRCULAR_REF_ERROR;
+ FormulaError error = FormulaError.forInt(errorCode);
+ ErrorEval eval = evals.get(error);
+ if (eval != null) {
+ return eval;
+ } else {
+ throw new RuntimeException("Unhandled error type " + eval + " for code " + errorCode);
}
- throw new RuntimeException("Unexpected error code (" + errorCode + ")");
}
/**
@@ -72,36 +70,28 @@ public final class ErrorEval implements
*/
public static String getText(int errorCode) {
if(FormulaError.isValidCode(errorCode)) {
- return FormulaError.forInt((byte)errorCode).getString();
- }
- // It is desirable to make these (arbitrary) strings look clearly different from any other
- // value expression that might appear in a formula. In addition these error strings should
- // look unlike the standard Excel errors. Hence tilde ('~') was used.
- switch(errorCode) {
- case CIRCULAR_REF_ERROR_CODE: return "~CIRCULAR~REF~";
- case FUNCTION_NOT_IMPLEMENTED_CODE: return "~FUNCTION~NOT~IMPLEMENTED~";
+ return FormulaError.forInt(errorCode).getString();
}
+ // Give a special string, based on ~, to make clear this isn't a standard Excel error
return "~non~std~err(" + errorCode + ")~";
}
- private int _errorCode;
- /**
- * @param errorCode an 8-bit value
- */
- private ErrorEval(int errorCode) {
- _errorCode = errorCode;
- }
+ private FormulaError _error;
private ErrorEval(FormulaError error) {
- _errorCode = error.getCode();
+ _error = error;
+ evals.put(error, this);
}
public int getErrorCode() {
- return _errorCode;
+ return _error.getLongCode();
+ }
+ public String getErrorString() {
+ return _error.getString();
}
public String toString() {
StringBuffer sb = new StringBuffer(64);
sb.append(getClass().getName()).append(" [");
- sb.append(getText(_errorCode));
+ sb.append(_error.getString());
sb.append("]");
return sb.toString();
}
Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaError.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaError.java?rev=1658190&r1=1658189&r2=1658190&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaError.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaError.java Sun Feb 8 15:37:14 2015
@@ -93,7 +93,23 @@ public enum FormulaError {
* </p>
* This error value can be produced by calling the function NA
*/
- NA(0x2A, "#N/A");
+ NA(0x2A, "#N/A"),
+
+ // These are POI-specific error codes
+ // It is desirable to make these (arbitrary) strings look clearly different from any other
+ // value expression that might appear in a formula. In addition these error strings should
+ // look unlike the standard Excel errors. Hence tilde ('~') was used.
+
+ /**
+ * POI specific code to indicate that there is a circular reference
+ * in the formula
+ */
+ CIRCULAR_REF(0xFFFFFFC4, "~CIRCULAR~REF~"),
+ /**
+ * POI specific code to indicate that the funcition required is
+ * not implemented in POI
+ */
+ FUNCTION_NOT_IMPLEMENTED(0xFFFFFFE2, "~FUNCTION~NOT~IMPLEMENTED~");
private final byte type;
private final int longType;
@@ -151,6 +167,7 @@ public enum FormulaError {
}
public static FormulaError forInt(int type){
FormulaError err = imap.get(type);
+ if(err == null) err = bmap.get((byte)type);
if(err == null) throw new IllegalArgumentException("Unknown error type: " + type);
return err;
}
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java?rev=1658190&r1=1658189&r2=1658190&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java Sun Feb 8 15:37:14 2015
@@ -2151,7 +2151,7 @@ public final class TestXSSFBugs extends
CellValue value = evaluator.evaluate(cell);
assertEquals(Cell.CELL_TYPE_ERROR, value.getCellType());
assertEquals(-60, value.getErrorValue());
- // TODO Fix this
-// assertEquals("", FormulaError.forInt(value.getErrorValue()).toString());
+ assertEquals("~CIRCULAR~REF~", FormulaError.forInt(value.getErrorValue()).getString());
+ assertEquals("CIRCULAR_REF", FormulaError.forInt(value.getErrorValue()).toString());
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org