Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

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 //  public GenericField(Object value)
00045 //  {
00046 //    this(value, "");
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 }