1 10 11 package org.mmbase.bridge.jsp.taglib.typehandler; 12 13 import javax.servlet.jsp.JspTagException ; 14 import org.mmbase.bridge.*; 15 import org.mmbase.datatypes.DataType; 16 import org.mmbase.storage.search.Constraint; 17 import org.mmbase.bridge.jsp.taglib.*; 18 import org.mmbase.util.Casting; 19 20 import java.util.*; 21 22 import org.mmbase.util.SortedBundle; 23 import org.mmbase.util.logging.Logger; 24 import org.mmbase.util.logging.Logging; 25 26 33 34 public class EnumHandler extends AbstractTypeHandler implements TypeHandler { 35 36 private static final Logger log = Logging.getLoggerInstance(EnumHandler.class); 37 private Iterator iterator; 38 private boolean available; 39 40 43 public EnumHandler(FieldInfoTag tag) throws JspTagException { 44 super(tag); 45 available = true; 46 } 47 48 51 protected Iterator getIterator(Node node, Field field) throws JspTagException { 52 DataType dataType = field.getDataType(); 53 Locale locale = tag.getLocale(); 54 return dataType.getEnumerationValues(locale, tag.getCloudVar(), node, field); 55 } 56 60 public EnumHandler(FieldInfoTag tag, Node node, Field field) throws JspTagException { 61 super(tag); 62 iterator = getIterator(node, field); 63 if (iterator == null) { 64 String enumType = field.getGUIType(); 66 try { 67 Class.forName(enumType); 68 } catch (Exception ee) { 69 try { 70 String resource; 71 if (enumType.indexOf('.') == -1 ) { 72 resource = "org.mmbase.bridge.jsp.taglib.typehandler.resources." + enumType; 73 } else { 74 resource = enumType; 75 76 } 77 Class type; 78 switch(field.getType()) { 79 case Field.TYPE_STRING: type = String .class; break; 80 case Field.TYPE_INTEGER: type = Integer .class; break; 81 case Field.TYPE_LONG: type = Long .class; break; 82 83 case Field.TYPE_FLOAT: type = Float .class; break; 85 case Field.TYPE_DOUBLE: type = Double .class; break; 86 case Field.TYPE_BINARY: type = byte[].class; break; 87 case Field.TYPE_XML: type = String .class; break; case Field.TYPE_NODE: type = Node.class; break; 89 94 default: type = String .class; 95 } 96 97 98 iterator = SortedBundle.getResource(resource, tag.getLocale(), getClass().getClassLoader(), 99 SortedBundle.NO_CONSTANTSPROVIDER, type, SortedBundle.NO_COMPARATOR).entrySet().iterator(); 100 } catch (java.util.MissingResourceException e) { 101 log.warn(e.toString() + " for field " + field.getName() + " of builder " + field.getNodeManager().getName()); 102 } 103 } 104 } 105 available = iterator != null; 106 } 107 108 109 protected EnumHandler getEnumHandler(Node node, Field field) throws JspTagException { 110 return null; 111 } 112 public boolean isAvailable() { 113 return available; 114 } 115 116 protected Object cast(Object value, Node node, Field field) { 117 if ("".equals(value)) return null; 118 return field.getDataType().cast(value, node, field); 119 } 120 121 protected Object getFieldValue(Node node, Field field, boolean useDefault) throws JspTagException { 122 Object value = super.getFieldValue(node, field, useDefault); 123 if (value == null && field.getDataType().isRequired()) { 126 Iterator i = getIterator(node, field); 127 if (i!= null && i.hasNext()) { 128 value = ((Map.Entry) i.next()).getKey(); 129 } 130 } 131 return value; 132 } 133 134 public String htmlInput(Node node, Field field, boolean search) throws JspTagException { 135 StringBuffer buffer = new StringBuffer (); 136 String fieldName = field.getName(); 137 buffer.append("<select class=\"" + getClasses(field) + "\" name=\"").append(prefix(fieldName)).append("\" "); 138 buffer.append("id=\"").append(prefixID(fieldName)).append("\" "); 139 addExtraAttributes(buffer); 140 buffer.append(">"); 141 Object value = cast(getFieldValue(node, field, true), node, field); 142 if (log.isDebugEnabled()) { 143 log.debug("using value " + (value == null ? "NULL" : value.getClass().getName() + " " + value)); 144 } 145 if (! field.getDataType().isRequired()) { 146 buffer.append("<option value=\"\" "); 147 if (value == null) buffer.append("selected=\"selected\" "); 148 buffer.append(">--</option>"); 149 } 150 if (iterator == null) { 151 iterator = getIterator(node, field); 152 } 153 154 String valueString = Casting.toString(value); 155 while(iterator != null && iterator.hasNext()) { 156 Map.Entry entry = (Map.Entry) iterator.next(); 157 Object key = entry.getKey(); 158 if (key == null) { 159 log.warn("Found null as enumeration key for " + field.getDataType()); 160 continue; 161 } 162 String keyString = Casting.toString(key); 163 buffer.append("<option value=\""); 164 buffer.append(keyString); 165 buffer.append("\""); 166 if (keyString.equals(valueString)) { 167 buffer.append(" selected=\"selected\""); 168 } else if (search) { 169 String searchs = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(field.getName())); 170 if (keyString.equals(searchs)) { 171 buffer.append(" selected=\"selected\""); 172 } 173 } 174 buffer.append(">"); 175 buffer.append(entry.getValue()); 176 buffer.append("</option>"); 177 } 178 buffer.append("</select>"); 179 if (search) { 180 String name = prefix(field.getName()) + "_search"; 181 String fieldid = prefixID(field.getName() + "_search"); 182 String searchi = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), name); 183 buffer.append("<input type=\"checkbox\" name=\"").append(name).append("\" "); 184 buffer.append("id=\"").append(fieldid).append("\" "); 185 if (searchi != null) { 186 buffer.append(" checked=\"checked\""); 187 } 188 buffer.append(" />"); 189 } 190 return buffer.toString(); 191 } 192 193 194 public void paramHtmlInput(ParamHandler handler, Field field) throws JspTagException { 195 String name = prefix(field.getName() + "_search"); 196 String searchi = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), name); 197 if (searchi != null) { 198 handler.addParameter(name, "yes"); 199 } 200 super.paramHtmlInput(handler, field); 201 } 202 203 204 207 public String whereHtmlInput(Field field) throws JspTagException { 208 String fieldName = field.getName(); 209 String id = prefix(fieldName + "_search"); 210 if ( (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), id) == null) { 211 return ""; 212 } else { 213 return super.whereHtmlInput(field); 214 } 215 } 216 217 218 public Constraint whereHtmlInput(Field field, Query query) throws JspTagException { 219 String fieldName = field.getName(); 220 String id = prefix(fieldName + "_search"); 221 if ( (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), id) == null) { 222 return null; 223 } else { 224 return super.whereHtmlInput(field, query); 225 } 226 } 227 228 229 230 } 231 | Popular Tags |