From 9908a0afe96e08dbb4315fea5aaa685819a29dc7 Mon Sep 17 00:00:00 2001 From: James Ahlborn Date: Sat, 31 Mar 2018 03:13:14 +0000 Subject: [PATCH] use specific exceptions for expr eval git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/branches/exprs@1146 f203690c-595d-4dc9-a70b-905162fa7fd2 --- .../jackcess/expr/EvalException.java | 40 ++++++++++++++ .../jackcess/expr/ParseException.java | 39 ++++++++++++++ .../jackcess/impl/expr/BaseValue.java | 5 +- .../jackcess/impl/expr/BuiltinOperators.java | 23 ++++---- .../impl/expr/DefaultDateFunctions.java | 3 +- .../jackcess/impl/expr/DefaultFunctions.java | 15 +++--- .../impl/expr/DefaultNumberFunctions.java | 5 +- .../impl/expr/DefaultTextFunctions.java | 11 ++-- .../impl/expr/ExpressionTokenizer.java | 28 +++++----- .../jackcess/impl/expr/Expressionator.java | 52 +++++++++---------- .../impl/expr/DefaultFunctionsTest.java | 16 ++---- 11 files changed, 157 insertions(+), 80 deletions(-) create mode 100644 src/main/java/com/healthmarketscience/jackcess/expr/EvalException.java create mode 100644 src/main/java/com/healthmarketscience/jackcess/expr/ParseException.java diff --git a/src/main/java/com/healthmarketscience/jackcess/expr/EvalException.java b/src/main/java/com/healthmarketscience/jackcess/expr/EvalException.java new file mode 100644 index 0000000..b0f8fe7 --- /dev/null +++ b/src/main/java/com/healthmarketscience/jackcess/expr/EvalException.java @@ -0,0 +1,40 @@ +/* +Copyright (c) 2018 James Ahlborn + +Licensed 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 com.healthmarketscience.jackcess.expr; + + +/** + * Base class for exceptions thrown during expression evaluation. + * + * @author James Ahlborn + */ +public class EvalException extends IllegalStateException +{ + private static final long serialVersionUID = 20180330L; + + public EvalException(String message) { + super(message); + } + + public EvalException(Throwable cause) { + super(cause); + } + + public EvalException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/com/healthmarketscience/jackcess/expr/ParseException.java b/src/main/java/com/healthmarketscience/jackcess/expr/ParseException.java new file mode 100644 index 0000000..c4a6864 --- /dev/null +++ b/src/main/java/com/healthmarketscience/jackcess/expr/ParseException.java @@ -0,0 +1,39 @@ +/* +Copyright (c) 2018 James Ahlborn + +Licensed 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 com.healthmarketscience.jackcess.expr; + +/** + * Exception thrown when expression parsing fails. + * + * @author James Ahlborn + */ +public class ParseException extends EvalException +{ + private static final long serialVersionUID = 20180330L; + + public ParseException(String message) { + super(message); + } + + public ParseException(Throwable cause) { + super(cause); + } + + public ParseException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/expr/BaseValue.java b/src/main/java/com/healthmarketscience/jackcess/impl/expr/BaseValue.java index 6107fbc..ef0a91b 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/expr/BaseValue.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/expr/BaseValue.java @@ -21,6 +21,7 @@ import java.util.Date; import com.healthmarketscience.jackcess.expr.Value; import com.healthmarketscience.jackcess.expr.EvalContext; +import com.healthmarketscience.jackcess.expr.EvalException; /** * @@ -56,8 +57,8 @@ public abstract class BaseValue implements Value throw invalidConversion(Value.Type.BIG_DEC); } - private UnsupportedOperationException invalidConversion(Value.Type newType) { - return new UnsupportedOperationException( + private EvalException invalidConversion(Value.Type newType) { + return new EvalException( getType() + " value cannot be converted to " + newType); } diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/expr/BuiltinOperators.java b/src/main/java/com/healthmarketscience/jackcess/impl/expr/BuiltinOperators.java index 2037f34..fe4bf7a 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/expr/BuiltinOperators.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/expr/BuiltinOperators.java @@ -23,6 +23,7 @@ import java.util.Date; import java.util.regex.Pattern; import com.healthmarketscience.jackcess.expr.EvalContext; +import com.healthmarketscience.jackcess.expr.EvalException; import com.healthmarketscience.jackcess.expr.Value; import com.healthmarketscience.jackcess.impl.ColumnImpl; @@ -107,7 +108,7 @@ public class BuiltinOperators case BIG_DEC: return toValue(param1.getAsBigDecimal().negate()); default: - throw new RuntimeException("Unexpected type " + mathType); + throw new EvalException("Unexpected type " + mathType); } } @@ -137,7 +138,7 @@ public class BuiltinOperators case BIG_DEC: return toValue(param1.getAsBigDecimal().add(param2.getAsBigDecimal())); default: - throw new RuntimeException("Unexpected type " + mathType); + throw new EvalException("Unexpected type " + mathType); } } @@ -165,7 +166,7 @@ public class BuiltinOperators case BIG_DEC: return toValue(param1.getAsBigDecimal().subtract(param2.getAsBigDecimal())); default: - throw new RuntimeException("Unexpected type " + mathType); + throw new EvalException("Unexpected type " + mathType); } } @@ -190,7 +191,7 @@ public class BuiltinOperators case BIG_DEC: return toValue(param1.getAsBigDecimal().multiply(param2.getAsBigDecimal())); default: - throw new RuntimeException("Unexpected type " + mathType); + throw new EvalException("Unexpected type " + mathType); } } @@ -224,7 +225,7 @@ public class BuiltinOperators case BIG_DEC: return toValue(param1.getAsBigDecimal().divide(param2.getAsBigDecimal())); default: - throw new RuntimeException("Unexpected type " + mathType); + throw new EvalException("Unexpected type " + mathType); } } @@ -237,7 +238,7 @@ public class BuiltinOperators Value.Type mathType = getMathTypePrecedence(param1, param2, CoercionType.GENERAL); if(mathType == Value.Type.STRING) { - throw new RuntimeException("Unexpected type " + mathType); + throw new EvalException("Unexpected type " + mathType); } return toValue(param1.getAsLongInt() / param2.getAsLongInt()); } @@ -272,7 +273,7 @@ public class BuiltinOperators CoercionType.GENERAL); if(mathType == Value.Type.STRING) { - throw new RuntimeException("Unexpected type " + mathType); + throw new EvalException("Unexpected type " + mathType); } return toValue(param1.getAsLongInt() % param2.getAsLongInt()); } @@ -535,7 +536,7 @@ public class BuiltinOperators case STRING: // string comparison is only valid if _both_ params are strings if(param1.getType() != param2.getType()) { - throw new RuntimeException("Unexpected type " + compareType); + throw new EvalException("Unexpected type " + compareType); } return param1.getAsString().compareToIgnoreCase(param2.getAsString()); // case DATE: break; promoted to double @@ -548,7 +549,7 @@ public class BuiltinOperators case BIG_DEC: return param1.getAsBigDecimal().compareTo(param2.getAsBigDecimal()); default: - throw new RuntimeException("Unexpected type " + compareType); + throw new EvalException("Unexpected type " + compareType); } } @@ -598,7 +599,7 @@ public class BuiltinOperators case DATE_TIME: return new DateTimeValue(d, fmt); default: - throw new RuntimeException("Unexpected date/time type " + type); + throw new EvalException("Unexpected date/time type " + type); } } @@ -632,7 +633,7 @@ public class BuiltinOperators fmtStr = ctx.getTemporalConfig().getDefaultDateTimeFormat(); break; default: - throw new RuntimeException("Unexpected date/time type " + type); + throw new EvalException("Unexpected date/time type " + type); } return ctx.createDateFormat(fmtStr); } diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultDateFunctions.java b/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultDateFunctions.java index 1030772..0ef53e1 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultDateFunctions.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultDateFunctions.java @@ -23,6 +23,7 @@ import java.util.Calendar; import java.util.Date; import com.healthmarketscience.jackcess.expr.EvalContext; +import com.healthmarketscience.jackcess.expr.EvalException; import com.healthmarketscience.jackcess.expr.Function; import com.healthmarketscience.jackcess.expr.Value; import com.healthmarketscience.jackcess.impl.ColumnImpl; @@ -204,7 +205,7 @@ public class DefaultDateFunctions param = nonNullToDateValue(ctx, param); if(param == null) { // not a date/time - throw new IllegalStateException("Invalid date/time expression '" + param + "'"); + throw new EvalException("Invalid date/time expression '" + param + "'"); } Calendar cal = getDateValueFormat(ctx, param).getCalendar(); diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctions.java b/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctions.java index e88f6c8..35b8428 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctions.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctions.java @@ -22,6 +22,7 @@ import java.util.HashMap; import java.util.Map; import com.healthmarketscience.jackcess.expr.EvalContext; +import com.healthmarketscience.jackcess.expr.EvalException; import com.healthmarketscience.jackcess.expr.Function; import com.healthmarketscience.jackcess.expr.Value; import com.healthmarketscience.jackcess.impl.DatabaseImpl; @@ -78,7 +79,7 @@ public class DefaultFunctions if((num < _minParams) || (num > _maxParams)) { String range = ((_minParams == _maxParams) ? "" + _minParams : _minParams + " to " + _maxParams); - throw new IllegalArgumentException( + throw new EvalException( "Invalid number of parameters " + num + " passed, expected " + range); } @@ -311,7 +312,7 @@ public class DefaultFunctions @Override protected Value evalVar(EvalContext ctx, Value[] params) { if((params.length % 2) != 0) { - throw new IllegalStateException("Odd number of parameters"); + throw new EvalException("Odd number of parameters"); } for(int i = 0; i < params.length; i+=2) { if(params[i].getAsBoolean()) { @@ -347,7 +348,7 @@ public class DefaultFunctions protected Value eval1(EvalContext ctx, Value param1) { int lv = param1.getAsLongInt(); if((lv < 0) || (lv > 255)) { - throw new IllegalStateException("Byte code '" + lv + "' out of range "); + throw new EvalException("Byte code '" + lv + "' out of range "); } return BuiltinOperators.toValue(lv); } @@ -393,7 +394,7 @@ public class DefaultFunctions protected Value eval1(EvalContext ctx, Value param1) { int lv = param1.getAsLongInt(); if((lv < Short.MIN_VALUE) || (lv > Short.MAX_VALUE)) { - throw new IllegalStateException("Int value '" + lv + "' out of range "); + throw new EvalException("Int value '" + lv + "' out of range "); } return BuiltinOperators.toValue(lv); } @@ -412,7 +413,7 @@ public class DefaultFunctions protected Value eval1(EvalContext ctx, Value param1) { Double dv = param1.getAsDouble(); if((dv < Float.MIN_VALUE) || (dv > Float.MAX_VALUE)) { - throw new IllegalStateException("Single value '" + dv + "' out of range "); + throw new EvalException("Single value '" + dv + "' out of range "); } return BuiltinOperators.toValue(dv.floatValue()); } @@ -481,7 +482,7 @@ public class DefaultFunctions vType = 14; break; default: - throw new RuntimeException("Unknown type " + type); + throw new EvalException("Unknown type " + type); } return BuiltinOperators.toValue(vType); } @@ -514,7 +515,7 @@ public class DefaultFunctions tName = "Decimal"; break; default: - throw new RuntimeException("Unknown type " + type); + throw new EvalException("Unknown type " + type); } return BuiltinOperators.toValue(tName); } diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultNumberFunctions.java b/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultNumberFunctions.java index 0f8ebf2..b2a4546 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultNumberFunctions.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultNumberFunctions.java @@ -19,6 +19,7 @@ package com.healthmarketscience.jackcess.impl.expr; import java.math.BigDecimal; import com.healthmarketscience.jackcess.expr.EvalContext; +import com.healthmarketscience.jackcess.expr.EvalException; import com.healthmarketscience.jackcess.expr.Function; import com.healthmarketscience.jackcess.expr.Value; import static com.healthmarketscience.jackcess.impl.expr.DefaultFunctions.*; @@ -56,7 +57,7 @@ public class DefaultNumberFunctions case BIG_DEC: return BuiltinOperators.toValue(param1.getAsBigDecimal().abs()); default: - throw new RuntimeException("Unexpected type " + mathType); + throw new EvalException("Unexpected type " + mathType); } } }); @@ -160,7 +161,7 @@ public class DefaultNumberFunctions protected Value eval1(EvalContext ctx, Value param1) { double dv = param1.getAsDouble(); if(dv < 0.0d) { - throw new IllegalStateException("Invalid value '" + dv + "'"); + throw new EvalException("Invalid value '" + dv + "'"); } return BuiltinOperators.toValue(Math.sqrt(dv)); } diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultTextFunctions.java b/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultTextFunctions.java index 2217c68..43bf0e3 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultTextFunctions.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultTextFunctions.java @@ -19,6 +19,7 @@ package com.healthmarketscience.jackcess.impl.expr; import java.math.BigDecimal; import com.healthmarketscience.jackcess.expr.EvalContext; +import com.healthmarketscience.jackcess.expr.EvalException; import com.healthmarketscience.jackcess.expr.Function; import com.healthmarketscience.jackcess.expr.Value; import static com.healthmarketscience.jackcess.impl.expr.DefaultFunctions.*; @@ -42,11 +43,11 @@ public class DefaultTextFunctions String str = param1.getAsString(); int len = str.length(); if(len == 0) { - throw new IllegalStateException("No characters in string"); + throw new EvalException("No characters in string"); } int lv = str.charAt(0); if((lv < 0) || (lv > 255)) { - throw new IllegalStateException("Character code '" + lv + + throw new EvalException("Character code '" + lv + "' out of range "); } return BuiltinOperators.toValue(lv); @@ -59,7 +60,7 @@ public class DefaultTextFunctions String str = param1.getAsString(); int len = str.length(); if(len == 0) { - throw new IllegalStateException("No characters in string"); + throw new EvalException("No characters in string"); } int lv = str.charAt(0); return BuiltinOperators.toValue(lv); @@ -71,7 +72,7 @@ public class DefaultTextFunctions protected Value eval1(EvalContext ctx, Value param1) { int lv = param1.getAsLongInt(); if((lv < 0) || (lv > 255)) { - throw new IllegalStateException("Character code '" + lv + + throw new EvalException("Character code '" + lv + "' out of range "); } char[] cs = Character.toChars(lv); @@ -371,7 +372,7 @@ public class DefaultTextFunctions return true; default: // vbDatabaseCompare -> unsupported - throw new IllegalStateException("Unsupported compare type " + cmpType); + throw new EvalException("Unsupported compare type " + cmpType); } } diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/expr/ExpressionTokenizer.java b/src/main/java/com/healthmarketscience/jackcess/impl/expr/ExpressionTokenizer.java index 0535332..be68e9c 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/expr/ExpressionTokenizer.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/expr/ExpressionTokenizer.java @@ -18,7 +18,6 @@ package com.healthmarketscience.jackcess.impl.expr; import java.text.DateFormat; import java.text.FieldPosition; -import java.text.ParseException; import java.text.ParsePosition; import java.util.AbstractMap; import java.util.ArrayList; @@ -34,6 +33,7 @@ import java.util.TimeZone; import static com.healthmarketscience.jackcess.impl.expr.Expressionator.*; import com.healthmarketscience.jackcess.expr.Value; import com.healthmarketscience.jackcess.expr.TemporalConfig; +import com.healthmarketscience.jackcess.expr.ParseException; /** @@ -152,7 +152,7 @@ class ExpressionTokenizer tokens.add(new Token(TokenType.OBJ_NAME, parseObjNameString(buf))); break; default: - throw new IllegalArgumentException( + throw new ParseException( "Invalid leading quote character " + c + " " + buf); } @@ -258,8 +258,8 @@ class ExpressionTokenizer } if(!complete) { - throw new IllegalArgumentException("Missing closing '" + QUOTED_STR_CHAR + - "' for quoted string " + buf); + throw new ParseException("Missing closing '" + QUOTED_STR_CHAR + + "' for quoted string " + buf); } return sb.toString(); @@ -282,16 +282,16 @@ class ExpressionTokenizer break; } else if((startChar != null) && (startChar == c)) { - throw new IllegalArgumentException("Missing closing '" + endChar + - "' for quoted string " + buf); + throw new ParseException("Missing closing '" + endChar + + "' for quoted string " + buf); } sb.append(c); } if(!complete) { - throw new IllegalArgumentException("Missing closing '" + endChar + - "' for quoted string " + buf); + throw new ParseException("Missing closing '" + endChar + + "' for quoted string " + buf); } return sb.toString(); @@ -327,15 +327,15 @@ class ExpressionTokenizer sdf = (hasAmPm ? buf.getTimeFormat12() : buf.getTimeFormat24()); valType = Value.Type.TIME; } else { - throw new IllegalArgumentException("Invalid date time literal " + dateStr + - " " + buf); + throw new ParseException("Invalid date time literal " + dateStr + + " " + buf); } try { return new Token(TokenType.LITERAL, sdf.parse(dateStr), dateStr, valType, sdf); - } catch(ParseException pe) { - throw new IllegalArgumentException( + } catch(java.text.ParseException pe) { + throw new ParseException( "Invalid date time literal " + dateStr + " " + buf, pe); } } @@ -392,7 +392,7 @@ class ExpressionTokenizer return new Token(TokenType.LITERAL, num, numStr, (isFp ? Value.Type.DOUBLE : Value.Type.LONG)); } catch(NumberFormatException ne) { - throw new IllegalArgumentException( + throw new ParseException( "Invalid number literal " + numStr + " " + buf, ne); } @@ -536,7 +536,7 @@ class ExpressionTokenizer DateFormat df = _ctx.createDateFormat(BASE_DATE_FMT); baseDate = getDateFormat().format(df.parse(baseDate)); } catch(Exception e) { - throw new IllegalStateException("Could not parse base date", e); + throw new ParseException("Could not parse base date", e); } } _baseDate = baseDate + " "; diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/expr/Expressionator.java b/src/main/java/com/healthmarketscience/jackcess/impl/expr/Expressionator.java index b8681c6..0c03627 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/expr/Expressionator.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/expr/Expressionator.java @@ -39,6 +39,7 @@ import com.healthmarketscience.jackcess.expr.EvalContext; import com.healthmarketscience.jackcess.expr.Expression; import com.healthmarketscience.jackcess.expr.Function; import com.healthmarketscience.jackcess.expr.TemporalConfig; +import com.healthmarketscience.jackcess.expr.ParseException; import com.healthmarketscience.jackcess.expr.Value; import com.healthmarketscience.jackcess.impl.expr.ExpressionTokenizer.Token; import com.healthmarketscience.jackcess.impl.expr.ExpressionTokenizer.TokenType; @@ -506,7 +507,7 @@ public class Expressionator WordType wordType = getWordType(t); if(wordType == null) { // shouldn't happen - throw new RuntimeException("Invalid operator " + t); + throw new ParseException("Invalid operator " + t); } // this can only be an OP or a COMP (those are the only words that the @@ -522,7 +523,7 @@ public class Expressionator break; default: - throw new RuntimeException("Unexpected OP word type " + wordType); + throw new ParseException("Unexpected OP word type " + wordType); } break; @@ -580,7 +581,7 @@ public class Expressionator break; default: - throw new RuntimeException("Unexpected STRING word type " + throw new ParseException("Unexpected STRING word type " + wordType); } } @@ -592,7 +593,7 @@ public class Expressionator break; default: - throw new RuntimeException("unknown token type " + t); + throw new ParseException("unknown token type " + t); } if(singleExpr && buf.hasPendingExpr()) { @@ -602,7 +603,7 @@ public class Expressionator Expr expr = buf.takePendingExpr(); if(expr == null) { - throw new IllegalArgumentException("No expression found? " + buf); + throw new ParseException("No expression found? " + buf); } return expr; @@ -641,7 +642,7 @@ public class Expressionator } if(atSep || (objNames.size() > 3)) { - throw new IllegalArgumentException("Invalid object reference " + buf); + throw new ParseException("Invalid object reference " + buf); } // names are in reverse order @@ -657,7 +658,7 @@ public class Expressionator // the only "top-level" delim we expect to find is open paren, and // there shouldn't be any pending expression if(!isDelim(firstTok, OPEN_PAREN) || buf.hasPendingExpr()) { - throw new IllegalArgumentException("Unexpected delimiter " + + throw new ParseException("Unexpected delimiter " + firstTok.getValue() + " " + buf); } @@ -683,7 +684,7 @@ public class Expressionator String funcName = firstTok.getValueStr(); Function func = buf.getFunction(funcName); if(func == null) { - throw new IllegalArgumentException("Could not find function '" + + throw new ParseException("Could not find function '" + funcName + "' " + buf); } buf.setPendingExpr(new EFunc(func, params)); @@ -738,7 +739,7 @@ public class Expressionator } } - throw new IllegalArgumentException("Missing closing '" + CLOSE_PAREN + throw new ParseException("Missing closing '" + CLOSE_PAREN + " " + buf); } @@ -751,7 +752,7 @@ public class Expressionator } else if(isEitherOp(t, "-", "+")) { parseUnaryOpExpression(t, buf); } else { - throw new IllegalArgumentException( + throw new ParseException( "Missing left expression for binary operator " + t.getValue() + " " + buf); } @@ -792,7 +793,7 @@ public class Expressionator // the current field value for the left value buf.setPendingExpr(THIS_COL_VALUE); } else { - throw new IllegalArgumentException( + throw new ParseException( "Missing left expression for comparison operator " + firstTok.getValue() + " " + buf); } @@ -808,7 +809,7 @@ public class Expressionator private static void parseLogicalOpExpression(Token firstTok, TokBuf buf) { if(!buf.hasPendingExpr()) { - throw new IllegalArgumentException( + throw new ParseException( "Missing left expression for logical operator " + firstTok.getValue() + " " + buf); } @@ -836,7 +837,7 @@ public class Expressionator // the current field value for the left value buf.setPendingExpr(THIS_COL_VALUE); } else { - throw new IllegalArgumentException( + throw new ParseException( "Missing left expression for comparison operator " + specOp + " " + buf); } @@ -855,7 +856,7 @@ public class Expressionator Token t = buf.next(); if((t.getType() != TokenType.LITERAL) || (t.getValueType() != Value.Type.STRING)) { - throw new IllegalArgumentException("Missing Like pattern " + buf); + throw new ParseException("Missing Like pattern " + buf); } String patternStr = t.getValueStr(); specOpExpr = new ELikeOp(specOp, expr, patternStr); @@ -875,7 +876,7 @@ public class Expressionator if(tmpT == null) { // ran out of expression? - throw new IllegalArgumentException( + throw new ParseException( "Missing 'And' for 'Between' expression " + buf); } @@ -903,7 +904,7 @@ public class Expressionator t = buf.next(); } if(!isDelim(t, OPEN_PAREN)) { - throw new IllegalArgumentException("Malformed In expression " + buf); + throw new ParseException("Malformed In expression " + buf); } List exprs = findParenExprs(buf, true); @@ -911,7 +912,7 @@ public class Expressionator break; default: - throw new RuntimeException("Unexpected special op " + specOp); + throw new ParseException("Unexpected special op " + specOp); } buf.setPendingExpr(specOpExpr); @@ -950,7 +951,7 @@ public class Expressionator return SpecOp.NOT; } - throw new IllegalArgumentException( + throw new ParseException( "Malformed special operator " + opStr + " " + buf); } @@ -963,7 +964,7 @@ public class Expressionator } else if("null".equalsIgnoreCase(firstTok.getValueStr())) { constExpr = NULL_VALUE; } else { - throw new RuntimeException("Unexpected CONST word " + throw new ParseException("Unexpected CONST word " + firstTok.getValue()); } buf.setPendingExpr(constExpr); @@ -1011,7 +1012,7 @@ public class Expressionator return op; } } - throw new IllegalArgumentException("Unexpected op string " + t.getValueStr()); + throw new ParseException("Unexpected op string " + t.getValueStr()); } private static final class TokBuf @@ -1097,7 +1098,7 @@ public class Expressionator public Token next() { if(!hasNext()) { - throw new IllegalArgumentException( + throw new ParseException( "Unexpected end of expression " + this); } return _tokens.get(_pos++); @@ -1113,7 +1114,7 @@ public class Expressionator public void setPendingExpr(Expr expr) { if(_pendingExpr != null) { - throw new IllegalArgumentException( + throw new ParseException( "Found multiple expressions with no operator " + this); } _pendingExpr = expr.resolveOrderOfOperations(); @@ -1335,7 +1336,7 @@ public class Expressionator case BIG_DEC: return new BigDecimalValue((BigDecimal)value); default: - throw new RuntimeException("unexpected literal type " + valType); + throw new ParseException("unexpected literal type " + valType); } } @@ -1963,7 +1964,7 @@ public class Expressionator case RECORD_VALIDATOR: return evalCondition(ctx); default: - throw new RuntimeException("unexpected expression type " + _type); + throw new ParseException("unexpected expression type " + _type); } } @@ -2008,8 +2009,7 @@ public class Expressionator case BIG_DEC: return val.getAsBigDecimal(); default: - throw new IllegalStateException("unexpected result type " + - ctx.getResultType()); + throw new IllegalStateException("unexpected result type " + resultType); } } diff --git a/src/test/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctionsTest.java b/src/test/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctionsTest.java index ae9916c..e68ff33 100644 --- a/src/test/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctionsTest.java +++ b/src/test/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctionsTest.java @@ -17,16 +17,8 @@ limitations under the License. package com.healthmarketscience.jackcess.impl.expr; import java.math.BigDecimal; -import java.text.SimpleDateFormat; -import java.util.Date; - -import com.healthmarketscience.jackcess.DatabaseBuilder; -import com.healthmarketscience.jackcess.TestUtil; -import com.healthmarketscience.jackcess.expr.EvalContext; -import com.healthmarketscience.jackcess.expr.Expression; -import com.healthmarketscience.jackcess.expr.Function; -import com.healthmarketscience.jackcess.expr.TemporalConfig; -import com.healthmarketscience.jackcess.expr.Value; + +import com.healthmarketscience.jackcess.expr.EvalException; import junit.framework.TestCase; import static com.healthmarketscience.jackcess.impl.expr.ExpressionatorTest.eval; @@ -64,8 +56,8 @@ public class DefaultFunctionsTest extends TestCase try { eval("=Str$(Null)"); - fail("UnsupportedOperationException should have been thrown"); - } catch(UnsupportedOperationException expected) { + fail("EvalException should have been thrown"); + } catch(EvalException expected) { // success } -- 2.39.5