public InterceptorChain buildInterceptorChain() throws IllegalAccessException, InstantiationException, ClassNotFoundException
{
boolean optimistic = configuration.getNodeLockingScheme() == NodeLockingScheme.OPTIMISTIC;
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.getExposeManagementStatistics())
interceptorChain.appendIntereceptor(createInterceptor(CacheMgmtInterceptor.class));
// load the tx interceptor
interceptorChain.appendIntereceptor(createInterceptor(optimistic ? OptimisticTxInterceptor.class : TxInterceptor.class));
if (configuration.isUseLazyDeserialization())
interceptorChain.appendIntereceptor(createInterceptor(MarshalledValueInterceptor.class));
interceptorChain.appendIntereceptor(createInterceptor(NotificationInterceptor.class));
switch (configuration.getCacheMode())
{
case REPL_SYNC:
case REPL_ASYNC:
interceptorChain.appendIntereceptor(optimistic ? createInterceptor(OptimisticReplicationInterceptor.class) : createInterceptor(ReplicationInterceptor.class));
break;
case INVALIDATION_SYNC:
case INVALIDATION_ASYNC:
interceptorChain.appendIntereceptor(createInterceptor(InvalidationInterceptor.class));
break;
case LOCAL:
//Nothing...
}
if (configuration.getNodeLockingScheme() == NodeLockingScheme.MVCC)
{
// if MVCC, then the CLI or AI must come before the MVCCLI.
if (configuration.isUsingCacheLoaders())
{
if (configuration.getCacheLoaderConfig().isPassivation())
{
interceptorChain.appendIntereceptor(createInterceptor(ActivationInterceptor.class));
}
else
{
interceptorChain.appendIntereceptor(createInterceptor(CacheLoaderInterceptor.class));
}
}
interceptorChain.appendIntereceptor(createInterceptor(MVCCLockingInterceptor.class));
}
else if (configuration.getNodeLockingScheme() == NodeLockingScheme.PESSIMISTIC)
{
interceptorChain.appendIntereceptor(createInterceptor(PessimisticLockInterceptor.class));
}
if (configuration.isUsingCacheLoaders())
{
if (configuration.getCacheLoaderConfig().isPassivation())
{
if (configuration.getNodeLockingScheme() != NodeLockingScheme.MVCC)
{
interceptorChain.appendIntereceptor(createInterceptor(LegacyActivationInterceptor.class));
interceptorChain.appendIntereceptor(createInterceptor(LegacyPassivationInterceptor.class));
}
else
{
interceptorChain.appendIntereceptor(createInterceptor(PassivationInterceptor.class));
}
}
else
{
if (configuration.getNodeLockingScheme() != NodeLockingScheme.MVCC)
{
interceptorChain.appendIntereceptor(createInterceptor(LegacyCacheLoaderInterceptor.class));
interceptorChain.appendIntereceptor(createInterceptor(LegacyCacheStoreInterceptor.class));
}
else
{
interceptorChain.appendIntereceptor(createInterceptor(CacheStoreInterceptor.class));
}
}
}
if (configuration.isUsingBuddyReplication())
{
if (configuration.getNodeLockingScheme() == NodeLockingScheme.MVCC)
interceptorChain.appendIntereceptor(createInterceptor(DataGravitatorInterceptor.class));
else
interceptorChain.appendIntereceptor(createInterceptor(LegacyDataGravitatorInterceptor.class));
}
if (optimistic)
{
interceptorChain.appendIntereceptor(createInterceptor(OptimisticLockingInterceptor.class));
interceptorChain.appendIntereceptor(createInterceptor(OptimisticValidatorInterceptor.class));
interceptorChain.appendIntereceptor(createInterceptor(OptimisticCreateIfNotExistsInterceptor.class));
}
// eviction interceptor to come before the optimistic node interceptor
if (configuration.getEvictionConfig() != null && configuration.getEvictionConfig().isValidConfig())
interceptorChain.appendIntereceptor(createInterceptor(configuration.isUsingBuddyReplication() ? BuddyRegionAwareEvictionInterceptor.class : EvictionInterceptor.class));
if (optimistic) interceptorChain.appendIntereceptor(createInterceptor(OptimisticNodeInterceptor.class));
CommandInterceptor callInterceptor = createInterceptor(CallInterceptor.class);
interceptorChain.appendIntereceptor(callInterceptor);
if (log.isTraceEnabled()) log.trace("Finished building default interceptor chain.");
buildCustomInterceptors(interceptorChain, configuration.getCustomInterceptors());
return interceptorChain;
}