package org.limewire.http;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpMessage;
import org.apache.http.protocol.HttpContext;
/**
* Iterates over all headers of a {@link HttpMessage} and invokes interested
* {@link HeaderInterceptor}s for processing.
*/
public class BasicHeaderProcessor {
private List<HeaderInterceptor> headerInterceptors = null;
/**
* Adds <code>headerInterceptor</code> to list of interceptors. The
* <code>interceptor</code> is notified when
* {@link #process(HttpMessage, HttpContext)} is invoked.
*
* @see #removeInterceptor(HeaderInterceptor)
*/
public void addInterceptor(final HeaderInterceptor headerInterceptor) {
if (headerInterceptor == null) {
throw new IllegalArgumentException();
}
if (this.headerInterceptors == null) {
this.headerInterceptors = new ArrayList<HeaderInterceptor>();
}
this.headerInterceptors.add(headerInterceptor);
}
/**
* Removes <code>headerInterceptor</code> from the list of interceptors.
*
* @see #addInterceptor(HeaderInterceptor)
*/
public void removeInterceptor(final HeaderInterceptor headerInterceptor) {
if (headerInterceptor == null) {
throw new IllegalArgumentException();
}
if (this.headerInterceptors != null) {
this.headerInterceptors.remove(headerInterceptor);
}
}
/**
* Removes all interceptors.
*/
public void clearInterceptors() {
this.headerInterceptors = null;
}
/**
* Returns all interceptors.
*
* @return the returned array is a new instance, modifications of the array
* will not be reflected in the list of interceptors
*/
public HeaderInterceptor[] getInterceptors() {
return (headerInterceptors != null) ? headerInterceptors.toArray(new HeaderInterceptor[0]) : new HeaderInterceptor[0];
}
/**
* Iterates of the headers of <code>message</code> and invokes
* {@link HeaderInterceptor#process(Header, HttpContext)} for all
* interceptors on each header.
*
* @param message the message that provides the headers
* @param context the context that is passed to
* {@link HeaderInterceptor#process(Header, HttpContext)}
* @throws IOException thrown when a processing error occurs
* @throws HttpException thrown when a processing error occurs
*/
public void process(final HttpMessage message, final HttpContext context)
throws IOException, HttpException {
if (this.headerInterceptors != null) {
Header[] headers = message.getAllHeaders();
for (Header header : headers) {
for (HeaderInterceptor interceptor : headerInterceptors) {
interceptor.process(header, context);
}
}
}
}
}