提交 efee3b34 编写于 作者: A Andy Clement

date literal removed

上级 8740b702
/*
* Copyright 2004-2008 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.
* 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.springframework.expression.spel.ast;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.antlr.runtime.Token;
import org.springframework.expression.EvaluationException;
import org.springframework.expression.spel.ExpressionState;
import org.springframework.expression.spel.SpelException;
import org.springframework.expression.spel.SpelMessages;
/**
* Represents a date literal value in an expression (a java.util.Date object).
*
* @author Andy Clement
*
*/
public class DateLiteral extends SpelNode {
private DateFormat formatter = null;
private Date formattedDate = null;
public DateLiteral(Token payload) {
super(payload);
}
@Override
public Date getValue(ExpressionState state) throws EvaluationException {
if (formatter == null) {
if (getChildCount() > 1) {
formatter = new SimpleDateFormat((String) getChild(1).getValue(state));
} else {
// http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html
// this is something of this format: "Wed, 4 Jul 2001 12:08:56 GMT"
formatter = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.UK);
}
}
String valueToParse = (String) getChild(0).getValue(state);
try {
formattedDate = formatter.parse(valueToParse);
} catch (ParseException e) {
throw new SpelException(getCharPositionInLine(), e, SpelMessages.DATE_CANNOT_BE_PARSED, valueToParse,
(formatter instanceof SimpleDateFormat ? ((SimpleDateFormat) formatter).toLocalizedPattern()
: formatter));
}
return formattedDate;
}
@Override
public String toStringAST() {
StringBuilder sb = new StringBuilder();
sb.append("date(");
sb.append(getChild(0).toStringAST());
if (getChildCount() > 1) {
sb.append(",").append(getChild(1).toStringAST());
}
sb.append(")");
return sb.toString();
}
}
......@@ -18,7 +18,6 @@ tokens {
INDEXER;
ARGLIST;
CONSTRUCTOR;
DATE_LITERAL;
HOLDER;
CONSTRUCTOR_ARRAY;
NAMED_ARGUMENT;
......@@ -252,13 +251,10 @@ literal
| NULL_LITERAL
| HEXADECIMAL_INTEGER_LITERAL
| REAL_LITERAL
| dateLiteral
;
boolLiteral: TRUE | FALSE;
dateLiteral: 'date' LPAREN d=STRING_LITERAL (COMMA f=STRING_LITERAL)? RPAREN -> ^(DATE_LITERAL $d ($f)?);
INTEGER_LITERAL
: (DECIMAL_DIGIT)+ (INTEGER_TYPE_SUFFIX)?;
......@@ -327,27 +323,12 @@ STRING_LITERAL: '\''! (APOS|~'\'')* '\''!;
DQ_STRING_LITERAL: '"'! (~'"')* '"'!;
ID: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|DOT_ESCAPED)*;
DOT_ESCAPED: '\\.';
//DOUBLE_DOT: ':';
WS: ( ' ' | '\t' | '\n' |'\r')+ { $channel=HIDDEN; } ;
DOLLAR: '$';
AT: '@';
UPTO: '..';
COLON: ':';
/*
// real - use syntactic predicates (guess mode)
: ('.' DECIMAL_DIGIT) =>
in= '.' (DECIMAL_DIGIT)+ (EXPONENT_PART)? (REAL_TYPE_SUFFIX)?
| ((DECIMAL_DIGIT)+ '.' DECIMAL_DIGIT) =>
in=(DECIMAL_DIGIT)+ '.' (DECIMAL_DIGIT)+ (EXPONENT_PART)? (REAL_TYPE_SUFFIX)?
| ((DECIMAL_DIGIT)+ (EXPONENT_PART)) =>
in= (DECIMAL_DIGIT)+ (EXPONENT_PART) (REAL_TYPE_SUFFIX)?
| ((DECIMAL_DIGIT)+ (REAL_TYPE_SUFFIX)) =>
in= (DECIMAL_DIGIT)+ (REAL_TYPE_SUFFIX)
*/
REAL_LITERAL :
('.' (DECIMAL_DIGIT)+ (EXPONENT_PART)? (REAL_TYPE_SUFFIX)?) |
......@@ -362,5 +343,4 @@ fragment HEX_DIGIT : '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'A'|'B'|'C'|'D'|'E'
fragment EXPONENT_PART : 'e' (SIGN)* (DECIMAL_DIGIT)+ | 'E' (SIGN)* (DECIMAL_DIGIT)+ ;
fragment SIGN : '+' | '-' ;
// TODO what is M or m?
fragment REAL_TYPE_SUFFIX : 'F' | 'f' | 'D' | 'd' | 'M' | 'm' ;
fragment REAL_TYPE_SUFFIX : 'F' | 'f' | 'D' | 'd';
GREATER_THAN_OR_EQUAL=78
SELECT_FIRST=57
COMMA=50
HOLDER=14
GREATER_THAN=77
TYPE=59
GREATER_THAN_OR_EQUAL=77
SELECT_FIRST=56
COMMA=49
HOLDER=13
GREATER_THAN=76
TYPE=58
EXPRESSIONLIST=4
MINUS=40
MAP_ENTRY=25
SELECT_LAST=58
NUMBER=29
LESS_THAN=75
BANG=45
MINUS=39
MAP_ENTRY=24
SELECT_LAST=57
NUMBER=28
LESS_THAN=74
BANG=44
ARGLIST=11
FALSE=69
METHOD=26
FALSE=68
METHOD=25
PROPERTY_OR_FIELD=9
LBRACKET=52
LBRACKET=51
INDEXER=10
MOD=43
CONSTRUCTOR_ARRAY=15
FUNCTIONREF=17
NULL_LITERAL=65
NAMED_ARGUMENT=16
OR=37
PIPE=61
DOT=46
RCURLY=55
MOD=42
CONSTRUCTOR_ARRAY=14
FUNCTIONREF=16
NULL_LITERAL=64
NAMED_ARGUMENT=15
OR=36
PIPE=60
DOT=45
RCURLY=54
EXPRESSION=6
AND=38
LCURLY=62
DATE_LITERAL=13
REAL_TYPE_SUFFIX=89
STRING_LITERAL=63
SELECT=56
AND=37
LCURLY=61
REAL_TYPE_SUFFIX=88
STRING_LITERAL=62
SELECT=55
QUALIFIED_IDENTIFIER=7
RBRACKET=53
SUBTRACT=28
ASSIGN=31
BETWEEN=81
RPAREN=36
SIGN=90
LPAREN=35
HEX_DIGIT=72
PLUS=39
LIST_INITIALIZER=21
APOS=84
RBRACKET=52
SUBTRACT=27
ASSIGN=30
BETWEEN=80
RPAREN=35
SIGN=89
LPAREN=34
HEX_DIGIT=71
PLUS=38
LIST_INITIALIZER=20
APOS=83
INTEGER_LITERAL=5
AT=51
ID=48
NOT_EQUAL=74
RANGE=19
POWER=44
TYPEREF=18
DECIMAL_DIGIT=70
WS=86
IS=80
DOLLAR=49
LESS_THAN_OR_EQUAL=76
SEMIRPAREN=30
DQ_STRING_LITERAL=64
HEXADECIMAL_INTEGER_LITERAL=66
MAP_INITIALIZER=22
LAMBDA=60
LOCALFUNC=24
IN=79
SEMI=83
AT=50
ID=47
NOT_EQUAL=73
RANGE=18
POWER=43
TYPEREF=17
DECIMAL_DIGIT=69
WS=85
IS=79
DOLLAR=48
LESS_THAN_OR_EQUAL=75
SEMIRPAREN=29
DQ_STRING_LITERAL=63
HEXADECIMAL_INTEGER_LITERAL=65
MAP_INITIALIZER=21
LAMBDA=59
LOCALFUNC=23
IN=78
SEMI=82
CONSTRUCTOR=12
INTEGER_TYPE_SUFFIX=71
EQUAL=73
MATCHES=82
DOT_ESCAPED=85
UPTO=87
QMARK=33
INTEGER_TYPE_SUFFIX=70
EQUAL=72
MATCHES=81
DOT_ESCAPED=84
UPTO=86
QMARK=32
REFERENCE=8
PROJECT=54
DEFAULT=32
COLON=34
DIV=42
LOCALVAR=23
STAR=41
REAL_LITERAL=67
VARIABLEREF=20
EXPONENT_PART=88
TRUE=68
ADD=27
POUND=47
'date'=92
'new'=91
PROJECT=53
DEFAULT=31
COLON=33
DIV=41
LOCALVAR=22
STAR=40
REAL_LITERAL=66
VARIABLEREF=19
EXPONENT_PART=87
TRUE=67
ADD=26
POUND=46
'new'=90
......@@ -22,7 +22,6 @@ import org.springframework.expression.spel.ast.Assign;
import org.springframework.expression.spel.ast.BooleanLiteral;
import org.springframework.expression.spel.ast.CompoundExpression;
import org.springframework.expression.spel.ast.ConstructorReference;
import org.springframework.expression.spel.ast.DateLiteral;
import org.springframework.expression.spel.ast.Dot;
import org.springframework.expression.spel.ast.ExpressionListNode;
import org.springframework.expression.spel.ast.FunctionReference;
......@@ -123,8 +122,6 @@ public class SpelTreeAdaptor extends CommonTreeAdaptor {
return new StringLiteral(payload);
case SpringExpressionsLexer.NULL_LITERAL:
return new NullLiteral(payload);
case SpringExpressionsLexer.DATE_LITERAL:
return new DateLiteral(payload);
case SpringExpressionsLexer.ID:
return new Identifier(payload);
......
......@@ -129,34 +129,6 @@ public class LiteralTests extends ExpressionTestCase {
evaluate("null", null, null);
}
public void testLiteralDate01() {
evaluate("date('Wed, 4 Jul 2001 12:08:56 GMT').getTime()>0", "true", Boolean.class);
}
public void testLiteralDate02() {
evaluate("date('19740824131030','yyyyMMddHHmmss').getHours()", "13", Integer.class);
}
public void testLiteralDate03() {
// Jal is not a valid month
evaluateAndCheckError("date('Wed, 4 Jal 2001 12:08:56 GMT').getTime()>0", SpelMessages.DATE_CANNOT_BE_PARSED);
}
public void testLiteralDate04() {
// null format
parseAndCheckError("date('Wed, 4 Jul 2001 12:08:56 GMT',null).getTime()>0", SpelMessages.PARSE_PROBLEM);
}
public void testLiteralDate05() {
// null date
parseAndCheckError("date(null).getTime()>0", SpelMessages.PARSE_PROBLEM);
}
public void testLiteralDate06() {
// int year convertable from number to string
parseAndCheckError("date(2008,'yyyy').getTime()>0", SpelMessages.PARSE_PROBLEM);
}
public void testConversions() {
// getting the expression type to be what we want - either:
evaluate("new Integer(37).byteValue()", (byte) 37, Byte.class); // calling byteValue() on Integer.class
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册