package com.couchbase.lite.replicator;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;

import java.io.IOException;
import java.util.List;
import java.util.Queue;

public class ResponderChain implements CustomizableMockHttpClient.Responder {

    private Queue<CustomizableMockHttpClient.Responder> responders;
    private CustomizableMockHttpClient.Responder sentinal;

    public ResponderChain(Queue<CustomizableMockHttpClient.Responder> responders) {
        this.responders = responders;
    }

    public ResponderChain(Queue<CustomizableMockHttpClient.Responder> responders, CustomizableMockHttpClient.Responder sentinal) {
        this.responders = responders;
        this.sentinal = sentinal;
    }

    @Override
    public HttpResponse execute(HttpUriRequest httpUriRequest) throws IOException {

        CustomizableMockHttpClient.Responder responder;

        CustomizableMockHttpClient.Responder nextResponder = responders.peek();
        if (nextResponder != null) {
            responder = responders.remove();
        } else {
            if (sentinal != null) {
                responder = sentinal;
            } else {
                throw new RuntimeException("No more responders in queue");
            }
        }

        return responder.execute(httpUriRequest);
    }
}

@@ -205,343 +205,1928 @@
 e;%0A%0A
-public class ResponderChain implements CustomizableMockHttpClient.Responder %7B%0A%0A    private Queue%3CCustomizableMockHttpClient.Responder%3E responders;%0A    private CustomizableMockHttpClient.Responder sentinal;%0A%0A    public ResponderChain(Queue%3CCustomizableMockHttpClient.Responder%3E responders) %7B%0A        this.responders = responders;%0A    %7D%0A
+/**%0A * A ResponderChain lets you stack up responders which will handle sequences of requests.%0A */%0Apublic class ResponderChain implements CustomizableMockHttpClient.Responder %7B%0A%0A    /**%0A     * A list of responders which are %22consumed%22 as soon as they answer a request%0A     */%0A    private Queue%3CCustomizableMockHttpClient.Responder%3E responders;%0A%0A    /**%0A     * The final responder in the chain, which is %22sticky%22 and won't%0A     * be removed after handling a request.%0A     */%0A    private CustomizableMockHttpClient.Responder sentinal;%0A%0A    /**%0A     * Create a responder chain.%0A     *%0A     * In this version, you pass it a list of responders which are %22consumed%22%0A     * as soon as they answer a request.  If you go off the edge and have more%0A     * requests than responders, then it will throw a runtime exception.%0A     *%0A     * If you have no idea how many requests this responder chain will need to%0A     * service, then set a sentinal or use the other ctor that takes a sentinal.%0A     *%0A     * @param responders a list of responders, which will be %22consumed%22 as soon%0A     *                   as they respond to a request.%0A     */%0A    public ResponderChain(Queue%3CCustomizableMockHttpClient.Responder%3E responders) %7B%0A        this.responders = responders;%0A    %7D%0A%0A    /**%0A     * Create a responder chain with a %22sentinal%22.%0A     *%0A     * If and when the responders passed into responders are consumed, then the sentinal%0A     * will handle all remaining requests to the responder chain.%0A     *%0A     * This is the version you want to use if you don't know ahead of time how many%0A     * requests this responderchain will need to handle.%0A     *%0A     * @param responders a list of responders, which will be %22consumed%22 as soon%0A     *                   as they respond to a request.%0A     * @param sentinal the final responder in the chain, which is %22sticky%22 and won't%0A     *                 be removed after handling a request.%0A     */
 %0A   

Add doc comments to code for ResponderChain