1 /* 2 * Copyright 2001-2009 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.ReadableInstant; 22 import org.joda.time.chrono.ISOChronology; 23 24 /** 25 * ReadableInstantConverter extracts milliseconds and chronology from a ReadableInstant. 26 * 27 * @author Stephen Colebourne 28 * @since 1.0 29 */ 30 class ReadableInstantConverter extends AbstractConverter 31 implements InstantConverter, PartialConverter { 32 33 /** 34 * Singleton instance. 35 */ 36 static final ReadableInstantConverter INSTANCE = new ReadableInstantConverter(); 37 38 /** 39 * Restricted constructor. 40 */ 41 protected ReadableInstantConverter() { 42 super(); 43 } 44 45 //----------------------------------------------------------------------- 46 /** 47 * Gets the chronology, which is taken from the ReadableInstant. 48 * If the chronology on the instant is null, the ISOChronology in the 49 * specified time zone is used. 50 * If the chronology on the instant is not in the specified zone, it is 51 * adapted. 52 * 53 * @param object the ReadableInstant to convert, must not be null 54 * @param zone the specified zone to use, null means default zone 55 * @return the chronology, never null 56 */ 57 public Chronology getChronology(Object object, DateTimeZone zone) { 58 Chronology chrono = ((ReadableInstant) object).getChronology(); 59 if (chrono == null) { 60 return ISOChronology.getInstance(zone); 61 } 62 DateTimeZone chronoZone = chrono.getZone(); 63 if (chronoZone != zone) { 64 chrono = chrono.withZone(zone); 65 if (chrono == null) { 66 return ISOChronology.getInstance(zone); 67 } 68 } 69 return chrono; 70 } 71 72 /** 73 * Gets the chronology, which is taken from the ReadableInstant. 74 * <p> 75 * If the passed in chronology is non-null, it is used. 76 * Otherwise the chronology from the instant is used. 77 * 78 * @param object the ReadableInstant to convert, must not be null 79 * @param chrono the chronology to use, null means use that from object 80 * @return the chronology, never null 81 */ 82 public Chronology getChronology(Object object, Chronology chrono) { 83 if (chrono == null) { 84 chrono = ((ReadableInstant) object).getChronology(); 85 chrono = DateTimeUtils.getChronology(chrono); 86 } 87 return chrono; 88 } 89 90 /** 91 * Extracts the millis from an object of this convertor's type. 92 * 93 * @param object the ReadableInstant to convert, must not be null 94 * @param chrono the non-null result of getChronology 95 * @return the millisecond value 96 * @throws NullPointerException if the object is null 97 * @throws ClassCastException if the object is an invalid type 98 */ 99 public long getInstantMillis(Object object, Chronology chrono) { 100 return ((ReadableInstant) object).getMillis(); 101 } 102 103 //----------------------------------------------------------------------- 104 /** 105 * Returns ReadableInstant.class. 106 * 107 * @return ReadableInstant.class 108 */ 109 public Class<?> getSupportedType() { 110 return ReadableInstant.class; 111 } 112 113 }