1 10 11 package org.mmbase.bridge.jsp.taglib.typehandler; 12 13 import java.util.*; 14 15 import java.text.SimpleDateFormat ; 16 import javax.servlet.jsp.JspTagException ; 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 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 dateFormat = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss.SSS"); 41 42 45 public DateHandler(FieldInfoTag tag) { 46 super(tag); 47 } 48 49 50 private Calendar getInstance() throws JspTagException { 51 return Calendar.getInstance(tag.getTimeZone()); 52 } 53 54 private void yearFieldValue(Calendar cal, StringBuffer buffer) { 55 if (EXIST_YEAR_0) { 56 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 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 { 74 DateTimePattern dateTimePattern; 75 if (! (dt instanceof DateTimeDataType)) { 76 String 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 buf = new StringBuffer (); 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 113 protected Object getFieldValue(Field field) throws JspTagException { 114 Calendar cal = getSpecifiedValue(field, getInstance()); 115 return cal == null ? null : cal.getTime(); 116 } 117 118 121 public String htmlInput(Node node, Field field, boolean search) throws JspTagException { 122 123 StringBuffer buffer = new StringBuffer (); 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 137 ContextContainer container = tag.getContextProvider().getContextContainer(); 138 if (search) { 139 String name = prefix(field.getName() + "_search"); 140 String fieldid = prefixID(field.getName() + "_search"); 141 String searchi = (String ) 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("> </option>"); 148 buffer.append("<option value=\"less\" "); 149 if (searchi.equals("less")) buffer.append(" selected=\"selected\" "); 150 buffer.append("><</option>"); 151 buffer.append("<option value=\"greater\" "); 152 if (searchi.equals("greater")) buffer.append(" selected=\"selected\" "); 153 buffer.append(">></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 pattern = (String ) 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 name = prefix(field.getName() + "_" + element.getName()); 194 String fieldid = prefixID(field.getName() + "_" + element.getName()); 195 String searchValue = (String ) 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 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 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 269 270 protected int checkYear(int y, String fieldName) throws JspTagException { 271 if (! EXIST_YEAR_0) { 272 if (y == 0) throw new JspTagException ("The year '0' does not exist and cannot be used for field '" + fieldName + "'"); 273 if (y < 0) y++; } 275 return y; 276 } 277 278 281 public boolean useHtmlInput(Node node, Field field) throws JspTagException { 282 String fieldName = field.getName(); 283 Calendar cal = getInstance(); 284 Object 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 311 protected Calendar getSpecifiedValue(final Field field, Calendar cal) throws JspTagException { 312 String 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 pattern = (String ) 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 string = (String ) 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 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 getFieldValue(Node node, Field field, boolean useDefault) throws JspTagException { 361 Calendar cal = getCalendarValue(node, field); 362 return cal == null ? null : cal.getTime(); 363 } 364 protected Calendar getCalendarValue(Node node, Field field) throws JspTagException { 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 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 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 398 public String whereHtmlInput(Field field) throws JspTagException { 399 String fieldName = field.getName(); 400 String operator = (String ) 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 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 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 { 433 String fieldName = field.getName(); 434 String operator = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_search")); 435 if (operator == null || operator.equals("no")) { 436 return null; 437 } 438 439 Object time = getSpecifiedValue(field, getInstance()).getTime(); 440 if (field.getType() != Field.TYPE_DATETIME) { 441 time = new Long (Casting.toLong(time)); 442 } 443 444 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 options = tag.getOptions(); 456 if (options != null && options.indexOf("date") > -1) { 457 Object 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 (((Long )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 { 477 String fieldName = field.getName(); 478 String operator = (String ) 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 options = tag.getOptions(); 485 if (options == null || options.indexOf("time") > -1) { 486 String hour = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_hour")); 487 String minute = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_minute")); 488 String second = (String ) 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 day = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_day")); 494 String month = (String ) tag.getContextProvider().getContextContainer().find(tag.getPageContext(), prefix(fieldName + "_month")); 495 String year = (String ) 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 |