content: package redis.clients.jedis;
  
  import redis.clients.jedis.exceptions.JedisDataException;
  
  public class Response<T> {
    protected T response = null;
    protected JedisDataException exception = null;
  
    private boolean building = false;
    private boolean built = false;
    private boolean set = false;
  
    private Builder<T> builder;
    private Object data;
    private Response<?> dependency = null;
  
    public Response(Builder<T> b) {
      this.builder = b;
    }
  
    public void set(Object data) {
      this.data = data;
      set = true;
    }
  
    public T get() {
      // if response has dependency response and dependency is not built,
      // build it first and no more!!
      if (dependency != null && dependency.set && !dependency.built) {
        dependency.build();
      }
      if (!set) {
        throw new JedisDataException(
            "Please close pipeline or multi block before calling this method.");
      }
      if (!built) {
        build();
      }
      if (exception != null) {
        throw exception;
      }
      return response;
    }
  
    public void setDependency(Response<?> dependency) {
      this.dependency = dependency;
    }
  
    private void build() {
      // check build state to prevent recursion
      if (building) {
        return;
      }
  
      building = true;
      try {
        if (data != null) {
          if (data instanceof JedisDataException) {
            exception = (JedisDataException) data;
          } else {
            response = builder.build(data);
          }
        }
  
        data = null;
      } finally {
        building = false;
        built = true;
      }
    }
  
    public String toString() {
      return "Response " + builder.toString();
    }
  
  }
  