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 }