package org.infinispan.interceptors.base;
import org.infinispan.commands.VisitableCommand;
import org.infinispan.commands.read.GetKeyValueCommand;
import org.infinispan.commands.read.SizeCommand;
import org.infinispan.commands.tx.CommitCommand;
import org.infinispan.commands.tx.PrepareCommand;
import org.infinispan.commands.tx.RollbackCommand;
import org.infinispan.commands.write.ClearCommand;
import org.infinispan.commands.write.EvictCommand;
import org.infinispan.commands.write.PutKeyValueCommand;
import org.infinispan.commands.write.PutMapCommand;
import org.infinispan.commands.write.RemoveCommand;
import org.infinispan.commands.write.ReplaceCommand;
import org.infinispan.context.InvocationContext;
import org.infinispan.context.impl.TxInvocationContext;
import org.infinispan.interceptors.AsyncInterceptor;
/**
* This interceptor adds pre and post processing to each <tt>visitXXX()</tt> method.
* <p/>
* For each <tt>visitXXX()</tt> method invoked, it will first call {@link #doBeforeCall(InvocationContext,
* VisitableCommand)} and if this method returns true, it will proceed to invoking a <tt>handleXXX()</tt> method and
* lastly, {@link #doAfterCall(InvocationContext, VisitableCommand)} in a <tt>finally</tt> block. Note that the
* <tt>doAfterCall()</tt> method is still invoked even if <tt>doBeforeCall()</tt> returns <tt>false</tt>.
* <p/>
* Instead of overriding <tt>visitXXX()</tt> methods, implementations should override their <tt>handleXXX()</tt>
* counterparts defined in this class instead, as well as the {@link #doAfterCall(InvocationContext ,VisitableCommand)}
* method and optionally {@link #doBeforeCall(InvocationContext, VisitableCommand)}.
* <p/>
*
* @author Mircea.Markus@jboss.com
* @deprecated Since 9.0, please extend {@link AsyncInterceptor} instead.
*/
@Deprecated
public abstract class PrePostProcessingCommandInterceptor extends CommandInterceptor {
@Override
public Object visitPutKeyValueCommand(InvocationContext ctx, PutKeyValueCommand command) throws Throwable {
try {
return (doBeforeCall(ctx, command)) ? handlePutKeyValueCommand(ctx, command) : null;
}
finally {
doAfterCall(ctx, command);
}
}
protected Object handlePutKeyValueCommand(InvocationContext ctx, PutKeyValueCommand command) throws Throwable {
return handleDefault(ctx, command);
}
@Override
public Object visitRemoveCommand(InvocationContext ctx, RemoveCommand command) throws Throwable {
try {
return (doBeforeCall(ctx, command)) ? handleRemoveCommand(ctx, command) : null;
}
finally {
doAfterCall(ctx, command);
}
}
protected Object handleRemoveCommand(InvocationContext ctx, RemoveCommand command) throws Throwable {
return handleDefault(ctx, command);
}
@Override
public Object visitReplaceCommand(InvocationContext ctx, ReplaceCommand command) throws Throwable {
try {
return (doBeforeCall(ctx, command)) ? handleReplaceCommand(ctx, command) : null;
}
finally {
doAfterCall(ctx, command);
}
}
protected Object handleReplaceCommand(InvocationContext ctx, ReplaceCommand command) throws Throwable {
return handleDefault(ctx, command);
}
@Override
public Object visitClearCommand(InvocationContext ctx, ClearCommand command) throws Throwable {
try {
return (doBeforeCall(ctx, command)) ? handleClearCommand(ctx, command) : null;
}
finally {
doAfterCall(ctx, command);
}
}
protected Object handleClearCommand(InvocationContext ctx, ClearCommand command) throws Throwable {
return handleDefault(ctx, command);
}
@Override
public Object visitPutMapCommand(InvocationContext ctx, PutMapCommand command) throws Throwable {
try {
return (doBeforeCall(ctx, command)) ? handlePutMapCommand(ctx, command) : null;
}
finally {
doAfterCall(ctx, command);
}
}
protected Object handlePutMapCommand(InvocationContext ctx, PutMapCommand command) throws Throwable {
return handleDefault(ctx, command);
}
@Override
public Object visitEvictCommand(InvocationContext ctx, EvictCommand command) throws Throwable {
try {
return (doBeforeCall(ctx, command)) ? handleEvictCommand(ctx, command) : null;
}
finally {
doAfterCall(ctx, command);
}
}
protected Object handleEvictCommand(InvocationContext ctx, EvictCommand command) throws Throwable {
return handleDefault(ctx, command);
}
// read commands
@Override
public Object visitSizeCommand(InvocationContext ctx, SizeCommand command) throws Throwable {
try {
return (doBeforeCall(ctx, command)) ? handleSizeCommand(ctx, command) : null;
}
finally {
doAfterCall(ctx, command);
}
}
protected Object handleSizeCommand(InvocationContext ctx, SizeCommand command) throws Throwable {
return handleDefault(ctx, command);
}
@Override
public Object visitGetKeyValueCommand(InvocationContext ctx, GetKeyValueCommand command) throws Throwable {
try {
return (doBeforeCall(ctx, command)) ? handleGetKeyValueCommand(ctx, command) : null;
}
finally {
doAfterCall(ctx, command);
}
}
protected Object handleGetKeyValueCommand(InvocationContext ctx, GetKeyValueCommand command) throws Throwable {
return handleDefault(ctx, command);
}
// tx commands
@Override
public Object visitPrepareCommand(TxInvocationContext ctx, PrepareCommand command) throws Throwable {
try {
return (doBeforeCall(ctx, command)) ? handlePrepareCommand(ctx, command) : null;
}
finally {
doAfterCall(ctx, command);
}
}
protected Object handlePrepareCommand(InvocationContext ctx, PrepareCommand command) throws Throwable {
return handleDefault(ctx, command);
}
@Override
public Object visitRollbackCommand(TxInvocationContext ctx, RollbackCommand command) throws Throwable {
try {
return (doBeforeCall(ctx, command)) ? handleRollbackCommand(ctx, command) : null;
}
finally {
doAfterCall(ctx, command);
}
}
protected Object handleRollbackCommand(InvocationContext ctx, RollbackCommand command) throws Throwable {
return handleDefault(ctx, command);
}
@Override
public Object visitCommitCommand(TxInvocationContext ctx, CommitCommand command) throws Throwable {
try {
return (doBeforeCall(ctx, command)) ? handleCommitCommand(ctx, command) : null;
}
finally {
doAfterCall(ctx, command);
}
}
protected Object handleCommitCommand(InvocationContext ctx, CommitCommand command) throws Throwable {
return handleDefault(ctx, command);
}
/**
* Callback that is invoked after every handleXXX() method defined above.
*
* @param ctx invocation context
* @param command command which was invoked
*/
protected abstract void doAfterCall(InvocationContext ctx, VisitableCommand command);
protected boolean doBeforeCall(InvocationContext ctx, VisitableCommand command) {
return true;
}
}