public InterceptorChain buildInterceptorChain() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
boolean invocationBatching = configuration.isInvocationBatchingEnabled();
// load the icInterceptor first
CommandInterceptor first = invocationBatching ? createInterceptor(BatchingInterceptor.class) : createInterceptor(InvocationContextInterceptor.class);
InterceptorChain interceptorChain = new InterceptorChain(first);
// add the interceptor chain to the registry first, since some interceptors may ask for it.
componentRegistry.registerComponent(interceptorChain, InterceptorChain.class);
// NOW add the ICI if we are using batching!
if (invocationBatching)
interceptorChain.appendIntereceptor(createInterceptor(InvocationContextInterceptor.class));
// load the cache management interceptor next
if (configuration.isExposeJmxStatistics())
interceptorChain.appendIntereceptor(createInterceptor(CacheMgmtInterceptor.class));
// load the tx interceptor
if (configuration.getCacheMode().isDistributed())
interceptorChain.appendIntereceptor(createInterceptor(DistTxInterceptor.class));
else
interceptorChain.appendIntereceptor(createInterceptor(TxInterceptor.class));
if(configuration.isUseEagerLocking())
interceptorChain.appendIntereceptor(createInterceptor(ImplicitEagerLockingInterceptor.class));
if (configuration.isUseLazyDeserialization())
interceptorChain.appendIntereceptor(createInterceptor(MarshalledValueInterceptor.class));
interceptorChain.appendIntereceptor(createInterceptor(NotificationInterceptor.class));
if (configuration.isEnableDeadlockDetection()) {
interceptorChain.appendIntereceptor(createInterceptor(DeadlockDetectingInterceptor.class));
}
if (configuration.isUsingCacheLoaders()) {
if (configuration.getCacheLoaderManagerConfig().isPassivation()) {
interceptorChain.appendIntereceptor(createInterceptor(ActivationInterceptor.class));
interceptorChain.appendIntereceptor(createInterceptor(PassivationInterceptor.class));
} else {
interceptorChain.appendIntereceptor(createInterceptor(CacheLoaderInterceptor.class));
switch (configuration.getCacheMode()) {
case DIST_SYNC:
case DIST_ASYNC:
interceptorChain.appendIntereceptor(createInterceptor(DistCacheStoreInterceptor.class));
break;
default:
interceptorChain.appendIntereceptor(createInterceptor(CacheStoreInterceptor.class));
break;
}
}
}
if (configuration.getCacheMode().isDistributed())
interceptorChain.appendIntereceptor(createInterceptor(DistLockingInterceptor.class));
else
interceptorChain.appendIntereceptor(createInterceptor(LockingInterceptor.class));
switch (configuration.getCacheMode()) {
case REPL_SYNC:
case REPL_ASYNC:
interceptorChain.appendIntereceptor(createInterceptor(ReplicationInterceptor.class));
break;
case INVALIDATION_SYNC:
case INVALIDATION_ASYNC:
interceptorChain.appendIntereceptor(createInterceptor(InvalidationInterceptor.class));
break;
case DIST_SYNC:
case DIST_ASYNC:
interceptorChain.appendIntereceptor(createInterceptor(DistributionInterceptor.class));
break;
case LOCAL:
//Nothing...
}
CommandInterceptor callInterceptor = createInterceptor(CallInterceptor.class);
interceptorChain.appendIntereceptor(callInterceptor);
if (log.isTraceEnabled()) log.trace("Finished building default interceptor chain.");
buildCustomInterceptors(interceptorChain, configuration.getCustomInterceptors());
return interceptorChain;
}