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,
101: Object object, Chronology chrono) {
102: long instant = getInstantMillis(object, chrono);
103: return chrono.get(fieldSource, instant);
104: }
105:
106: /**
107: * Extracts the values of the partial from an object of this converter's type.
108: * The chrono parameter is a hint to the converter, should it require a
109: * chronology to aid in conversion.
110: * <p>
111: * This implementation calls {@link #getPartialValues(ReadablePartial, Object, Chronology)}.
112: *
113: * @param fieldSource a partial that provides access to the fields.
114: * This partial may be incomplete and only getFieldType(int) should be used
115: * @param object the object to convert
116: * @param chrono the chronology to use, which is the non-null result of getChronology()
117: * @param parser if converting from a String, the given parser is preferred
118: * @return the array of field values that match the fieldSource, must be non-null valid
119: * @throws ClassCastException if the object is invalid
120: * @since 1.3
121: */
122: public int[] getPartialValues(ReadablePartial fieldSource,
123: Object object, Chronology chrono, DateTimeFormatter parser) {
124: return getPartialValues(fieldSource, object, chrono);
125: }
126:
127: //-----------------------------------------------------------------------
128: /**
129: * Selects a suitable period type for the given object.
130: *
131: * @param object the object to examine
132: * @return the period type, never null
133: */
134: public PeriodType getPeriodType(Object object) {
135: return PeriodType.standard();
136: }
137:
138: //-----------------------------------------------------------------------
139: /**
140: * Checks if the input is a ReadableInterval.
141: * <p>
142: * If it is, then the calling code should cast and copy the fields directly.
143: *
144: * @param object the object to convert
145: * @param chrono the chronology to use, may be null
146: * @return true if the input is a ReadableInterval
147: */
148: public boolean isReadableInterval(Object object, Chronology chrono) {
149: return false;
150: }
151:
152: //-----------------------------------------------------------------------
153: /**
154: * Gets a debugging string version of this converter.
155: *
156: * @return a debugging string
157: */
158: public String toString() {
159: return "Converter["
160: + (getSupportedType() == null ? "null"
161: : getSupportedType().getName()) + "]";
162: }
163:
164: }
|