Code:
/*
* SpringInterceptor.java
*
*/
import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import net.sf.hibernate.CallbackException;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Interceptor;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.type.Type;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.propertyeditors.ClassEditor;
import org.springframework.util.StringUtils;
/**
*
* @author Oliver Hutchison
* @see Interceptor
*/
public class SpringInterceptor implements Interceptor, InitializingBean,
BeanFactoryAware {
private BeanFactory beanFactory;
private SessionFactory sessionFactory;
private String sessionFactoryBeanName;
private Map persistantClassBeanNames = new HashMap();
private Interceptor delegate;
/**
* Constructor
*/
public SpringInterceptor() {
super();
}
public void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void setSessionFactoryBeanName(String sessionFactoryBeanName) {
this.sessionFactoryBeanName = sessionFactoryBeanName;
}
public void setPersistantClassBeanNames(Properties persistantClassBeanNames) {
ClassEditor ce = new ClassEditor();
for (Iterator i = persistantClassBeanNames.keySet().iterator(); i
.hasNext();) {
String className = (String) i.next();
String beanName = persistantClassBeanNames.getProperty(className);
ce.setAsText(className);
Class clazz = (Class) ce.getValue();
this.persistantClassBeanNames.put(clazz, beanName);
}
}
public void setDelegateInterceptor(Interceptor delegateInterceptor) {
this.delegate = delegateInterceptor;
}
public void afterPropertiesSet() {
if (beanFactory == null) {
throw new IllegalArgumentException("beanFactory is required");
}
if ((sessionFactory == null)
&& !StringUtils.hasText(sessionFactoryBeanName)) {
throw new IllegalArgumentException(
"sessionFactory or sessionFactoryBeanName is required");
}
}
/**
* @see net.sf.hibernate.Interceptor#instantiate(java.lang.Class,
* java.io.Serializable)
*/
public Object instantiate(Class beanClass, Serializable id)
throws CallbackException {
String name = (String) persistantClassBeanNames.get(beanClass);
if (name == null) {
if (delegate == null) {
return null;
} else {
return delegate.instantiate(beanClass, id);
}
}
if (beanFactory.isSingleton(name)) {
throw new UnsupportedOperationException("Bean name [" + name
+ "] must be a prototype. i.e. singleton=\"false\"");
}
Object newEntity = beanFactory.getBean(name);
try {
BeanWrapper wrapper = new BeanWrapperImpl(newEntity);
wrapper.setPropertyValue(getSessionFactory().getClassMetadata(
beanClass).getIdentifierPropertyName(), id);
} catch (HibernateException e) {
throw new CallbackException(
"Error getting identifier property for class " + beanClass,
e);
}
return newEntity;
}
private SessionFactory getSessionFactory() {
if (sessionFactory == null) {
sessionFactory = (SessionFactory) beanFactory
.getBean(sessionFactoryBeanName);
}
return sessionFactory;
}
/**
*
* @see net.sf.hibernate.Interceptor#onLoad(java.lang.Object,
* java.io.Serializable, java.lang.Object[], java.lang.String[],
* net.sf.hibernate.type.Type[])
*/
public boolean onLoad(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) throws CallbackException {
if (delegate != null) {
return delegate.onLoad(entity, id, state, propertyNames, types);
} else {
return false;
}
}
/**
* @see net.sf.hibernate.Interceptor#onFlushDirty(java.lang.Object,
* java.io.Serializable, java.lang.Object[], java.lang.Object[],
* java.lang.String[], net.sf.hibernate.type.Type[])
*/
public boolean onFlushDirty(Object entity, Serializable id,
Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types) throws CallbackException {
if (delegate != null) {
return delegate.onFlushDirty(entity, id, currentState,
previousState, propertyNames, types);
} else {
return false;
}
}
/**
* @see net.sf.hibernate.Interceptor#onSave(java.lang.Object,
* java.io.Serializable, java.lang.Object[], java.lang.String[],
* net.sf.hibernate.type.Type[])
*/
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) throws CallbackException {
if (delegate != null) {
return delegate.onSave(entity, id, state, propertyNames, types);
} else {
return false;
}
}
/**
* @see net.sf.hibernate.Interceptor#onDelete(java.lang.Object,
* java.io.Serializable, java.lang.Object[], java.lang.String[],
* net.sf.hibernate.type.Type[])
*/
public void onDelete(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) throws CallbackException {
if (delegate != null) {
delegate.onDelete(entity, id, state, propertyNames, types);
}
}
/**
* @see net.sf.hibernate.Interceptor#preFlush(java.util.Iterator)
*/
public void preFlush(Iterator entities) throws CallbackException {
if (delegate != null) {
delegate.preFlush(entities);
}
}
/**
* @see net.sf.hibernate.Interceptor#postFlush(java.util.Iterator)
*/
public void postFlush(Iterator entities) throws CallbackException {
if (delegate != null) {
delegate.postFlush(entities);
}
}
/**
* @see net.sf.hibernate.Interceptor#isUnsaved(java.lang.Object)
*/
public Boolean isUnsaved(Object entity) {
if (delegate != null) {
return delegate.isUnsaved(entity);
} else {
return null;
}
}
/**
* @see net.sf.hibernate.Interceptor#findDirty(java.lang.Object,
* java.io.Serializable, java.lang.Object[], java.lang.Object[],
* java.lang.String[], net.sf.hibernate.type.Type[])
*/
public int[] findDirty(Object entity, Serializable id,
Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types) {
if (delegate != null) {
return delegate.findDirty(entity, id, currentState, previousState,
propertyNames, types);
} else {
return null;
}
}
}