/* * Hibernate, Relational Persistence for Idiomatic Java * * Copyright (c) 2011, Red Hat Inc. 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 Inc. * * 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.spi; import java.lang.reflect.Field; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.hibernate.HibernateException; /** * Enumeration of the recognized types of events, including meta-information about each. * * @author Steve Ebersole */ public class EventType<T> { public static final EventType<LoadEventListener> LOAD = new EventType<LoadEventListener>( "load", LoadEventListener.class ); public static final EventType<InitializeCollectionEventListener> INIT_COLLECTION = new EventType<InitializeCollectionEventListener>( "load-collection", InitializeCollectionEventListener.class ); public static final EventType<SaveOrUpdateEventListener> SAVE_UPDATE = new EventType<SaveOrUpdateEventListener>( "save-update", SaveOrUpdateEventListener.class ); public static final EventType<SaveOrUpdateEventListener> UPDATE = new EventType<SaveOrUpdateEventListener>( "update", SaveOrUpdateEventListener.class ); public static final EventType<SaveOrUpdateEventListener> SAVE = new EventType<SaveOrUpdateEventListener>( "save", SaveOrUpdateEventListener.class ); public static final EventType<PersistEventListener> PERSIST = new EventType<PersistEventListener>( "create", PersistEventListener.class ); public static final EventType<PersistEventListener> PERSIST_ONFLUSH = new EventType<PersistEventListener>( "create-onflush", PersistEventListener.class ); public static final EventType<MergeEventListener> MERGE = new EventType<MergeEventListener>( "merge", MergeEventListener.class ); public static final EventType<DeleteEventListener> DELETE = new EventType<DeleteEventListener>( "delete", DeleteEventListener.class ); public static final EventType<ReplicateEventListener> REPLICATE = new EventType<ReplicateEventListener>( "replicate", ReplicateEventListener.class ); public static final EventType<FlushEventListener> FLUSH = new EventType<FlushEventListener>( "flush", FlushEventListener.class ); public static final EventType<AutoFlushEventListener> AUTO_FLUSH = new EventType<AutoFlushEventListener>( "auto-flush", AutoFlushEventListener.class ); public static final EventType<DirtyCheckEventListener> DIRTY_CHECK = new EventType<DirtyCheckEventListener>( "dirty-check", DirtyCheckEventListener.class ); public static final EventType<FlushEntityEventListener> FLUSH_ENTITY = new EventType<FlushEntityEventListener>( "flush-entity", FlushEntityEventListener.class ); public static final EventType<EvictEventListener> EVICT = new EventType<EvictEventListener>( "evict", EvictEventListener.class ); public static final EventType<LockEventListener> LOCK = new EventType<LockEventListener>( "lock", LockEventListener.class ); public static final EventType<RefreshEventListener> REFRESH = new EventType<RefreshEventListener>( "refresh", RefreshEventListener.class ); public static final EventType<PreLoadEventListener> PRE_LOAD = new EventType<PreLoadEventListener>( "pre-load", PreLoadEventListener.class ); public static final EventType<PreDeleteEventListener> PRE_DELETE = new EventType<PreDeleteEventListener>( "pre-delete", PreDeleteEventListener.class ); public static final EventType<PreUpdateEventListener> PRE_UPDATE = new EventType<PreUpdateEventListener>( "pre-update", PreUpdateEventListener.class ); public static final EventType<PreInsertEventListener> PRE_INSERT = new EventType<PreInsertEventListener>( "pre-insert", PreInsertEventListener.class ); public static final EventType<PostLoadEventListener> POST_LOAD = new EventType<PostLoadEventListener>( "post-load", PostLoadEventListener.class ); public static final EventType<PostDeleteEventListener> POST_DELETE = new EventType<PostDeleteEventListener>( "post-delete", PostDeleteEventListener.class ); public static final EventType<PostUpdateEventListener> POST_UPDATE = new EventType<PostUpdateEventListener>( "post-update", PostUpdateEventListener.class ); public static final EventType<PostInsertEventListener> POST_INSERT = new EventType<PostInsertEventListener>( "post-insert", PostInsertEventListener.class ); public static final EventType<PostDeleteEventListener> POST_COMMIT_DELETE = new EventType<PostDeleteEventListener>( "post-commit-delete", PostDeleteEventListener.class ); public static final EventType<PostUpdateEventListener> POST_COMMIT_UPDATE = new EventType<PostUpdateEventListener>( "post-commit-update", PostUpdateEventListener.class ); public static final EventType<PostInsertEventListener> POST_COMMIT_INSERT = new EventType<PostInsertEventListener>( "post-commit-insert", PostInsertEventListener.class ); public static final EventType<PreCollectionRecreateEventListener> PRE_COLLECTION_RECREATE = new EventType<PreCollectionRecreateEventListener>( "pre-collection-recreate", PreCollectionRecreateEventListener.class ); public static final EventType<PreCollectionRemoveEventListener> PRE_COLLECTION_REMOVE = new EventType<PreCollectionRemoveEventListener>( "pre-collection-remove", PreCollectionRemoveEventListener.class ); public static final EventType<PreCollectionUpdateEventListener> PRE_COLLECTION_UPDATE = new EventType<PreCollectionUpdateEventListener>( "pre-collection-update", PreCollectionUpdateEventListener.class ); public static final EventType<PostCollectionRecreateEventListener> POST_COLLECTION_RECREATE = new EventType<PostCollectionRecreateEventListener>( "post-collection-recreate", PostCollectionRecreateEventListener.class ); public static final EventType<PostCollectionRemoveEventListener> POST_COLLECTION_REMOVE = new EventType<PostCollectionRemoveEventListener>( "post-collection-remove", PostCollectionRemoveEventListener.class ); public static final EventType<PostCollectionUpdateEventListener> POST_COLLECTION_UPDATE = new EventType<PostCollectionUpdateEventListener>( "post-collection-update", PostCollectionUpdateEventListener.class ); /** * Maintain a map of {@link EventType} instances keyed by name for lookup by name as well as {@link #values()} * resolution. */ public static final Map<String,EventType> eventTypeByNameMap = AccessController.doPrivileged( new PrivilegedAction<Map<String, EventType>>() { @Override public Map<String, EventType> run() { final Map<String, EventType> typeByNameMap = new HashMap<String, EventType>(); final Field[] fields = EventType.class.getDeclaredFields(); for ( int i = 0, max = fields.length; i < max; i++ ) { if ( EventType.class.isAssignableFrom( fields[i].getType() ) ) { try { final EventType typeField = ( EventType ) fields[i].get( null ); typeByNameMap.put( typeField.eventName(), typeField ); } catch( Exception t ) { throw new HibernateException( "Unable to initialize EventType map", t ); } } } return typeByNameMap; } } ); /** * Find an {@link EventType} by its name * * @param eventName The name * * @return The {@link EventType} instance. * * @throws HibernateException If eventName is null, or if eventName does not correlate to any known event type. */ public static EventType resolveEventTypeByName(final String eventName) { if ( eventName == null ) { throw new HibernateException( "event name to resolve cannot be null" ); } final EventType eventType = eventTypeByNameMap.get( eventName ); if ( eventType == null ) { throw new HibernateException( "Unable to locate proper event type for event name [" + eventName + "]" ); } return eventType; } /** * Get a collection of all {@link EventType} instances. * * @return All {@link EventType} instances */ public static Collection<EventType> values() { return eventTypeByNameMap.values(); } private final String eventName; private final Class<? extends T> baseListenerInterface; private EventType(String eventName, Class<? extends T> baseListenerInterface) { this.eventName = eventName; this.baseListenerInterface = baseListenerInterface; } public String eventName() { return eventName; } public Class baseListenerInterface() { return baseListenerInterface; } @Override public String toString() { return eventName(); } }