package com.manning.hsia.dvdstore.util;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceException;
import org.hibernate.search.SearchException;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.Search;
public class EntityManagerInvocationHandler implements InvocationHandler {
private EntityManagerFactory factory;
private Object delegate;
public EntityManagerInvocationHandler(Object delegate, EntityManagerFactory factory) {
this.factory = factory;
this.delegate = delegate;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
FullTextEntityManager entityManager = Search.getFullTextEntityManager( factory.createEntityManager() );
EntityManagerHolder.setFullTextEntityManager(entityManager);
EntityTransaction tx = null;
Object result;
try {
tx = entityManager.getTransaction();
tx.begin();
result = method.invoke(delegate, args);
tx.commit();
}
catch (PersistenceException e) {
rollbackIfNeeded(tx);
throw e;
}
catch (SearchException e) {
rollbackIfNeeded(tx);
throw e;
}
finally {
entityManager.close();
EntityManagerHolder.setFullTextEntityManager(null);
}
return result;
}
private void rollbackIfNeeded(EntityTransaction tx) {
if ( tx != null && tx.isActive() ) {
tx.rollback();
}
}
}