From 14eba5034d40c04f0b7a8b2aa3d47e6fdcf31922 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 24 Nov 2016 11:08:55 +0100 Subject: [PATCH] Consistent ExpressionException-style quoting of expression string and position Issue: SPR-14942 --- .../expression/EvaluationException.java | 37 ++++++----- .../expression/ExpressionException.java | 55 ++++++++-------- .../expression/ParseException.java | 8 +-- .../spel/SpelEvaluationException.java | 40 ++++-------- .../expression/spel/SpelMessage.java | 43 ++++++++---- .../expression/spel/SpelParseException.java | 26 +++----- .../expression/spel/SpelReproTests.java | 20 +++--- .../spel/standard/SpelParserTests.java | 65 ++++++++++--------- 8 files changed, 151 insertions(+), 143 deletions(-) diff --git a/spring-expression/src/main/java/org/springframework/expression/EvaluationException.java b/spring-expression/src/main/java/org/springframework/expression/EvaluationException.java index bca535d26c..f4132b881d 100644 --- a/spring-expression/src/main/java/org/springframework/expression/EvaluationException.java +++ b/spring-expression/src/main/java/org/springframework/expression/EvaluationException.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,7 +26,24 @@ package org.springframework.expression; public class EvaluationException extends ExpressionException { /** - * Creates a new expression evaluation exception. + * Create a new expression evaluation exception. + * @param message description of the problem that occurred + */ + public EvaluationException(String message) { + super(message); + } + + /** + * Create a new expression evaluation exception. + * @param message description of the problem that occurred + * @param cause the underlying cause of this exception + */ + public EvaluationException(String message, Throwable cause) { + super(message,cause); + } + + /** + * Create a new expression evaluation exception. * @param position the position in the expression where the problem occurred * @param message description of the problem that occurred */ @@ -35,7 +52,7 @@ public class EvaluationException extends ExpressionException { } /** - * Creates a new expression evaluation exception. + * Create a new expression evaluation exception. * @param expressionString the expression that could not be evaluated * @param message description of the problem that occurred */ @@ -44,7 +61,7 @@ public class EvaluationException extends ExpressionException { } /** - * Creates a new expression evaluation exception. + * Create a new expression evaluation exception. * @param position the position in the expression where the problem occurred * @param message description of the problem that occurred * @param cause the underlying cause of this exception @@ -53,16 +70,4 @@ public class EvaluationException extends ExpressionException { super(position, message, cause); } - /** - * Creates a new expression evaluation exception. - * @param message description of the problem that occurred - */ - public EvaluationException(String message) { - super(message); - } - - public EvaluationException(String message, Throwable cause) { - super(message,cause); - } - } diff --git a/spring-expression/src/main/java/org/springframework/expression/ExpressionException.java b/spring-expression/src/main/java/org/springframework/expression/ExpressionException.java index 767f5cee3b..950956e8ee 100644 --- a/spring-expression/src/main/java/org/springframework/expression/ExpressionException.java +++ b/spring-expression/src/main/java/org/springframework/expression/ExpressionException.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ package org.springframework.expression; * Super class for exceptions that can occur whilst processing expressions. * * @author Andy Clement + * @author Phil Webb * @since 3.0 */ @SuppressWarnings("serial") @@ -27,68 +28,68 @@ public class ExpressionException extends RuntimeException { protected String expressionString; - protected int position; // -1 if not known - but should be known in all reasonable cases + protected int position; // -1 if not known; should be known in all reasonable cases /** * Construct a new expression exception. - * @param expressionString the expression string * @param message a descriptive message */ - public ExpressionException(String expressionString, String message) { + public ExpressionException(String message) { super(message); - this.position = -1; - this.expressionString = expressionString; } /** * Construct a new expression exception. - * @param expressionString the expression string - * @param position the position in the expression string where the problem occurred * @param message a descriptive message + * @param cause the underlying cause of this exception */ - public ExpressionException(String expressionString, int position, String message) { - super(message); - this.position = position; - this.expressionString = expressionString; + public ExpressionException(String message, Throwable cause) { + super(message, cause); } /** * Construct a new expression exception. - * @param position the position in the expression string where the problem occurred + * @param expressionString the expression string * @param message a descriptive message */ - public ExpressionException(int position, String message) { + public ExpressionException(String expressionString, String message) { super(message); - this.position = position; + this.expressionString = expressionString; + this.position = -1; } /** * Construct a new expression exception. + * @param expressionString the expression string * @param position the position in the expression string where the problem occurred * @param message a descriptive message - * @param cause the underlying cause of this exception */ - public ExpressionException(int position, String message, Throwable cause) { - super(message,cause); + public ExpressionException(String expressionString, int position, String message) { + super(message); + this.expressionString = expressionString; this.position = position; } /** * Construct a new expression exception. + * @param position the position in the expression string where the problem occurred * @param message a descriptive message */ - public ExpressionException(String message) { + public ExpressionException(int position, String message) { super(message); + this.position = position; } /** * Construct a new expression exception. + * @param position the position in the expression string where the problem occurred * @param message a descriptive message * @param cause the underlying cause of this exception */ - public ExpressionException(String message, Throwable cause) { + public ExpressionException(int position, String message, Throwable cause) { super(message,cause); + this.position = position; } @@ -107,8 +108,9 @@ public class ExpressionException extends RuntimeException { } /** - * Return the exception message. Since Spring 4.0 this method returns the - * same result as {@link #toDetailedString()}. + * Return the exception message. + * As of Spring 4.0, this method returns the same result as {@link #toDetailedString()}. + * @see #getSimpleMessage() * @see java.lang.Throwable#getMessage() */ @Override @@ -123,11 +125,11 @@ public class ExpressionException extends RuntimeException { public String toDetailedString() { if (this.expressionString != null) { StringBuilder output = new StringBuilder(); - output.append("Expression '"); + output.append("Expression ["); output.append(this.expressionString); - output.append("'"); - if (this.position != -1) { - output.append(" @ "); + output.append("]"); + if (this.position >= 0) { + output.append(" @"); output.append(this.position); } output.append(": "); @@ -142,6 +144,7 @@ public class ExpressionException extends RuntimeException { /** * Return the exception simple message without including the expression * that caused the failure. + * @since 4.0 */ public String getSimpleMessage() { return super.getMessage(); diff --git a/spring-expression/src/main/java/org/springframework/expression/ParseException.java b/spring-expression/src/main/java/org/springframework/expression/ParseException.java index e8db01acc0..64cb2cadf8 100644 --- a/spring-expression/src/main/java/org/springframework/expression/ParseException.java +++ b/spring-expression/src/main/java/org/springframework/expression/ParseException.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package org.springframework.expression; public class ParseException extends ExpressionException { /** - * Creates a new expression parsing exception. + * Create a new expression parsing exception. * @param expressionString the expression string that could not be parsed * @param position the position in the expression string where the problem occurred * @param message description of the problem that occurred @@ -36,7 +36,7 @@ public class ParseException extends ExpressionException { } /** - * Creates a new expression parsing exception. + * Create a new expression parsing exception. * @param position the position in the expression string where the problem occurred * @param message description of the problem that occurred * @param cause the underlying cause of this exception @@ -46,7 +46,7 @@ public class ParseException extends ExpressionException { } /** - * Creates a new expression parsing exception. + * Create a new expression parsing exception. * @param position the position in the expression string where the problem occurred * @param message description of the problem that occurred */ diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/SpelEvaluationException.java b/spring-expression/src/main/java/org/springframework/expression/spel/SpelEvaluationException.java index 80a604f690..9aced9dbf5 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/SpelEvaluationException.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/SpelEvaluationException.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.expression.spel; import org.springframework.expression.EvaluationException; @@ -23,6 +24,7 @@ import org.springframework.expression.EvaluationException; * message. See {@link SpelMessage} for the list of all possible messages that can occur. * * @author Andy Clement + * @author Juergen Hoeller * @since 3.0 */ @SuppressWarnings("serial") @@ -34,62 +36,46 @@ public class SpelEvaluationException extends EvaluationException { public SpelEvaluationException(SpelMessage message, Object... inserts) { - super(message.formatMessage(0, inserts)); // TODO poor position information, can the callers not really supply something? + super(message.formatMessage(inserts)); this.message = message; this.inserts = inserts; } public SpelEvaluationException(int position, SpelMessage message, Object... inserts) { - super(position, message.formatMessage(position, inserts)); + super(position, message.formatMessage(inserts)); this.message = message; this.inserts = inserts; } - public SpelEvaluationException(int position, Throwable cause, - SpelMessage message, Object... inserts) { - super(position,message.formatMessage(position,inserts),cause); + public SpelEvaluationException(int position, Throwable cause, SpelMessage message, Object... inserts) { + super(position, message.formatMessage(inserts),cause); this.message = message; this.inserts = inserts; } public SpelEvaluationException(Throwable cause, SpelMessage message, Object... inserts) { - super(message.formatMessage(0,inserts),cause); + super(message.formatMessage(inserts), cause); this.message = message; this.inserts = inserts; } /** - * @return a formatted message with inserts applied + * Set the position in the related expression which gave rise to this exception. */ - @Override - public String getMessage() { - if (this.message != null) { - return this.message.formatMessage(this.position, this.inserts); - } - else { - return super.getMessage(); - } + public void setPosition(int position) { + this.position = position; } /** - * @return the message code + * Return the message code. */ public SpelMessage getMessageCode() { return this.message; } /** - * Set the position in the related expression which gave rise to this exception. - * - * @param position the position in the expression that gave rise to the exception - */ - public void setPosition(int position) { - this.position = position; - } - - /** - * @return the message inserts + * Return the message inserts. */ public Object[] getInserts() { return this.inserts; diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/SpelMessage.java b/spring-expression/src/main/java/org/springframework/expression/spel/SpelMessage.java index 40c7054c15..71054e6c5d 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/SpelMessage.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/SpelMessage.java @@ -24,16 +24,13 @@ import java.text.MessageFormat; * expect particular code numbers rather than particular text, enabling the message text * to more easily be modified and the tests to run successfully in different locales. * - *

When a message is formatted, it will have this kind of form + *

When a message is formatted, it will have this kind of form, capturing the prefix + * and the error kind: * - *

- * EL1004E: (pos 34): Type cannot be found 'String'
- * 
- * - * The prefix captures the code and the error kind, whilst the position is included - * if it is known. + *
EL1004E: Type cannot be found 'String'
* * @author Andy Clement + * @author Juergen Hoeller * @since 3.0 */ public enum SpelMessage { @@ -175,7 +172,7 @@ public enum SpelMessage { "Cannot find terminating \" for string"), NON_TERMINATING_QUOTED_STRING(Kind.ERROR, 1046, - "Cannot find terminating ' for string"), + "Cannot find terminating '' for string"), MISSING_LEADING_ZERO_FOR_NUMBER(Kind.ERROR, 1047, "A real number must be prefixed by zero, it cannot start with just ''.''"), @@ -190,7 +187,7 @@ public enum SpelMessage { "The arguments '(...)' for the constructor call are missing"), RUN_OUT_OF_ARGUMENTS(Kind.ERROR, 1051, - "Unexpected ran out of arguments"), + "Unexpectedly ran out of arguments"), UNABLE_TO_GROW_COLLECTION(Kind.ERROR, 1052, "Unable to grow collection"), @@ -262,20 +259,42 @@ public enum SpelMessage { private final String message; - private SpelMessage(Kind kind, int code, String message) { + SpelMessage(Kind kind, int code, String message) { this.kind = kind; this.code = code; this.message = message; } + /** + * Produce a complete message including the prefix and with the inserts + * applied to the message. + * @param inserts the inserts to put into the formatted message + * @return a formatted message + * @since 4.3.5 + */ + public String formatMessage(Object... inserts) { + StringBuilder formattedMessage = new StringBuilder(); + formattedMessage.append("EL").append(this.code); + switch (this.kind) { + case ERROR: + formattedMessage.append("E"); + break; + } + formattedMessage.append(": "); + formattedMessage.append(MessageFormat.format(this.message, inserts)); + return formattedMessage.toString(); + } + /** * Produce a complete message including the prefix, the position (if known) * and with the inserts applied to the message. * @param pos the position (ignored and not included in the message if less than 0) * @param inserts the inserts to put into the formatted message * @return a formatted message + * @deprecated as of Spring 4.3.5, in favor of {@link #formatMessage(Object...)} */ + @Deprecated public String formatMessage(int pos, Object... inserts) { StringBuilder formattedMessage = new StringBuilder(); formattedMessage.append("EL").append(this.code); @@ -285,7 +304,7 @@ public enum SpelMessage { break; } formattedMessage.append(":"); - if (pos != -1) { + if (pos >= 0) { formattedMessage.append("(pos ").append(pos).append("): "); } formattedMessage.append(MessageFormat.format(this.message, inserts)); @@ -293,6 +312,6 @@ public enum SpelMessage { } - public static enum Kind { INFO, WARNING, ERROR } + public enum Kind { INFO, WARNING, ERROR } } diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/SpelParseException.java b/spring-expression/src/main/java/org/springframework/expression/spel/SpelParseException.java index b498c5f16d..5a045a9199 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/SpelParseException.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/SpelParseException.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.expression.spel; import org.springframework.expression.ParseException; @@ -23,6 +24,7 @@ import org.springframework.expression.ParseException; * message. See {@link SpelMessage} for the list of all possible messages that can occur. * * @author Andy Clement + * @author Juergen Hoeller * @since 3.0 */ @SuppressWarnings("serial") @@ -34,45 +36,33 @@ public class SpelParseException extends ParseException { public SpelParseException(String expressionString, int position, SpelMessage message, Object... inserts) { - super(expressionString, position, message.formatMessage(position,inserts)); - this.position = position; + super(expressionString, position, message.formatMessage(inserts)); this.message = message; this.inserts = inserts; } public SpelParseException(int position, SpelMessage message, Object... inserts) { - super(position, message.formatMessage(position,inserts)); - this.position = position; + super(position, message.formatMessage(inserts)); this.message = message; this.inserts = inserts; } public SpelParseException(int position, Throwable cause, SpelMessage message, Object... inserts) { - super(position, message.formatMessage(position,inserts), cause); - this.position = position; + super(position, message.formatMessage(inserts), cause); this.message = message; this.inserts = inserts; } /** - * @return a formatted message with inserts applied - */ - @Override - public String getMessage() { - return (this.message != null ? this.message.formatMessage(this.position, this.inserts) - : super.getMessage()); - } - - /** - * @return the message code + * Return the message code. */ public SpelMessage getMessageCode() { return this.message; } /** - * @return the message inserts + * Return the message inserts. */ public Object[] getInserts() { return this.inserts; diff --git a/spring-expression/src/test/java/org/springframework/expression/spel/SpelReproTests.java b/spring-expression/src/test/java/org/springframework/expression/spel/SpelReproTests.java index 683bf19a90..18cb9eb38d 100644 --- a/spring-expression/src/test/java/org/springframework/expression/spel/SpelReproTests.java +++ b/spring-expression/src/test/java/org/springframework/expression/spel/SpelReproTests.java @@ -1663,15 +1663,15 @@ public class SpelReproTests extends AbstractExpressionTests { @Test public void SPR10146_malformedExpressions() throws Exception { - doTestSpr10146("/foo", "EL1070E:(pos 0): Problem parsing left operand"); - doTestSpr10146("*foo", "EL1070E:(pos 0): Problem parsing left operand"); - doTestSpr10146("%foo", "EL1070E:(pos 0): Problem parsing left operand"); - doTestSpr10146("foo", "EL1070E:(pos 0): Problem parsing left operand"); - doTestSpr10146("&&foo", "EL1070E:(pos 0): Problem parsing left operand"); - doTestSpr10146("||foo", "EL1070E:(pos 0): Problem parsing left operand"); - doTestSpr10146("&foo", "EL1069E:(pos 0): missing expected character '&'"); - doTestSpr10146("|foo", "EL1069E:(pos 0): missing expected character '|'"); + doTestSpr10146("/foo", "EL1070E: Problem parsing left operand"); + doTestSpr10146("*foo", "EL1070E: Problem parsing left operand"); + doTestSpr10146("%foo", "EL1070E: Problem parsing left operand"); + doTestSpr10146("foo", "EL1070E: Problem parsing left operand"); + doTestSpr10146("&&foo", "EL1070E: Problem parsing left operand"); + doTestSpr10146("||foo", "EL1070E: Problem parsing left operand"); + doTestSpr10146("&foo", "EL1069E: missing expected character '&'"); + doTestSpr10146("|foo", "EL1069E: missing expected character '|'"); } private void doTestSpr10146(String expression, String expectedMessage) { @@ -1702,7 +1702,7 @@ public class SpelReproTests extends AbstractExpressionTests { @Test public void SPR10328() throws Exception { thrown.expect(SpelParseException.class); - thrown.expectMessage("EL1071E:(pos 2): A required selection expression has not been specified"); + thrown.expectMessage("EL1071E: A required selection expression has not been specified"); Expression exp = parser.parseExpression("$[]"); exp.getValue(Arrays.asList("foo", "bar", "baz")); } diff --git a/spring-expression/src/test/java/org/springframework/expression/spel/standard/SpelParserTests.java b/spring-expression/src/test/java/org/springframework/expression/spel/standard/SpelParserTests.java index 6993bfc7ac..ed9789b0c7 100644 --- a/spring-expression/src/test/java/org/springframework/expression/spel/standard/SpelParserTests.java +++ b/spring-expression/src/test/java/org/springframework/expression/spel/standard/SpelParserTests.java @@ -19,7 +19,6 @@ package org.springframework.expression.spel.standard; import org.junit.Test; import org.springframework.expression.EvaluationContext; -import org.springframework.expression.EvaluationException; import org.springframework.expression.ExpressionException; import org.springframework.expression.ParseException; import org.springframework.expression.spel.SpelMessage; @@ -33,11 +32,12 @@ import static org.junit.Assert.*; /** * @author Andy Clement + * @author Juergen Hoeller */ public class SpelParserTests { @Test - public void theMostBasic() throws EvaluationException, ParseException { + public void theMostBasic() { SpelExpressionParser parser = new SpelExpressionParser(); SpelExpression expr = parser.parseRaw("2"); assertNotNull(expr); @@ -48,7 +48,7 @@ public class SpelParserTests { } @Test - public void valueType() throws Exception { + public void valueType() { SpelExpressionParser parser = new SpelExpressionParser(); EvaluationContext ctx = new StandardEvaluationContext(); Class c = parser.parseRaw("2").getValueType(); @@ -64,7 +64,7 @@ public class SpelParserTests { } @Test - public void whitespace() throws EvaluationException, ParseException { + public void whitespace() { SpelExpressionParser parser = new SpelExpressionParser(); SpelExpression expr = parser.parseRaw("2 + 3"); assertEquals(5, expr.getValue()); @@ -77,7 +77,7 @@ public class SpelParserTests { } @Test - public void arithmeticPlus1() throws EvaluationException, ParseException { + public void arithmeticPlus1() { SpelExpressionParser parser = new SpelExpressionParser(); SpelExpression expr = parser.parseRaw("2+2"); assertNotNull(expr); @@ -86,14 +86,14 @@ public class SpelParserTests { } @Test - public void arithmeticPlus2() throws EvaluationException, ParseException { + public void arithmeticPlus2() { SpelExpressionParser parser = new SpelExpressionParser(); SpelExpression expr = parser.parseRaw("37+41"); assertEquals(78, expr.getValue()); } @Test - public void arithmeticMultiply1() throws EvaluationException, ParseException { + public void arithmeticMultiply1() { SpelExpressionParser parser = new SpelExpressionParser(); SpelExpression expr = parser.parseRaw("2*3"); assertNotNull(expr); @@ -103,15 +103,14 @@ public class SpelParserTests { } @Test - public void arithmeticPrecedence1() throws EvaluationException, ParseException { + public void arithmeticPrecedence1() { SpelExpressionParser parser = new SpelExpressionParser(); SpelExpression expr = parser.parseRaw("2*3+5"); assertEquals(11, expr.getValue()); } @Test - public void generalExpressions() throws Exception { - + public void generalExpressions() { try { SpelExpressionParser parser = new SpelExpressionParser(); parser.parseRaw("new String"); @@ -122,6 +121,7 @@ public class SpelParserTests { SpelParseException spe = (SpelParseException) ex; assertEquals(SpelMessage.MISSING_CONSTRUCTOR_ARGS, spe.getMessageCode()); assertEquals(10, spe.getPosition()); + assertTrue(ex.getMessage().contains(ex.getExpressionString())); } try { @@ -134,6 +134,7 @@ public class SpelParserTests { SpelParseException spe = (SpelParseException) ex; assertEquals(SpelMessage.RUN_OUT_OF_ARGUMENTS, spe.getMessageCode()); assertEquals(10, spe.getPosition()); + assertTrue(ex.getMessage().contains(ex.getExpressionString())); } try { @@ -146,6 +147,7 @@ public class SpelParserTests { SpelParseException spe = (SpelParseException) ex; assertEquals(SpelMessage.RUN_OUT_OF_ARGUMENTS, spe.getMessageCode()); assertEquals(10, spe.getPosition()); + assertTrue(ex.getMessage().contains(ex.getExpressionString())); } try { @@ -158,6 +160,7 @@ public class SpelParserTests { SpelParseException spe = (SpelParseException) ex; assertEquals(SpelMessage.RUN_OUT_OF_ARGUMENTS, spe.getMessageCode()); assertEquals(10, spe.getPosition()); + assertTrue(ex.getMessage().contains(ex.getExpressionString())); } try { @@ -170,6 +173,7 @@ public class SpelParserTests { SpelParseException spe = (SpelParseException) ex; assertEquals(SpelMessage.NON_TERMINATING_DOUBLE_QUOTED_STRING, spe.getMessageCode()); assertEquals(0, spe.getPosition()); + assertTrue(ex.getMessage().contains(ex.getExpressionString())); } try { @@ -182,43 +186,44 @@ public class SpelParserTests { SpelParseException spe = (SpelParseException) ex; assertEquals(SpelMessage.NON_TERMINATING_QUOTED_STRING, spe.getMessageCode()); assertEquals(0, spe.getPosition()); + assertTrue(ex.getMessage().contains(ex.getExpressionString())); } } @Test - public void arithmeticPrecedence2() throws EvaluationException, ParseException { + public void arithmeticPrecedence2() { SpelExpressionParser parser = new SpelExpressionParser(); SpelExpression expr = parser.parseRaw("2+3*5"); assertEquals(17, expr.getValue()); } @Test - public void arithmeticPrecedence3() throws EvaluationException, ParseException { + public void arithmeticPrecedence3() { SpelExpression expr = new SpelExpressionParser().parseRaw("3+10/2"); assertEquals(8, expr.getValue()); } @Test - public void arithmeticPrecedence4() throws EvaluationException, ParseException { + public void arithmeticPrecedence4() { SpelExpression expr = new SpelExpressionParser().parseRaw("10/2+3"); assertEquals(8, expr.getValue()); } @Test - public void arithmeticPrecedence5() throws EvaluationException, ParseException { + public void arithmeticPrecedence5() { SpelExpression expr = new SpelExpressionParser().parseRaw("(4+10)/2"); assertEquals(7, expr.getValue()); } @Test - public void arithmeticPrecedence6() throws EvaluationException, ParseException { + public void arithmeticPrecedence6() { SpelExpression expr = new SpelExpressionParser().parseRaw("(3+2)*2"); assertEquals(10, expr.getValue()); } @Test - public void booleanOperators() throws EvaluationException, ParseException { + public void booleanOperators() { SpelExpression expr = new SpelExpressionParser().parseRaw("true"); assertEquals(Boolean.TRUE, expr.getValue(Boolean.class)); expr = new SpelExpressionParser().parseRaw("false"); @@ -236,7 +241,7 @@ public class SpelParserTests { } @Test - public void booleanOperators_symbolic_spr9614() throws EvaluationException, ParseException { + public void booleanOperators_symbolic_spr9614() { SpelExpression expr = new SpelExpressionParser().parseRaw("true"); assertEquals(Boolean.TRUE, expr.getValue(Boolean.class)); expr = new SpelExpressionParser().parseRaw("false"); @@ -254,7 +259,7 @@ public class SpelParserTests { } @Test - public void stringLiterals() throws EvaluationException, ParseException { + public void stringLiterals() { SpelExpression expr = new SpelExpressionParser().parseRaw("'howdy'"); assertEquals("howdy", expr.getValue()); expr = new SpelExpressionParser().parseRaw("'hello '' world'"); @@ -262,13 +267,13 @@ public class SpelParserTests { } @Test - public void stringLiterals2() throws EvaluationException, ParseException { + public void stringLiterals2() { SpelExpression expr = new SpelExpressionParser().parseRaw("'howdy'.substring(0,2)"); assertEquals("ho", expr.getValue()); } @Test - public void testStringLiterals_DoubleQuotes_spr9620() throws Exception { + public void testStringLiterals_DoubleQuotes_spr9620() { SpelExpression expr = new SpelExpressionParser().parseRaw("\"double quote: \"\".\""); assertEquals("double quote: \".", expr.getValue()); expr = new SpelExpressionParser().parseRaw("\"hello \"\" world\""); @@ -276,7 +281,7 @@ public class SpelParserTests { } @Test - public void testStringLiterals_DoubleQuotes_spr9620_2() throws Exception { + public void testStringLiterals_DoubleQuotes_spr9620_2() { try { new SpelExpressionParser().parseRaw("\"double quote: \\\"\\\".\""); fail("Should have failed"); @@ -288,7 +293,7 @@ public class SpelParserTests { } @Test - public void positionalInformation() throws EvaluationException, ParseException { + public void positionalInformation() { SpelExpression expr = new SpelExpressionParser().parseRaw("true and true or false"); SpelNode rootAst = expr.getAST(); OpOr operatorOr = (OpOr) rootAst; @@ -355,13 +360,13 @@ public class SpelParserTests { exprEx = new ExpressionException("wibble", "test"); assertEquals("test", exprEx.getSimpleMessage()); - assertEquals("Expression 'wibble': test", exprEx.toDetailedString()); - assertEquals("Expression 'wibble': test", exprEx.getMessage()); + assertEquals("Expression [wibble]: test", exprEx.toDetailedString()); + assertEquals("Expression [wibble]: test", exprEx.getMessage()); exprEx = new ExpressionException("wibble", 3, "test"); assertEquals("test", exprEx.getSimpleMessage()); - assertEquals("Expression 'wibble' @ 3: test", exprEx.toDetailedString()); - assertEquals("Expression 'wibble' @ 3: test", exprEx.getMessage()); + assertEquals("Expression [wibble] @3: test", exprEx.toDetailedString()); + assertEquals("Expression [wibble] @3: test", exprEx.getMessage()); } @Test @@ -401,16 +406,16 @@ public class SpelParserTests { checkNumber("1e+3", 1e3d, Double.class); } + private void checkNumber(String expression, Object value, Class type) { try { SpelExpressionParser parser = new SpelExpressionParser(); SpelExpression expr = parser.parseRaw(expression); - Object o = expr.getValue(); - assertEquals(value, o); - assertEquals(type, o.getClass()); + Object exprVal = expr.getValue(); + assertEquals(value, exprVal); + assertEquals(type, exprVal.getClass()); } catch (Exception ex) { - ex.printStackTrace(); fail(ex.getMessage()); } } -- GitLab