/**
* Copyright (C) 2012-2014 Gist Labs, LLC. (http://gistlabs.com)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package com.gistlabs.mechanize.filters;
import java.util.LinkedList;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.protocol.HttpContext;
/**
* Inprired by Servlet Filters, this represents executing a request and getting a response.
*
* Each filter in turn is called, and eventually a terminal MechanizeFilter will be called last.
*
*/
public class DefaultMechanizeChainFilter implements MechanizeFilter {
final MechanizeFilter theEnd;
final LinkedList<MechanizeChainFilter> filters = new LinkedList<MechanizeChainFilter>();
public DefaultMechanizeChainFilter(final MechanizeFilter theEnd) {
if (theEnd==null)
throw new NullPointerException("The end of the processing chain can't be null!");
this.theEnd = theEnd;
}
/**
* Adds a filter, runs after those added before it
*
* @param filter
* @return
*/
public DefaultMechanizeChainFilter add(final MechanizeChainFilter filter) {
filters.add(filter);
return this;
}
/**
* Adds a filter, to the front of the pipeline
*
* @param filter
*/
public void prefix(final MechanizeChainFilter filter) {
filters.addFirst(filter);
}
@Override
public HttpResponse execute(final HttpUriRequest request, final HttpContext context) {
return new ExecutionState().execute(request, context);
}
class ExecutionState implements MechanizeFilter {
int index=0;
@Override
public HttpResponse execute(final HttpUriRequest request, final HttpContext context) {
if (moreFilters())
return filters.get(index++).execute(request, context, this);
else
return theEnd.execute(request, context);
}
public boolean moreFilters() {
return index<filters.size();
}
}
}