package org.geoserver.hibernate; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.persistence.EntityManagerFactory; import javax.persistence.spi.PersistenceUnitInfo; import org.hibernate.EmptyInterceptor; import org.hibernate.Interceptor; import org.hibernate.ejb.Ejb3Configuration; import org.hibernate.ejb.HibernatePersistence; import org.hibernate.event.EventListeners; import org.hibernate.event.PostLoadEventListener; /** * Custom HibernatePersistence implementation that allows for setting an intercetor that is * a spring injected bean. * <p> * Taken from http://blog.krecan.net/tag/interceptor/. * </p> * */ public class ConfigurableHibernatePersistence extends HibernatePersistence { private Interceptor interceptor; private List<PostLoadEventListener> postLoadEventListeners; public Interceptor getInterceptor() { return interceptor; } public void setInterceptor(Interceptor interceptor) { this.interceptor = interceptor; } public void setPostLoadEventListeners(List<PostLoadEventListener> postLoadEventListeners) { this.postLoadEventListeners = postLoadEventListeners; } @SuppressWarnings("unchecked") @Override public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map) { Ejb3Configuration cfg = new Ejb3Configuration(); Ejb3Configuration configured = cfg.configure(info, map); postprocessConfiguration(info, map, configured); return configured != null ? configured.buildEntityManagerFactory() : null; } @SuppressWarnings("unchecked") protected void postprocessConfiguration(PersistenceUnitInfo info, Map map, Ejb3Configuration configured) { if (this.interceptor != null) { if (configured.getInterceptor() == null || EmptyInterceptor.class.equals(configured.getInterceptor().getClass())) { configured.setInterceptor(this.interceptor); } else { throw new IllegalStateException( "Hibernate interceptor already set in persistence.xml (" + configured.getInterceptor() + ")"); } } if (this.postLoadEventListeners != null) { EventListeners el = configured.getEventListeners(); List<PostLoadEventListener> listeners = new LinkedList(Arrays.asList(el.getPostLoadEventListeners())); listeners.addAll(this.postLoadEventListeners); el.setPostLoadEventListeners(listeners.toArray(new PostLoadEventListener[listeners.size()])); } } }