View Javadoc
1   /*
2    * Redistribution and use of this software and associated documentation
3    * ("Software"), with or without modification, are permitted provided that the
4    * following conditions are met:
5    *
6    * 1. Redistributions of source code must retain copyright statements and
7    * notices. Redistributions must also contain a copy of this document.
8    *
9    * 2. Redistributions in binary form must reproduce the above copyright notice,
10   * this list of conditions and the following disclaimer in the documentation
11   * and/or other materials provided with the distribution.
12   *
13   * 3. The name "Exolab" must not be used to endorse or promote products derived
14   * from this Software without prior written permission of Intalio, Inc. For
15   * written permission, please contact info@exolab.org.
16   *
17   * 4. Products derived from this Software may not be called "Exolab" nor may
18   * "Exolab" appear in their names without prior written permission of Intalio,
19   * Inc. Exolab is a registered trademark of Intalio, Inc.
20   *
21   * 5. Due credit should be given to the Exolab Project (http://www.exolab.org/).
22   *
23   * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS ``AS IS'' AND ANY
24   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26   * DISCLAIMED. IN NO EVENT SHALL INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR
27   * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33   *
34   * Copyright 2000-2004 (C) Intalio, Inc. All Rights Reserved.
35   *
36   * $Id$
37   */
38  package org.exolab.castor.xml.descriptors;
39  
40  import java.sql.Timestamp;
41  import java.util.Date;
42  
43  import org.exolab.castor.mapping.AccessMode;
44  import org.exolab.castor.mapping.ClassDescriptor;
45  import org.exolab.castor.mapping.FieldDescriptor;
46  import org.exolab.castor.xml.NodeType;
47  import org.exolab.castor.xml.TypeValidator;
48  import org.exolab.castor.xml.XMLFieldDescriptor;
49  import org.exolab.castor.xml.XMLFieldHandler;
50  import org.exolab.castor.xml.handlers.SQLTimestampFieldHandler;
51  import org.exolab.castor.xml.util.XMLFieldDescriptorImpl;
52  
53  /**
54   * A ClassDescriptor for java.sql.Date.
55   *
56   * @author <a href="kvisco-at-intalio.com">Keith Visco</a>
57   * @version $Revision$ $Date: 2006-04-13 06:47:36 -0600 (Thu, 13 Apr
58   *          2006) $
59   */
60  public class SQLTimestampClassDescriptor extends BaseDescriptor {
61  
62      /** Used for returning no attribute and no element fields. */
63      private static final XMLFieldDescriptor[]   NO_FIELDS = new XMLFieldDescriptor[0];
64      /** The name of the XML element. */
65      private static final String                 XML_NAME  = "sql-timestamp";
66      /** Our field descriptor for our "content". */
67      private static final XMLFieldDescriptorImpl CONTENT_DESCRIPTOR;
68      /** Our field descriptor array. Lists the fields we describe. */
69      private static final FieldDescriptor[]      FIELDS;
70      /** Type validator to use to validate an instance of this type. */
71      private static final TypeValidator          VALIDATOR = null;
72  
73      static {
74          CONTENT_DESCRIPTOR = new XMLFieldDescriptorImpl(String.class,
75                  "content", "content", NodeType.Text);
76  
77          CONTENT_DESCRIPTOR.setImmutable(true);
78          // -- setHandler
79          SQLTimestampFieldHandler handler = new SQLTimestampFieldHandler();
80          handler.setFieldHandler(new XMLFieldHandler() {
81  
82              /**
83               * {@inheritDoc}
84               */
85              public Object getValue(final Object object) {
86                  return object;
87              }
88  
89              /**
90               * {@inheritDoc}
91               */
92              public void setValue(final Object object, final Object value) {
93                  if (value == null) {
94                      return;
95                  }
96  
97                  if (java.sql.Timestamp.class == object.getClass()) {
98                      Class type = value.getClass();
99                      Timestamp target = (Timestamp) object;
100                     if (Timestamp.class.isAssignableFrom(type)) {
101                         Timestamp temp = (Timestamp) value;
102                         target.setTime(temp.getTime());
103                         target.setNanos(temp.getNanos());
104                     } else if (java.util.Date.class.isAssignableFrom(type)) {
105                         target.setTime(((Date) value).getTime());
106                     }
107                 }
108             }
109 
110             /**
111              * {@inheritDoc}
112              */
113             public Object newInstance(final Object parent) {
114                 return new java.sql.Timestamp(0);
115             }
116         });
117 
118         CONTENT_DESCRIPTOR.setHandler(handler);
119 
120         FIELDS = new FieldDescriptor[1];
121         FIELDS[0] = CONTENT_DESCRIPTOR;
122     }
123 
124     // ----------------/
125     // - Constructors -/
126     // ----------------/
127 
128     /**
129      * No-arg constructor.
130      */
131     public SQLTimestampClassDescriptor() {
132         super();
133     } // -- DateDescriptor
134 
135     // ------------------/
136     // - Public Methods -/
137     // ------------------/
138 
139     /**
140      * Returns the set of XMLFieldDescriptors for all members that should be
141      * marshaled as XML attributes.
142      *
143      * @return an array of XMLFieldDescriptors for all members that should be
144      *         marshaled as XML attributes.
145      */
146     public XMLFieldDescriptor[] getAttributeDescriptors() {
147         return NO_FIELDS;
148     } // getAttributeDescriptors
149 
150     /**
151      * Returns the XMLFieldDescriptor for the member that should be marshaled
152      * as text content.
153      *
154      * @return the XMLFieldDescriptor for the member that should be marshaled
155      *         as text content.
156      */
157     public XMLFieldDescriptor getContentDescriptor() {
158         return CONTENT_DESCRIPTOR;
159     } // getContentDescriptor
160 
161     /**
162      * Returns the set of XMLFieldDescriptors for all members that should be
163      * marshaled as XML elements.
164      *
165      * @return an array of XMLFieldDescriptors for all members that should be
166      *         marshaled as XML elements.
167      */
168     public XMLFieldDescriptor[] getElementDescriptors() {
169         return NO_FIELDS;
170     } // getElementDescriptors
171 
172     /**
173      * Returns the XML field descriptor matching the given xml name and
174      * nodeType. If NodeType is null, then either an AttributeDescriptor, or
175      * ElementDescriptor may be returned. Null is returned if no matching
176      * descriptor is available.
177      *
178      * @param name the xml name to match against
179      * @param namespace the namespace uri
180      * @param nodeType the NodeType to match against, or null if the node type
181      *        is not known.
182      * @return the matching descriptor, or null if no matching descriptor is
183      *         available.
184      */
185     public XMLFieldDescriptor getFieldDescriptor(final String name, final String namespace,
186             final NodeType nodeType) {
187         return null;
188     } // -- getFieldDescriptor
189 
190     /**
191      * @return the namespace prefix to use when marshaling as XML.
192      */
193     public String getNameSpacePrefix() {
194         return null;
195     } // -- getNameSpacePrefix
196 
197     /**
198      * @return the namespace URI used when marshaling and unmarshaling as XML.
199      */
200     public String getNameSpaceURI() {
201         return null;
202     } // -- getNameSpaceURI
203 
204     /**
205      * Returns a specific validator for the class described by this
206      * ClassDescriptor. A null value may be returned if no specific validator
207      * exists.
208      *
209      * @return the type validator for the class described by this
210      *         ClassDescriptor.
211      */
212     public TypeValidator getValidator() {
213         return VALIDATOR;
214     } // -- getValidator
215 
216     /**
217      * Returns the XML Name for the Class being described.
218      *
219      * @return the XML name.
220      */
221     public String getXMLName() {
222         return XML_NAME;
223     } // -- getXMLName
224 
225     /**
226      * Returns the String representation of this XMLClassDescriptor.
227      *
228      * @return the String representation of this XMLClassDescriptor.
229      */
230     public String toString() {
231         return super.toString()
232                 + "; descriptor for class: java.sql.Timestamp; xml name: "
233                 + XML_NAME;
234     } // -- toString
235 
236     // -------------------------------------/
237     // - Implementation of ClassDescriptor -/
238     // -------------------------------------/
239 
240     /**
241      * Returns the Java class represented by this descriptor.
242      *
243      * @return The Java class
244      */
245     public Class getJavaClass() {
246         return java.sql.Timestamp.class;
247     } // -- getJavaClass
248 
249     /**
250      * Returns a list of fields represented by this descriptor.
251      *
252      * @return A list of fields
253      */
254     public FieldDescriptor[] getFields() {
255         return FIELDS;
256     } // -- getFields
257 
258     /**
259      * Returns the class descriptor of the class extended by this class.
260      *
261      * @return The extended class descriptor
262      */
263     public ClassDescriptor getExtends() {
264         return null;
265     } // -- getExtends
266 
267     /**
268      * Returns the identity field, null if this class has no identity.
269      *
270      * @return The identity field
271      */
272     public FieldDescriptor getIdentity() {
273         return null;
274     } // -- getIdentity
275 
276     /**
277      * Returns the access mode specified for this class.
278      *
279      * @return The access mode
280      */
281     public AccessMode getAccessMode() {
282         return null;
283     } // -- getAccessMode
284 
285 } // -- class: SQLTimestampClassDescriptor