/* This file is part of OpenMyEWB. OpenMyEWB is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OpenMyEWB is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenMyEWB. If not, see <http://www.gnu.org/licenses/>. OpenMyEWB is Copyright 2005-2009 Nicolas Kruchten (nicolas@kruchten.com), Francis Kung, Engineers Without Borders Canada, Michael Trauttmansdorff, Jon Fishbein, David Kadish */ package ca.myewb.frame.forms; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.apache.log4j.Logger; import ca.myewb.frame.ErrorMessage; import ca.myewb.frame.Message; import ca.myewb.frame.Helpers; import ca.myewb.frame.forms.element.Checkbox; import ca.myewb.frame.forms.element.DatePicker; import ca.myewb.frame.forms.element.DateTimePicker; import ca.myewb.frame.forms.element.Dropdown; import ca.myewb.frame.forms.element.Element; import ca.myewb.frame.forms.element.FileChooser; import ca.myewb.frame.forms.element.Header; import ca.myewb.frame.forms.element.Hidden; import ca.myewb.frame.forms.element.Password; import ca.myewb.frame.forms.element.Radio; import ca.myewb.frame.forms.element.Text; import ca.myewb.frame.forms.element.TextArea; import ca.myewb.frame.forms.multiment.Address; import ca.myewb.frame.forms.multiment.IntlAddress; import ca.myewb.frame.forms.multiment.Phone; public class Form { private List<Element> elements; private Hashtable<String, Element> namesToElements; protected String target; protected String submitText; public Form(String target) { this(target, "Submit"); } public Form(String target, String submitText) { this.target = target; this.submitText = submitText; elements = new LinkedList<Element>(); namesToElements = new Hashtable<String, Element>(); } public List getElements() { return elements; } public String getTarget() { return target; } public String getSubmitText() { return submitText; } private String makeNotNull(String value) { if (value == null) { return ""; } else { return value; } } public Text addText(String name, String label, String value, boolean required) { Text e = new Text(name, label, makeNotNull(value), required); addToElements(name, e); return e; } public DatePicker addDatePicker(String name, String label, String value, boolean required) { DatePicker e = new DatePicker(name, label, makeNotNull(value), required); addToElements(name, e); return e; } public DateTimePicker addDateTimePicker(String name, String label, String value, boolean required) { DateTimePicker e = new DateTimePicker(name, label, makeNotNull(value), required); addToElements(name, e); return e; } public Header addHeader(String name, String label) { Header e = new Header(name, label); addToElements(name, e); return e; } public TextArea addTextArea(String name, String label, String value, boolean required) { TextArea t = new TextArea(name, label, makeNotNull(value), required); addToElements(name, t); return t; } public FileChooser addFileChooser(String name, String label, String value, boolean required) { return addFileChooser(name, label, makeNotNull(value), required, true); } public FileChooser addFileChooser(String name, String label, String value, boolean required, boolean multi) { FileChooser t = new FileChooser(name, label, makeNotNull(value), required, multi); addToElements(name, t); return t; } public Password addPassword(String name, String label, String value, boolean required) { Password p = new Password(name, label, makeNotNull(value), required); addToElements(name, p); return p; } public Dropdown addDropdown(String name, String label, String value, boolean required) { Dropdown d = new Dropdown(name, label, makeNotNull(value), required); addToElements(name, d); return d; } public Radio addRadio(String name, String label, String value, boolean required) { Radio r = new Radio(name, label, makeNotNull(value), required); addToElements(name, r); return r; } public Hidden addHidden(String name, String value, boolean required) { Hidden h = new Hidden(name, makeNotNull(value), required); addToElements(name, h); return h; } public Checkbox addCheckbox(String name, String label, String value, String boxLabel) { Checkbox c = new Checkbox(name, label, makeNotNull(value), boxLabel); addToElements(name, c); return c; } public Phone addPhone(String name, String label, String[] value, boolean required) { Phone p = new Phone(name, label, value, required); addToElements(name, p); return p; } public Address addAddress(String name, String label, String[] value, boolean required) { Address a = new Address(name, label, value, required); addToElements(name, a); return a; } public IntlAddress addIntlAddress(String name, String label, String[] value, boolean required) { IntlAddress a = new IntlAddress(name, label, value, required); addToElements(name, a); return a; } public void addToElements(Element e) { addToElements(e.getInternalName(), e); } public void addToElements(String name, Element e) { elements.add(e); namesToElements.put(name, e); } public final Message validate() { boolean isClean = true; // Iterate over all elements, calling their individual validate fcns Iterator i = elements.iterator(); while (i.hasNext()) { Element e = (Element)i.next(); isClean = (e.validate() && isClean); } isClean = this.cleanAndValidate(isClean) && isClean; if (!isClean) { return new ErrorMessage("There was a problem with the form."); } else { return null; } } public String getParameter(String param) throws Exception { return getParameter(param, true); } public String getNulledStringParam(String param) throws Exception { String p = getParameter(param, true); return (p == null || p.equals("")) ? null : p; } public Character getNulledCharParam(String param) throws Exception { String p = getParameter(param, true); return (p == null || p.equals("")) ? null : p.charAt(0); } public Integer getNulledIntParam(String param) throws Exception { String p = getParameter(param, true); return (p == null || p.equals("")) ? null : Integer.parseInt(p); } public Float getNulledFloatParam(String param) throws Exception { String p = getParameter(param, true); return (p == null || p.equals("")) ? null : Float.parseFloat(p); } public Date getParameterAsDate(String param) throws Exception { String paramValue = getParameter(param, true); if((paramValue == null) || paramValue.equals("")) { return null; } else { return new SimpleDateFormat("yyyy-MM-dd").parse(paramValue); } } public Date getParameterAsDateTime(String param) throws Exception { String paramValue = getParameter(param, true); if((paramValue == null) || paramValue.equals("")) { return null; } else { return new SimpleDateFormat("yyyy-MM-dd kk:mm").parse(paramValue); } } public String getParameter(String param, boolean checkExistance) throws Exception { Element e = getElement(param); if (checkExistance && (e == null)) { Logger.getLogger(this.getClass()) .warn("tried to get non-existent parameter! (" + param + ")", new Throwable()); return null; } else if (e == null) { return null; } else { return e.getValue(); } } public void setValue(String element, String value) throws Exception { Element e = getElement(element); if (e != null) { if (value == null) { e.setValue(""); } else { e.setValue(value); } } else { if (Helpers.isDevMode()) { throw new Exception("tried to set non-existent param!"); } else { Logger.getLogger(this.getClass()) .error("tried to set non-existent parameter! (" + element + ")", new Throwable()); } } } public void setError(String element, String message) { Element e = getElement(element); if (e != null) { e.setError(message); e.highlight(); } } public boolean cleanAndValidate(boolean isClean) { return isClean; } public Element getElement(String name) { return namesToElements.get(name); } protected Date getParameterAsTime(String string) { return null; } }