View Javadoc

1   /*
2    *  Copyright 2001-2006 Stephen Colebourne
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License");
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License.
15   */
16  package org.joda.time.convert;
17  
18  import org.joda.time.Chronology;
19  import org.joda.time.DateTimeUtils;
20  import org.joda.time.DateTimeZone;
21  import org.joda.time.PeriodType;
22  import org.joda.time.ReadablePartial;
23  import org.joda.time.chrono.ISOChronology;
24  import org.joda.time.format.DateTimeFormatter;
25  
26  /**
27   * AbstractConverter simplifies the process of implementing a converter.
28   *
29   * @author Stephen Colebourne
30   * @since 1.0
31   */
32  public abstract class AbstractConverter implements Converter {
33  
34      /**
35       * Restricted constructor.
36       */
37      protected AbstractConverter() {
38          super();
39      }
40  
41      //-----------------------------------------------------------------------
42      /**
43       * Extracts the millis from an object of this convertor's type.
44       * <p>
45       * This implementation returns the current time.
46       * 
47       * @param object  the object to convert
48       * @param chrono  the chronology to use, which is always non-null
49       * @return the millisecond value
50       */
51      public long getInstantMillis(Object object, Chronology chrono) {
52          return DateTimeUtils.currentTimeMillis();
53      }
54  
55      //-----------------------------------------------------------------------
56      /**
57       * Extracts the chronology from an object of this convertor's type
58       * where the time zone is specified.
59       * <p>
60       * This implementation returns the ISO chronology.
61       * 
62       * @param object  the object to convert
63       * @param zone  the specified zone to use, null means default zone
64       * @return the chronology, never null
65       */
66      public Chronology getChronology(Object object, DateTimeZone zone) {
67          return ISOChronology.getInstance(zone);
68      }
69  
70      /**
71       * Extracts the chronology from an object of this convertor's type
72       * where the chronology is specified.
73       * <p>
74       * This implementation returns the chronology specified, or the
75       * ISO chronology in the default zone if null passed in.
76       * 
77       * @param object  the object to convert
78       * @param chrono  the chronology to use, null means ISO default
79       * @return the chronology, never null
80       */
81      public Chronology getChronology(Object object, Chronology chrono) {
82          return DateTimeUtils.getChronology(chrono);
83      }
84  
85      //-----------------------------------------------------------------------
86      /**
87       * Extracts the values of the partial from an object of this converter's type.
88       * The chrono parameter is a hint to the converter, should it require a
89       * chronology to aid in conversion.
90       * <p>
91       * This implementation calls {@link #getInstantMillis(Object, Chronology)}.
92       * 
93       * @param fieldSource  a partial that provides access to the fields.
94       *  This partial may be incomplete and only getFieldType(int) should be used
95       * @param object  the object to convert
96       * @param chrono  the chronology to use, which is the non-null result of getChronology()
97       * @return the array of field values that match the fieldSource, must be non-null valid
98       * @throws ClassCastException if the object is invalid
99       */
100     public int[] getPartialValues(ReadablePartial fieldSource, Object object, Chronology chrono) {
101         long instant = getInstantMillis(object, chrono);
102         return chrono.get(fieldSource, instant);
103     }
104 
105     /**
106      * Extracts the values of the partial from an object of this converter's type.
107      * The chrono parameter is a hint to the converter, should it require a
108      * chronology to aid in conversion.
109      * <p>
110      * This implementation calls {@link #getPartialValues(ReadablePartial, Object, Chronology)}.
111      * 
112      * @param fieldSource  a partial that provides access to the fields.
113      *  This partial may be incomplete and only getFieldType(int) should be used
114      * @param object  the object to convert
115      * @param chrono  the chronology to use, which is the non-null result of getChronology()
116      * @param parser  if converting from a String, the given parser is preferred
117      * @return the array of field values that match the fieldSource, must be non-null valid
118      * @throws ClassCastException if the object is invalid
119      * @since 1.3
120      */
121     public int[] getPartialValues(ReadablePartial fieldSource,
122             Object object, Chronology chrono, DateTimeFormatter parser) {
123         return getPartialValues(fieldSource, object, chrono);
124     }
125 
126     //-----------------------------------------------------------------------
127     /**
128      * Selects a suitable period type for the given object.
129      *
130      * @param object  the object to examine
131      * @return the period type, never null
132      */
133     public PeriodType getPeriodType(Object object) {
134         return PeriodType.standard();
135     }
136 
137     //-----------------------------------------------------------------------
138     /**
139      * Checks if the input is a ReadableInterval.
140      * <p>
141      * If it is, then the calling code should cast and copy the fields directly.
142      *
143      * @param object  the object to convert
144      * @param chrono  the chronology to use, may be null
145      * @return true if the input is a ReadableInterval
146      */
147     public boolean isReadableInterval(Object object, Chronology chrono) {
148         return false;
149     }
150 
151     //-----------------------------------------------------------------------
152     /**
153      * Gets a debugging string version of this converter.
154      * 
155      * @return a debugging string
156      */
157     public String toString() {
158         return "Converter[" + (getSupportedType() == null ? "null" : getSupportedType().getName()) + "]";
159     }
160 
161 }