/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2009-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.ejb.event;
import javax.persistence.PostLoad;
import javax.persistence.PostPersist;
import javax.persistence.PostRemove;
import javax.persistence.PostUpdate;
import javax.persistence.PrePersist;
import javax.persistence.PreRemove;
import javax.persistence.PreUpdate;
import java.io.Serializable;
import java.util.HashMap;
import org.hibernate.annotations.common.reflection.ReflectionManager;
import org.hibernate.annotations.common.reflection.XClass;
import org.hibernate.metamodel.binding.EntityBinding;
import org.hibernate.service.classloading.spi.ClassLoaderService;
/**
* Keep track of all lifecycle callbacks and listeners for a given persistence unit
*
* @author <a href="mailto:kabir.khan@jboss.org">Kabir Khan</a>
*/
@SuppressWarnings({"unchecked", "serial"})
public class EntityCallbackHandler implements Serializable {
private HashMap<Class, Callback[]> preCreates = new HashMap<Class, Callback[]>();
private HashMap<Class, Callback[]> postCreates = new HashMap<Class, Callback[]>();
private HashMap<Class, Callback[]> preRemoves = new HashMap<Class, Callback[]>();
private HashMap<Class, Callback[]> postRemoves = new HashMap<Class, Callback[]>();
private HashMap<Class, Callback[]> preUpdates = new HashMap<Class, Callback[]>();
private HashMap<Class, Callback[]> postUpdates = new HashMap<Class, Callback[]>();
private HashMap<Class, Callback[]> postLoads = new HashMap<Class, Callback[]>();
public void add(XClass entity, ReflectionManager reflectionManager) {
addCallback( entity, preCreates, PrePersist.class, reflectionManager );
addCallback( entity, postCreates, PostPersist.class, reflectionManager );
addCallback( entity, preRemoves, PreRemove.class, reflectionManager );
addCallback( entity, postRemoves, PostRemove.class, reflectionManager );
addCallback( entity, preUpdates, PreUpdate.class, reflectionManager );
addCallback( entity, postUpdates, PostUpdate.class, reflectionManager );
addCallback( entity, postLoads, PostLoad.class, reflectionManager );
}
public void add( Class entity,
ClassLoaderService classLoaderService,
EntityBinding binding ) {
addCallback( entity, preCreates, PrePersist.class, classLoaderService, binding );
addCallback( entity, postCreates, PostPersist.class, classLoaderService, binding );
addCallback( entity, preRemoves, PreRemove.class, classLoaderService, binding );
addCallback( entity, postRemoves, PostRemove.class, classLoaderService, binding );
addCallback( entity, preUpdates, PreUpdate.class, classLoaderService, binding );
addCallback( entity, postUpdates, PostUpdate.class, classLoaderService, binding );
addCallback( entity, postLoads, PostLoad.class, classLoaderService, binding );
}
public boolean preCreate(Object bean) {
return callback( preCreates.get( bean.getClass() ), bean );
}
public boolean postCreate(Object bean) {
return callback( postCreates.get( bean.getClass() ), bean );
}
public boolean preRemove(Object bean) {
return callback( preRemoves.get( bean.getClass() ), bean );
}
public boolean postRemove(Object bean) {
return callback( postRemoves.get( bean.getClass() ), bean );
}
public boolean preUpdate(Object bean) {
return callback( preUpdates.get( bean.getClass() ), bean );
}
public boolean postUpdate(Object bean) {
return callback( postUpdates.get( bean.getClass() ), bean );
}
public boolean postLoad(Object bean) {
return callback( postLoads.get( bean.getClass() ), bean );
}
private boolean callback(Callback[] callbacks, Object bean) {
if ( callbacks != null && callbacks.length != 0 ) {
for ( Callback callback : callbacks ) {
callback.invoke( bean );
}
return true;
}
else {
return false;
}
}
private void addCallback(
XClass entity, HashMap<Class, Callback[]> map, Class annotation, ReflectionManager reflectionManager
) {
Callback[] callbacks = null;
callbacks = CallbackResolver.resolveCallback( entity, annotation, reflectionManager );
map.put( reflectionManager.toClass( entity ), callbacks );
}
private void addCallback( Class<?> entity,
HashMap<Class, Callback[]> map,
Class annotation,
ClassLoaderService classLoaderService,
EntityBinding binding ) {
map.put(entity, CallbackResolver.resolveCallbacks(entity, annotation, classLoaderService, binding));
}
}