TimestampInterceptor.java
package org.itracker.persistence.dao;
import org.apache.log4j.Logger;
import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;
import org.itracker.model.AbstractEntity;
import java.io.Serializable;
import java.util.Date;
/**
* A Hibernate Interceptor that automatically sets the <code>createDate</code>
* and <code>lastModifiedDate</code> of any AbstractEntity instance that is
* inserted or updated.
*
* @author johnny
*/
public class TimestampInterceptor extends EmptyInterceptor {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* The name of the AbstractEntity.createDate property
*/
private static final String CREATE_DATE_PROPERTY = "createDate";
/**
* The name of the AbstractEntity.lastModifiedDate property
*/
private static final String LAST_MODIFIED_DATE_PROPERTY = "lastModifiedDate";
@SuppressWarnings("unused")
private static final transient Logger logger = Logger.getLogger(TimestampInterceptor.class);
/**
*
*/
public TimestampInterceptor() {
}
/**
* Called before inserting an item in the datastore.
* <p/>
* <p>The interceptor may modify the state, which will be used for
* the SQL INSERT and propagated to the persistent object. </p>
* <p/>
* <p>Automatically sets the createDate and lastModifiedDate properties. </p>
*
* @return true if the timestamp was set and thus the state was modified
*/
public boolean onSave(Object entity, Serializable id,
Object[] state, String[] propertyNames, Type[] types) {
if (entity instanceof AbstractEntity) {
final Date timestamp = new Date();
// Number of properties to set.
int propertiesSet = 0;
// Find createDate property to set.
for (int i = 0; i < propertyNames.length; i++) {
if (CREATE_DATE_PROPERTY.equals(propertyNames[i])
|| LAST_MODIFIED_DATE_PROPERTY.equals(propertyNames[i])) {
state[i] = timestamp;
// if (this.logger.isDebugEnabled()) {
// this.logger.debug("Setting " + propertyNames[i]
// + " property of " + entity);
// }
if (++propertiesSet == 2) {
break;
}
}
}
return (propertiesSet > 0);
}
return false;
}
/**
* Called before updating the datastore.
* <p/>
* <p>Called when an object is detected to be dirty, during a flush.
* The interceptor may modify the detected currentState, which will be
* propagated to both the database and the persistent object. <br>
* Note that not all flushes end in actual synchronization
* with the database, in which case the new currentState will be
* propagated to the object, but not necessarily (immediately)
* to the database. It is strongly recommended that the interceptor
* not modify the previousState. </p>
* <p/>
* <p>Automatically sets the lastModifiedDate property. </p>
*
* @return true if the timestamp was set and thus the currentState was modified
*/
public boolean onFlushDirty(Object entity, Serializable id,
Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types) {
if (entity instanceof AbstractEntity) {
final Date timestamp = new Date();
// Find lastModifiedDate property to set.
for (int i = 0; i < propertyNames.length; i++) {
if (LAST_MODIFIED_DATE_PROPERTY.equals(propertyNames[i])) {
currentState[i] = timestamp;
// if (this.logger.isDebugEnabled()) {
// this.logger.debug("Setting " + propertyNames[i]
// + " property of " + entity);
// }
return true;
}
}
}
return false;
}
}