KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > access > types > UtilDateType


1 /* ====================================================================
2  *
3  * The ObjectStyle Group Software License, version 1.1
4  * ObjectStyle Group - http://objectstyle.org/
5  *
6  * Copyright (c) 2002-2005, Andrei (Andrus) Adamchik and individual authors
7  * of the software. All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution, if any,
22  * must include the following acknowlegement:
23  * "This product includes software developed by independent contributors
24  * and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
25  * Alternately, this acknowlegement may appear in the software itself,
26  * if and wherever such third-party acknowlegements normally appear.
27  *
28  * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
29  * or promote products derived from this software without prior written
30  * permission. For written permission, email
31  * "andrus at objectstyle dot org".
32  *
33  * 5. Products derived from this software may not be called "ObjectStyle"
34  * or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
35  * names without prior written permission.
36  *
37  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40  * DISCLAIMED. IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
41  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48  * SUCH DAMAGE.
49  * ====================================================================
50  *
51  * This software consists of voluntary contributions made by many
52  * individuals and hosted on ObjectStyle Group web site. For more
53  * information on the ObjectStyle Group, please see
54  * <http://objectstyle.org/>.
55  */

56 package org.objectstyle.cayenne.access.types;
57
58 import java.sql.CallableStatement JavaDoc;
59 import java.sql.PreparedStatement JavaDoc;
60 import java.sql.ResultSet JavaDoc;
61 import java.sql.Types JavaDoc;
62 import java.util.Date JavaDoc;
63
64 import org.objectstyle.cayenne.CayenneRuntimeException;
65 import org.objectstyle.cayenne.dba.TypesMapping;
66 import org.objectstyle.cayenne.map.DbAttribute;
67 import org.objectstyle.cayenne.validation.ValidationResult;
68
69 /**
70  * ExtendedType that allows Java application to use java.util.Date
71  * transparently for all three database date/time types: TIME, DATE, TIMESTAMP.
72  *
73  * @author Andrei Adamchik
74  */

75 public class UtilDateType extends AbstractType {
76
77     /**
78      * Always returns java.util.Date class.
79      */

80     public String JavaDoc getClassName() {
81         return Date JavaDoc.class.getName();
82     }
83
84     /**
85      * Always returns true indicating no validation failures. There is no date-specific
86      * validations at the moment.
87      *
88      * @since 1.1
89      */

90     public boolean validateProperty(
91         Object JavaDoc source,
92         String JavaDoc property,
93         Object JavaDoc value,
94         DbAttribute dbAttribute,
95         ValidationResult validationResult) {
96         return true;
97     }
98
99     protected Object JavaDoc convertToJdbcObject(Object JavaDoc val, int type) throws Exception JavaDoc {
100         if (type == Types.DATE)
101             return new java.sql.Date JavaDoc(((Date JavaDoc) val).getTime());
102         else if (type == Types.TIME)
103             return new java.sql.Time JavaDoc(((Date JavaDoc) val).getTime());
104         else if (type == Types.TIMESTAMP)
105             return new java.sql.Timestamp JavaDoc(((Date JavaDoc) val).getTime());
106         else
107             throw new IllegalArgumentException JavaDoc(
108                 "Only date/time types can be used for '" + getClassName() + "'.");
109     }
110
111     public Object JavaDoc materializeObject(ResultSet JavaDoc rs, int index, int type) throws Exception JavaDoc {
112         Date JavaDoc val = null;
113
114         switch (type) {
115             case Types.TIMESTAMP:
116                 val = rs.getTimestamp(index);
117                 break;
118             case Types.DATE:
119                 val = rs.getDate(index);
120                 break;
121             case Types.TIME:
122                 val = rs.getTime(index);
123                 break;
124             default:
125                 // here the driver can "surpirse" us
126
// check the type of returned value...
127
Object JavaDoc object = rs.getObject(index);
128
129                 if (object != null && !(object instanceof Date JavaDoc)) {
130                     throw new CayenneRuntimeException(
131                             "Expected an instance of java.util.Date, instead got "
132                                     + object.getClass().getName()
133                                     + ", column index: "
134                                     + index);
135                 }
136
137                 val = (Date JavaDoc) object;
138                 break;
139         }
140
141         return (rs.wasNull()) ? null : new Date JavaDoc(val.getTime());
142     }
143
144     public Object JavaDoc materializeObject(CallableStatement JavaDoc cs, int index, int type)
145         throws Exception JavaDoc {
146         Object JavaDoc val = null;
147
148         switch (type) {
149             case Types.TIMESTAMP :
150                 val = cs.getTimestamp(index);
151                 break;
152             case Types.DATE :
153                 val = cs.getDate(index);
154                 break;
155             case Types.TIME :
156                 val = cs.getTime(index);
157                 break;
158             default :
159                 val = cs.getObject(index);
160                 // check if value was properly converted by the driver
161
if (val != null && !(val instanceof java.util.Date JavaDoc)) {
162                     String JavaDoc typeName = TypesMapping.getSqlNameByType(type);
163                     throw new ClassCastException JavaDoc(
164                         "Expected a java.util.Date or subclass, instead fetched '"
165                             + val.getClass().getName()
166                             + "' for JDBC type "
167                             + typeName);
168                 }
169                 break;
170         }
171
172         // all sql time/date classes are subclasses of java.util.Date,
173
// so lets cast it to Date,
174
// if it is not date, ClassCastException will be thrown,
175
// which is what we want
176
return (cs.wasNull())
177             ? null
178             : new java.util.Date JavaDoc(((java.util.Date JavaDoc) val).getTime());
179     }
180
181     public void setJdbcObject(
182         PreparedStatement JavaDoc st,
183         Object JavaDoc val,
184         int pos,
185         int type,
186         int precision)
187         throws Exception JavaDoc {
188         super.setJdbcObject(st, convertToJdbcObject(val, type), pos, type, precision);
189     }
190 }
Popular Tags