KickJava   Java API By Example, From Geeks To Geeks.

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


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
15 import org.mmbase.bridge.*;
16 import org.mmbase.bridge.jsp.taglib.FieldInfoTag;
17 import org.mmbase.datatypes.StringDataType;
18 import org.mmbase.datatypes.DataType;
19 import org.mmbase.storage.search.*;
20 import org.mmbase.util.transformers.Xml;
21 import org.mmbase.util.transformers.Sql;
22 import org.mmbase.util.logging.Logger;
23 import org.mmbase.util.logging.Logging;
24
25 /**
26  * A TypeHandler for strings, textareas and text-input.
27  * Search values are SQL escaped.
28  *
29  * @author Gerard van de Looi
30  * @author Michiel Meeuwissen
31  * @since MMBase-1.6
32  * @version $Id: StringHandler.java,v 1.58 2006/07/09 13:48:06 michiel Exp $
33  */

34
35 public class StringHandler extends AbstractTypeHandler {
36
37     private static final Logger log = Logging.getLoggerInstance(StringHandler.class);
38
39     /**
40      * Constructor for StringHandler.
41      */

42     public StringHandler(FieldInfoTag tag) {
43         super(tag);
44     }
45
46     /**
47      * @see TypeHandler#htmlInput(Node, Field, boolean)
48      */

49     public String JavaDoc htmlInput(Node node, Field field, boolean search) throws JspTagException JavaDoc {
50         eh = getEnumHandler(node, field);
51         if (eh != null) {
52             return eh.htmlInput(node, field, search);
53         }
54
55         if(! search) {
56             StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
57             try {
58                 Object JavaDoc v = getFieldValue(node, field, true);
59                 String JavaDoc value = org.mmbase.util.Casting.toString(v);
60                 value = tag.decode(value, node);
61                 StringDataType dataType = (StringDataType) field.getDataType();
62
63                 if (dataType.getPattern().matcher("\n").matches()) {
64                     if(field.getMaxLength() > 2048) {
65                         // the wrap attribute is not valid in XHTML, but it is really needed for netscape < 6
66
// wrap attribute removed, we want to produce valid XHTML, and who is still using netscape < 6?
67
buffer.append("<textarea class=\"big " + getClasses(field) + "\" rows=\"10\" cols=\"80\" ");
68                     } else {
69                         buffer.append("<textarea class=\"small " + getClasses(field) + "\" rows=\"5\" cols=\"80\" ");
70                     }
71                     addExtraAttributes(buffer);
72                     buffer.append("name=\"").append(prefix(field.getName())).append("\" ");
73                     buffer.append("id=\"").append(prefixID(field.getName())).append("\">");
74                     if ("".equals(value)) {
75                         String JavaDoc opt = tag.getOptions();
76                         if (opt != null && opt.indexOf("noempty") > -1) {
77                             // This can be needed because:
78
// If included, e.g. with xmlhttprequest,
79
// the textarea can collaps: <textarea />
80
// This does not work in either FF or IE if the contenttype is text/html
81
// The more logical contenttype application/xml or text/xml would make it behave normally in FF,
82
// but that is absolutely not supported by IE. IE sucks. FF too, but less so.
83
//
84
// Any how, in short, sometimes you _must_ output one space here if empty otherwise.
85
// I _reall_ cannot think of anything more sane then this.
86
// e.g. <!-- empty --> would simply produce a textarea containing that...
87
// also <![CDATA[]]> produces a textarea containing that...
88
//
89
// HTML is broken.
90

91                             buffer.append(" ");
92                         }
93                     } else {
94                         Xml.XMLEscape(value, buffer);
95                     }
96                     buffer.append("</textarea>");
97                 } else { // not 'field' perhaps it's 'string'.
98
buffer.append("<input class=\"small " + getClasses(field) + "\" type=\"").append(dataType.isPassword() ? "password" : "text").append("\" size=\"80\" ");
99                     buffer.append("name=\"").append(prefix(field.getName())).append("\" ");
100                     buffer.append("id=\"").append(prefixID(field.getName())).append("\" ");
101                     String JavaDoc opt = tag.getOptions();
102                     if (opt != null && opt.indexOf("noautocomplete") > -1) {
103                         buffer.append("autocomplete=\"off\" ");
104                     }
105                     addExtraAttributes(buffer);
106                     buffer.append("value=\"");
107                     Xml.XMLEscape(value, buffer);
108                     buffer.append("\" />");
109                 }
110             } catch (ClassCastException JavaDoc cce) {
111                 DataType dt = field.getDataType();
112                 log.error("Expected StringDataType for field " + field + " but found " + dt.getClass().getName() + ":"+ dt);
113                 throw cce;
114             }
115             return buffer.toString();
116         } else { // in case of search
117
return super.htmlInput(node, field, search);
118         }
119     }
120
121     /**
122      * @see TypeHandler#useHtmlInput(Node, Field)
123      */

124     public boolean useHtmlInput(Node node, Field field) throws JspTagException JavaDoc {
125         String JavaDoc guiType = field.getGUIType();
126
127         if (guiType.indexOf('.') > 0) {
128             EnumHandler eh = new EnumHandler(tag, node, field);
129             if (eh.isAvailable()) {
130                 return eh.useHtmlInput(node, field);
131             }
132         }
133         String JavaDoc fieldValue = (String JavaDoc) getFieldValue(field);
134
135         if (fieldValue != null) {
136             String JavaDoc fieldName = field.getName();
137             if (! fieldValue.equals(node.getValue(fieldName))) {
138                 if (fieldValue.equals("") && node.getValue(fieldName) == null) return false;
139                 node.setStringValue(fieldName, fieldValue);
140                 return true;
141             }
142         }
143
144         return false;
145     }
146     protected Object JavaDoc getFieldValue(Field field) throws JspTagException JavaDoc {
147         String JavaDoc fieldName = field.getName();
148         String JavaDoc fieldValue = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName));
149
150         fieldValue = tag.encode(fieldValue, field);
151         if (fieldValue != null) {
152             String JavaDoc opt = tag.getOptions();
153             if (opt != null && opt.indexOf("trim") > -1) {
154                 fieldValue = fieldValue.trim();
155             }
156         }
157         if (log.isDebugEnabled()) {
158             log.debug("Received '" + fieldValue + "' for " + field + " " + tag.getOptions());
159         }
160         return fieldValue;
161     }
162
163     protected boolean interpretEmptyAsNull(Field field) {
164         return false; //field.getDataType().isRequired();
165
}
166
167     /**
168      * @see TypeHandler#whereHtmlInput(Field)
169      */

