ReusableCircuitBreakerBuilder.java

package net.secodo.jcircuitbreaker.breaker.builder.impl;

import net.secodo.jcircuitbreaker.breaker.builder.BuilderValidationException;
import net.secodo.jcircuitbreaker.breaker.impl.ReusableCircuitBreaker;
import net.secodo.jcircuitbreaker.breakhandler.BreakHandler;
import net.secodo.jcircuitbreaker.breakstrategy.BreakStrategy;


/**
 * A builder class for {@link ReusableCircuitBreaker}. Allows to create instance of {@link ReusableCircuitBreaker}
 * using fluent interface.
 *
 * @param <R> see {@link net.secodo.jcircuitbreaker.breaker.CircuitBreaker}
 */
public class ReusableCircuitBreakerBuilder<R> {
  private BreakStrategy<R> breakStrategy;
  private BreakHandler<R> breakHandler;

  public ReusableCircuitBreakerBuilder() {
  }

  public ReusableCircuitBreakerBuilder<R> withBreakStrategy(BreakStrategy<R> breakStrategy) {
    this.breakStrategy = breakStrategy;
    return this;
  }

  public ReusableCircuitBreakerBuilder<R> withBreakHandler(BreakHandler<R> breakHandler) {
    this.breakHandler = breakHandler;
    return this;
  }

  /**
   * Creates new instance of the breaker.
   *
   * @return newly build circuit breaker
   * @throws BuilderValidationException in case important properties were not set for the circuit breaker that is
   *                                    being created
   */
  public ReusableCircuitBreaker<R> build() throws BuilderValidationException {
    validate();

    return new ReusableCircuitBreaker<R>(breakStrategy, breakHandler);
  }

  private void validate() throws BuilderValidationException {
    if (breakStrategy == null) {
      throw new BuilderValidationException("Break strategy must be set but was null");
    }

    if (breakHandler == null) {
      throw new BuilderValidationException("Break handler must be set but was null");
    }

  }

}