/** * 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.io.StringReader; import javax.servlet.http.HttpServletRequest; import org.apache.commons.validator.Field; import org.apache.commons.validator.Validator; import org.apache.commons.validator.ValidatorAction; import org.apache.commons.validator.util.ValidatorUtils; import us.mn.state.health.lims.common.log.LogEvent; import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; import org.apache.struts.validator.Resources; import org.apache.struts.validator.validwhen.ValidWhenLexer; //import org.apache.struts.validator.validwhen.ValidWhenParser; import us.mn.state.health.lims.common.util.validator.ValidWhenParser; /** * This class contains the validwhen validation that is used in the * validator-rules.xml file. * * @since Struts 1.2 */ public class ValidWhen extends org.apache.struts.validator.validwhen.ValidWhen { /** * Returns true if <code>obj</code> is null or a String. */ private static boolean isString(Object obj) { return (obj == null) ? true : String.class.isInstance(obj); } /** * Checks if the field matches the boolean expression specified in * <code>test</code> parameter. * * @param bean * The bean validation is being performed on. * * @param va * The <code>ValidatorAction</code> that is currently being * performed. * * @param field * The <code>Field</code> object associated with the current * field being validated. * * @param errors * The <code>ActionMessages</code> object to add errors to if * any validation errors occur. * * @param request * Current request object. * * @return <code>true</code> if meets stated requirements, * <code>false</code> otherwise. */ public static boolean validateValidWhen(Object bean, ValidatorAction va, Field field, ActionMessages errors, Validator validator, HttpServletRequest request) { Object form = validator.getParameterValue(Validator.BEAN_PARAM); String value = null; boolean valid = false; int index = -1; if (field.isIndexed()) { String key = field.getKey(); final int leftBracket = key.indexOf("["); final int rightBracket = key.indexOf("]"); if ((leftBracket > -1) && (rightBracket > -1)) { index = Integer.parseInt(key.substring(leftBracket + 1, rightBracket)); } } if (isString(bean)) { value = (String) bean; } else { value = ValidatorUtils.getValueAsString(bean, field.getProperty()); } String test = field.getVarValue("test"); if (test == null) { String msg = "ValidWhen Error 'test' parameter is missing for field ' " + field.getKey() + "'"; errors.add(field.getKey(), new ActionMessage(msg, false)); //bugzilla 2154 LogEvent.logError("ValidWhen","validateValidWhen()",msg); return false; } // Create the Lexer ValidWhenLexer lexer = null; try { lexer = new ValidWhenLexer(new StringReader(test)); } catch (Exception ex) { String msg = "ValidWhenLexer Error for field ' " + field.getKey() + "' - " + ex; errors.add(field.getKey(), new ActionMessage(msg + " - " + ex, false)); //bugzilla 2154 LogEvent.logError("ValidWhen","validateValidWhen()",ex.toString()); LogEvent.logDebug("ValidWhen","validateValidWhen",msg); return false; } // Create the Parser ValidWhenParser parser = null; try { parser = new ValidWhenParser(lexer); } catch (Exception ex) { String msg = "ValidWhenParser Error for field ' " + field.getKey() + "' - " + ex; errors.add(field.getKey(), new ActionMessage(msg, false)); //bugzilla 2154 LogEvent.logError("ValidWhen","validateValidWhen()",ex.toString()); LogEvent.logDebug("ValidWhen","validateValidWhen",msg); return false; } parser.setForm(form); parser.setIndex(index); parser.setValue(value); try { parser.expression(); valid = parser.getResult(); } catch (Exception ex) { // errors.add( // field.getKey(), // Resources.getActionMessage(validator, request, va, field)); String msg = "ValidWhen Error for field ' " + field.getKey() + "' - " + ex; errors.add(field.getKey(), new ActionMessage(msg, false)); //bugzilla 2154 LogEvent.logError("ValidWhen","validateValidWhen()",ex.toString()); LogEvent.logDebug("ValidWhen","validateValidWhen",msg); return false; } if (!valid) { errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); return false; } return true; } }