/* * Copyright 2006 Amazon Technologies, Inc. or its affiliates. * Amazon, Amazon.com and Carbonado are trademarks or registered trademarks * of Amazon Technologies, Inc. or its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.amazon.carbonado.adapter; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.sql.Time; import java.sql.Timestamp; import java.util.Date; import org.joda.time.DateMidnight; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; import org.joda.time.LocalDateTime; import org.joda.time.ReadableInstant; import com.amazon.carbonado.adapter.AdapterDefinition; /** * Converts Joda-Time datetime objects to and from other forms. This adapter is * applied automatically for all storable properties of type {@link DateTime}, * {@link DateMidnight}, {@link LocalDateTime} and {@link LocalDate}. Explicit * use allows a different time zone to be used. DateTimeAdapter can also be * used to support {@link Date} properties, but it must be explicitly * specified. * *
Example:
* public interface UserInfo extends Storable { * @DateTimeAdapter(timeZone="UTC") * DateTime getModifyDateTime(); * * ... * } ** * @author Brian S O'Neill * @author Justin Rudd * @see AdapterDefinition */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @AdapterDefinition(storageTypePreferences={ long.class, Long.class, String.class }) public @interface DateTimeAdapter { /** * Optionally specify a time zone to apply to new DateTimes, overriding the * default time zone. */ String timeZone() default ""; /** * Adapter implementation for {@link DateTimeAdapter}. */ public static class Adapter { private static DateTimeZone toDateTimeZone(DateTimeAdapter ann) { String id; if (ann == null || (id = ann.timeZone()) == null || id.length() == 0) { return null; } return DateTimeZone.forID(id); } private final String mPropertyName; private final DateTimeZone mZone; /** * @param type type of object that contains the adapted property * @param propertyName name of property with adapter * @param ann specific annotation that binds to this adapter class */ public Adapter(Class> type, String propertyName, DateTimeAdapter ann) { this(type, propertyName, toDateTimeZone(ann)); } /** * @param type type of object that contains the adapted property * @param propertyName name of property with * @param zone time zone to apply, or null to use default */ public Adapter(Class> type, String propertyName, DateTimeZone zone) { mPropertyName = propertyName; mZone = zone; } // Adapt to DateTime... public DateTime adaptToDateTime(long instant) { return new DateTime(instant, mZone); } public DateTime adaptToDateTime(Long instant) { return instant == null ? null : new DateTime(instant, mZone); } public DateTime adaptToDateTime(String isoDateString) { return isoDateString == null ? null : new DateTime(isoDateString, mZone); } public DateTime adaptToDateTime(Date date) { return date == null ? null : new DateTime(date, mZone); } // Adapt to DateMidnight... public DateMidnight adaptToDateMidnight(long instant) { return new DateMidnight(instant, mZone); } public DateMidnight adaptToDateMidnight(Long instant) { return instant == null ? null : new DateMidnight(instant, mZone); } public DateMidnight adaptToDateMidnight(String isoDateString) { return isoDateString == null ? null : new DateMidnight(isoDateString, mZone); } public DateMidnight adaptToDateMidnight(Date date) { return date == null ? null : new DateMidnight(date, mZone); } // Adapt to LocalDateTime... public LocalDateTime adaptToLocalDateTime(long instant) { return new LocalDateTime(instant, mZone); } public LocalDateTime adaptToLocalDateTime(Long instant) { return instant == null ? null : new LocalDateTime(instant, mZone); } public LocalDateTime adaptToLocalDateTime(String isoDateString) { return isoDateString == null ? null : new LocalDateTime(isoDateString, mZone); } public LocalDateTime adaptToLocalDateTime(Date date) { return date == null ? null : new LocalDateTime(date, mZone); } // Adapt to LocalDate... public LocalDate adaptToLocalDate(long instant) { return new LocalDate(instant, mZone); } public LocalDate adaptToLocalDate(Long instant) { return instant == null ? null : new LocalDate(instant, mZone); } public LocalDate adaptToLocalDate(String isoDateString) { return isoDateString == null ? null : new LocalDate(isoDateString, mZone); } public LocalDate adaptToLocalDate(Date date) { return date == null ? null : new LocalDate(date, mZone); } // Adapt from DateTime and DateMidnight... (accept the more generic ReadableInstant) public long adaptToLong(ReadableInstant instant) { if (instant != null) { return instant.getMillis(); } throw new IllegalArgumentException ("Cannot adapt null instant into long for property \"" + mPropertyName + '"'); } public Long adaptToLongObj(ReadableInstant instant) { return instant == null ? null : instant.getMillis(); } public String adaptToString(ReadableInstant instant) { return instant == null ? null : instant.toString(); } public Date adaptToDate(ReadableInstant instant) { return instant == null ? null : new Date(instant.getMillis()); } public java.sql.Date adaptToSqlDate(ReadableInstant instant) { return instant == null ? null : new java.sql.Date(instant.getMillis()); } public Time adaptToSqlTime(ReadableInstant instant) { return instant == null ? null : new Time(instant.getMillis()); } public Timestamp adaptToSqlTimestamp(ReadableInstant instant) { return instant == null ? null : new Timestamp(instant.getMillis()); } // Adapt from LocalDateTime... public long adaptToLong(LocalDateTime dateTime) { if (dateTime != null) { return dateTime.toDateTime(mZone).getMillis(); } throw new IllegalArgumentException ("Cannot adapt null datetime into long for property \"" + mPropertyName + '"'); } public Long adaptToLongObj(LocalDateTime dateTime) { return dateTime == null ? null : dateTime.toDateTime(mZone).getMillis(); } public String adaptToString(LocalDateTime dateTime) { return dateTime == null ? null : dateTime.toString(); } public Date adaptToDate(LocalDateTime dateTime) { return dateTime == null ? null : dateTime.toDateTime(mZone).toDate(); } public java.sql.Date adaptToSqlDate(LocalDateTime dateTime) { return dateTime == null ? null : new java.sql.Date(dateTime.toDateTime(mZone).getMillis()); } public Time adaptToSqlTime(LocalDateTime dateTime) { return dateTime == null ? null : new Time(dateTime.toDateTime(mZone).getMillis()); } public Timestamp adaptToSqlTimestamp(LocalDateTime dateTime) { return dateTime == null ? null : new Timestamp(dateTime.toDateTime(mZone).getMillis()); } // Adapt from LocalDate... public long adaptToLong(LocalDate date) { if (date != null) { return date.toDateMidnight(mZone).getMillis(); } throw new IllegalArgumentException ("Cannot adapt null date into long for property \"" + mPropertyName + '"'); } public Long adaptToLongObj(LocalDate date) { return date == null ? null : date.toDateMidnight(mZone).getMillis(); } public String adaptToString(LocalDate date) { return date == null ? null : date.toString(); } public Date adaptToDate(LocalDate date) { return date == null ? null : date.toDateMidnight(mZone).toDate(); } public java.sql.Date adaptToSqlDate(LocalDate date) { return date == null ? null : new java.sql.Date(date.toDateMidnight(mZone).getMillis()); } public Timestamp adaptToSqlTimestamp(LocalDate date) { return date == null ? null : new Timestamp(date.toDateMidnight(mZone).getMillis()); } // Adapt to Date... public Date adaptToDate(long instant) { return new Date(instant); } public Date adaptToDate(Long instant) { return instant == null ? null : new Date(instant); } public Date adaptToDate(String isoDateString) { return isoDateString == null ? null : new DateTime(isoDateString, mZone).toDate(); } // Adapt from Date... public long adaptToLong(Date date) { if (date != null) { return date.getTime(); } throw new IllegalArgumentException ("Cannot adapt null date into long for property \"" + mPropertyName + '"'); } public Long adaptToLongObj(Date date) { return date == null ? null : date.getTime(); } public String adaptToString(Date date) { return date == null ? null : new DateTime(date, mZone).toString(); } public java.sql.Date adaptToSqlDate(Date date) { return date == null ? null : new java.sql.Date(date.getTime()); } public Time adaptToSqlTime(Date date) { return date == null ? null : new Time(date.getTime()); } public Timestamp adaptToSqlTimestamp(Date date) { return date == null ? null : new Timestamp(date.getTime()); } } }