KickJava   Java API By Example, From Geeks To Geeks.

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


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.bridge.util.Queries;
16 import org.mmbase.bridge.jsp.taglib.FieldInfoTag;
17 import org.mmbase.bridge.jsp.taglib.ParamHandler;
18 import org.mmbase.bridge.jsp.taglib.util.ContextContainer;
19
20
21 import org.mmbase.storage.search.*;
22
23 import org.mmbase.util.logging.Logging;
24 import org.mmbase.util.logging.Logger;
25
26 /**
27  * Handles the field-type LONG/relativetime
28  *
29  * @author Michiel Meeuwissen
30  * @since MMBase-1.7.2
31  * @version $Id: DurationHandler.java,v 1.6 2006/04/11 22:57:36 michiel Exp $
32  */

33 public class DurationHandler extends AbstractTypeHandler {
34
35     private static final Logger log = Logging.getLoggerInstance(DurationHandler.class);
36
37     private static int DATE_FACTOR = 1000; // MMBase stores dates in seconds not in milliseconds
38

39     /**
40      * @param tag
41      */

42     public DurationHandler(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         long currentValue = -1;
51         long currentHours = 0;
52         long currentMinutes = 0;
53         long currentSeconds = 0;
54         long currentMilliSeconds = 0;
55         if (node !=null) {
56             currentValue = node.getLongValue(field.getName());
57             long help = currentValue;
58             if (help < 0) help = 0;
59             currentMilliSeconds = help % 1000;
60             help /= 1000;
61             currentSeconds = help % 60;
62             help /= 60;
63             currentMinutes = help % 60;
64             currentHours = help / 60;
65         }
66
67         StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
68         buffer.append("<input type=\"hidden\" class=\"" + getClasses(field) + "\" name=\"");
69         buffer.append(prefix(field.getName()));
70         buffer.append("\" value=\"");
71         buffer.append(currentValue);
72         buffer.append("\" />");
73         // give also present value, this makes it possible to see if user changed this field.
74

75
76         ContextContainer container = tag.getContextProvider().getContextContainer();
77
78         if (search) { // operator drop-down
79
String JavaDoc name = prefix(field.getName() + "_search");
80             String JavaDoc fieldid = prefixID(field.getName() + "_search");
81             String JavaDoc searchi = (String JavaDoc) container.find(tag.getPageContext(), name);
82             if (searchi == null) searchi = "no";
83             buffer.append("<select name=\"").append(name).append("\" ");
84             buffer.append("id=\"").append(fieldid).append("\">\n");
85             buffer.append(" <option value=\"no\" ");
86             if (searchi.equals("no")) buffer.append(" selected=\"selected\" ");
87             buffer.append("> </option>");
88             buffer.append(" <option value=\"less\" ");
89             if (searchi.equals("less")) buffer.append(" selected=\"selected\" ");
90             buffer.append(">&lt;</option>");
91             buffer.append(" <option value=\"greater\" ");
92             if (searchi.equals("greater")) buffer.append(" selected=\"selected\" ");
93             buffer.append(">&gt;</option>");
94             buffer.append(" <option value=\"equal\" ");
95             if (searchi.equals("equal")) buffer.append(" selected=\"selected\" ");
96             buffer.append(">=</option>");
97             buffer.append("</select>");
98         }
99
100
101
102
103         String JavaDoc hoursName = prefix(field.getName() + "_hours");
104         String JavaDoc hoursId = prefixID(field.getName() + "_hours");
105         String JavaDoc searchHours = (String JavaDoc) container.find(tag.getPageContext(), hoursName);
106         buffer.append("<input size=\"5\" type=\"text\" name=\"").append(hoursName).append("\" id=\"").append(hoursId).append("\" ");
107         buffer.append("value=\"").append( (searchHours == null ? "" + currentHours : searchHours) ).append("\" /> h :\n");
108
109         String JavaDoc minutesName = prefix(field.getName() + "_minutes");
110         String JavaDoc minutesId = prefixID(field.getName() + "_minutes");
111         buffer.append("<select name=\"").append(minutesName).append("\" ");
112         buffer.append("id=\"").append(minutesId).append("\">\n");
113         for (int i = 0; i <= 59; i++) {
114             if (currentMinutes == i) {
115                 buffer.append(" <option selected=\"selected\">" + i + "</option>\n");
116             } else {
117                 buffer.append(" <option>" + i + "</option>\n");
118             }
119         }
120         buffer.append("</select> min : ");
121
122         String JavaDoc secondsName = prefix(field.getName() + "_seconds");
123         String JavaDoc secondsId = prefixID(field.getName() + "_seconds");
124         buffer.append("<select name=\"").append(secondsName).append("\" ");
125         buffer.append("id=\"").append(secondsId).append("\">\n");
126         for (int i = 0; i <= 59; i++) {
127             if (currentSeconds == i) {
128                 buffer.append(" <option selected=\"selected\">" + i + "</option>\n");
129             } else {
130                 buffer.append(" <option>" + i + "</option>\n");
131             }
132         }
133         buffer.append("</select> s . ");
134
135         String JavaDoc milliSecondsName = prefix(field.getName() + "_milliseconds");
136         String JavaDoc milliSecondsId = prefixID(field.getName() + "_milliseconds");
137         String JavaDoc searchMilliSeconds = (String JavaDoc) container.find(tag.getPageContext(), milliSecondsName);
138         buffer.append("<input size=\"5\" type=\"text\" name=\"").append(milliSecondsName).append("\" id=\"").append(milliSecondsId).append("\" ");
139         buffer.append("value=\"").append( (searchMilliSeconds == null ? "" + currentMilliSeconds : searchMilliSeconds) ).append("\" /> ms\n");
140
141         return buffer.toString();
142     }
143
144     /**
145      * @see TypeHandler#useHtmlInput(Node, Field)
146      */

147     public boolean useHtmlInput(Node node, Field field) throws JspTagException JavaDoc {
148
149         String JavaDoc fieldName = field.getName();
150         try {
151             long oldValue = node.getLongValue(fieldName);
152             long newValue = getSpecifiedValue(field);
153             if (oldValue != newValue) {
154                 node.setLongValue(fieldName, newValue);
155                 return true;
156             }
157         } catch (java.lang.NumberFormatException JavaDoc e) {
158             throw new JspTagException JavaDoc("Not a valid number (" + e.toString() + ") in field " + fieldName);
159         }
160         return false;
161     }
162
163
164     protected long getSpecifiedValue(Field field) throws JspTagException JavaDoc {
165         try {
166             String JavaDoc fieldName = field.getName();
167             Integer JavaDoc hours = new Integer JavaDoc( (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_hours")));
168             Integer JavaDoc minutes = new Integer JavaDoc( (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_minutes")));
169             Integer JavaDoc seconds = new Integer JavaDoc( (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_seconds")));
170             Integer JavaDoc milliSeconds = new Integer JavaDoc( (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_milliseconds")));
171             return (long) milliSeconds.intValue() + 1000 * (seconds.intValue() + 60 * (minutes.intValue() + 60 * hours.intValue()));
172         } catch (java.lang.NumberFormatException JavaDoc e) {
173             throw new JspTagException JavaDoc("Not a valid number (" + e.toString() + ")");
174         }
175     }
176
177     /**
178      * @see TypeHandler#whereHtmlInput(Field)
179      */

180     public String JavaDoc whereHtmlInput(Field field) throws JspTagException JavaDoc {
181      String JavaDoc fieldName = field.getName();
182         String JavaDoc operator = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_search"));
183         if (operator == null || operator.equals("no")) {
184             return null;
185         }
186
187         long time = getSpecifiedValue(field);
188         if (time == -1) return null;
189
190         if (operator.equals("greater")) {
191             return "( [" + fieldName + "] >" + time + ")";
192         } else if (operator.equals("smaller")) {
193             return "( [" + fieldName + "] <" + time + ")";
194         } else if (operator.equals("equal")) {
195
196             String JavaDoc options = tag.getOptions();
197             if (options != null && options.indexOf("date") > -1) {
198                 return "( [" + fieldName + "] >= " + time + " AND [" + fieldName + "] < " + (time + 24 * 60 * 60) + ")";
199             } else {
200                 return "( [" + fieldName + "] = " + time + ")";
201             }
202         } else {
203             log.warn("Found unknown operator value '" + operator + "'");
204             return null;
205         }
206     }
207
208     public Constraint whereHtmlInput(Field field, Query query) throws JspTagException JavaDoc {
209         String JavaDoc fieldName = field.getName();
210         String JavaDoc operator = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_search"));
211         if (operator == null || operator.equals("no")) {
212             return null;
213         }
214
215         Long JavaDoc time = new Long JavaDoc(getSpecifiedValue(field));
216
217         if (query.getSteps().size() > 1) {
218             fieldName = field.getNodeManager().getName()+"."+fieldName;
219         }
220         Constraint con;
221         if (operator.equals("greater")) {
222             con = Queries.createConstraint(query, fieldName, FieldCompareConstraint.GREATER, time);
223         } else if (operator.equals("less")) {
224             con = Queries.createConstraint(query, fieldName, FieldCompareConstraint.LESS, time);
225         } else if (operator.equals("equal")) {
226             String JavaDoc options = tag.getOptions();
227             if (options != null && options.indexOf("date") > -1) {
228                 con = Queries.createConstraint(query, fieldName, Queries.OPERATOR_BETWEEN, time, new Long JavaDoc(time.longValue() + 24 * 60 * 60), false);
229             } else {
230                 con = Queries.createConstraint(query, fieldName, FieldCompareConstraint.EQUAL, time);
231             }
232         } else {
233             log.warn("Found unknown operator value '" + operator + "'");
234             return null;
235         }
236         Queries.addConstraint(query, con);
237         return con;
238
239     }
240
241     public void paramHtmlInput(ParamHandler handler, Field field) throws JspTagException JavaDoc {
242         String JavaDoc fieldName = field.getName();
243         String JavaDoc operator = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_search"));
244         if (operator == null || operator.equals("no")) {
245             return;
246         }
247         handler.addParameter(prefix(fieldName + "_search"), operator);
248
249         String JavaDoc hours = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_hours"));
250         String JavaDoc minutes = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_minutes"));
251         String JavaDoc seconds = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_seconded"));
252         String JavaDoc milliseconds = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_milliseconds"));
253         handler.addParameter(prefix(fieldName + "_hours"), hours);
254         handler.addParameter(prefix(fieldName + "_minutes"), minutes);
255         handler.addParameter(prefix(fieldName + "_seconds"), seconds);
256         handler.addParameter(prefix(fieldName + "_milliseconds"), milliseconds);
257     }
258
259
260
261 }
262
Popular Tags