aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Burch <nick@apache.org>2014-07-03 11:20:32 +0000
committerNick Burch <nick@apache.org>2014-07-03 11:20:32 +0000
commit3105bd6f1881fbf3f699261479a13f13bdd1a5c5 (patch)
treeac34dae930820052d87f9f1b1dbb19d3eafbccf9
parentac3de152a582218d9a5698d7c122b5c26c6d4619 (diff)
downloadpoi-3105bd6f1881fbf3f699261479a13f13bdd1a5c5.tar.gz
poi-3105bd6f1881fbf3f699261479a13f13bdd1a5c5.zip
When throwing an exception during formula evaluation, if this is due to an unimplemented function, have a more specific exception type
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1607588 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--src/java/org/apache/poi/ss/formula/UserDefinedFunction.java4
-rw-r--r--src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java29
-rw-r--r--src/java/org/apache/poi/ss/formula/eval/NotImplementedException.java18
-rw-r--r--src/java/org/apache/poi/ss/formula/eval/NotImplementedFunctionException.java44
-rw-r--r--src/java/org/apache/poi/ss/formula/functions/NotImplementedFunction.java8
-rw-r--r--src/java/org/apache/poi/ss/formula/functions/Subtotal.java12
6 files changed, 91 insertions, 24 deletions
diff --git a/src/java/org/apache/poi/ss/formula/UserDefinedFunction.java b/src/java/org/apache/poi/ss/formula/UserDefinedFunction.java
index c1b22ba9ba..ee3c19e4b9 100644
--- a/src/java/org/apache/poi/ss/formula/UserDefinedFunction.java
+++ b/src/java/org/apache/poi/ss/formula/UserDefinedFunction.java
@@ -19,9 +19,9 @@ package org.apache.poi.ss.formula;
import org.apache.poi.ss.formula.eval.NameEval;
import org.apache.poi.ss.formula.eval.NameXEval;
+import org.apache.poi.ss.formula.eval.NotImplementedFunctionException;
import org.apache.poi.ss.formula.eval.ValueEval;
import org.apache.poi.ss.formula.functions.FreeRefFunction;
-import org.apache.poi.ss.formula.eval.NotImplementedException;
/**
*
* Common entry point for all user-defined (non-built-in) functions (where
@@ -56,7 +56,7 @@ final class UserDefinedFunction implements FreeRefFunction {
}
FreeRefFunction targetFunc = ec.findUserDefinedFunction(functionName);
if (targetFunc == null) {
- throw new NotImplementedException(functionName);
+ throw new NotImplementedFunctionException(functionName);
}
int nOutGoingArgs = nIncomingArgs -1;
ValueEval[] outGoingArgs = new ValueEval[nOutGoingArgs];
diff --git a/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java b/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
index d8d8bfad47..ad9604d9c8 100644
--- a/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
+++ b/src/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
@@ -10,16 +10,35 @@
package org.apache.poi.ss.formula.atp;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeSet;
+
import org.apache.poi.ss.formula.OperationEvaluationContext;
-import org.apache.poi.ss.formula.eval.NotImplementedException;
+import org.apache.poi.ss.formula.eval.NotImplementedFunctionException;
import org.apache.poi.ss.formula.eval.ValueEval;
import org.apache.poi.ss.formula.function.FunctionMetadata;
import org.apache.poi.ss.formula.function.FunctionMetadataRegistry;
-import org.apache.poi.ss.formula.functions.*;
+import org.apache.poi.ss.formula.functions.Bin2Dec;
+import org.apache.poi.ss.formula.functions.Complex;
+import org.apache.poi.ss.formula.functions.Countifs;
+import org.apache.poi.ss.formula.functions.Dec2Bin;
+import org.apache.poi.ss.formula.functions.Dec2Hex;
+import org.apache.poi.ss.formula.functions.Delta;
+import org.apache.poi.ss.formula.functions.EDate;
+import org.apache.poi.ss.formula.functions.FactDouble;
+import org.apache.poi.ss.formula.functions.FreeRefFunction;
+import org.apache.poi.ss.formula.functions.Hex2Dec;
+import org.apache.poi.ss.formula.functions.ImReal;
+import org.apache.poi.ss.formula.functions.Imaginary;
+import org.apache.poi.ss.formula.functions.Oct2Dec;
+import org.apache.poi.ss.formula.functions.Quotient;
+import org.apache.poi.ss.formula.functions.Sumifs;
+import org.apache.poi.ss.formula.functions.WeekNum;
import org.apache.poi.ss.formula.udf.UDFFinder;
-import java.util.*;
-
/**
* Analysis Toolpack Function Definitions
*/
@@ -35,7 +54,7 @@ public final class AnalysisToolPak implements UDFFinder {
}
public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) {
- throw new NotImplementedException(_functionName);
+ throw new NotImplementedFunctionException(_functionName);
}
}
diff --git a/src/java/org/apache/poi/ss/formula/eval/NotImplementedException.java b/src/java/org/apache/poi/ss/formula/eval/NotImplementedException.java
index cad7f88582..9d81f8ce36 100644
--- a/src/java/org/apache/poi/ss/formula/eval/NotImplementedException.java
+++ b/src/java/org/apache/poi/ss/formula/eval/NotImplementedException.java
@@ -20,14 +20,18 @@ package org.apache.poi.ss.formula.eval;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
/**
- * An exception thrown by implementors of {@link FormulaEvaluator} when attempting to evaluate
- * a formula which requires features that POI does not (yet) support.
- *
- * @author Josh Micich
+ * An exception thrown by implementors of {@link FormulaEvaluator},
+ * when attempting to evaluate a formula which requires features
+ * that POI does not (yet) support.
+ *
+ * <p>Where possible, a subclass of this should be thrown, to provide
+ * more detail of what part of the formula couldn't be processed due
+ * to a missing implementation
*/
-public final class NotImplementedException extends RuntimeException {
-
- public NotImplementedException(String message) {
+public class NotImplementedException extends RuntimeException {
+ private static final long serialVersionUID = -5840703336495141301L;
+
+ public NotImplementedException(String message) {
super(message);
}
public NotImplementedException(String message, NotImplementedException cause) {
diff --git a/src/java/org/apache/poi/ss/formula/eval/NotImplementedFunctionException.java b/src/java/org/apache/poi/ss/formula/eval/NotImplementedFunctionException.java
new file mode 100644
index 0000000000..182e53b153
--- /dev/null
+++ b/src/java/org/apache/poi/ss/formula/eval/NotImplementedFunctionException.java
@@ -0,0 +1,44 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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
+
+ http://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.apache.poi.ss.formula.eval;
+
+import org.apache.poi.ss.usermodel.FormulaEvaluator;
+
+/**
+ * An exception thrown by implementors of {@link FormulaEvaluator} when
+ * attempting to evaluate a formula which requires a function that POI
+ * does not (yet) support.
+ */
+public final class NotImplementedFunctionException extends NotImplementedException {
+ private static final long serialVersionUID = 1208119411557559057L;
+
+ private String functionName;
+
+ public NotImplementedFunctionException(String functionName) {
+ super(functionName);
+ this.functionName = functionName;
+ }
+ public NotImplementedFunctionException(String functionName, NotImplementedException cause) {
+ super(functionName, cause);
+ this.functionName = functionName;
+ }
+
+ public String getFunctionName() {
+ return functionName;
+ }
+}
diff --git a/src/java/org/apache/poi/ss/formula/functions/NotImplementedFunction.java b/src/java/org/apache/poi/ss/formula/functions/NotImplementedFunction.java
index 86422273b0..50e6237003 100644
--- a/src/java/org/apache/poi/ss/formula/functions/NotImplementedFunction.java
+++ b/src/java/org/apache/poi/ss/formula/functions/NotImplementedFunction.java
@@ -17,15 +17,13 @@
package org.apache.poi.ss.formula.functions;
+import org.apache.poi.ss.formula.eval.NotImplementedFunctionException;
import org.apache.poi.ss.formula.eval.ValueEval;
-import org.apache.poi.ss.formula.eval.NotImplementedException;
/**
- *
- * @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
* This is the default implementation of a Function class.
* The default behaviour is to raise a POI internal error
- * ({@link NotImplementedException}). This error should alert
+ * ({@link NotImplementedFunctionException}). This error should alert
* the user that the formula contained a function that is not
* yet implemented.
*/
@@ -39,7 +37,7 @@ public final class NotImplementedFunction implements Function {
}
public ValueEval evaluate(ValueEval[] operands, int srcRow, int srcCol) {
- throw new NotImplementedException(_functionName);
+ throw new NotImplementedFunctionException(_functionName);
}
public String getFunctionName() {
return _functionName;
diff --git a/src/java/org/apache/poi/ss/formula/functions/Subtotal.java b/src/java/org/apache/poi/ss/formula/functions/Subtotal.java
index 94258aab58..fca55c502e 100644
--- a/src/java/org/apache/poi/ss/formula/functions/Subtotal.java
+++ b/src/java/org/apache/poi/ss/formula/functions/Subtotal.java
@@ -17,12 +17,14 @@
package org.apache.poi.ss.formula.functions;
+import static org.apache.poi.ss.formula.functions.AggregateFunction.subtotalInstance;
+
import org.apache.poi.ss.formula.eval.ErrorEval;
import org.apache.poi.ss.formula.eval.EvaluationException;
+import org.apache.poi.ss.formula.eval.NotImplementedException;
+import org.apache.poi.ss.formula.eval.NotImplementedFunctionException;
import org.apache.poi.ss.formula.eval.OperandResolver;
import org.apache.poi.ss.formula.eval.ValueEval;
-import org.apache.poi.ss.formula.eval.NotImplementedException;
-import static org.apache.poi.ss.formula.functions.AggregateFunction.subtotalInstance;
/**
* Implementation for the Excel function SUBTOTAL<p>
@@ -68,10 +70,10 @@ public class Subtotal implements Function {
case 5: return subtotalInstance(AggregateFunction.MIN);
case 6: return subtotalInstance(AggregateFunction.PRODUCT);
case 7: return subtotalInstance(AggregateFunction.STDEV);
- case 8: throw new NotImplementedException("STDEVP");
+ case 8: throw new NotImplementedFunctionException("STDEVP");
case 9: return subtotalInstance(AggregateFunction.SUM);
- case 10: throw new NotImplementedException("VAR");
- case 11: throw new NotImplementedException("VARP");
+ case 10: throw new NotImplementedFunctionException("VAR");
+ case 11: throw new NotImplementedFunctionException("VARP");
}
if (functionCode > 100 && functionCode < 112) {
throw new NotImplementedException("SUBTOTAL - with 'exclude hidden values' option");