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 }