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    }