View Javadoc

1   /***
2    * Copyright (c) 2003 held jointly by the individual authors.
3    * 
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    * 
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; with out even the implied warranty of MERCHANTABILITY or
11   * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
12   * for more details.
13   * 
14   * You should have received a copy of the GNU Lesser General Public License
15   * along with this library; if not, write to the Free Software Foundation, Inc.,
16   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. >
17   * http://www.gnu.org/copyleft/lesser.html >
18   * http://www.opensource.org/licenses/lgpl-license.php
19   */
20  package net.mlw.vlh.adapter.hibernate.util.setter;
21  
22  import java.text.ParseException;
23  import java.text.SimpleDateFormat;
24  import java.util.Date;
25  
26  import net.sf.hibernate.HibernateException;
27  import net.sf.hibernate.Query;
28  
29  import org.apache.commons.logging.Log;
30  import org.apache.commons.logging.LogFactory;
31  
32  /***
33   * @author Andrej Zachar, Matthew L. Wilson
34   * @version $Revision: 1.3 $ $Date: 2005/09/26 09:25:31 $
35   */
36  public class DateSetter extends AbstractSetter
37  {
38     /***
39      * Logger for this class
40      */
41     private static final Log LOGGER = LogFactory.getLog(DateSetter.class);
42  
43     public static final String DEFAULT_FORMAT = "MM/dd/yyyy";
44  
45     private SimpleDateFormat formatter = new SimpleDateFormat(DEFAULT_FORMAT);
46  
47     /***
48      * <ol>
49      * <li>If is value instance of the String, it try to parse value using
50      * SimpleDateFormat with specified format.</li>
51      * <li>If is value instance of the Date, it will set it directly to query .
52      * </li>
53      * <li>Otherwise it will set null to query for key.</li>
54      * </ol>
55      * 
56      * @see net.mlw.vlh.adapter.hibernate.util.Setter#set(net.sf.hibernate.Query,
57      *      java.lang.String, java.lang.Object)
58      * @see #setFormat(String)
59      */
60     public void set(Query query, String key, Object value) throws HibernateException, ParseException
61     {
62        Date date = null;
63        if (value instanceof String)
64        {
65           if (LOGGER.isInfoEnabled())
66           {
67              LOGGER.info("The key='" + key + "'s value is instance of a String, now is parsing to date.");
68           }
69           date = formatter.parse((String) value);
70        }
71        else if (value instanceof Date)
72        {
73           if (LOGGER.isInfoEnabled())
74           {
75              LOGGER.info("The key='" + key + "' is instance of a Date.");
76           }
77           date = (Date) value;
78        }
79        else if (value == null)
80        {
81           if (LOGGER.isInfoEnabled())
82           {
83              LOGGER.info("The key='" + key + "'s value is null.");
84           }
85        }
86        else
87        {
88           if (LOGGER.isWarnEnabled())
89           {
90              LOGGER.warn("The key's='" + key + "' value='" + value + "' was expected as Date or String parseable to Date.");
91           }
92           throw new IllegalArgumentException("Cannot convert value of class " + value.getClass().getName() + " to date (key=" + key + ")");
93        }
94  
95        if (LOGGER.isInfoEnabled())
96        {
97           LOGGER.info("The key='" + key + "' was set to the query as Date with the date='" + date + "'.");
98        }
99  
100       query.setDate(key, date);
101    }
102 
103    /***
104     * Set the format for parsing <code>Date</code> from string values of
105     * keys. Default is "MM/dd/yyyy"
106     * 
107     * @param format The format to set.
108     */
109    public void setFormat(String format)
110    {
111       formatter = new SimpleDateFormat(format);
112    }
113 }