/* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Middleware LLC. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA * */ package org.hibernate.event; import java.io.Serializable; import java.lang.reflect.Field; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.hibernate.MappingException; import org.hibernate.HibernateException; import org.hibernate.cfg.Configuration; import org.hibernate.event.def.DefaultAutoFlushEventListener; import org.hibernate.event.def.DefaultDeleteEventListener; import org.hibernate.event.def.DefaultDirtyCheckEventListener; import org.hibernate.event.def.DefaultEvictEventListener; import org.hibernate.event.def.DefaultFlushEntityEventListener; import org.hibernate.event.def.DefaultFlushEventListener; import org.hibernate.event.def.DefaultInitializeCollectionEventListener; import org.hibernate.event.def.DefaultLoadEventListener; import org.hibernate.event.def.DefaultLockEventListener; import org.hibernate.event.def.DefaultMergeEventListener; import org.hibernate.event.def.DefaultPersistEventListener; import org.hibernate.event.def.DefaultPostLoadEventListener; import org.hibernate.event.def.DefaultPreLoadEventListener; import org.hibernate.event.def.DefaultRefreshEventListener; import org.hibernate.event.def.DefaultReplicateEventListener; import org.hibernate.event.def.DefaultSaveEventListener; import org.hibernate.event.def.DefaultSaveOrUpdateCopyEventListener; import org.hibernate.event.def.DefaultSaveOrUpdateEventListener; import org.hibernate.event.def.DefaultUpdateEventListener; import org.hibernate.event.def.DefaultPersistOnFlushEventListener; import org.hibernate.util.Cloneable; /** * A convience holder for all defined session event listeners. * * @author Steve Ebersole */ public class EventListeners extends Cloneable implements Serializable { private LoadEventListener[] loadEventListeners = { new DefaultLoadEventListener() }; private SaveOrUpdateEventListener[] saveOrUpdateEventListeners = { new DefaultSaveOrUpdateEventListener() }; private MergeEventListener[] mergeEventListeners = { new DefaultMergeEventListener() }; private PersistEventListener[] persistEventListeners = { new DefaultPersistEventListener() }; private PersistEventListener[] persistOnFlushEventListeners = { new DefaultPersistOnFlushEventListener() }; private ReplicateEventListener[] replicateEventListeners = { new DefaultReplicateEventListener() }; private DeleteEventListener[] deleteEventListeners = { new DefaultDeleteEventListener() }; private AutoFlushEventListener[] autoFlushEventListeners = { new DefaultAutoFlushEventListener() }; private DirtyCheckEventListener[] dirtyCheckEventListeners = { new DefaultDirtyCheckEventListener() }; private FlushEventListener[] flushEventListeners = { new DefaultFlushEventListener() }; private EvictEventListener[] evictEventListeners = { new DefaultEvictEventListener() }; private LockEventListener[] lockEventListeners = { new DefaultLockEventListener() }; private RefreshEventListener[] refreshEventListeners = { new DefaultRefreshEventListener() }; private FlushEntityEventListener[] flushEntityEventListeners = { new DefaultFlushEntityEventListener() }; private InitializeCollectionEventListener[] initializeCollectionEventListeners = { new DefaultInitializeCollectionEventListener() }; private PostLoadEventListener[] postLoadEventListeners = { new DefaultPostLoadEventListener() }; private PreLoadEventListener[] preLoadEventListeners = { new DefaultPreLoadEventListener() }; private PreDeleteEventListener[] preDeleteEventListeners = {}; private PreUpdateEventListener[] preUpdateEventListeners = {}; private PreInsertEventListener[] preInsertEventListeners = {}; private PostDeleteEventListener[] postDeleteEventListeners = {}; private PostUpdateEventListener[] postUpdateEventListeners = {}; private PostInsertEventListener[] postInsertEventListeners = {}; private PostDeleteEventListener[] postCommitDeleteEventListeners = {}; private PostUpdateEventListener[] postCommitUpdateEventListeners = {}; private PostInsertEventListener[] postCommitInsertEventListeners = {}; private PreCollectionRecreateEventListener[] preCollectionRecreateEventListeners = {}; private PostCollectionRecreateEventListener[] postCollectionRecreateEventListeners = {}; private PreCollectionRemoveEventListener[] preCollectionRemoveEventListeners = {}; private PostCollectionRemoveEventListener[] postCollectionRemoveEventListeners = {}; private PreCollectionUpdateEventListener[] preCollectionUpdateEventListeners = {}; private PostCollectionUpdateEventListener[] postCollectionUpdateEventListeners = {}; private SaveOrUpdateEventListener[] saveEventListeners = { new DefaultSaveEventListener() }; private SaveOrUpdateEventListener[] updateEventListeners = { new DefaultUpdateEventListener() }; private MergeEventListener[] saveOrUpdateCopyEventListeners = { new DefaultSaveOrUpdateCopyEventListener() };//saveOrUpdateCopy() is deprecated! private static Map eventInterfaceFromType; static { eventInterfaceFromType = new HashMap(); eventInterfaceFromType.put("auto-flush", AutoFlushEventListener.class); eventInterfaceFromType.put("merge", MergeEventListener.class); eventInterfaceFromType.put("create", PersistEventListener.class); eventInterfaceFromType.put("create-onflush", PersistEventListener.class); eventInterfaceFromType.put("delete", DeleteEventListener.class); eventInterfaceFromType.put("dirty-check", DirtyCheckEventListener.class); eventInterfaceFromType.put("evict", EvictEventListener.class); eventInterfaceFromType.put("flush", FlushEventListener.class); eventInterfaceFromType.put("flush-entity", FlushEntityEventListener.class); eventInterfaceFromType.put("load", LoadEventListener.class); eventInterfaceFromType.put("load-collection", InitializeCollectionEventListener.class); eventInterfaceFromType.put("lock", LockEventListener.class); eventInterfaceFromType.put("refresh", RefreshEventListener.class); eventInterfaceFromType.put("replicate", ReplicateEventListener.class); eventInterfaceFromType.put("save-update", SaveOrUpdateEventListener.class); eventInterfaceFromType.put("save", SaveOrUpdateEventListener.class); eventInterfaceFromType.put("update", SaveOrUpdateEventListener.class); eventInterfaceFromType.put("pre-load", PreLoadEventListener.class); eventInterfaceFromType.put("pre-update", PreUpdateEventListener.class); eventInterfaceFromType.put("pre-delete", PreDeleteEventListener.class); eventInterfaceFromType.put("pre-insert", PreInsertEventListener.class); eventInterfaceFromType.put("pre-collection-recreate", PreCollectionRecreateEventListener.class); eventInterfaceFromType.put("pre-collection-remove", PreCollectionRemoveEventListener.class); eventInterfaceFromType.put("pre-collection-update", PreCollectionUpdateEventListener.class); eventInterfaceFromType.put("post-load", PostLoadEventListener.class); eventInterfaceFromType.put("post-update", PostUpdateEventListener.class); eventInterfaceFromType.put("post-delete", PostDeleteEventListener.class); eventInterfaceFromType.put("post-insert", PostInsertEventListener.class); eventInterfaceFromType.put("post-commit-update", PostUpdateEventListener.class); eventInterfaceFromType.put("post-commit-delete", PostDeleteEventListener.class); eventInterfaceFromType.put("post-commit-insert", PostInsertEventListener.class); eventInterfaceFromType.put("post-collection-recreate", PostCollectionRecreateEventListener.class); eventInterfaceFromType.put("post-collection-remove", PostCollectionRemoveEventListener.class); eventInterfaceFromType.put("post-collection-update", PostCollectionUpdateEventListener.class); eventInterfaceFromType = Collections.unmodifiableMap( eventInterfaceFromType ); } public Class getListenerClassFor(String type) { Class clazz = (Class) eventInterfaceFromType.get(type); if (clazz == null) { throw new MappingException("Unrecognized listener type [" + type + "]"); } return clazz; } private static interface ListenerProcesser { public void processListener(Object listener); } private void processListeners(ListenerProcesser processer) { Field[] fields = getClass().getDeclaredFields(); for ( int i = 0; i < fields.length; i++ ) { final Object[] listeners; try { Object fieldValue = fields[i].get(this); if ( fieldValue instanceof Object[] ) { listeners = ( Object[] ) fieldValue; } else { continue; } } catch ( Throwable t ) { throw new HibernateException( "could not init listeners", t ); } int length = listeners.length; for ( int index = 0 ; index < length ; index++ ) { processer.processListener( listeners[index ] ); } } } /** * Call {@link Initializable#initialize} on any listeners that implement the * {@link Initializable} interface. * * @param cfg The configuration. */ public void initializeListeners(final Configuration cfg) { try { processListeners( new ListenerProcesser() { public void processListener(Object listener) { if ( listener instanceof Initializable ) { ( ( Initializable ) listener ).initialize( cfg ); } } } ); } catch ( Exception e ) { throw new HibernateException("could not init listeners", e); } } /** * Call {@link Destructible#cleanup} on any listeners that implement the * {@link Destructible} interface. */ public void destroyListeners() { try { processListeners( new ListenerProcesser() { public void processListener(Object listener) { if ( listener instanceof Destructible ) { ( ( Destructible ) listener ).cleanup(); } } } ); } catch ( Exception e ) { throw new HibernateException("could not destruct listeners", e); } } public LoadEventListener[] getLoadEventListeners() { return loadEventListeners; } public void setLoadEventListeners(LoadEventListener[] loadEventListener) { this.loadEventListeners = loadEventListener; } public ReplicateEventListener[] getReplicateEventListeners() { return replicateEventListeners; } public void setReplicateEventListeners(ReplicateEventListener[] replicateEventListener) { this.replicateEventListeners = replicateEventListener; } public DeleteEventListener[] getDeleteEventListeners() { return deleteEventListeners; } public void setDeleteEventListeners(DeleteEventListener[] deleteEventListener) { this.deleteEventListeners = deleteEventListener; } public AutoFlushEventListener[] getAutoFlushEventListeners() { return autoFlushEventListeners; } public void setAutoFlushEventListeners(AutoFlushEventListener[] autoFlushEventListener) { this.autoFlushEventListeners = autoFlushEventListener; } public DirtyCheckEventListener[] getDirtyCheckEventListeners() { return dirtyCheckEventListeners; } public void setDirtyCheckEventListeners(DirtyCheckEventListener[] dirtyCheckEventListener) { this.dirtyCheckEventListeners = dirtyCheckEventListener; } public FlushEventListener[] getFlushEventListeners() { return flushEventListeners; } public void setFlushEventListeners(FlushEventListener[] flushEventListener) { this.flushEventListeners = flushEventListener; } public EvictEventListener[] getEvictEventListeners() { return evictEventListeners; } public void setEvictEventListeners(EvictEventListener[] evictEventListener) { this.evictEventListeners = evictEventListener; } public LockEventListener[] getLockEventListeners() { return lockEventListeners; } public void setLockEventListeners(LockEventListener[] lockEventListener) { this.lockEventListeners = lockEventListener; } public RefreshEventListener[] getRefreshEventListeners() { return refreshEventListeners; } public void setRefreshEventListeners(RefreshEventListener[] refreshEventListener) { this.refreshEventListeners = refreshEventListener; } public InitializeCollectionEventListener[] getInitializeCollectionEventListeners() { return initializeCollectionEventListeners; } public void setInitializeCollectionEventListeners(InitializeCollectionEventListener[] initializeCollectionEventListener) { this.initializeCollectionEventListeners = initializeCollectionEventListener; } public FlushEntityEventListener[] getFlushEntityEventListeners() { return flushEntityEventListeners; } public void setFlushEntityEventListeners(FlushEntityEventListener[] flushEntityEventListener) { this.flushEntityEventListeners = flushEntityEventListener; } public SaveOrUpdateEventListener[] getSaveOrUpdateEventListeners() { return saveOrUpdateEventListeners; } public void setSaveOrUpdateEventListeners(SaveOrUpdateEventListener[] saveOrUpdateEventListener) { this.saveOrUpdateEventListeners = saveOrUpdateEventListener; } public MergeEventListener[] getMergeEventListeners() { return mergeEventListeners; } public void setMergeEventListeners(MergeEventListener[] mergeEventListener) { this.mergeEventListeners = mergeEventListener; } public PersistEventListener[] getPersistEventListeners() { return persistEventListeners; } public void setPersistEventListeners(PersistEventListener[] createEventListener) { this.persistEventListeners = createEventListener; } public PersistEventListener[] getPersistOnFlushEventListeners() { return persistOnFlushEventListeners; } public void setPersistOnFlushEventListeners(PersistEventListener[] createEventListener) { this.persistOnFlushEventListeners = createEventListener; } public MergeEventListener[] getSaveOrUpdateCopyEventListeners() { return saveOrUpdateCopyEventListeners; } public void setSaveOrUpdateCopyEventListeners(MergeEventListener[] saveOrUpdateCopyEventListener) { this.saveOrUpdateCopyEventListeners = saveOrUpdateCopyEventListener; } public SaveOrUpdateEventListener[] getSaveEventListeners() { return saveEventListeners; } public void setSaveEventListeners(SaveOrUpdateEventListener[] saveEventListener) { this.saveEventListeners = saveEventListener; } public SaveOrUpdateEventListener[] getUpdateEventListeners() { return updateEventListeners; } public void setUpdateEventListeners(SaveOrUpdateEventListener[] updateEventListener) { this.updateEventListeners = updateEventListener; } public PostLoadEventListener[] getPostLoadEventListeners() { return postLoadEventListeners; } public void setPostLoadEventListeners(PostLoadEventListener[] postLoadEventListener) { this.postLoadEventListeners = postLoadEventListener; } public PreLoadEventListener[] getPreLoadEventListeners() { return preLoadEventListeners; } public void setPreLoadEventListeners(PreLoadEventListener[] preLoadEventListener) { this.preLoadEventListeners = preLoadEventListener; } public PreCollectionRecreateEventListener[] getPreCollectionRecreateEventListeners() { return preCollectionRecreateEventListeners; } public void setPreCollectionRecreateEventListeners(PreCollectionRecreateEventListener[] preCollectionRecreateEventListener) { this.preCollectionRecreateEventListeners = preCollectionRecreateEventListener; } public PreCollectionRemoveEventListener[] getPreCollectionRemoveEventListeners() { return preCollectionRemoveEventListeners; } public void setPreCollectionRemoveEventListeners(PreCollectionRemoveEventListener[] preCollectionRemoveEventListener) { this.preCollectionRemoveEventListeners = preCollectionRemoveEventListener; } public PreCollectionUpdateEventListener[] getPreCollectionUpdateEventListeners() { return preCollectionUpdateEventListeners; } public void setPreCollectionUpdateEventListeners(PreCollectionUpdateEventListener[] preCollectionUpdateEventListeners) { this.preCollectionUpdateEventListeners = preCollectionUpdateEventListeners; } public PostDeleteEventListener[] getPostDeleteEventListeners() { return postDeleteEventListeners; } public PostInsertEventListener[] getPostInsertEventListeners() { return postInsertEventListeners; } public PostUpdateEventListener[] getPostUpdateEventListeners() { return postUpdateEventListeners; } public void setPostDeleteEventListeners(PostDeleteEventListener[] postDeleteEventListener) { this.postDeleteEventListeners = postDeleteEventListener; } public void setPostInsertEventListeners(PostInsertEventListener[] postInsertEventListener) { this.postInsertEventListeners = postInsertEventListener; } public void setPostUpdateEventListeners(PostUpdateEventListener[] postUpdateEventListener) { this.postUpdateEventListeners = postUpdateEventListener; } public PostCollectionRecreateEventListener[] getPostCollectionRecreateEventListeners() { return postCollectionRecreateEventListeners; } public void setPostCollectionRecreateEventListeners(PostCollectionRecreateEventListener[] postCollectionRecreateEventListener) { this.postCollectionRecreateEventListeners = postCollectionRecreateEventListener; } public PostCollectionRemoveEventListener[] getPostCollectionRemoveEventListeners() { return postCollectionRemoveEventListeners; } public void setPostCollectionRemoveEventListeners(PostCollectionRemoveEventListener[] postCollectionRemoveEventListener) { this.postCollectionRemoveEventListeners = postCollectionRemoveEventListener; } public PostCollectionUpdateEventListener[] getPostCollectionUpdateEventListeners() { return postCollectionUpdateEventListeners; } public void setPostCollectionUpdateEventListeners(PostCollectionUpdateEventListener[] postCollectionUpdateEventListeners) { this.postCollectionUpdateEventListeners = postCollectionUpdateEventListeners; } public PreDeleteEventListener[] getPreDeleteEventListeners() { return preDeleteEventListeners; } public void setPreDeleteEventListeners(PreDeleteEventListener[] preDeleteEventListener) { this.preDeleteEventListeners = preDeleteEventListener; } public PreInsertEventListener[] getPreInsertEventListeners() { return preInsertEventListeners; } public void setPreInsertEventListeners(PreInsertEventListener[] preInsertEventListener) { this.preInsertEventListeners = preInsertEventListener; } public PreUpdateEventListener[] getPreUpdateEventListeners() { return preUpdateEventListeners; } public void setPreUpdateEventListeners(PreUpdateEventListener[] preUpdateEventListener) { this.preUpdateEventListeners = preUpdateEventListener; } public PostDeleteEventListener[] getPostCommitDeleteEventListeners() { return postCommitDeleteEventListeners; } public void setPostCommitDeleteEventListeners( PostDeleteEventListener[] postCommitDeleteEventListeners) { this.postCommitDeleteEventListeners = postCommitDeleteEventListeners; } public PostInsertEventListener[] getPostCommitInsertEventListeners() { return postCommitInsertEventListeners; } public void setPostCommitInsertEventListeners( PostInsertEventListener[] postCommitInsertEventListeners) { this.postCommitInsertEventListeners = postCommitInsertEventListeners; } public PostUpdateEventListener[] getPostCommitUpdateEventListeners() { return postCommitUpdateEventListeners; } public void setPostCommitUpdateEventListeners( PostUpdateEventListener[] postCommitUpdateEventListeners) { this.postCommitUpdateEventListeners = postCommitUpdateEventListeners; } }