170     public String JavaDoc whereHtmlInput(Field field) throws JspTagException JavaDoc {
171         EnumHandler eh = getEnumHandler(null, field);
172         if (eh != null) {
173             return eh.whereHtmlInput(field);
174         }
175         String JavaDoc search = findString(field);
176         if (search == null) return null;
177
178         Sql sql = new Sql(Sql.ESCAPE_QUOTES);
179         return "( UPPER( [" + field.getName() + "] ) LIKE '%" + sql.transform(search.toUpperCase()) + "%')";
180         // cannot call getSearvhValue, because sql excaping is done twice then :-(
181
}
182
183     protected int getOperator() {
184         return FieldCompareConstraint.LIKE;
185     }
186     protected String JavaDoc getSearchValue(String JavaDoc string) {
187         return "%" + string.toUpperCase() + "%";
188     }
189    public Constraint whereHtmlInput(Field field, Query query) throws JspTagException JavaDoc {
190         EnumHandler eh = getEnumHandler(null, field);
191         if (eh != null) {
192             return eh.whereHtmlInput(field, query);
193         }
194        Constraint cons = super.whereHtmlInput(field, query);
195
196        if (cons != null) {
197            if (! (cons instanceof FieldConstraint)) {
198                throw new JspTagException JavaDoc("Found an instance of " + cons.getClass().getName() + " while expected a field-constraint");
199            }
200            query.setCaseSensitive((FieldConstraint) cons, false);
201        }
202
203        return cons;
204    }
205
206 }
207
Popular Tags