/*
* ome.tools.hibernate.EventMethodInterceptor
*
* 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.lang.reflect.Method;
// Third-party imports
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.hibernate.event.AbstractEvent;
// Application-internal dependencies
import ome.conditions.InternalException;
/**
* filter which can be added to any event type in order to catch execution.
*/
public class EventMethodInterceptor implements MethodInterceptor {
public static class Action {
public Object call(MethodInvocation mi) {
if (mi.getMethod().getReturnType().equals(boolean.class)) {
return Boolean.FALSE;
}
return null;
}
}
public static class DisableAction extends Action {
@Override
public Object call(MethodInvocation mi) {
if (disabled(mi)) {
throw createException(mi);
}
return super.call(mi);
}
protected boolean disabled(MethodInvocation mi) {
return true;
}
protected InternalException createException(MethodInvocation mi) {
return new InternalException(String.format(
"\nHibernate %s events have been disabled.", getType(mi)));
}
protected String getType(MethodInvocation mi) {
Object event = mi.getArguments()[0];
String type = "(unknown)";
if (AbstractEvent.class.isAssignableFrom(event.getClass())) {
type = event.getClass().getName();
}
return type;
}
}
static volatile String last = null;
static volatile int count = 1;
private static Logger log = LoggerFactory.getLogger(EventMethodInterceptor.class);
protected boolean verbose = false;
protected Action action;
public EventMethodInterceptor() {
this.action = new Action();
}
public EventMethodInterceptor(Action action) {
this.action = action;
}
// ~ Injectors
// =========================================================================
public void setDebug(boolean debug) {
this.verbose = debug;
}
public Object invoke(MethodInvocation arg0) throws Throwable {
Object[] args = arg0.getArguments();
Method method = arg0.getMethod();
if (verbose && method.getName().startsWith("on")) {
log(String.format("%s.%s called.", method.getDeclaringClass()
.getName(), method.getName()));
}
return action.call(arg0);
}
// ~ Helpers
// =========================================================================
protected void log(String msg) {
if (msg.equals(last)) {
count++;
}
else if (log.isInfoEnabled()) {
String times = " ( " + count + " times )";
log.info(msg + times);
last = msg;
count = 1;
}
}
}