001 // Copyright (c) 2001 Hursh Jain (http://www.mollypages.org) 002 // The Molly framework is freely distributable under the terms of an 003 // MIT-style license. For details, see the molly pages web site at: 004 // http://www.mollypages.org/. Use, modify, have fun ! 005 006 package fc.web.forms; 007 008 import javax.servlet.*; 009 import javax.servlet.http.*; 010 import java.io.*; 011 import java.util.*; 012 013 import fc.jdbc.*; 014 import fc.io.*; 015 import fc.util.*; 016 017 /** 018 Represents a form field validator. Various subclasses 019 implement concrete code (via {@link #validate}) for various 020 validation strategies. Subclasses are typically specific to 021 both the field type and the type of validation. So for 022 example, the {@link ValidatorText} would verify that the 023 specified HTML form element of type "text" has the specified 024 length. 025 <p> 026 Field level validators differ from {@link FormValidator} 027 because validation is at the field (per field) level and is 028 independent of other fields in the form. 029 <p> 030 <b>Note</b>: Validator objects have state and a particular 031 instance of a validator should only be assigned to one form 032 field. To ensure this, validators take a field reference in 033 their constructors and automatically add themselves to the 034 specified field at construction time. During validation, 035 validators are sequentially called in the order they were 036 added (which implies in the order they were constructed). 037 <p> 038 <b>Thread safety:</b> None of the validation classes (like 039 all other form-related classes) are thread safe. 040 Synchronization must be done at a higher level, typically 041 the session level. 042 043 @author hursh jain 044 **/ 045 public abstract class FieldValidator 046 { 047 protected String errorMessage; 048 protected Field field; 049 //protected boolean isOptional; 050 051 /** 052 Creates a new validator. 053 054 @param field the field to validate. <b>This validator 055 is added to the field automatically. 056 Subclasses can later retrieve the field 057 for validation</b>. 058 @param errorMessage the error message associated with invalid data 059 See {@link #getErrorMessage} 060 **/ 061 public FieldValidator(Field field, String errorMessage) 062 { 063 field.addValidator(this); 064 this.errorMessage = errorMessage; 065 this.field = field; 066 } 067 068 /** 069 Validates the field in some fashion. 070 <p> 071 If there are validation error, stores the error in the formdata 072 and returns <tt>false</tt>, otherwise returns <tt>true</tt> 073 */ 074 public abstract boolean validate(FormData fd, HttpServletRequest req); 075 076 /* 077 Makes this an optional validator for this field. During 078 validation, optional validators attached to a field are invoked 079 if and only if optional validation for that field is enabled. 080 Optional validation is intended for cases where validation should 081 only proceed based on certain states of the form (for example, 082 certain choices in the form might imply that certain other parts 083 of the form must be validated and those same parts must 084 <b>not</b> be validated in other cases. 085 */ 086 /* >>>>>>>>>>>>> disable/enable the field instead. 087 public abstract setOptional(boolean val) { 088 this.isOptional = true; 089 } 090 */ 091 092 public String getErrorMessage() { 093 return errorMessage; 094 } 095 096 /** 097 Returns the field associated with this validator. 098 */ 099 public Field getField() { 100 return field; 101 } 102 } //~class FieldValidator