package gui.events;
import op.OPDE;
import op.threads.DisplayManager;
import op.threads.DisplayMessage;
import org.apache.log4j.Logger;
import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import javax.persistence.OptimisticLockException;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLIntegrityConstraintViolationException;
/**
* Created by tloehr on 09.06.15.
*/
public class JPADataChangeListener<T> implements DataChangeListener<T> {
private final DataChangeListener<T> postProcessing;
public JPADataChangeListener(DataChangeListener<T> postProcessing) {
this.postProcessing = postProcessing;
}
@Override
public void dataChanged(DataChangeEvent<T> evt) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException, SQLIntegrityConstraintViolationException {
T myEntity;
EntityManager em = OPDE.createEM();
try {
em.getTransaction().begin();
myEntity = em.merge(evt.getData());
em.lock(myEntity, LockModeType.OPTIMISTIC);
em.getTransaction().commit();
// Passes this on to the postProcessing
evt.setData(myEntity);
postProcessing.dataChanged(evt);
} catch (OptimisticLockException ole) {
em.getTransaction().rollback();
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
OPDE.warn(Logger.getLogger(evt.getSource().getClass()), ole);
OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage(ole));
} catch (Exception e) {
for (Throwable t = e.getCause(); t != null; t = t.getCause()) {
if (t instanceof SQLIntegrityConstraintViolationException) {
OPDE.warn(Logger.getLogger(evt.getSource().getClass()), t);
OPDE.getDisplayManager().addSubMessage(new DisplayMessage("error.sql.integrity"));
throw (new SQLIntegrityConstraintViolationException(t));
}
}
OPDE.fatal(Logger.getLogger(evt.getSource().getClass()), e);
} finally {
em.close();
}
}
}