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