1 20 package org.enhydra.barracuda.contrib.sam.xmlform; 21 22 import java.util.*; 23 import java.lang.reflect.*; 24 25 import org.enhydra.barracuda.contrib.dbroggisch.repopulation.*; 26 import org.enhydra.barracuda.core.event.*; 27 import org.enhydra.barracuda.core.comp.*; 28 import org.enhydra.barracuda.core.forms.*; 29 import org.enhydra.barracuda.core.forms.validators.*; 30 31 import org.enhydra.barracuda.contrib.sam.xmlform.dtd.*; 32 import org.enhydra.barracuda.contrib.sam.data.*; 33 34 import org.apache.log4j.*; 35 36 37 public class XmlFormMap extends RepopulationFormMap { 38 39 protected static Logger logger = Logger.getLogger(XmlFormMap.class.getName()); 40 41 public static final String GROUP = "GROUP"; 42 protected String formName; 43 protected Form form; 44 45 52 public XmlFormMap(ControlEventContext context, String formName, String name, DataObject dataObject) { 53 this.formName = formName; 54 setName(name); 55 form = XmlFormFactory.get(context, this.formName); 56 Iterator iter = form.getElementList().iterator(); 57 while (iter.hasNext()) { 58 Element ele = (Element) iter.next(); 59 Object deflt = null; 60 FormElement fe = getFormElement(ele, ele.getName()); 61 if (dataObject != null) { 62 try { 63 deflt = dataObject.get(ele.getName()); 64 if (deflt instanceof List) { 65 66 List defltList = (List)deflt; 68 SelectFormElement sfe = (SelectFormElement)fe; 69 ListSelectionModel defaults = new DefaultListSelectionModel(); 70 defaults.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ); 71 72 ListModel lm = sfe.getListModel(); 74 for (int i = 0; i< lm.getSize(); i++) { 75 DefaultItemMap item = (DefaultItemMap)lm.getItemAt(i); 76 if (defltList.contains(item.getKey())) defaults.addSelectionInterval(i,i); 77 } 78 sfe.setListSelectionModel(defaults); 79 80 } else { 81 fe.setOrigVal(deflt); 82 if (logger.isDebugEnabled()) logger.debug("default value for element " + ele.getName() + " is " + deflt); 83 } 84 } catch (DataObjectException ex) { 85 logger.error(ex.getMessage(), ex); 86 } 87 } 88 if (logger.isDebugEnabled()) logger.debug("Adding " + ele.getName() + " to formmap."); 89 91 fe.setValidator( buildValidatorObject(ele.getValidator())); 92 defineElement(fe); 93 } 94 } 95 96 private static Map primitiveClasses = new Hashtable(); 97 98 static { 99 primitiveClasses.put("int", Integer.TYPE); 100 primitiveClasses.put("float", Float.TYPE); 101 primitiveClasses.put("double", Double.TYPE); 102 primitiveClasses.put("long", Long.TYPE); 103 primitiveClasses.put("short", Short.TYPE); 104 primitiveClasses.put("boolean", Boolean.TYPE); 105 primitiveClasses.put("byte", Byte.TYPE); 106 primitiveClasses.put("char", Character.TYPE); 107 } 108 109 private Class getClassWithPrimitive(String name) 110 throws ClassNotFoundException { 111 Class c = (Class ) primitiveClasses.get(name); 112 if (c==null) c = Class.forName(name); 113 return c; 114 } 115 116 private Object initialize(Class c, String value) 117 throws NoSuchMethodException , InstantiationException , IllegalAccessException , InvocationTargetException { 118 Class [] types = new Class [1]; 119 types[0] = String .class; 120 Object [] para = new Object [1]; 121 para[0] = value; 122 Constructor con = c.getConstructor(types); 123 return con.newInstance(para); 124 } 125 126 127 128 protected FormValidator buildValidatorObject(Validator validator) { 129 if (validator == null) return null; 130 131 List children = new Vector(); 132 133 Iterator iter = validator.getValidatorList().iterator(); 135 while (iter.hasNext()) { 136 Validator v = (Validator) iter.next(); 137 children.add(buildValidatorObject(v)); 139 } 140 try { 142 logger.info("Trying to create Validator " + validator.getClassname()); 144 Class validatorClass = Class.forName(validator.getClassname()); 145 if (logger.isDebugEnabled()) logger.debug("Class successfully found"); 146 147 List para = validator.getParaList(); 149 150 int size = children.size() + para.size(); 151 if (logger.isDebugEnabled()) logger.debug("constructor will have " + size + " arguments"); 152 Class [] types = new Class [size]; 153 Object [] values = new Object [size]; 154 int counter = 0; 155 iter = children.iterator(); 157 while (iter.hasNext()) { 158 Object o = iter.next(); 159 types[counter] = FormValidator.class; 160 values[counter++] = o; 161 } 162 iter = para.iterator(); 164 while (iter.hasNext()) { 165 Para p = (Para)iter.next(); 166 types[counter] = getClassWithPrimitive(p.getClassname()); 167 values[counter] = initialize(types[counter], p.getValue()); 168 counter++; 169 if (logger.isDebugEnabled()) logger.debug("counter is " + counter); 170 } 171 172 Constructor c = validatorClass.getConstructor(types); 173 if (logger.isDebugEnabled()) logger.debug("Constructor with " + children.size() + " arguments found"); 174 return (FormValidator)c.newInstance(values); 176 } catch (Exception ex) { 177 logger.error(ex.getMessage(), ex); 178 return null; 179 } 180 } 181 182 183 protected FormElement getFormElement(Element ele, String name) { 184 FormElement fe = null; 185 if (ele.getText() != null) 186 fe = new DefaultFormElement(name, FormType.STRING, null); 187 else if ( ele.getTextarea() != null) { 188 fe = new TextAreaFormElement(name, FormType.STRING, null); 189 logger.debug("creating a textarea element"+name); 190 } 191 else if ( ele.getSelect() != null) { 192 Select sel = ele.getSelect(); 193 DefaultListModel lm = new DefaultListModel(); 194 if (sel.getXmlclass() != null) { 196 logger.debug("class is " + sel.getXmlclass()); 197 try { 198 Class c = Class.forName(sel.getXmlclass()); 199 Class [] params = new Class [0]; 200 Object [] args = new Object [0]; 201 Method method = c.getMethod(sel.getMethod(), params); 202 Object result = method.invoke(null, args); 203 logger.debug("result is " + result.getClass().getName()); 204 if (result instanceof List) { 205 List l = (List)result; 206 Iterator rmiIter = l.iterator(); 207 while (rmiIter.hasNext()) lm.add(rmiIter.next()); 208 } 209 } catch (Exception e) { 210 logger.error(e.getMessage(),e); 211 } 212 } 213 Iterator subIter = ele.getSelect().getOptionList().iterator(); 214 while (subIter.hasNext()) { 215 Option opt = (Option)subIter.next(); 216 lm.add(new DefaultItemMap(opt.getValue2(), opt.getValue())); 217 } 218 boolean hasMulti = false; 220 String m = sel.getMultivalue(); 221 if ( (m!=null) && (m.equals("true") || m.equals("yes"))) hasMulti = true; 222 fe = new SelectFormElement(lm, name, FormType.STRING, null, null, hasMulti); 223 } else if (ele.getHidden() != null) { 224 fe = new DefaultFormElement(name, FormType.STRING, null); 225 } 226 return fe; 227 } 228 229 public Form getForm() { 230 return form; 231 } 232 233 } 234 | Popular Tags |