/* * Copyright (c) 2010-2013 Evolveum * * 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.evolveum.midpoint.repo.sql.type; import org.hibernate.HibernateException; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.type.AbstractSingleColumnStandardBasicType; import org.hibernate.type.TimestampType; import org.hibernate.usertype.UserType; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import java.io.Serializable; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Date; import java.util.GregorianCalendar; /** * @author lazyman */ public class XMLGregorianCalendarType implements UserType { public static final String NAME = "XMLGregorianCalendarType"; private static final AbstractSingleColumnStandardBasicType HIBERNATE_TYPE = TimestampType.INSTANCE; private static DatatypeFactory df = null; static { try { df = DatatypeFactory.newInstance(); } catch (DatatypeConfigurationException dce) { throw new IllegalStateException("Exception while obtaining Datatype Factory instance", dce); } } @Override public Object assemble(Serializable cached, Object owner) throws HibernateException { if (cached == null) { return null; } long date = (Long) cached; return asXMLGregorianCalendar(new Date(date)); } @Override public int[] sqlTypes() { return new int[]{HIBERNATE_TYPE.sqlType()}; } @Override public Class returnedClass() { return Date.class; } @Override public boolean equals(Object x, Object y) throws HibernateException { return x == null ? y == null : x.equals(y); } @Override public int hashCode(Object x) throws HibernateException { if (x == null) { return 0; } return x.hashCode(); } @Override public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException { Date date = (Date) HIBERNATE_TYPE.nullSafeGet(rs, names[0], session); if (date == null) { return null; } return asXMLGregorianCalendar(date); } @Override public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException { XMLGregorianCalendar calendar = (XMLGregorianCalendar) value; Date date = null; if (calendar != null) { date = asDate(calendar); } HIBERNATE_TYPE.nullSafeSet(st, date, index, session); } @Override public Object deepCopy(Object value) throws HibernateException { if (value == null) { return null; } XMLGregorianCalendar calendar = (XMLGregorianCalendar) value; return asXMLGregorianCalendar(asDate(calendar)); } @Override public boolean isMutable() { return true; } @Override public Serializable disassemble(Object value) throws HibernateException { if (value == null) { return null; } XMLGregorianCalendar calendar = (XMLGregorianCalendar) value; return asDate(calendar).getTime(); } @Override public Object replace(Object original, Object target, Object owner) throws HibernateException { return deepCopy(original); } /** * Converts a java.util.Date into an instance of XMLGregorianCalendar * * @param date Instance of java.util.Date or a null reference * @return XMLGregorianCalendar instance whose value is based upon the * value in the date parameter. If the date parameter is null then * this method will simply return null. */ public static XMLGregorianCalendar asXMLGregorianCalendar(java.util.Date date) { if (date == null) { return null; } else { GregorianCalendar gc = new GregorianCalendar(); gc.setTimeInMillis(date.getTime()); return df.newXMLGregorianCalendar(gc); } } /** * Converts an XMLGregorianCalendar to an instance of java.util.Date * * @param xgc Instance of XMLGregorianCalendar or a null reference * @return java.util.Date instance whose value is based upon the * value in the xgc parameter. If the xgc parameter is null then * this method will simply return null. */ public static java.util.Date asDate(XMLGregorianCalendar xgc) { if (xgc == null) { return null; } else { return xgc.toGregorianCalendar().getTime(); } } }