You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by pb...@apache.org on 2007/08/27 01:39:57 UTC
svn commit: r569926 - in /struts/struts1/trunk/core/src:
main/java/org/apache/struts/validator/validwhen/
test/java/org/apache/struts/validator/
Author: pbenedict
Date: Sun Aug 26 16:39:56 2007
New Revision: 569926
URL: http://svn.apache.org/viewvc?rev=569926&view=rev
Log:
STR-2321 and STR-2319: Compare floats and doubles
Modified:
struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenLexer.java
struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.g
struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.java
struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.java
struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.txt
struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/PojoBean.java
struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/TestValidWhen.java
Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenLexer.java
URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenLexer.java?rev=569926&r1=569925&r2=569926&view=diff
==============================================================================
--- struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenLexer.java (original)
+++ struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenLexer.java Sun Aug 26 16:39:56 2007
@@ -1,4 +1,4 @@
-// $ANTLR 2.7.6 (2005-12-22): "ValidWhenParser.g" -> "ValidWhenLexer.java"$
+// $ANTLR 2.7.7 (20060906): "ValidWhenParser.g" -> "ValidWhenLexer.java"$
/*
* $Id$
@@ -23,10 +23,10 @@
package org.apache.struts.validator.validwhen;
+import java.math.BigDecimal;
import java.util.Stack;
import org.apache.commons.validator.util.ValidatorUtils;
-
import java.io.InputStream;
import antlr.TokenStreamException;
import antlr.TokenStreamIOException;
@@ -67,9 +67,9 @@
caseSensitiveLiterals = true;
setCaseSensitive(false);
literals = new Hashtable();
- literals.put(new ANTLRHashString("null", this), new Integer(11));
- literals.put(new ANTLRHashString("or", this), new Integer(16));
- literals.put(new ANTLRHashString("and", this), new Integer(15));
+ literals.put(new ANTLRHashString("null", this), new Integer(12));
+ literals.put(new ANTLRHashString("or", this), new Integer(17));
+ literals.put(new ANTLRHashString("and", this), new Integer(16));
}
public Token nextToken() throws TokenStreamException {
@@ -88,9 +88,9 @@
theRetToken=_returnToken;
break;
}
- case '-': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- case '8': case '9':
+ case '-': case '0': case '1': case '2':
+ case '3': case '4': case '5': case '6':
+ case '7': case '8': case '9':
{
mDECIMAL_LITERAL(true);
theRetToken=_returnToken;
@@ -157,11 +157,7 @@
break;
}
default:
- if ((LA(1)=='0') && (LA(2)=='x')) {
- mHEX_LITERAL(true);
- theRetToken=_returnToken;
- }
- else if ((LA(1)=='<') && (LA(2)=='=')) {
+ if ((LA(1)=='<') && (LA(2)=='=')) {
mLESSEQUALSIGN(true);
theRetToken=_returnToken;
}
@@ -169,10 +165,6 @@
mGREATEREQUALSIGN(true);
theRetToken=_returnToken;
}
- else if ((LA(1)=='0') && (true)) {
- mOCTAL_LITERAL(true);
- theRetToken=_returnToken;
- }
else if ((LA(1)=='<') && (true)) {
mLESSTHANSIGN(true);
theRetToken=_returnToken;
@@ -213,8 +205,8 @@
int _saveIndex;
{
- int _cnt15=0;
- _loop15:
+ int _cnt17=0;
+ _loop17:
do {
switch ( LA(1)) {
case ' ':
@@ -239,13 +231,15 @@
}
default:
{
- if ( _cnt15>=1 ) { break _loop15; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
+ if ( _cnt17>=1 ) { break _loop17; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
}
- _cnt15++;
+ _cnt17++;
} while (true);
}
- _ttype = Token.SKIP;
+ if ( inputState.guessing==0 ) {
+ _ttype = Token.SKIP;
+ }
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
@@ -258,112 +252,253 @@
_ttype = DECIMAL_LITERAL;
int _saveIndex;
- {
- switch ( LA(1)) {
- case '-':
- {
- match('-');
- break;
- }
- case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8':
- case '9':
- {
- break;
- }
- default:
- {
- throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
- }
- }
- }
- {
- matchRange('1','9');
- }
- {
- _loop20:
- do {
- if (((LA(1) >= '0' && LA(1) <= '9'))) {
- matchRange('0','9');
+ boolean synPredMatched24 = false;
+ if (((_tokenSet_0.member(LA(1))) && (_tokenSet_1.member(LA(2))))) {
+ int _m24 = mark();
+ synPredMatched24 = true;
+ inputState.guessing++;
+ try {
+ {
+ {
+ switch ( LA(1)) {
+ case '-':
+ {
+ match('-');
+ break;
+ }
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ case '8': case '9':
+ {
+ break;
+ }
+ default:
+ {
+ throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ {
+ int _cnt22=0;
+ _loop22:
+ do {
+ if (((LA(1) >= '0' && LA(1) <= '9'))) {
+ matchRange('0','9');
+ }
+ else {
+ if ( _cnt22>=1 ) { break _loop22; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt22++;
+ } while (true);
+ }
+ {
+ match('.');
+ }
+ }
}
- else {
- break _loop20;
+ catch (RecognitionException pe) {
+ synPredMatched24 = false;
}
-
- } while (true);
- }
- if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
- _token = makeToken(_ttype);
- _token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
+ rewind(_m24);
+inputState.guessing--;
}
- _returnToken = _token;
- }
-
- public final void mHEX_LITERAL(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
- int _ttype; Token _token=null; int _begin=text.length();
- _ttype = HEX_LITERAL;
- int _saveIndex;
-
- match('0');
- match('x');
- {
- int _cnt23=0;
- _loop23:
- do {
+ if ( synPredMatched24 ) {
+ {
+ {
switch ( LA(1)) {
+ case '-':
+ {
+ match('-');
+ break;
+ }
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
case '8': case '9':
{
- matchRange('0','9');
break;
}
- case 'a': case 'b': case 'c': case 'd':
- case 'e': case 'f':
+ default:
{
- matchRange('a','f');
- break;
+ throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
}
- default:
{
- if ( _cnt23>=1 ) { break _loop23; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
+ int _cnt28=0;
+ _loop28:
+ do {
+ if (((LA(1) >= '0' && LA(1) <= '9'))) {
+ matchRange('0','9');
+ }
+ else {
+ if ( _cnt28>=1 ) { break _loop28; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt28++;
+ } while (true);
+ }
+ {
+ match('.');
+ }
+ {
+ int _cnt31=0;
+ _loop31:
+ do {
+ if (((LA(1) >= '0' && LA(1) <= '9'))) {
+ matchRange('0','9');
+ }
+ else {
+ if ( _cnt31>=1 ) { break _loop31; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
+ }
+
+ _cnt31++;
+ } while (true);
}
}
- _cnt23++;
- } while (true);
- }
- if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
- _token = makeToken(_ttype);
- _token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
- _returnToken = _token;
- }
-
- public final void mOCTAL_LITERAL(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
- int _ttype; Token _token=null; int _begin=text.length();
- _ttype = OCTAL_LITERAL;
- int _saveIndex;
-
- match('0');
- {
- _loop26:
- do {
- if (((LA(1) >= '0' && LA(1) <= '7'))) {
- matchRange('0','7');
+ else {
+ boolean synPredMatched38 = false;
+ if (((LA(1)=='0') && (LA(2)=='x'))) {
+ int _m38 = mark();
+ synPredMatched38 = true;
+ inputState.guessing++;
+ try {
+ {
+ match('0');
+ match('x');
+ }
+ }
+ catch (RecognitionException pe) {
+ synPredMatched38 = false;
+ }
+ rewind(_m38);
+inputState.guessing--;
+ }
+ if ( synPredMatched38 ) {
+ {
+ match('0');
+ match('x');
+ {
+ int _cnt41=0;
+ _loop41:
+ do {
+ switch ( LA(1)) {
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ case '8': case '9':
+ {
+ matchRange('0','9');
+ break;
+ }
+ case 'a': case 'b': case 'c': case 'd':
+ case 'e': case 'f':
+ {
+ matchRange('a','f');
+ break;
+ }
+ default:
+ {
+ if ( _cnt41>=1 ) { break _loop41; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
+ }
+ }
+ _cnt41++;
+ } while (true);
+ }
+ }
+ if ( inputState.guessing==0 ) {
+ _ttype = HEX_INT_LITERAL;
+ }
}
else {
- break _loop26;
+ boolean synPredMatched33 = false;
+ if (((LA(1)=='0') && (true))) {
+ int _m33 = mark();
+ synPredMatched33 = true;
+ inputState.guessing++;
+ try {
+ {
+ match('0');
+ }
+ }
+ catch (RecognitionException pe) {
+ synPredMatched33 = false;
+ }
+ rewind(_m33);
+inputState.guessing--;
+ }
+ if ( synPredMatched33 ) {
+ {
+ match('0');
+ {
+ _loop36:
+ do {
+ if (((LA(1) >= '0' && LA(1) <= '7'))) {
+ matchRange('0','7');
+ }
+ else {
+ break _loop36;
+ }
+
+ } while (true);
+ }
+ }
+ if ( inputState.guessing==0 ) {
+ _ttype = OCTAL_INT_LITERAL;
+ }
+ }
+ else if ((_tokenSet_2.member(LA(1))) && (true)) {
+ {
+ {
+ switch ( LA(1)) {
+ case '-':
+ {
+ match('-');
+ break;
+ }
+ case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8':
+ case '9':
+ {
+ break;
+ }
+ default:
+ {
+ throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
+ }
+ }
+ }
+ {
+ matchRange('1','9');
+ }
+ {
+ _loop46:
+ do {
+ if (((LA(1) >= '0' && LA(1) <= '9'))) {
+ matchRange('0','9');
+ }
+ else {
+ break _loop46;
+ }
+
+ } while (true);
+ }
+ }
+ if ( inputState.guessing==0 ) {
+ _ttype = DEC_INT_LITERAL;
+ }
+ }
+ else {
+ throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
+ }
+ }}
+ if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
+ _token = makeToken(_ttype);
+ _token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
+ }
+ _returnToken = _token;
}
- } while (true);
- }
- if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
- _token = makeToken(_ttype);
- _token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
- }
- _returnToken = _token;
- }
-
public final void mSTRING_LITERAL(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = STRING_LITERAL;
@@ -375,17 +510,17 @@
{
match('\'');
{
- int _cnt30=0;
- _loop30:
+ int _cnt50=0;
+ _loop50:
do {
- if ((_tokenSet_0.member(LA(1)))) {
+ if ((_tokenSet_3.member(LA(1)))) {
matchNot('\'');
}
else {
- if ( _cnt30>=1 ) { break _loop30; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
+ if ( _cnt50>=1 ) { break _loop50; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
- _cnt30++;
+ _cnt50++;
} while (true);
}
match('\'');
@@ -397,17 +532,17 @@
{
match('\"');
{
- int _cnt33=0;
- _loop33:
+ int _cnt53=0;
+ _loop53:
do {
- if ((_tokenSet_1.member(LA(1)))) {
+ if ((_tokenSet_4.member(LA(1)))) {
matchNot('\"');
}
else {
- if ( _cnt33>=1 ) { break _loop33; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
+ if ( _cnt53>=1 ) { break _loop53; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
- _cnt33++;
+ _cnt53++;
} while (true);
}
match('\"');
@@ -526,8 +661,8 @@
}
}
{
- int _cnt42=0;
- _loop42:
+ int _cnt62=0;
+ _loop62:
do {
switch ( LA(1)) {
case 'a': case 'b': case 'c': case 'd':
@@ -560,10 +695,10 @@
}
default:
{
- if ( _cnt42>=1 ) { break _loop42; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
+ if ( _cnt62>=1 ) { break _loop62; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
}
- _cnt42++;
+ _cnt62++;
} while (true);
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
@@ -657,14 +792,29 @@
private static final long[] mk_tokenSet_0() {
- long[] data = { -554050771456L, 9223372036854775807L, 0L, 0L};
+ long[] data = { 287984085547089920L, 0L, 0L};
return data;
}
public static final BitSet _tokenSet_0 = new BitSet(mk_tokenSet_0());
private static final long[] mk_tokenSet_1() {
- long[] data = { -21474826752L, 9223372036854775807L, 0L, 0L};
+ long[] data = { 288019269919178752L, 0L, 0L};
return data;
}
public static final BitSet _tokenSet_1 = new BitSet(mk_tokenSet_1());
+ private static final long[] mk_tokenSet_2() {
+ long[] data = { 287702610570379264L, 0L, 0L};
+ return data;
+ }
+ public static final BitSet _tokenSet_2 = new BitSet(mk_tokenSet_2());
+ private static final long[] mk_tokenSet_3() {
+ long[] data = { -554050771456L, 9223372036854775807L, 0L, 0L};
+ return data;
+ }
+ public static final BitSet _tokenSet_3 = new BitSet(mk_tokenSet_3());
+ private static final long[] mk_tokenSet_4() {
+ long[] data = { -21474826752L, 9223372036854775807L, 0L, 0L};
+ return data;
+ }
+ public static final BitSet _tokenSet_4 = new BitSet(mk_tokenSet_4());
}
Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.g
URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.g?rev=569926&r1=569925&r2=569926&view=diff
==============================================================================
--- struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.g (original)
+++ struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.g Sun Aug 26 16:39:56 2007
@@ -22,182 +22,196 @@
package org.apache.struts.validator.validwhen;
+import java.math.BigDecimal;
import java.util.Stack;
import org.apache.commons.validator.util.ValidatorUtils;
-
}
+
class ValidWhenParser extends Parser;
options {
-k=6;
-defaultErrorHandler=false;
+ k = 6;
+ defaultErrorHandler = false;
}
-{Stack argStack = new Stack();
-Object form;
-int index;
-String value;
+
+{
+ Stack argStack = new Stack();
+ Object form;
+ int index;
+ String value;
public void setForm(Object f) { form = f; };
public void setIndex (int i) { index = i; };
public void setValue (String v) { value = v; };
public boolean getResult() {
- return ((Boolean)argStack.peek()).booleanValue();
+ return ((Boolean)argStack.peek()).booleanValue();
}
- private final int LESS_EQUAL=0;
- private final int LESS_THAN=1;
- private final int EQUAL=2;
- private final int GREATER_THAN=3;
- private final int GREATER_EQUAL=4;
- private final int NOT_EQUAL=5;
- private final int AND=6;
- private final int OR=7;
-
- private boolean evaluateComparison (Object v1, Object compare, Object v2) {
- boolean intCompare = true;
- if ((v1 == null) || (v2 == null)) {
- if (String.class.isInstance(v1)) {
- if (((String) v1).trim().length() == 0) {
- v1 = null;
+ private final int LESS_EQUAL = 0;
+ private final int LESS_THAN = 1;
+ private final int EQUAL = 2;
+ private final int GREATER_THAN = 3;
+ private final int GREATER_EQUAL = 4;
+ private final int NOT_EQUAL = 5;
+ private final int AND = 6;
+ private final int OR = 7;
+
+ private boolean evaluateComparison (Object v1, Object comparison, Object v2) {
+ boolean numCompare = true;
+
+ if ((v1 == null) || (v2 == null)) {
+ if (String.class.isInstance(v1)) {
+ if (((String) v1).trim().length() == 0) {
+ v1 = null;
+ }
}
- }
- if (String.class.isInstance(v2)) {
- if (((String) v2).trim().length() == 0) {
- v2 = null;
- }
- }
- switch (((Integer)compare).intValue()) {
- case LESS_EQUAL:
- case GREATER_THAN:
- case LESS_THAN:
- case GREATER_EQUAL:
- return false;
- case EQUAL:
- return (v1 == v2);
- case NOT_EQUAL:
- return (v1 != v2);
- }
- }
- if ((Integer.class.isInstance(v1) ||
- String.class.isInstance(v1)) &&
- (Integer.class.isInstance(v2) ||
- String.class.isInstance(v2))) {
- intCompare = true;
- } else {
- intCompare = false;
- }
- if (intCompare) {
- try {
- int v1i = 0, v2i = 0;
- if (Integer.class.isInstance(v1)) {
- v1i = ((Integer)v1).intValue();
- } else {
- v1i = Integer.parseInt((String) v1);
- }
- if (Integer.class.isInstance(v2)) {
- v2i = ((Integer)v2).intValue();
- } else {
- v2i = Integer.parseInt((String) v2);
- }
- switch (((Integer)compare).intValue()) {
- case LESS_EQUAL:
- return (v1i <= v2i);
-
- case LESS_THAN:
- return (v1i < v2i);
-
- case EQUAL:
- return (v1i == v2i);
-
- case GREATER_THAN:
- return (v1i > v2i);
-
- case GREATER_EQUAL:
- return (v1i >= v2i);
-
- case NOT_EQUAL:
- return (v1i != v2i);
- }
- } catch (NumberFormatException ex) {};
- }
- String v1s = "", v2s = "";
-
- if (Integer.class.isInstance(v1)) {
- v1s = ((Integer)v1).toString();
- } else {
- v1s = (String) v1;
- }
-
- if (Integer.class.isInstance(v2)) {
- v2s = ((Integer)v2).toString();
- } else {
- v2s = (String) v2;
- }
-
- int res = v1s.compareTo(v2s);
- switch (((Integer)compare).intValue()) {
- case LESS_EQUAL:
- return (res <= 0);
-
- case LESS_THAN:
- return (res < 0);
-
- case EQUAL:
- return (res == 0);
-
- case GREATER_THAN:
- return (res > 0);
-
- case GREATER_EQUAL:
- return (res >= 0);
-
- case NOT_EQUAL:
- return (res != 0);
- }
- return true;
+ if (String.class.isInstance(v2)) {
+ if (((String) v2).trim().length() == 0) {
+ v2 = null;
+ }
+ }
+
+ switch (((Integer)comparison).intValue()) {
+ case LESS_EQUAL:
+ case GREATER_THAN:
+ case LESS_THAN:
+ case GREATER_EQUAL:
+ return false;
+ case EQUAL:
+ return (v1 == v2);
+ case NOT_EQUAL:
+ return (v1 != v2);
+ }
+ }
+
+ if ( (Integer.class.isInstance(v1) ||
+ BigDecimal.class.isInstance(v1) ||
+ String.class.isInstance(v1)) &&
+ (Integer.class.isInstance(v2) ||
+ BigDecimal.class.isInstance(v2) ||
+ String.class.isInstance(v2))) {
+ numCompare = true;
+ } else {
+ numCompare = false;
+ }
+
+ if (numCompare) {
+ try {
+ BigDecimal v1i = null;
+ BigDecimal v2i = null;
+
+ if (BigDecimal.class.isInstance(v1)) {
+ v1i = (BigDecimal)v1;
+ } else if (Integer.class.isInstance(v1)) {
+ v1i = new BigDecimal(v1.toString());
+ } else {
+ v1i = new BigDecimal((String) v1);
+ }
+
+ if (BigDecimal.class.isInstance(v2)) {
+ v2i = (BigDecimal)v2;
+ } else if (Integer.class.isInstance(v2)) {
+ v2i = new BigDecimal(v2.toString());
+ } else {
+ v2i = new BigDecimal((String) v2);
+ }
+
+ int res = v1i.compareTo(v2i);
+ switch (((Integer)comparison).intValue()) {
+ case LESS_EQUAL:
+ return (res <= 0);
+ case LESS_THAN:
+ return (res < 0);
+ case EQUAL:
+ return (res == 0);
+ case GREATER_THAN:
+ return (res > 0);
+ case GREATER_EQUAL:
+ return (res >= 0);
+ case NOT_EQUAL:
+ return (res != 0);
+ }
+ } catch (NumberFormatException ex) {};
+ }
+
+ String v1s = "";
+ String v2s = "";
+
+ if (String.class.isInstance(v1)) {
+ v1s = (String) v1;
+ } else {
+ v1s = v1.toString();
+ }
+
+ if (String.class.isInstance(v2)) {
+ v2s = (String) v2;
+ } else {
+ v2s = v2.toString();
+ }
+
+ int res = v1s.compareTo(v2s);
+ switch (((Integer)comparison).intValue()) {
+ case LESS_EQUAL:
+ return (res <= 0);
+ case LESS_THAN:
+ return (res < 0);
+ case EQUAL:
+ return (res == 0);
+ case GREATER_THAN:
+ return (res > 0);
+ case GREATER_EQUAL:
+ return (res >= 0);
+ case NOT_EQUAL:
+ return (res != 0);
+ }
+ return true;
}
-
}
+decimal:
+ d:DECIMAL_LITERAL
+ { argStack.push(new BigDecimal(d.getText())); } ;
+
+integer :
+ d:DEC_INT_LITERAL
+ { argStack.push(Integer.decode(d.getText())); } |
+ h:HEX_INT_LITERAL
+ { argStack.push(Integer.decode(h.getText())); } |
+ o:OCTAL_INT_LITERAL
+ { argStack.push(Integer.decode(o.getText())); } ;
+
+number : decimal | integer ;
+
+string :
+ str:STRING_LITERAL
+ { argStack.push(str.getText().substring(1, str.getText().length()-1)); };
+
+identifier :
+ str:IDENTIFIER
+ { argStack.push(str.getText()); } ;
+
+field :
+ identifier LBRACKET RBRACKET identifier {
+ Object i2 = argStack.pop();
+ Object i1 = argStack.pop();
+ argStack.push(ValidatorUtils.getValueAsString(form, i1 + "[" + index + "]" + i2)); } |
+ identifier LBRACKET integer RBRACKET identifier {
+ Object i5 = argStack.pop();
+ Object i4 = argStack.pop();
+ Object i3 = argStack.pop();
+ argStack.push(ValidatorUtils.getValueAsString(form, i3 + "[" + i4 + "]" + i5)); } |
+ identifier LBRACKET integer RBRACKET {
+ Object i7 = argStack.pop();
+ Object i6 = argStack.pop();
+ argStack.push(ValidatorUtils.getValueAsString(form, i6 + "[" + i7 + "]")); } |
+ identifier LBRACKET RBRACKET {
+ Object i8 = argStack.pop();
+ argStack.push(ValidatorUtils.getValueAsString(form, i8 + "[" + index + "]")); } |
+ identifier {
+ Object i9 = argStack.pop();
+ argStack.push(ValidatorUtils.getValueAsString(form, (String)i9)); };
-integer
-: d:DECIMAL_LITERAL { argStack.push(Integer.decode(d.getText())); }
-| h:HEX_LITERAL { argStack.push(Integer.decode(h.getText())); }
-| o:OCTAL_LITERAL { argStack.push(Integer.decode(o.getText())); } ;
-
-string : str:STRING_LITERAL { argStack.push(str.getText().substring(1, str.getText().length()-1)); };
-
-identifier
-: str:IDENTIFIER { argStack.push(str.getText()); } ;
-
-field
-: identifier LBRACKET RBRACKET identifier {
- Object i2 = argStack.pop();
- Object i1 = argStack.pop();
- argStack.push(ValidatorUtils.getValueAsString(form, i1 + "[" + index + "]" + i2));
-}
-| identifier LBRACKET integer RBRACKET identifier {
- Object i5 = argStack.pop();
- Object i4 = argStack.pop();
- Object i3 = argStack.pop();
- argStack.push(ValidatorUtils.getValueAsString(form, i3 + "[" + i4 + "]" + i5));
-}
-| identifier LBRACKET integer RBRACKET {
- Object i7 = argStack.pop();
- Object i6 = argStack.pop();
- argStack.push(ValidatorUtils.getValueAsString(form, i6 + "[" + i7 + "]"));
-}
-| identifier LBRACKET RBRACKET {
- Object i8 = argStack.pop();
- argStack.push(ValidatorUtils.getValueAsString(form, i8 + "[" + index + "]"));
-}
-| identifier {
- Object i9 = argStack.pop();
- argStack.push(ValidatorUtils.getValueAsString(form, (String)i9));
-}
-;
-
-literal : integer | string | "null" { argStack.push(null);} | THIS {argStack.push(value);};
+literal : number | string | "null" { argStack.push(null);} | THIS {argStack.push(value);};
value : field | literal ;
@@ -206,57 +220,70 @@
expr: LPAREN comparisonExpression RPAREN | LPAREN joinedExpression RPAREN;
joinedExpression : expr join expr {
- Boolean v1 = (Boolean) argStack.pop();
- Integer join = (Integer) argStack.pop();
- Boolean v2 = (Boolean) argStack.pop();
- if (join.intValue() == AND) {
- argStack.push(new Boolean(v1.booleanValue() && v2.booleanValue()));
-} else {
- argStack.push(new Boolean(v1.booleanValue() || v2.booleanValue()));
- }
+ Boolean v1 = (Boolean) argStack.pop();
+ Integer join = (Integer) argStack.pop();
+ Boolean v2 = (Boolean) argStack.pop();
+ if (join.intValue() == AND) {
+ argStack.push(new Boolean(v1.booleanValue() && v2.booleanValue()));
+ } else {
+ argStack.push(new Boolean(v1.booleanValue() || v2.booleanValue()));
+ }
};
-join : ANDSIGN { argStack.push(new Integer(AND)); } |
- ORSIGN { argStack.push(new Integer(OR)); };
+join :
+ ANDSIGN
+ { argStack.push(new Integer(AND)); } |
+ ORSIGN
+ { argStack.push(new Integer(OR)); };
comparison :
- EQUALSIGN { argStack.push(new Integer(EQUAL)); } |
- GREATERTHANSIGN { argStack.push(new Integer(GREATER_THAN)); } |
- GREATEREQUALSIGN { argStack.push(new Integer(GREATER_EQUAL)); } |
- LESSTHANSIGN { argStack.push(new Integer(LESS_THAN)); } |
- LESSEQUALSIGN { argStack.push(new Integer(LESS_EQUAL)); } |
- NOTEQUALSIGN { argStack.push(new Integer(NOT_EQUAL)); } ;
-
-comparisonExpression : value comparison value {
- Object v2 = argStack.pop();
- Object comp = argStack.pop();
- Object v1 = argStack.pop();
- argStack.push(new Boolean(evaluateComparison(v1, comp, v2)));
-};
-
+ EQUALSIGN
+ { argStack.push(new Integer(EQUAL)); } |
+ GREATERTHANSIGN
+ { argStack.push(new Integer(GREATER_THAN)); } |
+ GREATEREQUALSIGN
+ { argStack.push(new Integer(GREATER_EQUAL)); } |
+ LESSTHANSIGN
+ { argStack.push(new Integer(LESS_THAN)); } |
+ LESSEQUALSIGN
+ { argStack.push(new Integer(LESS_EQUAL)); } |
+ NOTEQUALSIGN
+ { argStack.push(new Integer(NOT_EQUAL)); } ;
+
+comparisonExpression :
+ value comparison value {
+ Object v2 = argStack.pop();
+ Object comp = argStack.pop();
+ Object v1 = argStack.pop();
+ argStack.push(new Boolean(evaluateComparison(v1, comp, v2)));
+ };
class ValidWhenLexer extends Lexer;
options {
- k=2;
-caseSensitive=false;
-defaultErrorHandler=false;
-charVocabulary='\40'..'\176';
+ k=2;
+ caseSensitive=false;
+ defaultErrorHandler=false;
+ charVocabulary='\40'..'\176';
}
+
tokens {
-ANDSIGN="and";
-ORSIGN="or";
+ ANDSIGN="and";
+ ORSIGN="or";
}
-WS : ( ' ' | '\t' | '\n' | '\r' )+
- { $setType(Token.SKIP); }
- ;
-
-DECIMAL_LITERAL : ('-')? ('1'..'9') ('0'..'9')*;
-
-HEX_LITERAL : '0' 'x' ('0'..'9' | 'a'..'f')+ ;
-
-OCTAL_LITERAL : '0' ('0'..'7')* ;
+WS :
+ ( ' ' | '\t' | '\n' | '\r' )+
+ { $setType(Token.SKIP); } ;
+
+DECIMAL_LITERAL :
+ (('-')? ('0'..'9')+ ('.')) => (('-')? ('0'..'9')+ ('.') ('0'..'9')+) |
+ ('0') => ('0' ('0'..'7')*)
+ { $setType(OCTAL_INT_LITERAL); } |
+ ('0' 'x') => ('0' 'x' ('0'..'9' | 'a'..'f')+)
+ { $setType(HEX_INT_LITERAL); } |
+ (('-')? ('1'..'9') ('0'..'9')*)
+ { $setType(DEC_INT_LITERAL); } ;
STRING_LITERAL : ('\'' (~'\'')+ '\'') | ('\"' (~'\"')+ '\"') ;
@@ -282,5 +309,4 @@
LESSEQUALSIGN : '<' '=';
-GREATEREQUALSIGN : '>' '=';
-
+GREATEREQUALSIGN : '>' '=';
\ No newline at end of file
Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.java
URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.java?rev=569926&r1=569925&r2=569926&view=diff
==============================================================================
--- struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.java (original)
+++ struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.java Sun Aug 26 16:39:56 2007
@@ -1,4 +1,4 @@
-// $ANTLR 2.7.6 (2005-12-22): "ValidWhenParser.g" -> "ValidWhenParser.java"$
+// $ANTLR 2.7.7 (20060906): "ValidWhenParser.g" -> "ValidWhenParser.java"$
/*
* $Id$
@@ -23,10 +23,10 @@
package org.apache.struts.validator.validwhen;
+import java.math.BigDecimal;
import java.util.Stack;
import org.apache.commons.validator.util.ValidatorUtils;
-
import antlr.TokenBuffer;
import antlr.TokenStreamException;
import antlr.TokenStreamIOException;
@@ -43,133 +43,140 @@
public class ValidWhenParser extends antlr.LLkParser implements ValidWhenParserTokenTypes
{
-Stack argStack = new Stack();
-Object form;
-int index;
-String value;
+
+ Stack argStack = new Stack();
+ Object form;
+ int index;
+ String value;
public void setForm(Object f) { form = f; };
public void setIndex (int i) { index = i; };
public void setValue (String v) { value = v; };
public boolean getResult() {
- return ((Boolean)argStack.peek()).booleanValue();
+ return ((Boolean)argStack.peek()).booleanValue();
}
- private final int LESS_EQUAL=0;
- private final int LESS_THAN=1;
- private final int EQUAL=2;
- private final int GREATER_THAN=3;
- private final int GREATER_EQUAL=4;
- private final int NOT_EQUAL=5;
- private final int AND=6;
- private final int OR=7;
-
- private boolean evaluateComparison (Object v1, Object compare, Object v2) {
- boolean intCompare = true;
- if ((v1 == null) || (v2 == null)) {
- if (String.class.isInstance(v1)) {
- if (((String) v1).trim().length() == 0) {
- v1 = null;
- }
- }
- if (String.class.isInstance(v2)) {
- if (((String) v2).trim().length() == 0) {
- v2 = null;
+ private final int LESS_EQUAL = 0;
+ private final int LESS_THAN = 1;
+ private final int EQUAL = 2;
+ private final int GREATER_THAN = 3;
+ private final int GREATER_EQUAL = 4;
+ private final int NOT_EQUAL = 5;
+ private final int AND = 6;
+ private final int OR = 7;
+
+ private boolean evaluateComparison (Object v1, Object comparison, Object v2) {
+ boolean numCompare = true;
+
+ if ((v1 == null) || (v2 == null)) {
+ if (String.class.isInstance(v1)) {
+ if (((String) v1).trim().length() == 0) {
+ v1 = null;
+ }
}
- }
- switch (((Integer)compare).intValue()) {
- case LESS_EQUAL:
- case GREATER_THAN:
- case LESS_THAN:
- case GREATER_EQUAL:
- return false;
- case EQUAL:
- return (v1 == v2);
- case NOT_EQUAL:
- return (v1 != v2);
- }
- }
- if ((Integer.class.isInstance(v1) ||
- String.class.isInstance(v1)) &&
- (Integer.class.isInstance(v2) ||
- String.class.isInstance(v2))) {
- intCompare = true;
- } else {
- intCompare = false;
- }
- if (intCompare) {
- try {
- int v1i = 0, v2i = 0;
- if (Integer.class.isInstance(v1)) {
- v1i = ((Integer)v1).intValue();
- } else {
- v1i = Integer.parseInt((String) v1);
- }
- if (Integer.class.isInstance(v2)) {
- v2i = ((Integer)v2).intValue();
- } else {
- v2i = Integer.parseInt((String) v2);
- }
- switch (((Integer)compare).intValue()) {
- case LESS_EQUAL:
- return (v1i <= v2i);
-
- case LESS_THAN:
- return (v1i < v2i);
-
- case EQUAL:
- return (v1i == v2i);
-
- case GREATER_THAN:
- return (v1i > v2i);
-
- case GREATER_EQUAL:
- return (v1i >= v2i);
-
- case NOT_EQUAL:
- return (v1i != v2i);
- }
- } catch (NumberFormatException ex) {};
- }
- String v1s = "", v2s = "";
-
- if (Integer.class.isInstance(v1)) {
- v1s = ((Integer)v1).toString();
- } else {
- v1s = (String) v1;
- }
-
- if (Integer.class.isInstance(v2)) {
- v2s = ((Integer)v2).toString();
- } else {
- v2s = (String) v2;
- }
-
- int res = v1s.compareTo(v2s);
- switch (((Integer)compare).intValue()) {
- case LESS_EQUAL:
- return (res <= 0);
-
- case LESS_THAN:
- return (res < 0);
-
- case EQUAL:
- return (res == 0);
-
- case GREATER_THAN:
- return (res > 0);
-
- case GREATER_EQUAL:
- return (res >= 0);
-
- case NOT_EQUAL:
- return (res != 0);
- }
- return true;
+ if (String.class.isInstance(v2)) {
+ if (((String) v2).trim().length() == 0) {
+ v2 = null;
+ }
+ }
+
+ switch (((Integer)comparison).intValue()) {
+ case LESS_EQUAL:
+ case GREATER_THAN:
+ case LESS_THAN:
+ case GREATER_EQUAL:
+ return false;
+ case EQUAL:
+ return (v1 == v2);
+ case NOT_EQUAL:
+ return (v1 != v2);
+ }
+ }
+
+ if ( (Integer.class.isInstance(v1) ||
+ BigDecimal.class.isInstance(v1) ||
+ String.class.isInstance(v1)) &&
+ (Integer.class.isInstance(v2) ||
+ BigDecimal.class.isInstance(v2) ||
+ String.class.isInstance(v2))) {
+ numCompare = true;
+ } else {
+ numCompare = false;
+ }
+
+ if (numCompare) {
+ try {
+ BigDecimal v1i = null;
+ BigDecimal v2i = null;
+
+ if (BigDecimal.class.isInstance(v1)) {
+ v1i = (BigDecimal)v1;
+ } else if (Integer.class.isInstance(v1)) {
+ v1i = new BigDecimal(v1.toString());
+ } else {
+ v1i = new BigDecimal((String) v1);
+ }
+
+ if (BigDecimal.class.isInstance(v2)) {
+ v2i = (BigDecimal)v2;
+ } else if (Integer.class.isInstance(v2)) {
+ v2i = new BigDecimal(v2.toString());
+ } else {
+ v2i = new BigDecimal((String) v2);
+ }
+
+ int res = v1i.compareTo(v2i);
+ switch (((Integer)comparison).intValue()) {
+ case LESS_EQUAL:
+ return (res <= 0);
+ case LESS_THAN:
+ return (res < 0);
+ case EQUAL:
+ return (res == 0);
+ case GREATER_THAN:
+ return (res > 0);
+ case GREATER_EQUAL:
+ return (res >= 0);
+ case NOT_EQUAL:
+ return (res != 0);
+ }
+ } catch (NumberFormatException ex) {};
+ }
+
+ String v1s = "";
+ String v2s = "";
+
+ if (String.class.isInstance(v1)) {
+ v1s = (String) v1;
+ } else {
+ v1s = v1.toString();
+ }
+
+ if (String.class.isInstance(v2)) {
+ v2s = (String) v2;
+ } else {
+ v2s = v2.toString();
+ }
+
+ int res = v1s.compareTo(v2s);
+ switch (((Integer)comparison).intValue()) {
+ case LESS_EQUAL:
+ return (res <= 0);
+ case LESS_THAN:
+ return (res < 0);
+ case EQUAL:
+ return (res == 0);
+ case GREATER_THAN:
+ return (res > 0);
+ case GREATER_EQUAL:
+ return (res >= 0);
+ case NOT_EQUAL:
+ return (res != 0);
+ }
+ return true;
}
-
protected ValidWhenParser(TokenBuffer tokenBuf, int k) {
super(tokenBuf,k);
tokenNames = _tokenNames;
@@ -193,6 +200,15 @@
tokenNames = _tokenNames;
}
+ public final void decimal() throws RecognitionException, TokenStreamException {
+
+ Token d = null;
+
+ d = LT(1);
+ match(DECIMAL_LITERAL);
+ argStack.push(new BigDecimal(d.getText()));
+ }
+
public final void integer() throws RecognitionException, TokenStreamException {
Token d = null;
@@ -200,24 +216,24 @@
Token o = null;
switch ( LA(1)) {
- case DECIMAL_LITERAL:
+ case DEC_INT_LITERAL:
{
d = LT(1);
- match(DECIMAL_LITERAL);
+ match(DEC_INT_LITERAL);
argStack.push(Integer.decode(d.getText()));
break;
}
- case HEX_LITERAL:
+ case HEX_INT_LITERAL:
{
h = LT(1);
- match(HEX_LITERAL);
+ match(HEX_INT_LITERAL);
argStack.push(Integer.decode(h.getText()));
break;
}
- case OCTAL_LITERAL:
+ case OCTAL_INT_LITERAL:
{
o = LT(1);
- match(OCTAL_LITERAL);
+ match(OCTAL_INT_LITERAL);
argStack.push(Integer.decode(o.getText()));
break;
}
@@ -228,6 +244,29 @@
}
}
+ public final void number() throws RecognitionException, TokenStreamException {
+
+
+ switch ( LA(1)) {
+ case DECIMAL_LITERAL:
+ {
+ decimal();
+ break;
+ }
+ case DEC_INT_LITERAL:
+ case HEX_INT_LITERAL:
+ case OCTAL_INT_LITERAL:
+ {
+ integer();
+ break;
+ }
+ default:
+ {
+ throw new NoViableAltException(LT(1), getFilename());
+ }
+ }
+ }
+
public final void string() throws RecognitionException, TokenStreamException {
Token str = null;
@@ -258,9 +297,8 @@
Object i2 = argStack.pop();
Object i1 = argStack.pop();
argStack.push(ValidatorUtils.getValueAsString(form, i1 + "[" + index + "]" + i2));
-
}
- else if ((LA(1)==IDENTIFIER) && (LA(2)==LBRACKET) && ((LA(3) >= DECIMAL_LITERAL && LA(3) <= OCTAL_LITERAL)) && (LA(4)==RBRACKET) && (LA(5)==IDENTIFIER)) {
+ else if ((LA(1)==IDENTIFIER) && (LA(2)==LBRACKET) && ((LA(3) >= DEC_INT_LITERAL && LA(3) <= OCTAL_INT_LITERAL)) && (LA(4)==RBRACKET) && (LA(5)==IDENTIFIER)) {
identifier();
match(LBRACKET);
integer();
@@ -271,9 +309,8 @@
Object i4 = argStack.pop();
Object i3 = argStack.pop();
argStack.push(ValidatorUtils.getValueAsString(form, i3 + "[" + i4 + "]" + i5));
-
}
- else if ((LA(1)==IDENTIFIER) && (LA(2)==LBRACKET) && ((LA(3) >= DECIMAL_LITERAL && LA(3) <= OCTAL_LITERAL)) && (LA(4)==RBRACKET) && (_tokenSet_0.member(LA(5)))) {
+ else if ((LA(1)==IDENTIFIER) && (LA(2)==LBRACKET) && ((LA(3) >= DEC_INT_LITERAL && LA(3) <= OCTAL_INT_LITERAL)) && (LA(4)==RBRACKET) && (_tokenSet_0.member(LA(5)))) {
identifier();
match(LBRACKET);
integer();
@@ -282,7 +319,6 @@
Object i7 = argStack.pop();
Object i6 = argStack.pop();
argStack.push(ValidatorUtils.getValueAsString(form, i6 + "[" + i7 + "]"));
-
}
else if ((LA(1)==IDENTIFIER) && (LA(2)==LBRACKET) && (LA(3)==RBRACKET) && (_tokenSet_0.member(LA(4)))) {
identifier();
@@ -291,14 +327,12 @@
Object i8 = argStack.pop();
argStack.push(ValidatorUtils.getValueAsString(form, i8 + "[" + index + "]"));
-
}
else if ((LA(1)==IDENTIFIER) && (_tokenSet_0.member(LA(2)))) {
identifier();
Object i9 = argStack.pop();
argStack.push(ValidatorUtils.getValueAsString(form, (String)i9));
-
}
else {
throw new NoViableAltException(LT(1), getFilename());
@@ -311,10 +345,11 @@
switch ( LA(1)) {
case DECIMAL_LITERAL:
- case HEX_LITERAL:
- case OCTAL_LITERAL:
+ case DEC_INT_LITERAL:
+ case HEX_INT_LITERAL:
+ case OCTAL_INT_LITERAL:
{
- integer();
+ number();
break;
}
case STRING_LITERAL:
@@ -351,8 +386,9 @@
break;
}
case DECIMAL_LITERAL:
- case HEX_LITERAL:
- case OCTAL_LITERAL:
+ case DEC_INT_LITERAL:
+ case HEX_INT_LITERAL:
+ case OCTAL_INT_LITERAL:
case STRING_LITERAL:
case LITERAL_null:
case THIS:
@@ -400,8 +436,8 @@
comparison();
value();
- Object v2 = argStack.pop();
- Object comp = argStack.pop();
+ Object v2 = argStack.pop();
+ Object comp = argStack.pop();
Object v1 = argStack.pop();
argStack.push(new Boolean(evaluateComparison(v1, comp, v2)));
@@ -502,8 +538,9 @@
"<2>",
"NULL_TREE_LOOKAHEAD",
"DECIMAL_LITERAL",
- "HEX_LITERAL",
- "OCTAL_LITERAL",
+ "DEC_INT_LITERAL",
+ "HEX_INT_LITERAL",
+ "OCTAL_INT_LITERAL",
"STRING_LITERAL",
"IDENTIFIER",
"LBRACKET",
@@ -524,12 +561,12 @@
};
private static final long[] mk_tokenSet_0() {
- long[] data = { 8273920L, 0L};
+ long[] data = { 16547840L, 0L};
return data;
}
public static final BitSet _tokenSet_0 = new BitSet(mk_tokenSet_0());
private static final long[] mk_tokenSet_1() {
- long[] data = { 6640L, 0L};
+ long[] data = { 13296L, 0L};
return data;
}
public static final BitSet _tokenSet_1 = new BitSet(mk_tokenSet_1());
Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.java
URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.java?rev=569926&r1=569925&r2=569926&view=diff
==============================================================================
--- struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.java (original)
+++ struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.java Sun Aug 26 16:39:56 2007
@@ -1,4 +1,4 @@
-// $ANTLR 2.7.6 (2005-12-22): "ValidWhenParser.g" -> "ValidWhenParser.java"$
+// $ANTLR 2.7.7 (20060906): "ValidWhenParser.g" -> "ValidWhenParser.java"$
/*
* $Id$
@@ -23,31 +23,32 @@
package org.apache.struts.validator.validwhen;
+import java.math.BigDecimal;
import java.util.Stack;
import org.apache.commons.validator.util.ValidatorUtils;
-
public interface ValidWhenParserTokenTypes {
int EOF = 1;
int NULL_TREE_LOOKAHEAD = 3;
int DECIMAL_LITERAL = 4;
- int HEX_LITERAL = 5;
- int OCTAL_LITERAL = 6;
- int STRING_LITERAL = 7;
- int IDENTIFIER = 8;
- int LBRACKET = 9;
- int RBRACKET = 10;
- int LITERAL_null = 11;
- int THIS = 12;
- int LPAREN = 13;
- int RPAREN = 14;
- int ANDSIGN = 15;
- int ORSIGN = 16;
- int EQUALSIGN = 17;
- int GREATERTHANSIGN = 18;
- int GREATEREQUALSIGN = 19;
- int LESSTHANSIGN = 20;
- int LESSEQUALSIGN = 21;
- int NOTEQUALSIGN = 22;
- int WS = 23;
+ int DEC_INT_LITERAL = 5;
+ int HEX_INT_LITERAL = 6;
+ int OCTAL_INT_LITERAL = 7;
+ int STRING_LITERAL = 8;
+ int IDENTIFIER = 9;
+ int LBRACKET = 10;
+ int RBRACKET = 11;
+ int LITERAL_null = 12;
+ int THIS = 13;
+ int LPAREN = 14;
+ int RPAREN = 15;
+ int ANDSIGN = 16;
+ int ORSIGN = 17;
+ int EQUALSIGN = 18;
+ int GREATERTHANSIGN = 19;
+ int GREATEREQUALSIGN = 20;
+ int LESSTHANSIGN = 21;
+ int LESSEQUALSIGN = 22;
+ int NOTEQUALSIGN = 23;
+ int WS = 24;
}
Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.txt
URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.txt?rev=569926&r1=569925&r2=569926&view=diff
==============================================================================
--- struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.txt (original)
+++ struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.txt Sun Aug 26 16:39:56 2007
@@ -1,22 +1,23 @@
-// $ANTLR 2.7.6 (2005-12-22): ValidWhenParser.g -> ValidWhenParserTokenTypes.txt$
+// $ANTLR 2.7.7 (20060906): ValidWhenParser.g -> ValidWhenParserTokenTypes.txt$
ValidWhenParser // output token vocab name
DECIMAL_LITERAL=4
-HEX_LITERAL=5
-OCTAL_LITERAL=6
-STRING_LITERAL=7
-IDENTIFIER=8
-LBRACKET=9
-RBRACKET=10
-LITERAL_null="null"=11
-THIS=12
-LPAREN=13
-RPAREN=14
-ANDSIGN="and"=15
-ORSIGN="or"=16
-EQUALSIGN=17
-GREATERTHANSIGN=18
-GREATEREQUALSIGN=19
-LESSTHANSIGN=20
-LESSEQUALSIGN=21
-NOTEQUALSIGN=22
-WS=23
+DEC_INT_LITERAL=5
+HEX_INT_LITERAL=6
+OCTAL_INT_LITERAL=7
+STRING_LITERAL=8
+IDENTIFIER=9
+LBRACKET=10
+RBRACKET=11
+LITERAL_null="null"=12
+THIS=13
+LPAREN=14
+RPAREN=15
+ANDSIGN="and"=16
+ORSIGN="or"=17
+EQUALSIGN=18
+GREATERTHANSIGN=19
+GREATEREQUALSIGN=20
+LESSTHANSIGN=21
+LESSEQUALSIGN=22
+NOTEQUALSIGN=23
+WS=24
Modified: struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/PojoBean.java
URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/PojoBean.java?rev=569926&r1=569925&r2=569926&view=diff
==============================================================================
--- struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/PojoBean.java (original)
+++ struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/PojoBean.java Sun Aug 26 16:39:56 2007
@@ -33,6 +33,10 @@
protected int intValue2;
protected Integer integerValue1;
protected Integer integerValue2;
+ protected float floatValue1;
+ protected float floatValue2;
+ protected double doubleValue1;
+ protected double doubleValue2;
protected PojoBean[] beans;
protected Map map = new HashMap();
protected String[] stringArray;
@@ -213,5 +217,37 @@
*/
public Object getMapped(String key) {
return map.get(key);
+ }
+
+ public float getFloatValue1() {
+ return floatValue1;
+ }
+
+ public float getFloatValue2() {
+ return floatValue2;
+ }
+
+ public void setFloatValue1(float floatValue1) {
+ this.floatValue1 = floatValue1;
+ }
+
+ public void setFloatValue2(float floatValue2) {
+ this.floatValue2 = floatValue2;
+ }
+
+ public double getDoubleValue1() {
+ return doubleValue1;
+ }
+
+ public double getDoubleValue2() {
+ return doubleValue2;
+ }
+
+ public void setDoubleValue1(double doubleValue1) {
+ this.doubleValue1 = doubleValue1;
+ }
+
+ public void setDoubleValue2(double doubleValue2) {
+ this.doubleValue2 = doubleValue2;
}
}
Modified: struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/TestValidWhen.java
URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/TestValidWhen.java?rev=569926&r1=569925&r2=569926&view=diff
==============================================================================
--- struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/TestValidWhen.java (original)
+++ struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/TestValidWhen.java Sun Aug 26 16:39:56 2007
@@ -31,6 +31,7 @@
import org.apache.struts.validator.validwhen.ValidWhenParser;
import java.io.StringReader;
+import java.math.BigDecimal;
/**
* Unit tests for the ValidWhen Parser/Lexer.
@@ -73,6 +74,10 @@
testBean = new PojoBean(123, 789);
testBean.setStringValue1("ABC");
testBean.setStringValue2(null);
+ testBean.setFloatValue1(0.0f);
+ testBean.setFloatValue2(-3.14f);
+ testBean.setDoubleValue1(0.0);
+ testBean.setDoubleValue2(-3.14);
testBean.setBeans(new PojoBean[] {
new PojoBean(11, 12), new PojoBean(21, 22), new PojoBean(31, 42),
new PojoBean(41, 52), new PojoBean(51, 62)
@@ -151,9 +156,9 @@
}
/**
- * Test Numeric values.
+ * Test integer values.
*/
- public void testNumeric() {
+ public void testInteger() {
// Test Zero
PojoBean numberBean = new PojoBean(0, -50);
@@ -164,6 +169,8 @@
// int
doParse("(intValue1 == 123)", testBean, 0, "intValue1", true);
+ doParse("(intValue1 == 123.0)", testBean, 0, "intValue1", true);
+ doParse("(intValue1 == 123.1)", testBean, 0, "intValue1", false);
// Integer
doParse("(integerValue1 == 123)", testBean, 0, "integerValue1", true);
@@ -187,6 +194,48 @@
true);
doParse("(stringValue1 < stringValue2)", stringBean, 0, "stringValue1",
false);
+ }
+
+ /**
+ * Test float values
+ */
+ public void testFloat() {
+ // Test zero
+ doParse("(floatValue1 == 0)", testBean, 0, "floatValue1", true);
+ doParse("(floatValue2 != 0)", testBean, 0, "floatValue2", true);
+ doParse("(floatValue1 == 0.0)", testBean, 0, "floatValue1", true);
+ doParse("(floatValue2 != 0.0)", testBean, 0, "floatValue2", true);
+ doParse("(floatValue1 == 00.00)", testBean, 0, "floatValue1", true);
+ doParse("(floatValue2 != 00.00)", testBean, 0, "floatValue2", true);
+
+ // Test precision
+ doParse("(floatValue2 == -3.14)", testBean, 0, "floatValue2", true);
+ doParse("(floatValue2 == -3.140)", testBean, 0, "floatValue2", true);
+ doParse("(floatValue2 == -3.1)", testBean, 0, "floatValue2", false);
+
+ // Test negative
+ doParse("((floatValue2 > -3.15) and (floatValue2 < -3.13))", testBean, 0, "floatValue2", true);
+ }
+
+ /**
+ * Test double values
+ */
+ public void testDouble() {
+ // Test zero
+ doParse("(doubleValue1 == 0)", testBean, 0, "doubleValue1", true);
+ doParse("(doubleValue2 != 0)", testBean, 0, "doubleValue2", true);
+ doParse("(doubleValue1 == 0.0)", testBean, 0, "doubleValue1", true);
+ doParse("(doubleValue2 != 0.0)", testBean, 0, "doubleValue2", true);
+ doParse("(doubleValue1 == 00.00)", testBean, 0, "doubleValue1", true);
+ doParse("(doubleValue2 != 00.00)", testBean, 0, "doubleValue2", true);
+
+ // Test precision
+ doParse("(doubleValue2 == -3.14)", testBean, 0, "doubleValue2", true);
+ doParse("(doubleValue2 == -3.140)", testBean, 0, "doubleValue2", true);
+ doParse("(doubleValue2 == -3.1)", testBean, 0, "doubleValue2", false);
+
+ // Test negative
+ doParse("((doubleValue2 > -3.15) and (doubleValue2 < -3.13))", testBean, 0, "doubleValue2", true);
}
/**
Re: svn commit: r569926 - in /struts/struts1/trunk/core/src: main/java/org/apache/struts/validator/validwhen/ test/java/org/apache/struts/validator/
Posted by Antonio Petrelli <an...@gmail.com>.
2007/9/11, Paul Benedict <pb...@apache.org>:
>
> Oh, the .g file is pure human. :-)
In this case I agree with Niall :-)
Antonio
Re: svn commit: r569926 - in /struts/struts1/trunk/core/src: main/java/org/apache/struts/validator/validwhen/ test/java/org/apache/struts/validator/
Posted by Paul Benedict <pb...@apache.org>.
Oh, the .g file is pure human. :-)
On 9/11/07, Antonio Petrelli <an...@gmail.com> wrote:
>
> 2007/9/11, Niall Pemberton <ni...@gmail.com>:
> >
> > I really dislike changes where as well as the bug/enhancement
> > modifications there are also a mass of style/formatting changes -
> > makes it really difficult to pick out the actual changes from the
> > noise in ValidWhenParser.g
>
>
>
> I suppose that this is generated code (by antlr), so I don't think it is a
> problem.
>
> Antonio
>
Re: svn commit: r569926 - in /struts/struts1/trunk/core/src: main/java/org/apache/struts/validator/validwhen/ test/java/org/apache/struts/validator/
Posted by Antonio Petrelli <an...@gmail.com>.
2007/9/11, Niall Pemberton <ni...@gmail.com>:
>
> I really dislike changes where as well as the bug/enhancement
> modifications there are also a mass of style/formatting changes -
> makes it really difficult to pick out the actual changes from the
> noise in ValidWhenParser.g
I suppose that this is generated code (by antlr), so I don't think it is a
problem.
Antonio
Re: svn commit: r569926 - in /struts/struts1/trunk/core/src: main/java/org/apache/struts/validator/validwhen/ test/java/org/apache/struts/validator/
Posted by Niall Pemberton <ni...@gmail.com>.
I really dislike changes where as well as the bug/enhancement
modifications there are also a mass of style/formatting changes -
makes it really difficult to pick out the actual changes from the
noise in ValidWhenParser.g
Niall
On 8/27/07, pbenedict@apache.org <pb...@apache.org> wrote:
> Author: pbenedict
> Date: Sun Aug 26 16:39:56 2007
> New Revision: 569926
>
> URL: http://svn.apache.org/viewvc?rev=569926&view=rev
> Log:
> STR-2321 and STR-2319: Compare floats and doubles
>
> Modified:
> struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenLexer.java
> struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.g
> struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.java
> struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.java
> struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.txt
> struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/PojoBean.java
> struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/TestValidWhen.java
>
> Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenLexer.java
> URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenLexer.java?rev=569926&r1=569925&r2=569926&view=diff
> ==============================================================================
> --- struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenLexer.java (original)
> +++ struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenLexer.java Sun Aug 26 16:39:56 2007
> @@ -1,4 +1,4 @@
> -// $ANTLR 2.7.6 (2005-12-22): "ValidWhenParser.g" -> "ValidWhenLexer.java"$
> +// $ANTLR 2.7.7 (20060906): "ValidWhenParser.g" -> "ValidWhenLexer.java"$
>
> /*
> * $Id$
> @@ -23,10 +23,10 @@
>
> package org.apache.struts.validator.validwhen;
>
> +import java.math.BigDecimal;
> import java.util.Stack;
> import org.apache.commons.validator.util.ValidatorUtils;
>
> -
> import java.io.InputStream;
> import antlr.TokenStreamException;
> import antlr.TokenStreamIOException;
> @@ -67,9 +67,9 @@
> caseSensitiveLiterals = true;
> setCaseSensitive(false);
> literals = new Hashtable();
> - literals.put(new ANTLRHashString("null", this), new Integer(11));
> - literals.put(new ANTLRHashString("or", this), new Integer(16));
> - literals.put(new ANTLRHashString("and", this), new Integer(15));
> + literals.put(new ANTLRHashString("null", this), new Integer(12));
> + literals.put(new ANTLRHashString("or", this), new Integer(17));
> + literals.put(new ANTLRHashString("and", this), new Integer(16));
> }
>
> public Token nextToken() throws TokenStreamException {
> @@ -88,9 +88,9 @@
> theRetToken=_returnToken;
> break;
> }
> - case '-': case '1': case '2': case '3':
> - case '4': case '5': case '6': case '7':
> - case '8': case '9':
> + case '-': case '0': case '1': case '2':
> + case '3': case '4': case '5': case '6':
> + case '7': case '8': case '9':
> {
> mDECIMAL_LITERAL(true);
> theRetToken=_returnToken;
> @@ -157,11 +157,7 @@
> break;
> }
> default:
> - if ((LA(1)=='0') && (LA(2)=='x')) {
> - mHEX_LITERAL(true);
> - theRetToken=_returnToken;
> - }
> - else if ((LA(1)=='<') && (LA(2)=='=')) {
> + if ((LA(1)=='<') && (LA(2)=='=')) {
> mLESSEQUALSIGN(true);
> theRetToken=_returnToken;
> }
> @@ -169,10 +165,6 @@
> mGREATEREQUALSIGN(true);
> theRetToken=_returnToken;
> }
> - else if ((LA(1)=='0') && (true)) {
> - mOCTAL_LITERAL(true);
> - theRetToken=_returnToken;
> - }
> else if ((LA(1)=='<') && (true)) {
> mLESSTHANSIGN(true);
> theRetToken=_returnToken;
> @@ -213,8 +205,8 @@
> int _saveIndex;
>
> {
> - int _cnt15=0;
> - _loop15:
> + int _cnt17=0;
> + _loop17:
> do {
> switch ( LA(1)) {
> case ' ':
> @@ -239,13 +231,15 @@
> }
> default:
> {
> - if ( _cnt15>=1 ) { break _loop15; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
> + if ( _cnt17>=1 ) { break _loop17; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
> }
> }
> - _cnt15++;
> + _cnt17++;
> } while (true);
> }
> - _ttype = Token.SKIP;
> + if ( inputState.guessing==0 ) {
> + _ttype = Token.SKIP;
> + }
> if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
> _token = makeToken(_ttype);
> _token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
> @@ -258,112 +252,253 @@
> _ttype = DECIMAL_LITERAL;
> int _saveIndex;
>
> - {
> - switch ( LA(1)) {
> - case '-':
> - {
> - match('-');
> - break;
> - }
> - case '1': case '2': case '3': case '4':
> - case '5': case '6': case '7': case '8':
> - case '9':
> - {
> - break;
> - }
> - default:
> - {
> - throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
> - }
> - }
> - }
> - {
> - matchRange('1','9');
> - }
> - {
> - _loop20:
> - do {
> - if (((LA(1) >= '0' && LA(1) <= '9'))) {
> - matchRange('0','9');
> + boolean synPredMatched24 = false;
> + if (((_tokenSet_0.member(LA(1))) && (_tokenSet_1.member(LA(2))))) {
> + int _m24 = mark();
> + synPredMatched24 = true;
> + inputState.guessing++;
> + try {
> + {
> + {
> + switch ( LA(1)) {
> + case '-':
> + {
> + match('-');
> + break;
> + }
> + case '0': case '1': case '2': case '3':
> + case '4': case '5': case '6': case '7':
> + case '8': case '9':
> + {
> + break;
> + }
> + default:
> + {
> + throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
> + }
> + }
> + }
> + {
> + int _cnt22=0;
> + _loop22:
> + do {
> + if (((LA(1) >= '0' && LA(1) <= '9'))) {
> + matchRange('0','9');
> + }
> + else {
> + if ( _cnt22>=1 ) { break _loop22; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
> + }
> +
> + _cnt22++;
> + } while (true);
> + }
> + {
> + match('.');
> + }
> + }
> }
> - else {
> - break _loop20;
> + catch (RecognitionException pe) {
> + synPredMatched24 = false;
> }
> -
> - } while (true);
> - }
> - if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
> - _token = makeToken(_ttype);
> - _token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
> + rewind(_m24);
> +inputState.guessing--;
> }
> - _returnToken = _token;
> - }
> -
> - public final void mHEX_LITERAL(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
> - int _ttype; Token _token=null; int _begin=text.length();
> - _ttype = HEX_LITERAL;
> - int _saveIndex;
> -
> - match('0');
> - match('x');
> - {
> - int _cnt23=0;
> - _loop23:
> - do {
> + if ( synPredMatched24 ) {
> + {
> + {
> switch ( LA(1)) {
> + case '-':
> + {
> + match('-');
> + break;
> + }
> case '0': case '1': case '2': case '3':
> case '4': case '5': case '6': case '7':
> case '8': case '9':
> {
> - matchRange('0','9');
> break;
> }
> - case 'a': case 'b': case 'c': case 'd':
> - case 'e': case 'f':
> + default:
> {
> - matchRange('a','f');
> - break;
> + throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
> + }
> + }
> }
> - default:
> {
> - if ( _cnt23>=1 ) { break _loop23; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
> + int _cnt28=0;
> + _loop28:
> + do {
> + if (((LA(1) >= '0' && LA(1) <= '9'))) {
> + matchRange('0','9');
> + }
> + else {
> + if ( _cnt28>=1 ) { break _loop28; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
> + }
> +
> + _cnt28++;
> + } while (true);
> + }
> + {
> + match('.');
> + }
> + {
> + int _cnt31=0;
> + _loop31:
> + do {
> + if (((LA(1) >= '0' && LA(1) <= '9'))) {
> + matchRange('0','9');
> + }
> + else {
> + if ( _cnt31>=1 ) { break _loop31; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
> + }
> +
> + _cnt31++;
> + } while (true);
> }
> }
> - _cnt23++;
> - } while (true);
> - }
> - if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
> - _token = makeToken(_ttype);
> - _token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
> }
> - _returnToken = _token;
> - }
> -
> - public final void mOCTAL_LITERAL(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
> - int _ttype; Token _token=null; int _begin=text.length();
> - _ttype = OCTAL_LITERAL;
> - int _saveIndex;
> -
> - match('0');
> - {
> - _loop26:
> - do {
> - if (((LA(1) >= '0' && LA(1) <= '7'))) {
> - matchRange('0','7');
> + else {
> + boolean synPredMatched38 = false;
> + if (((LA(1)=='0') && (LA(2)=='x'))) {
> + int _m38 = mark();
> + synPredMatched38 = true;
> + inputState.guessing++;
> + try {
> + {
> + match('0');
> + match('x');
> + }
> + }
> + catch (RecognitionException pe) {
> + synPredMatched38 = false;
> + }
> + rewind(_m38);
> +inputState.guessing--;
> + }
> + if ( synPredMatched38 ) {
> + {
> + match('0');
> + match('x');
> + {
> + int _cnt41=0;
> + _loop41:
> + do {
> + switch ( LA(1)) {
> + case '0': case '1': case '2': case '3':
> + case '4': case '5': case '6': case '7':
> + case '8': case '9':
> + {
> + matchRange('0','9');
> + break;
> + }
> + case 'a': case 'b': case 'c': case 'd':
> + case 'e': case 'f':
> + {
> + matchRange('a','f');
> + break;
> + }
> + default:
> + {
> + if ( _cnt41>=1 ) { break _loop41; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
> + }
> + }
> + _cnt41++;
> + } while (true);
> + }
> + }
> + if ( inputState.guessing==0 ) {
> + _ttype = HEX_INT_LITERAL;
> + }
> }
> else {
> - break _loop26;
> + boolean synPredMatched33 = false;
> + if (((LA(1)=='0') && (true))) {
> + int _m33 = mark();
> + synPredMatched33 = true;
> + inputState.guessing++;
> + try {
> + {
> + match('0');
> + }
> + }
> + catch (RecognitionException pe) {
> + synPredMatched33 = false;
> + }
> + rewind(_m33);
> +inputState.guessing--;
> + }
> + if ( synPredMatched33 ) {
> + {
> + match('0');
> + {
> + _loop36:
> + do {
> + if (((LA(1) >= '0' && LA(1) <= '7'))) {
> + matchRange('0','7');
> + }
> + else {
> + break _loop36;
> + }
> +
> + } while (true);
> + }
> + }
> + if ( inputState.guessing==0 ) {
> + _ttype = OCTAL_INT_LITERAL;
> + }
> + }
> + else if ((_tokenSet_2.member(LA(1))) && (true)) {
> + {
> + {
> + switch ( LA(1)) {
> + case '-':
> + {
> + match('-');
> + break;
> + }
> + case '1': case '2': case '3': case '4':
> + case '5': case '6': case '7': case '8':
> + case '9':
> + {
> + break;
> + }
> + default:
> + {
> + throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
> + }
> + }
> + }
> + {
> + matchRange('1','9');
> + }
> + {
> + _loop46:
> + do {
> + if (((LA(1) >= '0' && LA(1) <= '9'))) {
> + matchRange('0','9');
> + }
> + else {
> + break _loop46;
> + }
> +
> + } while (true);
> + }
> + }
> + if ( inputState.guessing==0 ) {
> + _ttype = DEC_INT_LITERAL;
> + }
> + }
> + else {
> + throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
> + }
> + }}
> + if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
> + _token = makeToken(_ttype);
> + _token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
> + }
> + _returnToken = _token;
> }
>
> - } while (true);
> - }
> - if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
> - _token = makeToken(_ttype);
> - _token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
> - }
> - _returnToken = _token;
> - }
> -
> public final void mSTRING_LITERAL(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
> int _ttype; Token _token=null; int _begin=text.length();
> _ttype = STRING_LITERAL;
> @@ -375,17 +510,17 @@
> {
> match('\'');
> {
> - int _cnt30=0;
> - _loop30:
> + int _cnt50=0;
> + _loop50:
> do {
> - if ((_tokenSet_0.member(LA(1)))) {
> + if ((_tokenSet_3.member(LA(1)))) {
> matchNot('\'');
> }
> else {
> - if ( _cnt30>=1 ) { break _loop30; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
> + if ( _cnt50>=1 ) { break _loop50; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
> }
>
> - _cnt30++;
> + _cnt50++;
> } while (true);
> }
> match('\'');
> @@ -397,17 +532,17 @@
> {
> match('\"');
> {
> - int _cnt33=0;
> - _loop33:
> + int _cnt53=0;
> + _loop53:
> do {
> - if ((_tokenSet_1.member(LA(1)))) {
> + if ((_tokenSet_4.member(LA(1)))) {
> matchNot('\"');
> }
> else {
> - if ( _cnt33>=1 ) { break _loop33; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
> + if ( _cnt53>=1 ) { break _loop53; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
> }
>
> - _cnt33++;
> + _cnt53++;
> } while (true);
> }
> match('\"');
> @@ -526,8 +661,8 @@
> }
> }
> {
> - int _cnt42=0;
> - _loop42:
> + int _cnt62=0;
> + _loop62:
> do {
> switch ( LA(1)) {
> case 'a': case 'b': case 'c': case 'd':
> @@ -560,10 +695,10 @@
> }
> default:
> {
> - if ( _cnt42>=1 ) { break _loop42; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
> + if ( _cnt62>=1 ) { break _loop62; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
> }
> }
> - _cnt42++;
> + _cnt62++;
> } while (true);
> }
> if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
> @@ -657,14 +792,29 @@
>
>
> private static final long[] mk_tokenSet_0() {
> - long[] data = { -554050771456L, 9223372036854775807L, 0L, 0L};
> + long[] data = { 287984085547089920L, 0L, 0L};
> return data;
> }
> public static final BitSet _tokenSet_0 = new BitSet(mk_tokenSet_0());
> private static final long[] mk_tokenSet_1() {
> - long[] data = { -21474826752L, 9223372036854775807L, 0L, 0L};
> + long[] data = { 288019269919178752L, 0L, 0L};
> return data;
> }
> public static final BitSet _tokenSet_1 = new BitSet(mk_tokenSet_1());
> + private static final long[] mk_tokenSet_2() {
> + long[] data = { 287702610570379264L, 0L, 0L};
> + return data;
> + }
> + public static final BitSet _tokenSet_2 = new BitSet(mk_tokenSet_2());
> + private static final long[] mk_tokenSet_3() {
> + long[] data = { -554050771456L, 9223372036854775807L, 0L, 0L};
> + return data;
> + }
> + public static final BitSet _tokenSet_3 = new BitSet(mk_tokenSet_3());
> + private static final long[] mk_tokenSet_4() {
> + long[] data = { -21474826752L, 9223372036854775807L, 0L, 0L};
> + return data;
> + }
> + public static final BitSet _tokenSet_4 = new BitSet(mk_tokenSet_4());
>
> }
>
> Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.g
> URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.g?rev=569926&r1=569925&r2=569926&view=diff
> ==============================================================================
> --- struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.g (original)
> +++ struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.g Sun Aug 26 16:39:56 2007
> @@ -22,182 +22,196 @@
>
> package org.apache.struts.validator.validwhen;
>
> +import java.math.BigDecimal;
> import java.util.Stack;
> import org.apache.commons.validator.util.ValidatorUtils;
> -
> }
> +
> class ValidWhenParser extends Parser;
> options {
> -k=6;
> -defaultErrorHandler=false;
> + k = 6;
> + defaultErrorHandler = false;
> }
> -{Stack argStack = new Stack();
> -Object form;
> -int index;
> -String value;
> +
> +{
> + Stack argStack = new Stack();
> + Object form;
> + int index;
> + String value;
>
> public void setForm(Object f) { form = f; };
> public void setIndex (int i) { index = i; };
> public void setValue (String v) { value = v; };
>
> public boolean getResult() {
> - return ((Boolean)argStack.peek()).booleanValue();
> + return ((Boolean)argStack.peek()).booleanValue();
> }
>
> - private final int LESS_EQUAL=0;
> - private final int LESS_THAN=1;
> - private final int EQUAL=2;
> - private final int GREATER_THAN=3;
> - private final int GREATER_EQUAL=4;
> - private final int NOT_EQUAL=5;
> - private final int AND=6;
> - private final int OR=7;
> -
> - private boolean evaluateComparison (Object v1, Object compare, Object v2) {
> - boolean intCompare = true;
> - if ((v1 == null) || (v2 == null)) {
> - if (String.class.isInstance(v1)) {
> - if (((String) v1).trim().length() == 0) {
> - v1 = null;
> + private final int LESS_EQUAL = 0;
> + private final int LESS_THAN = 1;
> + private final int EQUAL = 2;
> + private final int GREATER_THAN = 3;
> + private final int GREATER_EQUAL = 4;
> + private final int NOT_EQUAL = 5;
> + private final int AND = 6;
> + private final int OR = 7;
> +
> + private boolean evaluateComparison (Object v1, Object comparison, Object v2) {
> + boolean numCompare = true;
> +
> + if ((v1 == null) || (v2 == null)) {
> + if (String.class.isInstance(v1)) {
> + if (((String) v1).trim().length() == 0) {
> + v1 = null;
> + }
> }
> - }
> - if (String.class.isInstance(v2)) {
> - if (((String) v2).trim().length() == 0) {
> - v2 = null;
> - }
> - }
> - switch (((Integer)compare).intValue()) {
> - case LESS_EQUAL:
> - case GREATER_THAN:
> - case LESS_THAN:
> - case GREATER_EQUAL:
> - return false;
> - case EQUAL:
> - return (v1 == v2);
> - case NOT_EQUAL:
> - return (v1 != v2);
> - }
> - }
> - if ((Integer.class.isInstance(v1) ||
> - String.class.isInstance(v1)) &&
> - (Integer.class.isInstance(v2) ||
> - String.class.isInstance(v2))) {
> - intCompare = true;
> - } else {
> - intCompare = false;
> - }
> - if (intCompare) {
> - try {
> - int v1i = 0, v2i = 0;
> - if (Integer.class.isInstance(v1)) {
> - v1i = ((Integer)v1).intValue();
> - } else {
> - v1i = Integer.parseInt((String) v1);
> - }
> - if (Integer.class.isInstance(v2)) {
> - v2i = ((Integer)v2).intValue();
> - } else {
> - v2i = Integer.parseInt((String) v2);
> - }
> - switch (((Integer)compare).intValue()) {
> - case LESS_EQUAL:
> - return (v1i <= v2i);
> -
> - case LESS_THAN:
> - return (v1i < v2i);
> -
> - case EQUAL:
> - return (v1i == v2i);
> -
> - case GREATER_THAN:
> - return (v1i > v2i);
> -
> - case GREATER_EQUAL:
> - return (v1i >= v2i);
> -
> - case NOT_EQUAL:
> - return (v1i != v2i);
> - }
> - } catch (NumberFormatException ex) {};
> - }
> - String v1s = "", v2s = "";
> -
> - if (Integer.class.isInstance(v1)) {
> - v1s = ((Integer)v1).toString();
> - } else {
> - v1s = (String) v1;
> - }
> -
> - if (Integer.class.isInstance(v2)) {
> - v2s = ((Integer)v2).toString();
> - } else {
> - v2s = (String) v2;
> - }
> -
> - int res = v1s.compareTo(v2s);
> - switch (((Integer)compare).intValue()) {
> - case LESS_EQUAL:
> - return (res <= 0);
> -
> - case LESS_THAN:
> - return (res < 0);
> -
> - case EQUAL:
> - return (res == 0);
> -
> - case GREATER_THAN:
> - return (res > 0);
> -
> - case GREATER_EQUAL:
> - return (res >= 0);
> -
> - case NOT_EQUAL:
> - return (res != 0);
> - }
> - return true;
> + if (String.class.isInstance(v2)) {
> + if (((String) v2).trim().length() == 0) {
> + v2 = null;
> + }
> + }
> +
> + switch (((Integer)comparison).intValue()) {
> + case LESS_EQUAL:
> + case GREATER_THAN:
> + case LESS_THAN:
> + case GREATER_EQUAL:
> + return false;
> + case EQUAL:
> + return (v1 == v2);
> + case NOT_EQUAL:
> + return (v1 != v2);
> + }
> + }
> +
> + if ( (Integer.class.isInstance(v1) ||
> + BigDecimal.class.isInstance(v1) ||
> + String.class.isInstance(v1)) &&
> + (Integer.class.isInstance(v2) ||
> + BigDecimal.class.isInstance(v2) ||
> + String.class.isInstance(v2))) {
> + numCompare = true;
> + } else {
> + numCompare = false;
> + }
> +
> + if (numCompare) {
> + try {
> + BigDecimal v1i = null;
> + BigDecimal v2i = null;
> +
> + if (BigDecimal.class.isInstance(v1)) {
> + v1i = (BigDecimal)v1;
> + } else if (Integer.class.isInstance(v1)) {
> + v1i = new BigDecimal(v1.toString());
> + } else {
> + v1i = new BigDecimal((String) v1);
> + }
> +
> + if (BigDecimal.class.isInstance(v2)) {
> + v2i = (BigDecimal)v2;
> + } else if (Integer.class.isInstance(v2)) {
> + v2i = new BigDecimal(v2.toString());
> + } else {
> + v2i = new BigDecimal((String) v2);
> + }
> +
> + int res = v1i.compareTo(v2i);
> + switch (((Integer)comparison).intValue()) {
> + case LESS_EQUAL:
> + return (res <= 0);
> + case LESS_THAN:
> + return (res < 0);
> + case EQUAL:
> + return (res == 0);
> + case GREATER_THAN:
> + return (res > 0);
> + case GREATER_EQUAL:
> + return (res >= 0);
> + case NOT_EQUAL:
> + return (res != 0);
> + }
> + } catch (NumberFormatException ex) {};
> + }
> +
> + String v1s = "";
> + String v2s = "";
> +
> + if (String.class.isInstance(v1)) {
> + v1s = (String) v1;
> + } else {
> + v1s = v1.toString();
> + }
> +
> + if (String.class.isInstance(v2)) {
> + v2s = (String) v2;
> + } else {
> + v2s = v2.toString();
> + }
> +
> + int res = v1s.compareTo(v2s);
> + switch (((Integer)comparison).intValue()) {
> + case LESS_EQUAL:
> + return (res <= 0);
> + case LESS_THAN:
> + return (res < 0);
> + case EQUAL:
> + return (res == 0);
> + case GREATER_THAN:
> + return (res > 0);
> + case GREATER_EQUAL:
> + return (res >= 0);
> + case NOT_EQUAL:
> + return (res != 0);
> + }
> + return true;
> }
> -
> }
>
> +decimal:
> + d:DECIMAL_LITERAL
> + { argStack.push(new BigDecimal(d.getText())); } ;
> +
> +integer :
> + d:DEC_INT_LITERAL
> + { argStack.push(Integer.decode(d.getText())); } |
> + h:HEX_INT_LITERAL
> + { argStack.push(Integer.decode(h.getText())); } |
> + o:OCTAL_INT_LITERAL
> + { argStack.push(Integer.decode(o.getText())); } ;
> +
> +number : decimal | integer ;
> +
> +string :
> + str:STRING_LITERAL
> + { argStack.push(str.getText().substring(1, str.getText().length()-1)); };
> +
> +identifier :
> + str:IDENTIFIER
> + { argStack.push(str.getText()); } ;
> +
> +field :
> + identifier LBRACKET RBRACKET identifier {
> + Object i2 = argStack.pop();
> + Object i1 = argStack.pop();
> + argStack.push(ValidatorUtils.getValueAsString(form, i1 + "[" + index + "]" + i2)); } |
> + identifier LBRACKET integer RBRACKET identifier {
> + Object i5 = argStack.pop();
> + Object i4 = argStack.pop();
> + Object i3 = argStack.pop();
> + argStack.push(ValidatorUtils.getValueAsString(form, i3 + "[" + i4 + "]" + i5)); } |
> + identifier LBRACKET integer RBRACKET {
> + Object i7 = argStack.pop();
> + Object i6 = argStack.pop();
> + argStack.push(ValidatorUtils.getValueAsString(form, i6 + "[" + i7 + "]")); } |
> + identifier LBRACKET RBRACKET {
> + Object i8 = argStack.pop();
> + argStack.push(ValidatorUtils.getValueAsString(form, i8 + "[" + index + "]")); } |
> + identifier {
> + Object i9 = argStack.pop();
> + argStack.push(ValidatorUtils.getValueAsString(form, (String)i9)); };
>
> -integer
> -: d:DECIMAL_LITERAL { argStack.push(Integer.decode(d.getText())); }
> -| h:HEX_LITERAL { argStack.push(Integer.decode(h.getText())); }
> -| o:OCTAL_LITERAL { argStack.push(Integer.decode(o.getText())); } ;
> -
> -string : str:STRING_LITERAL { argStack.push(str.getText().substring(1, str.getText().length()-1)); };
> -
> -identifier
> -: str:IDENTIFIER { argStack.push(str.getText()); } ;
> -
> -field
> -: identifier LBRACKET RBRACKET identifier {
> - Object i2 = argStack.pop();
> - Object i1 = argStack.pop();
> - argStack.push(ValidatorUtils.getValueAsString(form, i1 + "[" + index + "]" + i2));
> -}
> -| identifier LBRACKET integer RBRACKET identifier {
> - Object i5 = argStack.pop();
> - Object i4 = argStack.pop();
> - Object i3 = argStack.pop();
> - argStack.push(ValidatorUtils.getValueAsString(form, i3 + "[" + i4 + "]" + i5));
> -}
> -| identifier LBRACKET integer RBRACKET {
> - Object i7 = argStack.pop();
> - Object i6 = argStack.pop();
> - argStack.push(ValidatorUtils.getValueAsString(form, i6 + "[" + i7 + "]"));
> -}
> -| identifier LBRACKET RBRACKET {
> - Object i8 = argStack.pop();
> - argStack.push(ValidatorUtils.getValueAsString(form, i8 + "[" + index + "]"));
> -}
> -| identifier {
> - Object i9 = argStack.pop();
> - argStack.push(ValidatorUtils.getValueAsString(form, (String)i9));
> -}
> -;
> -
> -literal : integer | string | "null" { argStack.push(null);} | THIS {argStack.push(value);};
> +literal : number | string | "null" { argStack.push(null);} | THIS {argStack.push(value);};
>
> value : field | literal ;
>
> @@ -206,57 +220,70 @@
> expr: LPAREN comparisonExpression RPAREN | LPAREN joinedExpression RPAREN;
>
> joinedExpression : expr join expr {
> - Boolean v1 = (Boolean) argStack.pop();
> - Integer join = (Integer) argStack.pop();
> - Boolean v2 = (Boolean) argStack.pop();
> - if (join.intValue() == AND) {
> - argStack.push(new Boolean(v1.booleanValue() && v2.booleanValue()));
> -} else {
> - argStack.push(new Boolean(v1.booleanValue() || v2.booleanValue()));
> - }
> + Boolean v1 = (Boolean) argStack.pop();
> + Integer join = (Integer) argStack.pop();
> + Boolean v2 = (Boolean) argStack.pop();
> + if (join.intValue() == AND) {
> + argStack.push(new Boolean(v1.booleanValue() && v2.booleanValue()));
> + } else {
> + argStack.push(new Boolean(v1.booleanValue() || v2.booleanValue()));
> + }
> };
>
> -join : ANDSIGN { argStack.push(new Integer(AND)); } |
> - ORSIGN { argStack.push(new Integer(OR)); };
> +join :
> + ANDSIGN
> + { argStack.push(new Integer(AND)); } |
> + ORSIGN
> + { argStack.push(new Integer(OR)); };
>
> comparison :
> - EQUALSIGN { argStack.push(new Integer(EQUAL)); } |
> - GREATERTHANSIGN { argStack.push(new Integer(GREATER_THAN)); } |
> - GREATEREQUALSIGN { argStack.push(new Integer(GREATER_EQUAL)); } |
> - LESSTHANSIGN { argStack.push(new Integer(LESS_THAN)); } |
> - LESSEQUALSIGN { argStack.push(new Integer(LESS_EQUAL)); } |
> - NOTEQUALSIGN { argStack.push(new Integer(NOT_EQUAL)); } ;
> -
> -comparisonExpression : value comparison value {
> - Object v2 = argStack.pop();
> - Object comp = argStack.pop();
> - Object v1 = argStack.pop();
> - argStack.push(new Boolean(evaluateComparison(v1, comp, v2)));
> -};
> -
> + EQUALSIGN
> + { argStack.push(new Integer(EQUAL)); } |
> + GREATERTHANSIGN
> + { argStack.push(new Integer(GREATER_THAN)); } |
> + GREATEREQUALSIGN
> + { argStack.push(new Integer(GREATER_EQUAL)); } |
> + LESSTHANSIGN
> + { argStack.push(new Integer(LESS_THAN)); } |
> + LESSEQUALSIGN
> + { argStack.push(new Integer(LESS_EQUAL)); } |
> + NOTEQUALSIGN
> + { argStack.push(new Integer(NOT_EQUAL)); } ;
> +
> +comparisonExpression :
> + value comparison value {
> + Object v2 = argStack.pop();
> + Object comp = argStack.pop();
> + Object v1 = argStack.pop();
> + argStack.push(new Boolean(evaluateComparison(v1, comp, v2)));
> + };
>
> class ValidWhenLexer extends Lexer;
>
> options {
> - k=2;
> -caseSensitive=false;
> -defaultErrorHandler=false;
> -charVocabulary='\40'..'\176';
> + k=2;
> + caseSensitive=false;
> + defaultErrorHandler=false;
> + charVocabulary='\40'..'\176';
> }
> +
> tokens {
> -ANDSIGN="and";
> -ORSIGN="or";
> + ANDSIGN="and";
> + ORSIGN="or";
> }
>
> -WS : ( ' ' | '\t' | '\n' | '\r' )+
> - { $setType(Token.SKIP); }
> - ;
> -
> -DECIMAL_LITERAL : ('-')? ('1'..'9') ('0'..'9')*;
> -
> -HEX_LITERAL : '0' 'x' ('0'..'9' | 'a'..'f')+ ;
> -
> -OCTAL_LITERAL : '0' ('0'..'7')* ;
> +WS :
> + ( ' ' | '\t' | '\n' | '\r' )+
> + { $setType(Token.SKIP); } ;
> +
> +DECIMAL_LITERAL :
> + (('-')? ('0'..'9')+ ('.')) => (('-')? ('0'..'9')+ ('.') ('0'..'9')+) |
> + ('0') => ('0' ('0'..'7')*)
> + { $setType(OCTAL_INT_LITERAL); } |
> + ('0' 'x') => ('0' 'x' ('0'..'9' | 'a'..'f')+)
> + { $setType(HEX_INT_LITERAL); } |
> + (('-')? ('1'..'9') ('0'..'9')*)
> + { $setType(DEC_INT_LITERAL); } ;
>
> STRING_LITERAL : ('\'' (~'\'')+ '\'') | ('\"' (~'\"')+ '\"') ;
>
> @@ -282,5 +309,4 @@
>
> LESSEQUALSIGN : '<' '=';
>
> -GREATEREQUALSIGN : '>' '=';
> -
> +GREATEREQUALSIGN : '>' '=';
> \ No newline at end of file
>
> Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.java
> URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.java?rev=569926&r1=569925&r2=569926&view=diff
> ==============================================================================
> --- struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.java (original)
> +++ struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParser.java Sun Aug 26 16:39:56 2007
> @@ -1,4 +1,4 @@
> -// $ANTLR 2.7.6 (2005-12-22): "ValidWhenParser.g" -> "ValidWhenParser.java"$
> +// $ANTLR 2.7.7 (20060906): "ValidWhenParser.g" -> "ValidWhenParser.java"$
>
> /*
> * $Id$
> @@ -23,10 +23,10 @@
>
> package org.apache.struts.validator.validwhen;
>
> +import java.math.BigDecimal;
> import java.util.Stack;
> import org.apache.commons.validator.util.ValidatorUtils;
>
> -
> import antlr.TokenBuffer;
> import antlr.TokenStreamException;
> import antlr.TokenStreamIOException;
> @@ -43,133 +43,140 @@
>
> public class ValidWhenParser extends antlr.LLkParser implements ValidWhenParserTokenTypes
> {
> -Stack argStack = new Stack();
> -Object form;
> -int index;
> -String value;
> +
> + Stack argStack = new Stack();
> + Object form;
> + int index;
> + String value;
>
> public void setForm(Object f) { form = f; };
> public void setIndex (int i) { index = i; };
> public void setValue (String v) { value = v; };
>
> public boolean getResult() {
> - return ((Boolean)argStack.peek()).booleanValue();
> + return ((Boolean)argStack.peek()).booleanValue();
> }
>
> - private final int LESS_EQUAL=0;
> - private final int LESS_THAN=1;
> - private final int EQUAL=2;
> - private final int GREATER_THAN=3;
> - private final int GREATER_EQUAL=4;
> - private final int NOT_EQUAL=5;
> - private final int AND=6;
> - private final int OR=7;
> -
> - private boolean evaluateComparison (Object v1, Object compare, Object v2) {
> - boolean intCompare = true;
> - if ((v1 == null) || (v2 == null)) {
> - if (String.class.isInstance(v1)) {
> - if (((String) v1).trim().length() == 0) {
> - v1 = null;
> - }
> - }
> - if (String.class.isInstance(v2)) {
> - if (((String) v2).trim().length() == 0) {
> - v2 = null;
> + private final int LESS_EQUAL = 0;
> + private final int LESS_THAN = 1;
> + private final int EQUAL = 2;
> + private final int GREATER_THAN = 3;
> + private final int GREATER_EQUAL = 4;
> + private final int NOT_EQUAL = 5;
> + private final int AND = 6;
> + private final int OR = 7;
> +
> + private boolean evaluateComparison (Object v1, Object comparison, Object v2) {
> + boolean numCompare = true;
> +
> + if ((v1 == null) || (v2 == null)) {
> + if (String.class.isInstance(v1)) {
> + if (((String) v1).trim().length() == 0) {
> + v1 = null;
> + }
> }
> - }
> - switch (((Integer)compare).intValue()) {
> - case LESS_EQUAL:
> - case GREATER_THAN:
> - case LESS_THAN:
> - case GREATER_EQUAL:
> - return false;
> - case EQUAL:
> - return (v1 == v2);
> - case NOT_EQUAL:
> - return (v1 != v2);
> - }
> - }
> - if ((Integer.class.isInstance(v1) ||
> - String.class.isInstance(v1)) &&
> - (Integer.class.isInstance(v2) ||
> - String.class.isInstance(v2))) {
> - intCompare = true;
> - } else {
> - intCompare = false;
> - }
> - if (intCompare) {
> - try {
> - int v1i = 0, v2i = 0;
> - if (Integer.class.isInstance(v1)) {
> - v1i = ((Integer)v1).intValue();
> - } else {
> - v1i = Integer.parseInt((String) v1);
> - }
> - if (Integer.class.isInstance(v2)) {
> - v2i = ((Integer)v2).intValue();
> - } else {
> - v2i = Integer.parseInt((String) v2);
> - }
> - switch (((Integer)compare).intValue()) {
> - case LESS_EQUAL:
> - return (v1i <= v2i);
> -
> - case LESS_THAN:
> - return (v1i < v2i);
> -
> - case EQUAL:
> - return (v1i == v2i);
> -
> - case GREATER_THAN:
> - return (v1i > v2i);
> -
> - case GREATER_EQUAL:
> - return (v1i >= v2i);
> -
> - case NOT_EQUAL:
> - return (v1i != v2i);
> - }
> - } catch (NumberFormatException ex) {};
> - }
> - String v1s = "", v2s = "";
> -
> - if (Integer.class.isInstance(v1)) {
> - v1s = ((Integer)v1).toString();
> - } else {
> - v1s = (String) v1;
> - }
> -
> - if (Integer.class.isInstance(v2)) {
> - v2s = ((Integer)v2).toString();
> - } else {
> - v2s = (String) v2;
> - }
> -
> - int res = v1s.compareTo(v2s);
> - switch (((Integer)compare).intValue()) {
> - case LESS_EQUAL:
> - return (res <= 0);
> -
> - case LESS_THAN:
> - return (res < 0);
> -
> - case EQUAL:
> - return (res == 0);
> -
> - case GREATER_THAN:
> - return (res > 0);
> -
> - case GREATER_EQUAL:
> - return (res >= 0);
> -
> - case NOT_EQUAL:
> - return (res != 0);
> - }
> - return true;
> + if (String.class.isInstance(v2)) {
> + if (((String) v2).trim().length() == 0) {
> + v2 = null;
> + }
> + }
> +
> + switch (((Integer)comparison).intValue()) {
> + case LESS_EQUAL:
> + case GREATER_THAN:
> + case LESS_THAN:
> + case GREATER_EQUAL:
> + return false;
> + case EQUAL:
> + return (v1 == v2);
> + case NOT_EQUAL:
> + return (v1 != v2);
> + }
> + }
> +
> + if ( (Integer.class.isInstance(v1) ||
> + BigDecimal.class.isInstance(v1) ||
> + String.class.isInstance(v1)) &&
> + (Integer.class.isInstance(v2) ||
> + BigDecimal.class.isInstance(v2) ||
> + String.class.isInstance(v2))) {
> + numCompare = true;
> + } else {
> + numCompare = false;
> + }
> +
> + if (numCompare) {
> + try {
> + BigDecimal v1i = null;
> + BigDecimal v2i = null;
> +
> + if (BigDecimal.class.isInstance(v1)) {
> + v1i = (BigDecimal)v1;
> + } else if (Integer.class.isInstance(v1)) {
> + v1i = new BigDecimal(v1.toString());
> + } else {
> + v1i = new BigDecimal((String) v1);
> + }
> +
> + if (BigDecimal.class.isInstance(v2)) {
> + v2i = (BigDecimal)v2;
> + } else if (Integer.class.isInstance(v2)) {
> + v2i = new BigDecimal(v2.toString());
> + } else {
> + v2i = new BigDecimal((String) v2);
> + }
> +
> + int res = v1i.compareTo(v2i);
> + switch (((Integer)comparison).intValue()) {
> + case LESS_EQUAL:
> + return (res <= 0);
> + case LESS_THAN:
> + return (res < 0);
> + case EQUAL:
> + return (res == 0);
> + case GREATER_THAN:
> + return (res > 0);
> + case GREATER_EQUAL:
> + return (res >= 0);
> + case NOT_EQUAL:
> + return (res != 0);
> + }
> + } catch (NumberFormatException ex) {};
> + }
> +
> + String v1s = "";
> + String v2s = "";
> +
> + if (String.class.isInstance(v1)) {
> + v1s = (String) v1;
> + } else {
> + v1s = v1.toString();
> + }
> +
> + if (String.class.isInstance(v2)) {
> + v2s = (String) v2;
> + } else {
> + v2s = v2.toString();
> + }
> +
> + int res = v1s.compareTo(v2s);
> + switch (((Integer)comparison).intValue()) {
> + case LESS_EQUAL:
> + return (res <= 0);
> + case LESS_THAN:
> + return (res < 0);
> + case EQUAL:
> + return (res == 0);
> + case GREATER_THAN:
> + return (res > 0);
> + case GREATER_EQUAL:
> + return (res >= 0);
> + case NOT_EQUAL:
> + return (res != 0);
> + }
> + return true;
> }
>
> -
> protected ValidWhenParser(TokenBuffer tokenBuf, int k) {
> super(tokenBuf,k);
> tokenNames = _tokenNames;
> @@ -193,6 +200,15 @@
> tokenNames = _tokenNames;
> }
>
> + public final void decimal() throws RecognitionException, TokenStreamException {
> +
> + Token d = null;
> +
> + d = LT(1);
> + match(DECIMAL_LITERAL);
> + argStack.push(new BigDecimal(d.getText()));
> + }
> +
> public final void integer() throws RecognitionException, TokenStreamException {
>
> Token d = null;
> @@ -200,24 +216,24 @@
> Token o = null;
>
> switch ( LA(1)) {
> - case DECIMAL_LITERAL:
> + case DEC_INT_LITERAL:
> {
> d = LT(1);
> - match(DECIMAL_LITERAL);
> + match(DEC_INT_LITERAL);
> argStack.push(Integer.decode(d.getText()));
> break;
> }
> - case HEX_LITERAL:
> + case HEX_INT_LITERAL:
> {
> h = LT(1);
> - match(HEX_LITERAL);
> + match(HEX_INT_LITERAL);
> argStack.push(Integer.decode(h.getText()));
> break;
> }
> - case OCTAL_LITERAL:
> + case OCTAL_INT_LITERAL:
> {
> o = LT(1);
> - match(OCTAL_LITERAL);
> + match(OCTAL_INT_LITERAL);
> argStack.push(Integer.decode(o.getText()));
> break;
> }
> @@ -228,6 +244,29 @@
> }
> }
>
> + public final void number() throws RecognitionException, TokenStreamException {
> +
> +
> + switch ( LA(1)) {
> + case DECIMAL_LITERAL:
> + {
> + decimal();
> + break;
> + }
> + case DEC_INT_LITERAL:
> + case HEX_INT_LITERAL:
> + case OCTAL_INT_LITERAL:
> + {
> + integer();
> + break;
> + }
> + default:
> + {
> + throw new NoViableAltException(LT(1), getFilename());
> + }
> + }
> + }
> +
> public final void string() throws RecognitionException, TokenStreamException {
>
> Token str = null;
> @@ -258,9 +297,8 @@
> Object i2 = argStack.pop();
> Object i1 = argStack.pop();
> argStack.push(ValidatorUtils.getValueAsString(form, i1 + "[" + index + "]" + i2));
> -
> }
> - else if ((LA(1)==IDENTIFIER) && (LA(2)==LBRACKET) && ((LA(3) >= DECIMAL_LITERAL && LA(3) <= OCTAL_LITERAL)) && (LA(4)==RBRACKET) && (LA(5)==IDENTIFIER)) {
> + else if ((LA(1)==IDENTIFIER) && (LA(2)==LBRACKET) && ((LA(3) >= DEC_INT_LITERAL && LA(3) <= OCTAL_INT_LITERAL)) && (LA(4)==RBRACKET) && (LA(5)==IDENTIFIER)) {
> identifier();
> match(LBRACKET);
> integer();
> @@ -271,9 +309,8 @@
> Object i4 = argStack.pop();
> Object i3 = argStack.pop();
> argStack.push(ValidatorUtils.getValueAsString(form, i3 + "[" + i4 + "]" + i5));
> -
> }
> - else if ((LA(1)==IDENTIFIER) && (LA(2)==LBRACKET) && ((LA(3) >= DECIMAL_LITERAL && LA(3) <= OCTAL_LITERAL)) && (LA(4)==RBRACKET) && (_tokenSet_0.member(LA(5)))) {
> + else if ((LA(1)==IDENTIFIER) && (LA(2)==LBRACKET) && ((LA(3) >= DEC_INT_LITERAL && LA(3) <= OCTAL_INT_LITERAL)) && (LA(4)==RBRACKET) && (_tokenSet_0.member(LA(5)))) {
> identifier();
> match(LBRACKET);
> integer();
> @@ -282,7 +319,6 @@
> Object i7 = argStack.pop();
> Object i6 = argStack.pop();
> argStack.push(ValidatorUtils.getValueAsString(form, i6 + "[" + i7 + "]"));
> -
> }
> else if ((LA(1)==IDENTIFIER) && (LA(2)==LBRACKET) && (LA(3)==RBRACKET) && (_tokenSet_0.member(LA(4)))) {
> identifier();
> @@ -291,14 +327,12 @@
>
> Object i8 = argStack.pop();
> argStack.push(ValidatorUtils.getValueAsString(form, i8 + "[" + index + "]"));
> -
> }
> else if ((LA(1)==IDENTIFIER) && (_tokenSet_0.member(LA(2)))) {
> identifier();
>
> Object i9 = argStack.pop();
> argStack.push(ValidatorUtils.getValueAsString(form, (String)i9));
> -
> }
> else {
> throw new NoViableAltException(LT(1), getFilename());
> @@ -311,10 +345,11 @@
>
> switch ( LA(1)) {
> case DECIMAL_LITERAL:
> - case HEX_LITERAL:
> - case OCTAL_LITERAL:
> + case DEC_INT_LITERAL:
> + case HEX_INT_LITERAL:
> + case OCTAL_INT_LITERAL:
> {
> - integer();
> + number();
> break;
> }
> case STRING_LITERAL:
> @@ -351,8 +386,9 @@
> break;
> }
> case DECIMAL_LITERAL:
> - case HEX_LITERAL:
> - case OCTAL_LITERAL:
> + case DEC_INT_LITERAL:
> + case HEX_INT_LITERAL:
> + case OCTAL_INT_LITERAL:
> case STRING_LITERAL:
> case LITERAL_null:
> case THIS:
> @@ -400,8 +436,8 @@
> comparison();
> value();
>
> - Object v2 = argStack.pop();
> - Object comp = argStack.pop();
> + Object v2 = argStack.pop();
> + Object comp = argStack.pop();
> Object v1 = argStack.pop();
> argStack.push(new Boolean(evaluateComparison(v1, comp, v2)));
>
> @@ -502,8 +538,9 @@
> "<2>",
> "NULL_TREE_LOOKAHEAD",
> "DECIMAL_LITERAL",
> - "HEX_LITERAL",
> - "OCTAL_LITERAL",
> + "DEC_INT_LITERAL",
> + "HEX_INT_LITERAL",
> + "OCTAL_INT_LITERAL",
> "STRING_LITERAL",
> "IDENTIFIER",
> "LBRACKET",
> @@ -524,12 +561,12 @@
> };
>
> private static final long[] mk_tokenSet_0() {
> - long[] data = { 8273920L, 0L};
> + long[] data = { 16547840L, 0L};
> return data;
> }
> public static final BitSet _tokenSet_0 = new BitSet(mk_tokenSet_0());
> private static final long[] mk_tokenSet_1() {
> - long[] data = { 6640L, 0L};
> + long[] data = { 13296L, 0L};
> return data;
> }
> public static final BitSet _tokenSet_1 = new BitSet(mk_tokenSet_1());
>
> Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.java
> URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.java?rev=569926&r1=569925&r2=569926&view=diff
> ==============================================================================
> --- struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.java (original)
> +++ struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.java Sun Aug 26 16:39:56 2007
> @@ -1,4 +1,4 @@
> -// $ANTLR 2.7.6 (2005-12-22): "ValidWhenParser.g" -> "ValidWhenParser.java"$
> +// $ANTLR 2.7.7 (20060906): "ValidWhenParser.g" -> "ValidWhenParser.java"$
>
> /*
> * $Id$
> @@ -23,31 +23,32 @@
>
> package org.apache.struts.validator.validwhen;
>
> +import java.math.BigDecimal;
> import java.util.Stack;
> import org.apache.commons.validator.util.ValidatorUtils;
>
> -
> public interface ValidWhenParserTokenTypes {
> int EOF = 1;
> int NULL_TREE_LOOKAHEAD = 3;
> int DECIMAL_LITERAL = 4;
> - int HEX_LITERAL = 5;
> - int OCTAL_LITERAL = 6;
> - int STRING_LITERAL = 7;
> - int IDENTIFIER = 8;
> - int LBRACKET = 9;
> - int RBRACKET = 10;
> - int LITERAL_null = 11;
> - int THIS = 12;
> - int LPAREN = 13;
> - int RPAREN = 14;
> - int ANDSIGN = 15;
> - int ORSIGN = 16;
> - int EQUALSIGN = 17;
> - int GREATERTHANSIGN = 18;
> - int GREATEREQUALSIGN = 19;
> - int LESSTHANSIGN = 20;
> - int LESSEQUALSIGN = 21;
> - int NOTEQUALSIGN = 22;
> - int WS = 23;
> + int DEC_INT_LITERAL = 5;
> + int HEX_INT_LITERAL = 6;
> + int OCTAL_INT_LITERAL = 7;
> + int STRING_LITERAL = 8;
> + int IDENTIFIER = 9;
> + int LBRACKET = 10;
> + int RBRACKET = 11;
> + int LITERAL_null = 12;
> + int THIS = 13;
> + int LPAREN = 14;
> + int RPAREN = 15;
> + int ANDSIGN = 16;
> + int ORSIGN = 17;
> + int EQUALSIGN = 18;
> + int GREATERTHANSIGN = 19;
> + int GREATEREQUALSIGN = 20;
> + int LESSTHANSIGN = 21;
> + int LESSEQUALSIGN = 22;
> + int NOTEQUALSIGN = 23;
> + int WS = 24;
> }
>
> Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.txt
> URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.txt?rev=569926&r1=569925&r2=569926&view=diff
> ==============================================================================
> --- struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.txt (original)
> +++ struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/validwhen/ValidWhenParserTokenTypes.txt Sun Aug 26 16:39:56 2007
> @@ -1,22 +1,23 @@
> -// $ANTLR 2.7.6 (2005-12-22): ValidWhenParser.g -> ValidWhenParserTokenTypes.txt$
> +// $ANTLR 2.7.7 (20060906): ValidWhenParser.g -> ValidWhenParserTokenTypes.txt$
> ValidWhenParser // output token vocab name
> DECIMAL_LITERAL=4
> -HEX_LITERAL=5
> -OCTAL_LITERAL=6
> -STRING_LITERAL=7
> -IDENTIFIER=8
> -LBRACKET=9
> -RBRACKET=10
> -LITERAL_null="null"=11
> -THIS=12
> -LPAREN=13
> -RPAREN=14
> -ANDSIGN="and"=15
> -ORSIGN="or"=16
> -EQUALSIGN=17
> -GREATERTHANSIGN=18
> -GREATEREQUALSIGN=19
> -LESSTHANSIGN=20
> -LESSEQUALSIGN=21
> -NOTEQUALSIGN=22
> -WS=23
> +DEC_INT_LITERAL=5
> +HEX_INT_LITERAL=6
> +OCTAL_INT_LITERAL=7
> +STRING_LITERAL=8
> +IDENTIFIER=9
> +LBRACKET=10
> +RBRACKET=11
> +LITERAL_null="null"=12
> +THIS=13
> +LPAREN=14
> +RPAREN=15
> +ANDSIGN="and"=16
> +ORSIGN="or"=17
> +EQUALSIGN=18
> +GREATERTHANSIGN=19
> +GREATEREQUALSIGN=20
> +LESSTHANSIGN=21
> +LESSEQUALSIGN=22
> +NOTEQUALSIGN=23
> +WS=24
>
> Modified: struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/PojoBean.java
> URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/PojoBean.java?rev=569926&r1=569925&r2=569926&view=diff
> ==============================================================================
> --- struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/PojoBean.java (original)
> +++ struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/PojoBean.java Sun Aug 26 16:39:56 2007
> @@ -33,6 +33,10 @@
> protected int intValue2;
> protected Integer integerValue1;
> protected Integer integerValue2;
> + protected float floatValue1;
> + protected float floatValue2;
> + protected double doubleValue1;
> + protected double doubleValue2;
> protected PojoBean[] beans;
> protected Map map = new HashMap();
> protected String[] stringArray;
> @@ -213,5 +217,37 @@
> */
> public Object getMapped(String key) {
> return map.get(key);
> + }
> +
> + public float getFloatValue1() {
> + return floatValue1;
> + }
> +
> + public float getFloatValue2() {
> + return floatValue2;
> + }
> +
> + public void setFloatValue1(float floatValue1) {
> + this.floatValue1 = floatValue1;
> + }
> +
> + public void setFloatValue2(float floatValue2) {
> + this.floatValue2 = floatValue2;
> + }
> +
> + public double getDoubleValue1() {
> + return doubleValue1;
> + }
> +
> + public double getDoubleValue2() {
> + return doubleValue2;
> + }
> +
> + public void setDoubleValue1(double doubleValue1) {
> + this.doubleValue1 = doubleValue1;
> + }
> +
> + public void setDoubleValue2(double doubleValue2) {
> + this.doubleValue2 = doubleValue2;
> }
> }
>
> Modified: struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/TestValidWhen.java
> URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/TestValidWhen.java?rev=569926&r1=569925&r2=569926&view=diff
> ==============================================================================
> --- struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/TestValidWhen.java (original)
> +++ struts/struts1/trunk/core/src/test/java/org/apache/struts/validator/TestValidWhen.java Sun Aug 26 16:39:56 2007
> @@ -31,6 +31,7 @@
> import org.apache.struts.validator.validwhen.ValidWhenParser;
>
> import java.io.StringReader;
> +import java.math.BigDecimal;
>
> /**
> * Unit tests for the ValidWhen Parser/Lexer.
> @@ -73,6 +74,10 @@
> testBean = new PojoBean(123, 789);
> testBean.setStringValue1("ABC");
> testBean.setStringValue2(null);
> + testBean.setFloatValue1(0.0f);
> + testBean.setFloatValue2(-3.14f);
> + testBean.setDoubleValue1(0.0);
> + testBean.setDoubleValue2(-3.14);
> testBean.setBeans(new PojoBean[] {
> new PojoBean(11, 12), new PojoBean(21, 22), new PojoBean(31, 42),
> new PojoBean(41, 52), new PojoBean(51, 62)
> @@ -151,9 +156,9 @@
> }
>
> /**
> - * Test Numeric values.
> + * Test integer values.
> */
> - public void testNumeric() {
> + public void testInteger() {
> // Test Zero
> PojoBean numberBean = new PojoBean(0, -50);
>
> @@ -164,6 +169,8 @@
>
> // int
> doParse("(intValue1 == 123)", testBean, 0, "intValue1", true);
> + doParse("(intValue1 == 123.0)", testBean, 0, "intValue1", true);
> + doParse("(intValue1 == 123.1)", testBean, 0, "intValue1", false);
>
> // Integer
> doParse("(integerValue1 == 123)", testBean, 0, "integerValue1", true);
> @@ -187,6 +194,48 @@
> true);
> doParse("(stringValue1 < stringValue2)", stringBean, 0, "stringValue1",
> false);
> + }
> +
> + /**
> + * Test float values
> + */
> + public void testFloat() {
> + // Test zero
> + doParse("(floatValue1 == 0)", testBean, 0, "floatValue1", true);
> + doParse("(floatValue2 != 0)", testBean, 0, "floatValue2", true);
> + doParse("(floatValue1 == 0.0)", testBean, 0, "floatValue1", true);
> + doParse("(floatValue2 != 0.0)", testBean, 0, "floatValue2", true);
> + doParse("(floatValue1 == 00.00)", testBean, 0, "floatValue1", true);
> + doParse("(floatValue2 != 00.00)", testBean, 0, "floatValue2", true);
> +
> + // Test precision
> + doParse("(floatValue2 == -3.14)", testBean, 0, "floatValue2", true);
> + doParse("(floatValue2 == -3.140)", testBean, 0, "floatValue2", true);
> + doParse("(floatValue2 == -3.1)", testBean, 0, "floatValue2", false);
> +
> + // Test negative
> + doParse("((floatValue2 > -3.15) and (floatValue2 < -3.13))", testBean, 0, "floatValue2", true);
> + }
> +
> + /**
> + * Test double values
> + */
> + public void testDouble() {
> + // Test zero
> + doParse("(doubleValue1 == 0)", testBean, 0, "doubleValue1", true);
> + doParse("(doubleValue2 != 0)", testBean, 0, "doubleValue2", true);
> + doParse("(doubleValue1 == 0.0)", testBean, 0, "doubleValue1", true);
> + doParse("(doubleValue2 != 0.0)", testBean, 0, "doubleValue2", true);
> + doParse("(doubleValue1 == 00.00)", testBean, 0, "doubleValue1", true);
> + doParse("(doubleValue2 != 00.00)", testBean, 0, "doubleValue2", true);
> +
> + // Test precision
> + doParse("(doubleValue2 == -3.14)", testBean, 0, "doubleValue2", true);
> + doParse("(doubleValue2 == -3.140)", testBean, 0, "doubleValue2", true);
> + doParse("(doubleValue2 == -3.1)", testBean, 0, "doubleValue2", false);
> +
> + // Test negative
> + doParse("((doubleValue2 > -3.15) and (doubleValue2 < -3.13))", testBean, 0, "doubleValue2", true);
> }
>
> /**
>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org