/** * Request that an attempt is made to compile the specified expression. It may fail if * components of the expression are not suitable for compilation or the data types * involved are not suitable for compilation. Used for testing. * @return true if the expression was successfully compiled */ public static boolean compile(Expression expression) { return (expression instanceof SpelExpression && ((SpelExpression) expression).compileExpression()); }
/** * Create a new {@code StandardBeanExpressionResolver} with default settings. */ public StandardBeanExpressionResolver() { this.expressionParser = new SpelExpressionParser(); }
private boolean peekToken(TokenKind possible1, TokenKind possible2) { Token t = peekToken(); if (t == null) { return false; } return (t.kind == possible1 || t.kind == possible2); }
@Test public void stringLiterals() { SpelExpression expr = new SpelExpressionParser().parseRaw("'howdy'"); assertEquals("howdy", expr.getValue()); expr = new SpelExpressionParser().parseRaw("'hello '' world'"); assertEquals("hello ' world", expr.getValue()); }
private SpelNodeImpl eatDottedNode() { Token t = takeToken(); // it was a '.' or a '?.' boolean nullSafeNavigation = (t.kind == TokenKind.SAFE_NAVI); if (maybeEatMethodOrProperty(nullSafeNavigation) || maybeEatFunctionOrVar() || maybeEatProjection(nullSafeNavigation) || maybeEatSelection(nullSafeNavigation)) { return pop(); } if (peekToken() == null) { // unexpectedly ran out of data throw internalException(t.startPos, SpelMessage.OOD); } else { throw internalException(t.startPos, SpelMessage.UNEXPECTED_DATA_AFTER_DOT, toString(peekToken())); } }
private Token eatToken(TokenKind expectedKind) { Token t = nextToken(); if (t == null) { int pos = this.expressionString.length(); throw internalException(pos, SpelMessage.OOD); } if (t.kind != expectedKind) { throw internalException(t.startPos, SpelMessage.NOT_EXPECTED_TOKEN, expectedKind.toString().toLowerCase(), t.getKind().toString().toLowerCase()); } return t; }
private boolean peekIdentifierToken(String identifierString) { Token t = peekToken(); if (t == null) { return false; } return (t.kind == TokenKind.IDENTIFIER && identifierString.equalsIgnoreCase(t.stringValue())); }
private boolean isIdentifier(char ch) { return isAlphabetic(ch) || isDigit(ch) || ch == '_' || ch == '$'; }
public Token asBetweenToken() { return new Token(TokenKind.BETWEEN, this.startPos, this.endPos); }
private SpelNodeImpl getAst() { SpelExpression spelExpression = (SpelExpression) expression; SpelNode ast = spelExpression.getAST(); return (SpelNodeImpl)ast; }
/** * Request to revert to the interpreter for expression evaluation. * Any compiled form is discarded but can be recreated by later recompiling again. * @param expression the expression */ public static void revertToInterpreted(Expression expression) { if (expression instanceof SpelExpression) { ((SpelExpression) expression).revertToInterpreted(); } }
public SpelExpression parseRaw(String expressionString) throws ParseException { return doParseExpression(expressionString, null); }
@Test public void whitespace() { SpelExpressionParser parser = new SpelExpressionParser(); SpelExpression expr = parser.parseRaw("2 + 3"); assertEquals(5, expr.getValue()); expr = parser.parseRaw("2 + 3"); assertEquals(5, expr.getValue()); expr = parser.parseRaw("2\n+\t3"); assertEquals(5, expr.getValue()); expr = parser.parseRaw("2\r\n+\t3"); assertEquals(5, expr.getValue()); }
/** * Create a new instance with a default {@link SpelExpressionParser}. */ protected CachedExpressionEvaluator() { this(new SpelExpressionParser()); }
public Token asInstanceOfToken() { return new Token(TokenKind.INSTANCEOF, this.startPos, this.endPos); }
private boolean peekToken(TokenKind possible1, TokenKind possible2, TokenKind possible3) { Token t = peekToken(); if (t == null) { return false; } return (t.kind == possible1 || t.kind == possible2 || t.kind == possible3); }
public Token asMatchesToken() { return new Token(TokenKind.MATCHES, this.startPos, this.endPos); }
private boolean peekSelectToken() { Token t = peekToken(); if (t == null) { return false; } return (t.kind == TokenKind.SELECT || t.kind == TokenKind.SELECT_FIRST || t.kind == TokenKind.SELECT_LAST); }
private boolean peekToken(TokenKind desiredTokenKind) { return peekToken(desiredTokenKind, false); }