1 /* 2 * $Id: DatePropertyEditor.java 20320 2010-11-24 15:03:31Z dfeist $ 3 * -------------------------------------------------------------------------------------- 4 * Copyright (c) MuleSource, Inc. All rights reserved. http://www.mulesource.com 5 * 6 * The software in this package is published under the terms of the CPAL v1.0 7 * license, a copy of which has been included with this distribution in the 8 * LICENSE.txt file. 9 */ 10 package org.mule.config.spring.editors; 11 12 import java.beans.PropertyEditorSupport; 13 import java.text.DateFormat; 14 import java.text.ParseException; 15 import java.util.Date; 16 17 import org.springframework.util.StringUtils; 18 19 /** 20 * Handles the conversion of date strings in {@link java.util.Date} objects. 21 */ 22 public class DatePropertyEditor extends PropertyEditorSupport 23 { 24 25 private DateFormat dateFormat; 26 27 private DateFormat shortDateFormat; 28 29 private final boolean allowEmpty; 30 31 private final int exactDateLength; 32 33 34 /** 35 * Create a new CustomDateEditor instance, using the given DateFormat 36 * for parsing and rendering. 37 * <p>The "allowEmpty" parameter states if an empty String should 38 * be allowed for parsing, i.e. get interpreted as null value. 39 * Otherwise, an IllegalArgumentException gets thrown in that case. 40 * @param longDateFormat DateFormat to use for parsing and rendering 41 * @param shortDateFormat a short form of DateFormat to use for parsing and rendering 42 * @param allowEmpty if empty strings should be allowed 43 */ 44 public DatePropertyEditor(DateFormat longDateFormat, DateFormat shortDateFormat, boolean allowEmpty) { 45 this.dateFormat = longDateFormat; 46 this.shortDateFormat = shortDateFormat; 47 this.allowEmpty = allowEmpty; 48 this.exactDateLength = -1; 49 } 50 51 /** 52 * Create a new CustomDateEditor instance, using the given DateFormat 53 * for parsing and rendering. 54 * <p>The "allowEmpty" parameter states if an empty String should 55 * be allowed for parsing, i.e. get interpreted as null value. 56 * Otherwise, an IllegalArgumentException gets thrown in that case. 57 * <p>The "exactDateLength" parameter states that IllegalArgumentException gets 58 * thrown if the String does not exactly match the length specified. This is useful 59 * because SimpleDateFormat does not enforce strict parsing of the year part, 60 * not even with <code>setLenient(false)</code>. Without an "exactDateLength" 61 * specified, the "01/01/05" would get parsed to "01/01/0005". 62 * @param longDateFormat DateFormat to use for parsing and rendering 63 * @param allowEmpty if empty strings should be allowed 64 * @param exactDateLength the exact expected length of the date String 65 */ 66 public DatePropertyEditor(DateFormat longDateFormat, boolean allowEmpty, int exactDateLength) { 67 this.dateFormat = longDateFormat; 68 this.allowEmpty = allowEmpty; 69 this.exactDateLength = exactDateLength; 70 } 71 72 73 /** 74 * Parse the Date from the given text, using the specified DateFormat. 75 */ 76 @Override 77 public void setAsText(String text) throws IllegalArgumentException { 78 if (this.allowEmpty && !StringUtils.hasText(text)) { 79 // Treat empty String as null value. 80 setValue(null); 81 } 82 else if(text.equals("now")) 83 { 84 setValue(new Date()); 85 } 86 else if (this.exactDateLength >= 0 && text.length() != this.exactDateLength) { 87 throw new IllegalArgumentException( 88 "Could not parse date: it is not exactly" + this.exactDateLength + "characters long"); 89 } 90 else { 91 try { 92 if(shortDateFormat!=null && text.length() <=10) { 93 setValue(this.shortDateFormat.parse(text)); 94 } else { 95 setValue(this.dateFormat.parse(text)); 96 } 97 } 98 catch (ParseException ex) { 99 throw new IllegalArgumentException("Could not parse date: " + ex.getMessage(), ex); 100 } 101 } 102 } 103 104 /** 105 * Format the Date as String, using the specified DateFormat. 106 */ 107 @Override 108 public String getAsText() { 109 Date value = (Date) getValue(); 110 return (value != null ? this.dateFormat.format(value) : ""); 111 } 112 }