KickJava   Java API By Example, From Geeks To Geeks.

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


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 java.util.*;
14
15 import java.text.SimpleDateFormat JavaDoc;
16 import javax.servlet.jsp.JspTagException JavaDoc;
17
18 import org.mmbase.bridge.*;
19 import org.mmbase.datatypes.*;
20 import org.mmbase.bridge.util.Queries;
21 import org.mmbase.bridge.jsp.taglib.*;
22 import org.mmbase.bridge.jsp.taglib.util.ContextContainer;
23 import org.mmbase.storage.search.*;
24 import org.mmbase.util.Casting;
25
26 import org.mmbase.util.logging.Logging;
27 import org.mmbase.util.logging.Logger;
28
29 /**
30  * @author Michiel Meeuwissen
31  * @author Vincent vd Locht
32  * @since MMBase-1.6
33  * @version $Id: DateHandler.java,v 1.47 2006/07/08 13:04:47 michiel Exp $
34  */

35 public class DateHandler extends AbstractTypeHandler {
36
37     private static final Logger log = Logging.getLoggerInstance(DateHandler.class);
38
39     private static boolean EXIST_YEAR_0 = false;
40     private static final SimpleDateFormat JavaDoc dateFormat = new SimpleDateFormat JavaDoc("yyyy-MM-dd HH:mm:ss.SSS");
41
42     /**
43      * @param tag
44      */

45     public DateHandler(FieldInfoTag tag) {
46         super(tag);
47     }
48
49
50     private Calendar getInstance() throws JspTagException JavaDoc {
51         return Calendar.getInstance(tag.getTimeZone());
52     }
53
54     private void yearFieldValue(Calendar cal, StringBuffer JavaDoc buffer) {
55         if (EXIST_YEAR_0) {
56             // the year '0' does not really exist in gregorian, So 4 BC == -3, 1 BC == 0
57
if(cal.get(Calendar.ERA) == java.util.GregorianCalendar.BC) {
58                 buffer.append("-");
59                 buffer.append(cal.get(Calendar.YEAR) - 1);
60             } else {
61                 buffer.append(cal.get(Calendar.YEAR));
62             }
63         } else {
64             // perhaps this is simpler..
65
if(cal.get(Calendar.ERA) == java.util.GregorianCalendar.BC) {
66                 buffer.append("-");
67             }
68             buffer.append(cal.get(Calendar.YEAR));
69         }
70     }
71
72
73     protected DateTimePattern getPattern(DataType dt) throws JspTagException JavaDoc {
74         DateTimePattern dateTimePattern;
75         if (! (dt instanceof DateTimeDataType)) {
76             // backwards compatibility
77
String JavaDoc options = tag.getOptions();
78             boolean doDate = true;
79             boolean doTime = true;
80             if (options != null) {
81                 boolean time = false;
82                 if (options.indexOf("time") > -1) {
83                     doTime = true;
84                     time = true;
85                     doDate = false;
86
87                 }
88                 if (options.indexOf("date") > -1) {
89                     doDate = true;
90                     doTime = time;
91                 }
92             }
93             StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
94             if (doDate) {
95                 buf.append("yyyy-MM-dd");
96             }
97             if (doTime) {
98                 if (buf.length() > 0) buf.append(" ");
99                 buf.append("HH'h':mm'm':ss's'");
100             }
101             dateTimePattern = new DateTimePattern(buf.toString());
102         } else {
103             dateTimePattern = ((DateTimeDataType) dt).getPattern();
104         }
105         return dateTimePattern;
106
107
108     }
109
110     /**
111      * Returns the field value as specified by the client's post.
112      */

113     protected Object JavaDoc getFieldValue(Field field) throws JspTagException JavaDoc {
114         Calendar cal = getSpecifiedValue(field, getInstance());
115         return cal == null ? null : cal.getTime();
116     }
117
118     /**
119      * @see TypeHandler#htmlInput(Node, Field, boolean)
120      */

121     public String JavaDoc htmlInput(Node node, Field field, boolean search) throws JspTagException JavaDoc {
122
123         StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
124         boolean required = field.getDataType().isRequired();
125
126         Calendar cal = getCalendarValue(node, field);
127         buffer.append("<span class=\"mm_datetime " + getClasses(field) + "\">");
128         buffer.append("<input type=\"hidden\" name=\"");
129         buffer.append(prefix(field.getName()));
130         buffer.append("\" value=\"");
131         if (cal != null) {
132             buffer.append(cal.getTime().getTime() / 1000);
133         }
134         buffer.append("\" />");
135         // give also present value, this makes it possible to see if user changed this field.
136

137         ContextContainer container = tag.getContextProvider().getContextContainer();
138         if (search) {
139             String JavaDoc name = prefix(field.getName() + "_search");
140             String JavaDoc fieldid = prefixID(field.getName() + "_search");
141             String JavaDoc searchi = (String JavaDoc) container.find(tag.getPageContext(), name);
142             if (searchi == null) searchi = "no";
143             buffer.append("<select name=\"").append(name).append("\" ");
144             buffer.append("id=\"").append(fieldid).append("\" class=\"mm_search\">");
145             buffer.append("<option value=\"no\" ");
146             if (searchi.equals("no")) buffer.append(" selected=\"selected\" ");
147             buffer.append(">&nbsp;</option>");
148             buffer.append("<option value=\"less\" ");
149             if (searchi.equals("less")) buffer.append(" selected=\"selected\" ");
150             buffer.append(">&lt;</option>");
151             buffer.append("<option value=\"greater\" ");
152             if (searchi.equals("greater")) buffer.append(" selected=\"selected\" ");
153             buffer.append(">&gt;</option>");
154             buffer.append("<option value=\"equal\" ");
155             if (searchi.equals("equal")) buffer.append(" selected=\"selected\" ");
156             buffer.append(">=</option>");
157             buffer.append("</select>");
158         }
159         DataType dt = field.getDataType();
160         DateTimePattern dateTimePattern = getPattern(dt);
161         Calendar minDate = getInstance();
162         Calendar maxDate = getInstance();
163         if (dt instanceof DateTimeDataType) {
164             Date min = ((DateTimeDataType) dt).getMin();
165             minDate.setTime(min);
166             Date max = ((DateTimeDataType) dt).getMax();
167             maxDate.setTime(max);
168         } else {
169             minDate.setTime(new Date(Long.MIN_VALUE));
170             maxDate.setTime(new Date(Long.MAX_VALUE));
171         }
172
173
174         Locale locale = tag.getLocale();
175         List parsed = dateTimePattern.getList(locale);
176
177         Iterator parsedPattern = parsed.iterator();
178         boolean first = true;
179         while(parsedPattern.hasNext()) {
180             String JavaDoc pattern = (String JavaDoc) parsedPattern.next();
181             if (pattern.length() < 1) continue;
182             char firstChar = pattern.charAt(0);
183             if (firstChar == '\'') {
184                 buffer.append(pattern.substring(1));
185                 continue;
186             }
187
188             DateTimePattern.Element element = DateTimePattern.getElement(firstChar, minDate, maxDate);
189             if (element == null) {
190                 continue;
191             }
192
193             String JavaDoc name = prefix(field.getName() + "_" + element.getName());
194             String JavaDoc fieldid = prefixID(field.getName() + "_" + element.getName());
195             String JavaDoc searchValue = (String JavaDoc) container.find(tag.getPageContext(), name);
196             int check;
197             if (searchValue == null || searchValue.equals("")) {
198                 if (cal != null) {
199                     check = cal.get(element.getField()) + element.getOffset();
200                 } else {
201                     check = -1;
202                 }
203             } else {
204                 check = Integer.parseInt(searchValue);
205             }
206
207             if (element.getMax() - element.getMin() < 200) {
208                 buffer.append("<select class=\"mm_datetime_").append(element.getName()).append("\" ");
209                 buffer.append("name=\"").append(name).append("\" ");
210                 buffer.append("id=\"").append(fieldid).append("\" ");
211                 addExtraAttributes(buffer);
212                 buffer.append(">");
213                 String JavaDoc checkOption = " <option selected=\"selected\" value=\"" + check + "\">" +
214                     (check == -1 ? "--" : element.toString(check - element.getOffset(), locale, pattern.length())) +
215                     "</option>";
216                 if (! required && first) {
217                     if (check == -1) {
218                         buffer.append(checkOption);
219                     } else {
220                         buffer.append("<option value=\"-1\">--</option>");
221                     }
222                 }
223                 if (check > -1 && check < element.getMin()) {
224                     buffer.append(checkOption);
225                 }
226                 for (int i = element.getMin(); i <= element.getMax(); i++) {
227                     if (firstChar == 'y' && i == 0 && ! EXIST_YEAR_0) continue;
228                     if (check == i) {
229                         buffer.append(checkOption);
230                     } else {
231                         String JavaDoc val = element.toString(i - element.getOffset(), locale, pattern.length());
232                         buffer.append("<option value=\"" + i + "\">" + val + "</option>");
233                     }
234                 }
235                 if (check > element.getMax()) {
236                     buffer.append(checkOption);
237                 }
238                 buffer.append("</select>");
239             } else {
240                 buffer.append("<input class=\"mm_datetime_").append(element.getName()).append("\" type=\"text\" size=\"").append( (pattern.length() + 1) ).append("\" ");
241                 buffer.append("name=\"").append(name).append("\" ");
242                 buffer.append("id=\"").append(fieldid).append("\" ");
243                 addExtraAttributes(buffer);
244                 buffer.append("value=\"");
245                 if (searchValue == null) {
246                     if (cal != null) {
247                         buffer.append(cal.get(element.getField()));
248                     } else {
249                         buffer.append("");
250                     }
251                 } else {
252                     buffer.append(searchValue);
253                 }
254                 buffer.append("\" />");
255             }
256             first = false;
257
258         }
259
260         buffer.append("</span>");
261         return buffer.toString();
262     }
263
264     /**
265      * Just to override. For example if the date is stored in an int and not in a long, then the year can be checked.
266      *
267      * @return int
268      */

269
270     protected int checkYear(int y, String JavaDoc fieldName) throws JspTagException JavaDoc {
271         if (! EXIST_YEAR_0) {
272             if (y == 0) throw new JspTagException JavaDoc("The year '0' does not exist and cannot be used for field '" + fieldName + "'");
273             if (y < 0) y++; // This makes that year BC 1 = -1 in stead of BC 1 = 0 (which seems to be the java way)
274
}
275         return y;
276     }
277
278     /**
279      * @see TypeHandler#useHtmlInput(Node, Field)
280      */

281     public boolean useHtmlInput(Node node, Field field) throws JspTagException JavaDoc {
282         String JavaDoc fieldName = field.getName();
283         Calendar cal = getInstance();
284         Object JavaDoc oldValue = node.getValue(fieldName);
285         if (oldValue != null) {
286             oldValue = node.getDateValue(fieldName);
287             cal.setTime((Date) oldValue);
288         } else {
289             cal.clear();
290         }
291
292         Calendar newCal = getSpecifiedValue(field, cal);
293         Date newValue = newCal == null ? null : newCal.getTime();
294         if (oldValue == null) {
295             if (newValue != null) {
296                 node.setDateValue(fieldName, newValue);
297                 return true;
298             }
299         } else if (!oldValue.equals(newValue)) {
300             node.setDateValue(fieldName, newValue);
301             return true;
302         }
303
304         return false;
305     }
306
307
308     /**
309      * @return The given Calendar instance or <code>null</code>
310      */

311     protected Calendar getSpecifiedValue(final Field field, Calendar cal) throws JspTagException JavaDoc {
312         String JavaDoc fieldName = field.getName();
313         DataType dt = field.getDataType();
314         if (log.isDebugEnabled()) {
315             log.debug("Using " + dt);
316         }
317         DateTimePattern dateTimePattern = getPattern(dt);
318         Calendar minDate = getInstance();
319         minDate.setTime(DateTimeDataType.MIN_VALUE);
320         Calendar maxDate = getInstance();
321         maxDate.setTime(DateTimeDataType.MAX_VALUE);
322
323
324         Locale locale = tag.getLocale();
325         List parsed = dateTimePattern.getList(locale);
326         Iterator parsedPattern = parsed.iterator();
327         boolean first = true;
328         while(parsedPattern.hasNext()) {
329             String JavaDoc pattern = (String JavaDoc) parsedPattern.next();
330             if (pattern.length() < 1) continue;
331             char firstChar = pattern.charAt(0);
332             if (firstChar == '\'') {
333                 continue;
334             }
335             DateTimePattern.Element element = DateTimePattern.getElement(firstChar, minDate, maxDate);
336             if (element == null) {
337                 continue;
338             }
339             try {
340                 String JavaDoc string = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_" + element.getName()));
341                 if (string == null || "".equals(string)) {
342                     cal = null;
343                 } else {
344                     int value = Integer.parseInt(string);
345                     if (value == element.getNullValue()) {
346                         cal = null;
347                     } else {
348                         if (cal != null) {
349                             cal.set(element.getField(), value - element.getOffset());
350                         }
351                     }
352                 }
353             } catch (java.lang.NumberFormatException JavaDoc e) {
354                 throw new TaglibException("Not a valid number (" + e.toString() + ") in field " + fieldName, e);
355             }
356         }
357
358         return cal;
359     }
360     protected Object JavaDoc getFieldValue(Node node, Field field, boolean useDefault) throws JspTagException JavaDoc {
361         Calendar cal = getCalendarValue(node, field);
362         return cal == null ? null : cal.getTime();
363     }
364     protected Calendar getCalendarValue(Node node, Field field) throws JspTagException JavaDoc {
365         Calendar cal = Calendar.getInstance();
366         cal.set(0, 0, 0, 0, 0, 0);
367         cal.set(Calendar.MILLISECOND, 0);
368         cal = getSpecifiedValue(field, cal);
369         if (cal == null) {
370             if (node != null) {
371                 Object JavaDoc value = node.getValue(field.getName());
372                 if (value != null) {
373                     cal = getInstance();
374                     cal.setTime(node.getDateValue(field.getName()));
375                 } else {
376                     cal = null;
377                 }
378             } else {
379                 Object JavaDoc def = field.getDataType().getDefaultValue();
380                 if (def != null) {
381                     cal = getInstance();
382                     cal.setTime(Casting.toDate(def));
383                 } else {
384                     if (! field.getDataType().isRequired()) {
385                         cal = null;
386                     } else {
387                         cal = getInstance();
388                     }
389                 }
390             }
391         }
392         return cal;
393     }
394
395     /**
396      * @see TypeHandler#whereHtmlInput(Field)
397      */

398     public String JavaDoc whereHtmlInput(Field field) throws JspTagException JavaDoc {
399         String JavaDoc fieldName = field.getName();
400         String JavaDoc operator = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_search"));
401         if (operator == null || operator.equals("no")) {
402             return null;
403         }
404
405         Date timeValue = getSpecifiedValue(field, getInstance()).getTime();
406
407         String JavaDoc time;
408         if (field.getType() == Field.TYPE_DATETIME) {
409             time = dateFormat.format(timeValue);
410         } else {
411             time = "" + Casting.toLong(timeValue);
412         }
413
414         if (operator.equals("greater")) {
415             return "( [" + fieldName + "] >" + time + ")";
416         } else if (operator.equals("smaller")) {
417             return "( [" + fieldName + "] <" + time + ")";
418         } else if (operator.equals("equal")) {
419
420             String JavaDoc options = tag.getOptions();
421             if (options != null && options.indexOf("date") > -1) {
422                 return "( [" + fieldName + "] >= " + time + " AND [" + fieldName + "] < " + (time + 24 * 60 * 60) + ")";
423             } else {
424                 return "( [" + fieldName + "] = " + time + ")";
425             }
426         } else {
427             log.warn("Found unknown operator value '" + operator + "'");
428             return null;
429         }
430     }
431
432     public Constraint whereHtmlInput(Field field, Query query) throws JspTagException JavaDoc {
433         String JavaDoc fieldName = field.getName();
434         String JavaDoc operator = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_search"));
435         if (operator == null || operator.equals("no")) {
436             return null;
437         }
438
439         Object JavaDoc time = getSpecifiedValue(field, getInstance()).getTime();
440         if (field.getType() != Field.TYPE_DATETIME) {
441             time = new Long JavaDoc(Casting.toLong(time));
442         }
443
444         // expand fieldname with nodemanager name if needed
445
if (query.getSteps().size() > 1) {
446             fieldName = field.getNodeManager().getName()+"."+fieldName;
447         }
448
449         Constraint con;
450         if (operator.equals("greater")) {
451             con = Queries.createConstraint(query, fieldName, FieldCompareConstraint.GREATER, time);
452         } else if (operator.equals("less")) {
453             con = Queries.createConstraint(query, fieldName, FieldCompareConstraint.LESS, time);
454         } else if (operator.equals("equal")) {
455             String JavaDoc options = tag.getOptions();
456             if (options != null && options.indexOf("date") > -1) {
457                 Object JavaDoc nextTime;
458                 if (field.getType() == Field.TYPE_DATETIME) {
459                     nextTime = new Date(((Date)time).getTime() + 24 * 60 * 60 * 1000);
460                 } else {
461                     nextTime = new Long JavaDoc(((Long JavaDoc)time).longValue() + 24 * 60 * 60);
462                 }
463                 con = Queries.createConstraint(query, fieldName, Queries.OPERATOR_BETWEEN, time, nextTime, false);
464             } else {
465                 con = Queries.createConstraint(query, fieldName, FieldCompareConstraint.EQUAL, time);
466             }
467         } else {
468             log.warn("Found unknown operator value '" + operator + "'");
469             return null;
470         }
471         Queries.addConstraint(query, con);
472         return con;
473
474     }
475
476     public void paramHtmlInput(ParamHandler handler, Field field) throws JspTagException JavaDoc {
477         String JavaDoc fieldName = field.getName();
478         String JavaDoc operator = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_search"));
479         if (operator == null || operator.equals("no")) {
480             return;
481         }
482         handler.addParameter(prefix(fieldName + "_search"), operator);
483
484         String JavaDoc options = tag.getOptions();
485         if (options == null || options.indexOf("time") > -1) {
486             String JavaDoc hour = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_hour"));
487             String JavaDoc minute = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_minute"));
488             String JavaDoc second = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_second"));
489             handler.addParameter(prefix(fieldName + "_hour"), hour);
490             handler.addParameter(prefix(fieldName + "_minute"), minute);
491             handler.addParameter(prefix(fieldName + "_second"), second);
492         }
493         String JavaDoc day = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_day"));
494         String JavaDoc month = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_month"));
495         String JavaDoc year = (String JavaDoc) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_year"));
496         handler.addParameter(prefix(fieldName + "_day"), day);
497         handler.addParameter(prefix(fieldName + "_month"), month);
498         handler.addParameter(prefix(fieldName + "_year"), year);
499     }
500 }
501
Popular Tags