/*
* ome.tools.hibernate.ReloadingRefreshEventListener
*
* Copyright 2006 University of Dundee. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.tools.hibernate;
// Java imports
import java.util.Map;
// Third-party imports
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.hibernate.HibernateException;
import org.hibernate.event.EventSource;
import org.hibernate.event.RefreshEvent;
import org.hibernate.event.RefreshEventListener;
import org.hibernate.util.IdentityMap;
// Application-internal dependencies
import ome.conditions.ApiUsageException;
import ome.model.IObject;
/**
* responsible for responding to {@link RefreshEvent}. in particular in
* reloading the {@link IObject#unload() unloaded} entities.
*
* @author Josh Moore, josh.moore at gmx.de
* @version $Revision$, $Date$
* @since 3.0-M3
*/
public class ReloadingRefreshEventListener implements RefreshEventListener {
private static final long serialVersionUID = 4292680015211981832L;
private static Logger log = LoggerFactory
.getLogger(ReloadingRefreshEventListener.class);
/**
* @see RefreshEventListener#onRefresh(RefreshEvent)
*/
@SuppressWarnings("unchecked")
public void onRefresh(RefreshEvent event) throws HibernateException {
onRefresh(event, IdentityMap.instantiate(10));
}
/**
* @see RefreshEventListener#onRefresh(RefreshEvent, Map)
*/
@SuppressWarnings("unchecked")
public void onRefresh(RefreshEvent event, Map refreshedAlready)
throws HibernateException {
IObject orig = (IObject) event.getObject();
if (orig.getId() == null) {
throw new ApiUsageException(
"Transient entities cannot be refreshed.");
}
if (HibernateUtils.isUnloaded(orig)) {
final EventSource source = event.getSession();
log("Reloading unloaded entity:", orig.getClass(), ":", orig
.getId());
Object obj = source.load(orig.getClass(), orig.getId());
refreshedAlready.put(orig, obj);
return; // EARLY EXIT!
}
}
// ~ Helpers
// =========================================================================
private void log(Object... objects) {
if (log.isDebugEnabled() && objects != null && objects.length > 0) {
StringBuilder sb = new StringBuilder(objects.length * 16);
for (Object obj : objects) {
sb.append(obj.toString());
}
log.debug(sb.toString());
}
}
}