001: /*
002: * Copyright 2001-2005 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.ReadableInstant;
022: import org.joda.time.chrono.ISOChronology;
023:
024: /**
025: * ReadableInstantConverter extracts milliseconds and chronology from a ReadableInstant.
026: *
027: * @author Stephen Colebourne
028: * @since 1.0
029: */
030: class ReadableInstantConverter extends AbstractConverter implements
031: InstantConverter, PartialConverter {
032:
033: /**
034: * Singleton instance.
035: */
036: static final ReadableInstantConverter INSTANCE = new ReadableInstantConverter();
037:
038: /**
039: * Restricted constructor.
040: */
041: protected ReadableInstantConverter() {
042: super ();
043: }
044:
045: //-----------------------------------------------------------------------
046: /**
047: * Gets the chronology, which is taken from the ReadableInstant.
048: * If the chronology on the instant is null, the ISOChronology in the
049: * specified time zone is used.
050: * If the chronology on the instant is not in the specified zone, it is
051: * adapted.
052: *
053: * @param object the ReadableInstant to convert, must not be null
054: * @param zone the specified zone to use, null means default zone
055: * @return the chronology, never null
056: */
057: public Chronology getChronology(Object object, DateTimeZone zone) {
058: Chronology chrono = ((ReadableInstant) object).getChronology();
059: if (chrono == null) {
060: return ISOChronology.getInstance(zone);
061: }
062: DateTimeZone chronoZone = chrono.getZone();
063: if (chronoZone != zone) {
064: chrono = chrono.withZone(zone);
065: if (chrono == null) {
066: return ISOChronology.getInstance(zone);
067: }
068: }
069: return chrono;
070: }
071:
072: /**
073: * Gets the chronology, which is taken from the ReadableInstant.
074: * <p>
075: * If the passed in chronology is non-null, it is used.
076: * Otherwise the chronology from the instant is used.
077: *
078: * @param object the ReadableInstant to convert, must not be null
079: * @param chrono the chronology to use, null means use that from object
080: * @return the chronology, never null
081: */
082: public Chronology getChronology(Object object, Chronology chrono) {
083: if (chrono == null) {
084: chrono = ((ReadableInstant) object).getChronology();
085: chrono = DateTimeUtils.getChronology(chrono);
086: }
087: return chrono;
088: }
089:
090: /**
091: * Extracts the millis from an object of this convertor's type.
092: *
093: * @param object the ReadableInstant to convert, must not be null
094: * @param chrono the non-null result of getChronology
095: * @return the millisecond value
096: * @throws NullPointerException if the object is null
097: * @throws ClassCastException if the object is an invalid type
098: */
099: 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: }
|