Home | History | Annotate | Download | only in message
      1 /*
      2  * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/message/BasicNameValuePair.java $
      3  * $Revision: 604625 $
      4  * $Date: 2007-12-16 06:11:11 -0800 (Sun, 16 Dec 2007) $
      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.message;
     33 
     34 import org.apache.http.NameValuePair;
     35 import org.apache.http.util.CharArrayBuffer;
     36 import org.apache.http.util.LangUtils;
     37 
     38 /**
     39  * A simple class encapsulating an attribute/value pair.
     40  * <p>
     41  *  This class comforms to the generic grammar and formatting rules outlined in the
     42  *  <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2">Section 2.2</a>
     43  *  and
     44  *  <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6">Section 3.6</a>
     45  *  of <a href="http://www.w3.org/Protocols/rfc2616/rfc2616.txt">RFC 2616</a>
     46  * </p>
     47  * <h>2.2 Basic Rules</h>
     48  * <p>
     49  *  The following rules are used throughout this specification to describe basic parsing constructs.
     50  *  The US-ASCII coded character set is defined by ANSI X3.4-1986.
     51  * </p>
     52  * <pre>
     53  *     OCTET          = <any 8-bit sequence of data>
     54  *     CHAR           = <any US-ASCII character (octets 0 - 127)>
     55  *     UPALPHA        = <any US-ASCII uppercase letter "A".."Z">
     56  *     LOALPHA        = <any US-ASCII lowercase letter "a".."z">
     57  *     ALPHA          = UPALPHA | LOALPHA
     58  *     DIGIT          = <any US-ASCII digit "0".."9">
     59  *     CTL            = <any US-ASCII control character
     60  *                      (octets 0 - 31) and DEL (127)>
     61  *     CR             = <US-ASCII CR, carriage return (13)>
     62  *     LF             = <US-ASCII LF, linefeed (10)>
     63  *     SP             = <US-ASCII SP, space (32)>
     64  *     HT             = <US-ASCII HT, horizontal-tab (9)>
     65  *     <">            = <US-ASCII double-quote mark (34)>
     66  * </pre>
     67  * <p>
     68  *  Many HTTP/1.1 header field values consist of words separated by LWS or special
     69  *  characters. These special characters MUST be in a quoted string to be used within
     70  *  a parameter value (as defined in section 3.6).
     71  * <p>
     72  * <pre>
     73  * token          = 1*<any CHAR except CTLs or separators>
     74  * separators     = "(" | ")" | "<" | ">" | "@"
     75  *                | "," | ";" | ":" | "\" | <">
     76  *                | "/" | "[" | "]" | "?" | "="
     77  *                | "{" | "}" | SP | HT
     78  * </pre>
     79  * <p>
     80  *  A string of text is parsed as a single word if it is quoted using double-quote marks.
     81  * </p>
     82  * <pre>
     83  * quoted-string  = ( <"> *(qdtext | quoted-pair ) <"> )
     84  * qdtext         = <any TEXT except <">>
     85  * </pre>
     86  * <p>
     87  *  The backslash character ("\") MAY be used as a single-character quoting mechanism only
     88  *  within quoted-string and comment constructs.
     89  * </p>
     90  * <pre>
     91  * quoted-pair    = "\" CHAR
     92  * </pre>
     93  * <h>3.6 Transfer Codings</h>
     94  * <p>
     95  *  Parameters are in the form of attribute/value pairs.
     96  * </p>
     97  * <pre>
     98  * parameter               = attribute "=" value
     99  * attribute               = token
    100  * value                   = token | quoted-string
    101  * </pre>
    102  *
    103  * @author <a href="mailto:oleg at ural.com">Oleg Kalnichevski</a>
    104  *
    105  */
    106 public class BasicNameValuePair implements NameValuePair, Cloneable {
    107 
    108     private final String name;
    109     private final String value;
    110 
    111     /**
    112      * Default Constructor taking a name and a value. The value may be null.
    113      *
    114      * @param name The name.
    115      * @param value The value.
    116      */
    117     public BasicNameValuePair(final String name, final String value) {
    118         super();
    119         if (name == null) {
    120             throw new IllegalArgumentException("Name may not be null");
    121         }
    122         this.name = name;
    123         this.value = value;
    124     }
    125 
    126     /**
    127      * Returns the name.
    128      *
    129      * @return String name The name
    130      */
    131     public String getName() {
    132         return this.name;
    133     }
    134 
    135     /**
    136      * Returns the value.
    137      *
    138      * @return String value The current value.
    139      */
    140     public String getValue() {
    141         return this.value;
    142     }
    143 
    144 
    145     /**
    146      * Get a string representation of this pair.
    147      *
    148      * @return A string representation.
    149      */
    150     public String toString() {
    151         // don't call complex default formatting for a simple toString
    152 
    153         int len = this.name.length();
    154         if (this.value != null)
    155             len += 1 + this.value.length();
    156         CharArrayBuffer buffer = new CharArrayBuffer(len);
    157 
    158         buffer.append(this.name);
    159         if (this.value != null) {
    160             buffer.append("=");
    161             buffer.append(this.value);
    162         }
    163         return buffer.toString();
    164     }
    165 
    166     public boolean equals(final Object object) {
    167         if (object == null) return false;
    168         if (this == object) return true;
    169         if (object instanceof NameValuePair) {
    170             BasicNameValuePair that = (BasicNameValuePair) object;
    171             return this.name.equals(that.name)
    172                   && LangUtils.equals(this.value, that.value);
    173         } else {
    174             return false;
    175         }
    176     }
    177 
    178     public int hashCode() {
    179         int hash = LangUtils.HASH_SEED;
    180         hash = LangUtils.hashCode(hash, this.name);
    181         hash = LangUtils.hashCode(hash, this.value);
    182         return hash;
    183     }
    184 
    185     public Object clone() throws CloneNotSupportedException {
    186         return super.clone();
    187     }
    188 
    189 }
    190