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 }