1/*
2* Conditions Of Use
3*
4* This software was developed by employees of the National Institute of
5* Standards and Technology (NIST), an agency of the Federal Government.
6* Pursuant to title 15 Untied States Code Section 105, works of NIST
7* employees are not subject to copyright protection in the United States
8* and are considered to be in the public domain.  As a result, a formal
9* license is not needed to use the software.
10*
11* This software is provided by NIST as a service and is expressly
12* provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
13* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
15* AND DATA ACCURACY.  NIST does not warrant or make any representations
16* regarding the use of the software or the results thereof, including but
17* not limited to the correctness, accuracy, reliability or usefulness of
18* the software.
19*
20* Permission to use this software is contingent upon your acceptance
21* of the terms of this agreement
22*
23* .
24*
25*/
26/*******************************************************************************
27* Product of NIST/ITL Advanced Networking Technologies Division (ANTD).        *
28*******************************************************************************/
29package gov.nist.javax.sip.header;
30
31/**
32 * Root class from which all SIPHeader objects are subclassed.
33 *
34 * @author M. Ranganathan   <br/>
35 * @version 1.2 $Revision: 1.7 $ $Date: 2009/07/17 18:57:37 $
36 *
37 *
38 */
39public abstract class SIPHeader
40    extends SIPObject
41    implements SIPHeaderNames, javax.sip.header.Header, HeaderExt {
42
43    /** name of this header
44     */
45    protected String headerName;
46
47    /** Value of the header.
48    */
49
50    /** Constructor
51     * @param hname String to set
52     */
53    protected SIPHeader(String hname) {
54        headerName = hname;
55    }
56
57    /** Default constructor
58     */
59    public SIPHeader() {
60    }
61
62    /**
63     * Name of the SIPHeader
64     * @return String
65     */
66    public String getHeaderName() {
67        return headerName;
68    }
69
70    /** Alias for getHaderName above.
71    *
72    *@return String headerName
73    *
74    */
75    public String getName() {
76        return this.headerName;
77    }
78
79    /**
80         * Set the name of the header .
81         * @param hdrname String to set
82         */
83    public void setHeaderName(String hdrname) {
84        headerName = hdrname;
85    }
86
87    /** Get the header value (i.e. what follows the name:).
88    * This merely goes through and lops off the portion that follows
89    * the headerName:
90    */
91    public String getHeaderValue() {
92        String encodedHdr = null;
93        try {
94            encodedHdr = this.encode();
95        } catch (Exception ex) {
96            return null;
97        }
98        StringBuffer buffer = new StringBuffer(encodedHdr);
99        while (buffer.length() > 0 && buffer.charAt(0) != ':') {
100            buffer.deleteCharAt(0);
101        }
102        if (buffer.length() > 0)
103            buffer.deleteCharAt(0);
104        return buffer.toString().trim();
105    }
106
107    /** Return false if this is not a header list
108    * (SIPHeaderList overrrides this method).
109    *@return false
110    */
111    public boolean isHeaderList() {
112        return false;
113    }
114
115    /** Encode this header into canonical form.
116    */
117    public String encode() {
118        return encode(new StringBuffer()).toString();
119    }
120
121    public StringBuffer encode(StringBuffer buffer) {
122        buffer.append(this.headerName).append(COLON).append(SP);
123        this.encodeBody(buffer);
124        buffer.append(NEWLINE);
125        return buffer;
126    }
127
128    /** Encode the body of this header (the stuff that follows headerName).
129    * A.K.A headerValue.
130    */
131    protected abstract String encodeBody();
132
133    /** Encode the body of this header in the given buffer.
134     * Default implementation calls encodeBody();
135     */
136    protected StringBuffer encodeBody(StringBuffer buffer) {
137        return buffer.append(encodeBody());
138    }
139
140    /** Alias for getHeaderValue.
141     */
142    public String getValue() {
143        return this.getHeaderValue();
144    }
145
146    /**
147     * This is a pretty simple hashCode but satisfies requirements.
148     *
149     */
150    public int hashCode() {
151        return this.headerName.hashCode();
152    }
153
154    public final String toString() {
155        return this.encode();
156    }
157}
158