/*
* Copyright 2011 Red Hat, Inc. and/or its affiliates.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
package org.infinispan.configuration.cache;
import org.infinispan.config.ConfigurationException;
import org.infinispan.configuration.cache.InterceptorConfiguration.Position;
import org.infinispan.interceptors.base.CommandInterceptor;
/**
* This builder defines details of a specific custom interceptor.
*/
public class InterceptorConfigurationBuilder extends AbstractCustomInterceptorsConfigurationChildBuilder<InterceptorConfiguration> {
private Class<? extends CommandInterceptor> after;
private Class<? extends CommandInterceptor> before;
private CommandInterceptor interceptor;
private int index = -1;
private Position position = null;
InterceptorConfigurationBuilder(CustomInterceptorsConfigurationBuilder builder) {
super(builder);
}
/**
* Dictates that the custom interceptor appears immediately <i>after</i> the specified interceptor. If the specified
* interceptor is not found in the interceptor chain, a {@link ConfigurationException} will be thrown when the
* cache starts.
*
* @param after the class of the interceptor to look for
*/
public InterceptorConfigurationBuilder after(Class<? extends CommandInterceptor> after) {
this.after = after;
return this;
}
/**
* Dictates that the custom interceptor appears immediately <i>before</i> the specified interceptor. If the specified
* interceptor is not found in the interceptor chain, a {@link ConfigurationException} will be thrown when the
* cache starts.
*
* @param before the class of the interceptor to look for
*/
public InterceptorConfigurationBuilder before(Class<? extends CommandInterceptor> before) {
this.before = before;
return this;
}
/**
* An instance of the new custom interceptor to add to the configuration.
* @param interceptor an instance of {@link CommandInterceptor}
*/
public InterceptorConfigurationBuilder interceptor(CommandInterceptor interceptor) {
this.interceptor = interceptor;
return this;
}
/**
* Specifies a position in the interceptor chain to place the new interceptor. The index starts at 0 and goes up to
* the number of interceptors in a given configuration. A {@link ConfigurationException} is thrown if the index is
* less than 0 or greater than the maximum number of interceptors in the chain.
*
* @param i positional index in the interceptor chain to place the new interceptor.
*/
public InterceptorConfigurationBuilder index(int i) {
if (i < 0) throw new IllegalArgumentException("Index cannot be negative");
this.index = i;
return this;
}
/**
* Specifies a position, denoted by the {@link Position} enumeration, where to place the new interceptor.
*
* @param p position to place the new interceptor
*/
public InterceptorConfigurationBuilder position(Position p) {
this.position = p;
return this;
}
@Override
void validate() {
// Make sure more than one 'position' isn't picked.
int positions = 0;
if (before != null) positions++;
if (after != null) positions++;
if (position != null) positions++;
if (index > -1) positions++;
switch (positions) {
case 0:
position = Position.OTHER_THAN_FIRST_OR_LAST;
break;
case 1:
break;
default:
throw new ConfigurationException("You can only specify the position of a custom interceptor once.");
}
}
@Override
InterceptorConfiguration create() {
return new InterceptorConfiguration(after, before, interceptor, index, position);
}
@Override
public InterceptorConfigurationBuilder read(InterceptorConfiguration template) {
this.after = template.after();
this.before = template.before();
this.index = template.index();
this.interceptor = template.interceptor();
this.position = template.position();
return this;
}
@Override
public String toString() {
return "InterceptorConfigurationBuilder{" +
"after=" + after +
", before=" + before +
", interceptor=" + interceptor +
", index=" + index +
", position=" + position +
'}';
}
}