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); } /**