HeaderGroup.java
  1  /*
  2   * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//httpclient/src/java/org/apache/commons/httpclient/HeaderGroup.java,v 1.8 2004/05/13 04:03:25 mbecke Exp $
  3   * $Revision: 480424 $
  4   * $Date: 2006-11-29 06:56:49 +0100 (Wed, 29 Nov 2006) $
  5   *
  6   * ====================================================================
  7   *
  8   *  Licensed to the Apache Software Foundation (ASF) under one or more
  9   *  contributor license agreements.  See the NOTICE file distributed with
 10   *  this work for additional information regarding copyright ownership.
 11   *  The ASF licenses this file to You under the Apache License, Version 2.0
 12   *  (the "License"); you may not use this file except in compliance with
 13   *  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, software
 18   *  distributed under the License is distributed on an "AS IS" BASIS,
 19   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 20   *  See the License for the specific language governing permissions and
 21   *  limitations under the License.
 22   * ====================================================================
 23   *
 24   * This software consists of voluntary contributions made by many
 25   * individuals on behalf of the Apache Software Foundation.  For more
 26   * information on the Apache Software Foundation, please see
 27   * <http://www.apache.org/>.
 28   *
 29   */
 30  
 31  package org.apache.commons.httpclient;
 32  
 33  import java.util.ArrayList;
 34  import java.util.Iterator;
 35  import java.util.List;
 36  
 37  /**
 38   * A class for combining a set of headers.  This class allows for multiple
 39   * headers with the same name and keeps track of the order in which headers were
 40   * added.
 41   * 
 42   * @author Michael Becke
 43   * 
 44   * @since 2.0beta1
 45   */
 46  public class HeaderGroup {
 47  
 48      /** The list of headers for this group, in the order in which they were added */
 49      private List headers;
 50  
 51      /**
 52       * Constructor for HeaderGroup.
 53       */
 54      public HeaderGroup() {
 55          this.headers = new ArrayList();
 56      }
 57      
 58      /**
 59       * Removes any contained headers.
 60       */
 61      public void clear() {
 62          headers.clear();
 63      }
 64      
 65      /**
 66       * Adds the given header to the group.  The order in which this header was
 67       * added is preserved.
 68       * 
 69       * @param header the header to add
 70       */
 71      public void addHeader(Header header) {
 72          headers.add(header);
 73      }
 74      
 75      /**
 76       * Removes the given header.
 77       *
 78       * @param header the header to remove
 79       */
 80      public void removeHeader(Header header) {
 81          headers.remove(header);
 82      }
 83  
 84      /**
 85       * Sets all of the headers contained within this group overriding any
 86       * existing headers. The headers are added in the order in which they appear
 87       * in the array.
 88       * 
 89       * @param headers the headers to set
 90       */
 91      public void setHeaders(Header[] headers) {
 92          clear();
 93          
 94          for (int i = 0; i < headers.length; i++) {
 95              addHeader(headers[i]);
 96          }
 97      }
 98      
 99      /**
100       * Gets a header representing all of the header values with the given name.
101       * If more that one header with the given name exists the values will be
102       * combined with a "," as per RFC 2616.
103       * 
104       * <p>Header name comparison is case insensitive.
105       * 
106       * @param name the name of the header(s) to get
107       * @return a header with a condensed value or <code>null</code> if no
108       * headers by the given name are present
109       */
110      public Header getCondensedHeader(String name) {
111          Header[] headers = getHeaders(name);
112          
113          if (headers.length == 0) {
114              return null;   
115          } else if (headers.length == 1) {
116              return new Header(headers[0].getName(), headers[0].getValue());
117          } else {
118              StringBuffer valueBuffer = new StringBuffer(headers[0].getValue());
119              
120              for (int i = 1; i < headers.length; i++) {
121                  valueBuffer.append(", ");
122                  valueBuffer.append(headers[i].getValue());
123              }
124              
125              return new Header(name.toLowerCase(), valueBuffer.toString());
126          }
127      }
128      
129      /**
130       * Gets all of the headers with the given name.  The returned array
131       * maintains the relative order in which the headers were added.  
132       * 
133       * <p>Header name comparison is case insensitive.
134       * 
135       * @param name the name of the header(s) to get
136       * 
137       * @return an array of length >= 0
138       */
139      public Header[] getHeaders(String name) {
140          ArrayList headersFound = new ArrayList();
141          
142          for (Iterator headerIter = headers.iterator(); headerIter.hasNext();) {
143              Header header = (Header) headerIter.next();
144              if (header.getName().equalsIgnoreCase(name)) {
145                  headersFound.add(header);
146              }
147          }
148          
149          return (Header[]) headersFound.toArray(new Header[headersFound.size()]);
150      }
151      
152      /**
153       * Gets the first header with the given name.
154       * 
155       * <p>Header name comparison is case insensitive.
156       * 
157       * @param name the name of the header to get
158       * @return the first header or <code>null</code>
159       */
160      public Header getFirstHeader(String name) {
161          for (Iterator headerIter = headers.iterator(); headerIter.hasNext();) {
162              Header header = (Header) headerIter.next();
163              if (header.getName().equalsIgnoreCase(name)) {
164                  return header;
165              }
166          }
167          
168          return null;                
169      }
170      
171      /**
172       * Gets the last header with the given name.
173       *
174       * <p>Header name comparison is case insensitive.
175       *
176       * @param name the name of the header to get
177       * @return the last header or <code>null</code>
178       */
179      public Header getLastHeader(String name) {
180          // start at the end of the list and work backwards
181          for (int i = headers.size() - 1; i >= 0; i--) {
182              Header header = (Header) headers.get(i);
183              if (header.getName().equalsIgnoreCase(name)) {
184                  return header;
185              }            
186          }
187          
188          return null;        
189      }
190      
191      /**
192       * Gets all of the headers contained within this group.
193       * 
194       * @return an array of length >= 0
195       */
196      public Header[] getAllHeaders() {
197          return (Header[]) headers.toArray(new Header[headers.size()]);
198      }
199      
200      /**
201       * Tests if headers with the given name are contained within this group.
202       * 
203       * <p>Header name comparison is case insensitive.
204       * 
205       * @param name the header name to test for
206       * @return <code>true</code> if at least one header with the name is
207       * contained, <code>false</code> otherwise
208       */
209      public boolean containsHeader(String name) {
210          for (Iterator headerIter = headers.iterator(); headerIter.hasNext();) {
211              Header header = (Header) headerIter.next();
212              if (header.getName().equalsIgnoreCase(name)) {
213                  return true;
214              }
215          }
216          
217          return false;
218      }
219  
220      /**
221       * Returns an iterator over this group of headers.
222       * 
223       * @return iterator over this group of headers.
224       * 
225       * @since 3.0
226       */
227      public Iterator getIterator() {
228          return this.headers.iterator(); 
229      }
230  }