KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > bridge > jsp > taglib > typehandler > EnumHandler


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10
11 package org.mmbase.bridge.jsp.taglib.typehandler;
12
13 import javax.servlet.jsp.JspTagException JavaDoc;
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 /**
27  * This handler can be used to create option list by use of a resource.
28  *
29  * @author Michiel Meeuwissen
30  * @since MMBase-1.6
31  * @version $Id: EnumHandler.java,v 1.38 2006/06/06 17:47:43 michiel Exp $
32  */

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     /**
41      * @since MMBase-1.8
42      */

43     public EnumHandler(FieldInfoTag tag) throws JspTagException JavaDoc {
44         super(tag);
45         available = true;
46     }
47
48     /**
49      * @since MMBase-1.8
50      */

51     protected Iterator getIterator(Node node, Field field) throws JspTagException JavaDoc {
52         DataType dataType = field.getDataType();
53         Locale locale = tag.getLocale();
54         return dataType.getEnumerationValues(locale, tag.getCloudVar(), node, field);
55     }
56     /**
57      * @param tag
58      * @since MMBase-1.8
59      */

60     public EnumHandler(FieldInfoTag tag, Node node, Field field) throws JspTagException JavaDoc {
61         super(tag);
62         iterator = getIterator(node, field);
63         if (iterator == null) {
64             // backwards compatibility mode
65
String JavaDoc enumType = field.getGUIType();
66             try {
67                 Class.forName(enumType);
68             } catch (Exception JavaDoc ee) {
69                 try {
70                     String JavaDoc 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 JavaDoc type;
78                     switch(field.getType()) {
79                     case Field.TYPE_STRING: type = String JavaDoc.class; break;
80                     case Field.TYPE_INTEGER: type = Integer JavaDoc.class; break;
81                     case Field.TYPE_LONG: type = Long JavaDoc.class; break;
82
83                         // I wonder if enums for the following types could make any sense, but well:
84
case Field.TYPE_FLOAT: type = Float JavaDoc.class; break;
85                     case Field.TYPE_DOUBLE: type = Double JavaDoc.class; break;
86                     case Field.TYPE_BINARY: type = byte[].class; break;
87                     case Field.TYPE_XML: type = String JavaDoc.class; break; // Document.class ?
88
case Field.TYPE_NODE: type = Node.class; break;
89                         /*
90                           case Field.TYPE_DATETIME: type = Date.class; break;
91                           case Field.TYPE_BOOLEAN: type = Boolean.class; break;
92                           case Field.TYPE_LIST: // type = Boolean.class; break;
93                         */

94                     default: type = String JavaDoc.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 JavaDoc 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 JavaDoc {
110         return null;
111     }
112     public boolean isAvailable() {
113         return available;
114     }
115
116     protected Object JavaDoc cast(Object JavaDoc value, Node node, Field field) {
117         if ("".equals(value)) return null;
118         return field.getDataType().cast(value, node, field);
119     }
120
121     protected Object JavaDoc getFieldValue(Node node, Field field, boolean useDefault) throws JspTagException JavaDoc {
122         Object JavaDoc value = super.getFieldValue(node, field, useDefault);
123         // if an enum is required ('not null'), and no default value was specified, then we simply default to the first
124
// entry, as HTML rendering would do any way.
125
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 JavaDoc htmlInput(Node node, Field field, boolean search) throws JspTagException JavaDoc {
135         StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
136         String JavaDoc 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 JavaDoc 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 JavaDoc valueString = Casting.toString(value);
155         while(iterator != null && iterator.hasNext()) {
156             Map.Entry entry = (Map.Entry) iterator.next();
157             Object JavaDoc key = entry.getKey();
158             if (key == null) {
159                 log.warn("Found null as enumeration key for " + field.getDataType());
160                 continue;
161             }
162             String JavaDoc 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 JavaDoc searchs = (String JavaDoc) 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 JavaDoc name = prefix(field.getName()) + "_search";
181             String JavaDoc fieldid = prefixID(field.getName() + "_search");
182             String JavaDoc searchi = (String JavaDoc) 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 JavaDoc {
195         String JavaDoc name = prefix(field.getName() + "_search");
196         String JavaDoc searchi = (String JavaDoc) 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     /**
205      * @see TypeHandler#whereHtmlInput(Field)
206      */

207     public String JavaDoc whereHtmlInput(Field field) throws JspTagException JavaDoc {
208         String JavaDoc fieldName = field.getName();
209         String JavaDoc id = prefix(fieldName + "_search");
210         if ( (String JavaDoc) 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 JavaDoc {
219         String JavaDoc fieldName = field.getName();
220         String JavaDoc id = prefix(fieldName + "_search");
221         if ( (String JavaDoc) 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