/** * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations under * the License. * * The Original Code is OpenELIS code. * * Copyright (C) The Minnesota Department of Health. All Rights Reserved. */ package us.mn.state.health.lims.common.util.validator; import java.text.SimpleDateFormat; import java.util.Stack; import org.apache.commons.validator.util.ValidatorUtils; import org.apache.struts.validator.validwhen.ValidWhenParserTokenTypes; import antlr.NoViableAltException; import antlr.ParserSharedInputState; import antlr.RecognitionException; import antlr.Token; import antlr.TokenBuffer; import antlr.TokenStream; import antlr.TokenStreamException; import antlr.collections.impl.BitSet; public class ValidWhenParser extends antlr.LLkParser implements ValidWhenParserTokenTypes { 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(); } 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) { //System.out.println("I am in evaluateComparison " + v1 + " " + v2 + " " + compare); boolean intCompare = true; if ((v1 == null) || (v2 == null)) { if (String.class.isInstance(v1)) { if (((String) v1).length() == 0) { v1 = null; } } if (String.class.isInstance(v2)) { if (((String) v2).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(); //System.out.println("v1i 1" + v1i); } else { v1i = Integer.parseInt((String) v1); //System.out.println("v1i 2" + v1i); } if (Integer.class.isInstance(v2)) { v2i = ((Integer) v2).intValue(); //System.out.println("v2i 1" + v1i); } else { v2i = Integer.parseInt((String) v2); //System.out.println("v2i 2" + v1i); } 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: //System.out.println("v1i > = v2i " + v1i + " " + v2i); return (v1i >= v2i); case NOT_EQUAL: return (v1i != v2i); } } catch (NumberFormatException ex) { //bugzilla 2154 //bugzilla 2437 do not need to log this as it is not an actual ERROR that needs attention //LogEvent.logError("ValidWhenParser","evaluateComparison()",ex.toString()); } ; } //diane SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); java.util.Date v1d = null, v2d = null; try { v1d = sdf.parse((String)v1); v2d = sdf.parse((String)v2); intCompare = true; } catch (Exception e) { //bugzilla 2154 //bugzilla 2437 do not need to log this as it is not an actual ERROR that needs attention //LogEvent.logError("ValidWhenParser","evaluateComparison()",e.toString()); intCompare = false; } if (intCompare) { try { /* if (Integer.class.isInstance(v1)) { v1i = ((Integer) v1).intValue(); System.out.println("v1i 1" + v1i); } else { v1i = Integer.parseInt((String) v1); System.out.println("v1i 2" + v1i); } if (Integer.class.isInstance(v2)) { v2i = ((Integer) v2).intValue(); System.out.println("v2i 1" + v1i); } else { v2i = Integer.parseInt((String) v2); System.out.println("v2i 2" + v1i); }*/ switch (((Integer) compare).intValue()) { case LESS_EQUAL: return (v1d.compareTo(v2d) <= 0); case LESS_THAN: return (v1d.compareTo(v2d) < 0); case EQUAL: return (v1d.compareTo(v2d) == 0); case GREATER_THAN: return (v1d.compareTo(v2d) > 0); case GREATER_EQUAL: return (v1d.compareTo(v2d) >= 0); case NOT_EQUAL: return (v1d.compareTo(v2d) != 0); } } catch (Exception ex) { //bugzilla 2154 //bugzilla 2437 do not need to log this as it is not an actual ERROR that needs attention //LogEvent.logError("ValidWhenParser","evaluateComparison()",ex.toString()); } ; } //end diane String v1s = "", v2s = ""; if (Integer.class.isInstance(v1)) { v1s = ((Integer) v1).toString(); //System.out.println("v1s 1" + v1s); } else { v1s = (String) v1; //System.out.println("v1s 2" + v1s); } if (Integer.class.isInstance(v2)) { v2s = ((Integer) v2).toString(); //System.out.println("v2s 1" + v2s); } else { v2s = (String) v2; //System.out.println("v2s 2" + v2s); } int res = v1s.compareTo(v2s); //System.out.println(" res " + res); 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: //System.out.println(" > = " + res); return (res >= 0); case NOT_EQUAL: return (res != 0); } return true; } protected ValidWhenParser(TokenBuffer tokenBuf, int k) { super(tokenBuf, k); tokenNames = _tokenNames; } public ValidWhenParser(TokenBuffer tokenBuf) { this(tokenBuf, 6); } protected ValidWhenParser(TokenStream lexer, int k) { super(lexer, k); tokenNames = _tokenNames; } public ValidWhenParser(TokenStream lexer) { this(lexer, 6); } public ValidWhenParser(ParserSharedInputState state) { super(state, 6); tokenNames = _tokenNames; } public final void integer() throws RecognitionException, TokenStreamException { Token d = null; Token h = null; Token o = null; switch (LA(1)) { case DECIMAL_LITERAL: { d = LT(1); match(DECIMAL_LITERAL); //System.out.println("Going through integer()1 " + d.getText()); argStack.push(Integer.decode(d.getText())); break; } case HEX_LITERAL: { h = LT(1); match(HEX_LITERAL); //System.out.println("Going through integer()2 " + h.getText()); argStack.push(Integer.decode(h.getText())); break; } case OCTAL_LITERAL: { o = LT(1); match(OCTAL_LITERAL); //System.out.println("Going through integer()3 " + o.getText()); argStack.push(Integer.decode(o.getText())); break; } default: { throw new NoViableAltException(LT(1), getFilename()); } } } public final void string() throws RecognitionException, TokenStreamException { Token str = null; str = LT(1); //System.out.println("Going through string() " + str.getText()); match(STRING_LITERAL); argStack.push(str.getText().substring(1, str.getText().length() - 1)); } public final void identifier() throws RecognitionException, TokenStreamException { Token str = null; str = LT(1); //System.out.println("Going through identifier() " + str.getText()); match(IDENTIFIER); argStack.push(str.getText()); } public final void field() throws RecognitionException, TokenStreamException { //System.out.println("I am in field()"); if ((LA(1) == IDENTIFIER) && (LA(2) == LBRACKET) && (LA(3) == RBRACKET) && (LA(4) == IDENTIFIER)) { identifier(); //System.out.println("I am in field()1"); match(LBRACKET); match(RBRACKET); identifier(); 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)) { //System.out.println("I am in field()2"); identifier(); match(LBRACKET); integer(); match(RBRACKET); identifier(); Object i5 = argStack.pop(); 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) && (LA(5) == LBRACKET)) { //System.out.println("I am in field()3"); identifier(); match(LBRACKET); integer(); match(RBRACKET); match(LBRACKET); 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)))) { //System.out.println("I am in field()4"); identifier(); match(LBRACKET); match(RBRACKET); Object i8 = argStack.pop(); argStack.push(ValidatorUtils.getValueAsString(form, i8 + "[" + index + "]")); } else if ((LA(1) == IDENTIFIER) && (_tokenSet_0.member(LA(2)))) { //System.out.println("I am in field()5"); identifier(); Object i9 = argStack.pop(); argStack.push(ValidatorUtils.getValueAsString(form, (String) i9)); } else { throw new NoViableAltException(LT(1), getFilename()); } } public final void literal() throws RecognitionException, TokenStreamException { //System.out.println("I am i n literal()"); switch (LA(1)) { case DECIMAL_LITERAL: case HEX_LITERAL: case OCTAL_LITERAL: { integer(); //System.out.println("I am i n literal()1"); break; } case STRING_LITERAL: { string(); //System.out.println("I am i n literal()2"); break; } case LITERAL_null: { match(LITERAL_null); argStack.push(null); //System.out.println("I am i n literal()3"); break; } case THIS: { match(THIS); argStack.push(value); //System.out.println("I am i n literal()4"); break; } default: { throw new NoViableAltException(LT(1), getFilename()); } } } public final void value() throws RecognitionException, TokenStreamException { //System.out.println("I am in value()"); switch (LA(1)) { case IDENTIFIER: { field(); break; } case DECIMAL_LITERAL: case HEX_LITERAL: case OCTAL_LITERAL: case STRING_LITERAL: case LITERAL_null: case THIS: { literal(); break; } default: { throw new NoViableAltException(LT(1), getFilename()); } } } public final void expression() throws RecognitionException, TokenStreamException { //System.out.println("I am in expression()"); expr(); match(Token.EOF_TYPE); } public final void expr() throws RecognitionException, TokenStreamException { //System.out.println("I am in expr()"); if ((LA(1) == LPAREN) && (_tokenSet_1.member(LA(2)))) { match(LPAREN); comparisonExpression(); match(RPAREN); } else if ((LA(1) == LPAREN) && (LA(2) == LPAREN)) { match(LPAREN); joinedExpression(); match(RPAREN); } else { throw new NoViableAltException(LT(1), getFilename()); } } public final void comparisonExpression() throws RecognitionException, TokenStreamException { //System.out.println("I am in comparisonExpression"); value(); comparison(); value(); Object v2 = argStack.pop(); Object comp = argStack.pop(); Object v1 = argStack.pop(); argStack.push(new Boolean(evaluateComparison(v1, comp, v2))); } public final void joinedExpression() throws RecognitionException, TokenStreamException { 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())); } } public final void join() throws RecognitionException, TokenStreamException { switch (LA(1)) { case ANDSIGN: { match(ANDSIGN); argStack.push(new Integer(AND)); break; } case ORSIGN: { match(ORSIGN); argStack.push(new Integer(OR)); break; } default: { throw new NoViableAltException(LT(1), getFilename()); } } } public final void comparison() throws RecognitionException, TokenStreamException { switch (LA(1)) { case EQUALSIGN: { match(EQUALSIGN); argStack.push(new Integer(EQUAL)); break; } case GREATERTHANSIGN: { match(GREATERTHANSIGN); argStack.push(new Integer(GREATER_THAN)); break; } case GREATEREQUALSIGN: { match(GREATEREQUALSIGN); argStack.push(new Integer(GREATER_EQUAL)); break; } case LESSTHANSIGN: { match(LESSTHANSIGN); argStack.push(new Integer(LESS_THAN)); break; } case LESSEQUALSIGN: { match(LESSEQUALSIGN); argStack.push(new Integer(LESS_EQUAL)); break; } case NOTEQUALSIGN: { match(NOTEQUALSIGN); argStack.push(new Integer(NOT_EQUAL)); break; } default: { throw new NoViableAltException(LT(1), getFilename()); } } } public static final String[] _tokenNames = { "<0>", "EOF", "<2>", "NULL_TREE_LOOKAHEAD", "DECIMAL_LITERAL", "HEX_LITERAL", "OCTAL_LITERAL", "STRING_LITERAL", "IDENTIFIER", "LBRACKET", "RBRACKET", "\"null\"", "THIS", "LPAREN", "RPAREN", "\"and\"", "\"or\"", "EQUALSIGN", "GREATERTHANSIGN", "GREATEREQUALSIGN", "LESSTHANSIGN", "LESSEQUALSIGN", "NOTEQUALSIGN", "WS" }; private static final long[] mk_tokenSet_0() { long[] data = { 8273920L, 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 }; return data; } public static final BitSet _tokenSet_1 = new BitSet(mk_tokenSet_1()); }