001 /*
002 * Copyright 2001-2006 Stephen Colebourne
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.joda.time.convert;
017
018 import org.joda.time.Chronology;
019 import org.joda.time.DateTimeUtils;
020 import org.joda.time.DateTimeZone;
021 import org.joda.time.PeriodType;
022 import org.joda.time.ReadablePartial;
023 import org.joda.time.chrono.ISOChronology;
024 import org.joda.time.format.DateTimeFormatter;
025
026 /**
027 * AbstractConverter simplifies the process of implementing a converter.
028 *
029 * @author Stephen Colebourne
030 * @since 1.0
031 */
032 public abstract class AbstractConverter implements Converter {
033
034 /**
035 * Restricted constructor.
036 */
037 protected AbstractConverter() {
038 super();
039 }
040
041 //-----------------------------------------------------------------------
042 /**
043 * Extracts the millis from an object of this convertor's type.
044 * <p>
045 * This implementation returns the current time.
046 *
047 * @param object the object to convert
048 * @param chrono the chronology to use, which is always non-null
049 * @return the millisecond value
050 */
051 public long getInstantMillis(Object object, Chronology chrono) {
052 return DateTimeUtils.currentTimeMillis();
053 }
054
055 //-----------------------------------------------------------------------
056 /**
057 * Extracts the chronology from an object of this convertor's type
058 * where the time zone is specified.
059 * <p>
060 * This implementation returns the ISO chronology.
061 *
062 * @param object the object to convert
063 * @param zone the specified zone to use, null means default zone
064 * @return the chronology, never null
065 */
066 public Chronology getChronology(Object object, DateTimeZone zone) {
067 return ISOChronology.getInstance(zone);
068 }
069
070 /**
071 * Extracts the chronology from an object of this convertor's type
072 * where the chronology is specified.
073 * <p>
074 * This implementation returns the chronology specified, or the
075 * ISO chronology in the default zone if null passed in.
076 *
077 * @param object the object to convert
078 * @param chrono the chronology to use, null means ISO default
079 * @return the chronology, never null
080 */
081 public Chronology getChronology(Object object, Chronology chrono) {
082 return DateTimeUtils.getChronology(chrono);
083 }
084
085 //-----------------------------------------------------------------------
086 /**
087 * Extracts the values of the partial from an object of this converter's type.
088 * The chrono parameter is a hint to the converter, should it require a
089 * chronology to aid in conversion.
090 * <p>
091 * This implementation calls {@link #getInstantMillis(Object, Chronology)}.
092 *
093 * @param fieldSource a partial that provides access to the fields.
094 * This partial may be incomplete and only getFieldType(int) should be used
095 * @param object the object to convert
096 * @param chrono the chronology to use, which is the non-null result of getChronology()
097 * @return the array of field values that match the fieldSource, must be non-null valid
098 * @throws ClassCastException if the object is invalid
099 */
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 }