Home | History | Annotate | Download | only in protocol
      1 /*
      2  * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/protocol/BasicHttpProcessor.java $
      3  * $Revision: 613298 $
      4  * $Date: 2008-01-18 14:09:22 -0800 (Fri, 18 Jan 2008) $
      5  *
      6  * ====================================================================
      7  * Licensed to the Apache Software Foundation (ASF) under one
      8  * or more contributor license agreements.  See the NOTICE file
      9  * distributed with this work for additional information
     10  * regarding copyright ownership.  The ASF licenses this file
     11  * to you under the Apache License, Version 2.0 (the
     12  * "License"); you may not use this file except in compliance
     13  * with the License.  You may obtain a copy of the License at
     14  *
     15  *   http://www.apache.org/licenses/LICENSE-2.0
     16  *
     17  * Unless required by applicable law or agreed to in writing,
     18  * software distributed under the License is distributed on an
     19  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     20  * KIND, either express or implied.  See the License for the
     21  * specific language governing permissions and limitations
     22  * under the License.
     23  * ====================================================================
     24  *
     25  * This software consists of voluntary contributions made by many
     26  * individuals on behalf of the Apache Software Foundation.  For more
     27  * information on the Apache Software Foundation, please see
     28  * <http://www.apache.org/>.
     29  *
     30  */
     31 
     32 package org.apache.http.protocol;
     33 
     34 import java.io.IOException;
     35 import java.util.ArrayList;
     36 import java.util.Iterator;
     37 import java.util.List;
     38 
     39 import org.apache.http.HttpException;
     40 import org.apache.http.HttpRequest;
     41 import org.apache.http.HttpRequestInterceptor;
     42 import org.apache.http.HttpResponse;
     43 import org.apache.http.HttpResponseInterceptor;
     44 
     45 /**
     46  * Keeps lists of interceptors for processing requests and responses.
     47  *
     48  * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
     49  * @author Andrea Selva
     50  *
     51  * @version $Revision: 613298 $
     52  *
     53  * @since 4.0
     54  */
     55 public final class BasicHttpProcessor implements
     56     HttpProcessor, HttpRequestInterceptorList, HttpResponseInterceptorList, Cloneable {
     57 
     58     protected List requestInterceptors = null;
     59     protected List responseInterceptors = null;
     60 
     61 
     62     // non-Javadoc, see interface HttpRequestInterceptorList
     63     public void addRequestInterceptor(final HttpRequestInterceptor itcp) {
     64 
     65         if (itcp == null) {
     66             return;
     67         }
     68         if (this.requestInterceptors == null) {
     69             this.requestInterceptors = new ArrayList();
     70         }
     71         this.requestInterceptors.add(itcp);
     72     }
     73 
     74     // non-Javadoc, see interface HttpRequestInterceptorList
     75     public void addRequestInterceptor(final HttpRequestInterceptor itcp,
     76                                       int index) {
     77         if (index < 0) {
     78             throw new IndexOutOfBoundsException(String.valueOf(index));
     79         }
     80         if (itcp == null) {
     81             return;
     82         }
     83 
     84         if (this.requestInterceptors == null) {
     85             if (index > 0) {
     86                 throw new IndexOutOfBoundsException(String.valueOf(index));
     87             }
     88             this.requestInterceptors = new ArrayList();
     89         }
     90         this.requestInterceptors.add(index, itcp);
     91     }
     92 
     93 
     94     public void addResponseInterceptor(HttpResponseInterceptor itcp,
     95                                        int index) {
     96         if (index < 0) {
     97             throw new IndexOutOfBoundsException(String.valueOf(index));
     98         }
     99         if (itcp == null) {
    100             return;
    101         }
    102 
    103         if (this.responseInterceptors == null) {
    104             if (index > 0) {
    105                 throw new IndexOutOfBoundsException(String.valueOf(index));
    106             }
    107             this.responseInterceptors = new ArrayList();
    108         }
    109         this.responseInterceptors.add(index, itcp);
    110     }
    111 
    112 
    113     // non-Javadoc, see interface HttpRequestInterceptorList
    114     public void removeRequestInterceptorByClass(final Class clazz) {
    115         if (this.requestInterceptors == null) {
    116             return;
    117         }
    118         for (Iterator it = this.requestInterceptors.iterator();
    119              it.hasNext(); ) {
    120             Object request = it.next();
    121             if (request.getClass().equals(clazz)) {
    122                 it.remove();
    123             }
    124         }
    125     }
    126 
    127     // non-Javadoc, see interface HttpResponseInterceptorList
    128     public void removeResponseInterceptorByClass(final Class clazz) {
    129         if (this.responseInterceptors == null) {
    130             return;
    131         }
    132         for (Iterator it = this.responseInterceptors.iterator();
    133              it.hasNext(); ) {
    134             Object request = it.next();
    135             if (request.getClass().equals(clazz)) {
    136                 it.remove();
    137             }
    138         }
    139     }
    140 
    141     /**
    142      * Same as {@link #addRequestInterceptor(HttpRequestInterceptor) addRequestInterceptor}.
    143      *
    144      * @param interceptor       the interceptor to add
    145      */
    146     public final
    147             void addInterceptor(final HttpRequestInterceptor interceptor) {
    148         addRequestInterceptor(interceptor);
    149     }
    150 
    151      public final
    152             void addInterceptor(final HttpRequestInterceptor interceptor,
    153                                 int index) {
    154         addRequestInterceptor(interceptor, index);
    155     }
    156 
    157 
    158     // non-Javadoc, see interface HttpRequestInterceptorList
    159     public int getRequestInterceptorCount() {
    160         return (this.requestInterceptors == null) ?
    161             0 : this.requestInterceptors.size();
    162     }
    163 
    164 
    165     // non-Javadoc, see interface HttpRequestInterceptorList
    166     public HttpRequestInterceptor getRequestInterceptor(int index) {
    167 
    168         if ((this.requestInterceptors == null) ||
    169                 (index < 0) || (index >= this.requestInterceptors.size()))
    170             return null;
    171 
    172         return (HttpRequestInterceptor) this.requestInterceptors.get(index);
    173     }
    174 
    175 
    176     // non-Javadoc, see interface HttpRequestInterceptorList
    177     public void clearRequestInterceptors() {
    178         this.requestInterceptors = null;
    179     }
    180 
    181 
    182 
    183     // non-Javadoc, see interface HttpResponseInterceptorList
    184     public void addResponseInterceptor(final HttpResponseInterceptor itcp) {
    185         if (itcp == null) {
    186             return;
    187         }
    188         if (this.responseInterceptors == null) {
    189             this.responseInterceptors = new ArrayList();
    190         }
    191         this.responseInterceptors.add(itcp);
    192     }
    193 
    194     /**
    195      * Same as {@link #addResponseInterceptor(HttpResponseInterceptor) addResponseInterceptor}.
    196      *
    197      * @param interceptor       the interceptor to add
    198      */
    199     public final
    200             void addInterceptor(final HttpResponseInterceptor interceptor) {
    201         addResponseInterceptor(interceptor);
    202     }
    203 
    204     public final void addInterceptor(final HttpResponseInterceptor interceptor,
    205                                      int index) {
    206         addResponseInterceptor(interceptor, index);
    207     }
    208 
    209 
    210 
    211     // non-Javadoc, see interface HttpResponseInterceptorList
    212     public int getResponseInterceptorCount() {
    213         return (this.responseInterceptors == null) ?
    214             0 : this.responseInterceptors.size();
    215     }
    216 
    217 
    218     // non-Javadoc, see interface HttpResponseInterceptorList
    219     public HttpResponseInterceptor getResponseInterceptor(int index) {
    220 
    221         if ((this.responseInterceptors == null) ||
    222                 (index < 0) || (index >= this.responseInterceptors.size()))
    223             return null;
    224 
    225         return (HttpResponseInterceptor) this.responseInterceptors.get(index);
    226     }
    227 
    228 
    229     // non-Javadoc, see interface HttpResponseInterceptorList
    230     public void clearResponseInterceptors() {
    231         this.responseInterceptors = null;
    232     }
    233 
    234 
    235     /**
    236      * Sets the interceptor lists.
    237      * First, both interceptor lists maintained by this processor
    238      * will be cleared.
    239      * Subsequently,
    240      * elements of the argument list that are request interceptors will be
    241      * added to the request interceptor list.
    242      * Elements that are response interceptors will be
    243      * added to the response interceptor list.
    244      * Elements that are both request and response interceptor will be
    245      * added to both lists.
    246      * Elements that are neither request nor response interceptor
    247      * will be ignored.
    248      *
    249      * @param list      the list of request and response interceptors
    250      *                  from which to initialize
    251      */
    252     public void setInterceptors(final List list) {
    253         if (list == null) {
    254             throw new IllegalArgumentException("List must not be null.");
    255         }
    256         if (this.requestInterceptors != null) {
    257             this.requestInterceptors.clear();
    258         }
    259         if (this.responseInterceptors != null) {
    260             this.responseInterceptors.clear();
    261         }
    262         for (int i = 0; i < list.size(); i++) {
    263             Object obj = list.get(i);
    264             if (obj instanceof HttpRequestInterceptor) {
    265                 addInterceptor((HttpRequestInterceptor)obj);
    266             }
    267             if (obj instanceof HttpResponseInterceptor) {
    268                 addInterceptor((HttpResponseInterceptor)obj);
    269             }
    270         }
    271     }
    272 
    273     /**
    274      * Clears both interceptor lists maintained by this processor.
    275      */
    276     public void clearInterceptors() {
    277         clearRequestInterceptors();
    278         clearResponseInterceptors();
    279     }
    280 
    281     // non-Javadoc, see interface HttpRequestInterceptor (via HttpProcessor)
    282     public void process(
    283             final HttpRequest request,
    284             final HttpContext context)
    285             throws IOException, HttpException {
    286         if (this.requestInterceptors != null) {
    287             for (int i = 0; i < this.requestInterceptors.size(); i++) {
    288                 HttpRequestInterceptor interceptor =
    289                     (HttpRequestInterceptor) this.requestInterceptors.get(i);
    290                 interceptor.process(request, context);
    291             }
    292         }
    293     }
    294 
    295     // non-Javadoc, see interface HttpResponseInterceptor (via HttpProcessor)
    296     public void process(
    297             final HttpResponse response,
    298             final HttpContext context)
    299             throws IOException, HttpException {
    300         if (this.responseInterceptors != null) {
    301             for (int i = 0; i < this.responseInterceptors.size(); i++) {
    302                 HttpResponseInterceptor interceptor =
    303                     (HttpResponseInterceptor) this.responseInterceptors.get(i);
    304                 interceptor.process(response, context);
    305             }
    306         }
    307     }
    308 
    309     protected void copyInterceptors(final BasicHttpProcessor target) {
    310         if (this.requestInterceptors != null) {
    311             target.requestInterceptors =
    312                 new ArrayList(this.requestInterceptors);
    313         }
    314         if (this.responseInterceptors != null) {
    315             target.responseInterceptors =
    316                 new ArrayList(this.responseInterceptors);
    317         }
    318     }
    319 
    320     /**
    321      * Creates a copy of this instance
    322      *
    323      * @return new instance of the BasicHttpProcessor
    324      */
    325     public BasicHttpProcessor copy() {
    326         BasicHttpProcessor clone = new BasicHttpProcessor();
    327         copyInterceptors(clone);
    328         return clone;
    329     }
    330 
    331     public Object clone() throws CloneNotSupportedException {
    332         BasicHttpProcessor clone = (BasicHttpProcessor) super.clone();
    333         copyInterceptors(clone);
    334         return clone;
    335     }
    336 
    337 }
    338