/* * Hibernate OGM, Domain model persistence for NoSQL datastores * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.ogm.type.descriptor.impl; import java.util.Calendar; import javax.xml.bind.DatatypeConverter; import org.hibernate.type.descriptor.java.CalendarDateTypeDescriptor; /** * Converts {@link Calendar}s into ISO8601-compliant strings and vice versa. The strings either contain date or time * information or both information and always time zone information. * <p> * Implementation note: The actual work is delegated to JAXB's {@link DatatypeConverter} which creates ISO8601-compliant * strings. This is ok since JAXB is part of the JDK. * * @author Gunnar Morling */ public class Iso8601CalendarTypeDescriptor extends CalendarDateTypeDescriptor { /** * Creates/parses ISO8601 strings containing date information only. */ public static final Iso8601CalendarTypeDescriptor DATE = new Iso8601CalendarTypeDescriptor( Type.DATE ); /** * Creates/parses ISO8601 strings containing time information only. */ public static final Iso8601CalendarTypeDescriptor TIME = new Iso8601CalendarTypeDescriptor( Type.TIME ); /** * Creates/parses ISO8601 strings containing date and time information. */ public static final Iso8601CalendarTypeDescriptor DATE_TIME = new Iso8601CalendarTypeDescriptor( Type.DATE_TIME ); private final Type type; private Iso8601CalendarTypeDescriptor(Type type) { this.type = type; } @Override public Calendar fromString(String string) { return type.fromString( string ); } @Override public String toString(Calendar value) { return type.toString( value ); } @Override public boolean areEqual(Calendar one, Calendar another) { if ( one == another ) { return true; } if ( one == null || another == null ) { return false; } return one.getTimeZone().getRawOffset() == another.getTimeZone().getRawOffset() && one.getTime() == another.getTime(); } private enum Type { DATE { @Override public Calendar fromString(String string) { return DatatypeConverter.parseDate( string ); } @Override public String toString(Calendar value) { return DatatypeConverter.printDate( value ); } }, TIME { @Override public Calendar fromString(String string) { return DatatypeConverter.parseTime( string ); } @Override public String toString(Calendar value) { return DatatypeConverter.printTime( value ); } }, DATE_TIME { @Override public Calendar fromString(String string) { return DatatypeConverter.parseDateTime( string ); } @Override public String toString(Calendar value) { return DatatypeConverter.printDateTime( value ); } }; public abstract Calendar fromString(String string); public abstract String toString(Calendar value); } }