/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.test.event.collection.detached;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.boot.Metadata;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.AbstractCollectionEvent;
import org.hibernate.event.spi.EventType;
import org.hibernate.event.spi.InitializeCollectionEvent;
import org.hibernate.event.spi.InitializeCollectionEventListener;
import org.hibernate.event.spi.PostCollectionRecreateEvent;
import org.hibernate.event.spi.PostCollectionRecreateEventListener;
import org.hibernate.event.spi.PostCollectionRemoveEvent;
import org.hibernate.event.spi.PostCollectionRemoveEventListener;
import org.hibernate.event.spi.PostCollectionUpdateEvent;
import org.hibernate.event.spi.PostCollectionUpdateEventListener;
import org.hibernate.event.spi.PreCollectionRecreateEvent;
import org.hibernate.event.spi.PreCollectionRecreateEventListener;
import org.hibernate.event.spi.PreCollectionRemoveEvent;
import org.hibernate.event.spi.PreCollectionRemoveEventListener;
import org.hibernate.event.spi.PreCollectionUpdateEvent;
import org.hibernate.event.spi.PreCollectionUpdateEventListener;
import org.hibernate.integrator.spi.Integrator;
import org.hibernate.service.spi.SessionFactoryServiceRegistry;
import org.jboss.logging.Logger;
/**
* @author Steve Ebersole
* @author Gail Badner
*/
public class AggregatedCollectionEventListener
implements InitializeCollectionEventListener,
PreCollectionRecreateEventListener,
PostCollectionRecreateEventListener,
PreCollectionRemoveEventListener,
PostCollectionRemoveEventListener,
PreCollectionUpdateEventListener,
PostCollectionUpdateEventListener {
private static final Logger log = Logger.getLogger( AggregatedCollectionEventListener.class );
private final List<EventEntry> eventEntryList = new ArrayList<EventEntry>();
public void reset() {
eventEntryList.clear();
}
public List<EventEntry> getEventEntryList() {
return eventEntryList;
}
@Override
public void onInitializeCollection(InitializeCollectionEvent event) throws HibernateException {
addEvent( event );
}
protected void addEvent(AbstractCollectionEvent event) {
log.debugf( "Added collection event : %s", event );
eventEntryList.add( new EventEntry( event ) );
}
// recreate ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void onPreRecreateCollection(PreCollectionRecreateEvent event) {
addEvent( event );
}
@Override
public void onPostRecreateCollection(PostCollectionRecreateEvent event) {
addEvent( event );
}
// remove ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void onPreRemoveCollection(PreCollectionRemoveEvent event) {
addEvent( event );
}
@Override
public void onPostRemoveCollection(PostCollectionRemoveEvent event) {
addEvent( event );
}
// update ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void onPreUpdateCollection(PreCollectionUpdateEvent event) {
addEvent( event );
}
@Override
public void onPostUpdateCollection(PostCollectionUpdateEvent event) {
addEvent( event );
}
public static class EventEntry {
private final AbstractCollectionEvent event;
private final Serializable snapshotAtTimeOfEventHandling;
public EventEntry(AbstractCollectionEvent event) {
this.event = event;
// make a copy of the collection?
this.snapshotAtTimeOfEventHandling = event.getSession()
.getPersistenceContext()
.getCollectionEntry( event.getCollection() )
.getSnapshot();
}
public AbstractCollectionEvent getEvent() {
return event;
}
public Serializable getSnapshotAtTimeOfEventHandling() {
return snapshotAtTimeOfEventHandling;
}
}
public static class IntegratorImpl implements Integrator {
private AggregatedCollectionEventListener listener;
public AggregatedCollectionEventListener getListener() {
if ( listener == null ) {
throw new HibernateException( "Integrator not yet processed" );
}
return listener;
}
@Override
public void integrate(
Metadata metadata,
SessionFactoryImplementor sessionFactory,
SessionFactoryServiceRegistry serviceRegistry) {
integrate( serviceRegistry );
}
protected void integrate(SessionFactoryServiceRegistry serviceRegistry) {
if ( listener != null ) {
log.warn( "integrate called second time on testing collection listener Integrator (could be result of rebuilding SF on test failure)" );
}
listener = new AggregatedCollectionEventListener();
final EventListenerRegistry listenerRegistry = serviceRegistry.getService( EventListenerRegistry.class );
listenerRegistry.appendListeners( EventType.INIT_COLLECTION, listener );
listenerRegistry.appendListeners( EventType.PRE_COLLECTION_RECREATE, listener );
listenerRegistry.appendListeners( EventType.POST_COLLECTION_RECREATE, listener );
listenerRegistry.appendListeners( EventType.PRE_COLLECTION_REMOVE, listener );
listenerRegistry.appendListeners( EventType.POST_COLLECTION_REMOVE, listener );
listenerRegistry.appendListeners( EventType.PRE_COLLECTION_UPDATE, listener );
listenerRegistry.appendListeners( EventType.POST_COLLECTION_UPDATE, listener );
}
@Override
public void disintegrate(
SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
//To change body of implemented methods use File | Settings | File Templates.
}
}
}