GenericField.java
00001 package edu.virtualschool.jwaa.field;
00002
00003 import java.lang.reflect.Constructor;
00004
00005 import org.apache.log4j.Logger;
00006
00007 import edu.virtualschool.jwaa.Fault;
00008 import gnu.regexp.RE;
00009 import gnu.regexp.REException;
00010
00036 public class GenericField implements Validatable
00037 {
00038 public String stringValue;
00039 public boolean ok;
00040 public String message;
00041
00042 final static Logger logger = Logger.getLogger(GenericField.class.getName());
00043
00044
00045
00046
00047
00048 public GenericField(Object value, Object defaultValue)
00049 {
00050 this((value == null ? defaultValue : value).toString());
00051 }
00052 private GenericField(String value)
00053 {
00054 if (value == null) value="";
00055 this.stringValue = value;
00056 this.ok = true;
00057 this.message = "";
00058 }
00064 public final void setValid(boolean v, String m)
00065 { if (ok) { ok = v; message = m; } }
00071 public final String getMessage() { return message; }
00077 public boolean ok() { return ok; }
00078
00079 public final String getStringValue() { return stringValue; }
00080 public boolean equals(Object o) { return stringValue.equals(o+""); }
00081 public final int hashCode() { return stringValue.hashCode(); }
00082 public final String toString() { return stringValue; }
00091 private final static Class[] argTypes = new Class[] { Object.class };
00092 public final Validatable cloneWithValue(String stringValue) throws Fault
00093 {
00094 if (stringValue == null)
00095 stringValue = "";
00096 Class c = this.getClass();
00097 Object[] argValues = new Object[] { stringValue };
00098 try
00099 {
00100 Constructor constructor = c.getConstructor(argTypes);
00101 Object copy = constructor.newInstance(argValues);
00102 return (Validatable)copy;
00103 }
00104 catch (Exception e)
00105 {
00106 throw new Fault(e.getMessage() + "\n"+c.getName()+"="+stringValue+"\n"+
00107 c.getName()+" must be public and must have a public constructor with one argument of type Object");
00108 }
00109 }
00119 public final static RE createRegexp(String s)
00120 {
00121 try { return new RE(s); }
00122 catch (REException e)
00123 {
00124 System.err.println("REException compiling " + s);
00125 e.printStackTrace(System.err);
00126 return null;
00127 }
00128 }
00132 public final void requireLength(int min, int max)
00133 {
00134 requireLengthMin(min);
00135 requireLengthMax(max);
00136 }
00140 public final void requireLengthMax(int max)
00141 {
00142 int len = stringValue.length();
00143 if (len > max) setValid(false,
00144 "Fewer than " + max + " characters are required");
00145 }
00149 public final void requireLengthMin(int min)
00150 {
00151 int len = stringValue.length();
00152 if(len < min) setValid(false,
00153 "At least " + min + " characters are required");
00154 }
00158 public final void requireMatch(RE re, String m)
00159 {
00160 if(!re.isMatch(stringValue)) setValid(false,m);
00161 }
00165 public final void requireNonNull()
00166 {
00167 if(stringValue.equals("")) setValid(false,"*");
00168 }
00169 public String inspect()
00170 {
00171 if (ok) return stringValue;
00172 return stringValue + " invalid:" + message;
00173 }
00174 }