1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*
2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Conditions Of Use
3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software was developed by employees of the National Institute of
5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Standards and Technology (NIST), an agency of the Federal Government.
6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Pursuant to title 15 Untied States Code Section 105, works of NIST
7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* employees are not subject to copyright protection in the United States
8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* and are considered to be in the public domain.  As a result, a formal
9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* license is not needed to use the software.
10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software is provided by NIST as a service and is expressly
12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* AND DATA ACCURACY.  NIST does not warrant or make any representations
16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* regarding the use of the software or the results thereof, including but
17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* not limited to the correctness, accuracy, reliability or usefulness of
18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* the software.
19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Permission to use this software is contingent upon your acceptance
21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* of the terms of this agreement
22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* .
24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*/
26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*******************************************************************************
27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Product of NIST/ITL Advanced Networking Technologies Division (ANTD).        *
28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*******************************************************************************/
29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.javax.sip.header;
30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Locale;
32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/**
34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* ContentLanguage header
35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* <pre>
36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*Fielding, et al.            Standards Track                   [Page 118]
37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*RFC 2616                        HTTP/1.1                       June 1999
38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*  14.12 Content-Language
40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   The Content-Language entity-header field describes the natural
42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   language(s) of the intended audience for the enclosed entity. Note
43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   that this might not be equivalent to all the languages used within
44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   the entity-body.
45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*       Content-Language  = "Content-Language" ":" 1#language-tag
47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   Language tags are defined in section 3.10. The primary purpose of
49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   Content-Language is to allow a user to identify and differentiate
50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   entities according to the user's own preferred language. Thus, if the
51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   body content is intended only for a Danish-literate audience, the
52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   appropriate field is
53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*       Content-Language: da
55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   If no Content-Language is specified, the default is that the content
57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   is intended for all language audiences. This might mean that the
58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   sender does not consider it to be specific to any natural language,
59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   or that the sender does not know for which language it is intended.
60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   Multiple languages MAY be listed for content that is intended for
62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   multiple audiences. For example, a rendition of the "Treaty of
63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   Waitangi," presented simultaneously in the original Maori and English
64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   versions, would call for
65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*       Content-Language: mi, en
67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   However, just because multiple languages are present within an entity
69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   does not mean that it is intended for multiple linguistic audiences.
70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   An example would be a beginner's language primer, such as "A First
71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   Lesson in Latin," which is clearly intended to be used by an
72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   English-literate audience. In this case, the Content-Language would
73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   properly only include "en".
74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   Content-Language MAY be applied to any media type -- it is not
76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*   limited to textual documents.
77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*</pre>
78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* @author M. Ranganathan
79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* @version 1.2 $Revision: 1.8 $ $Date: 2009/07/17 18:57:29 $
80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* @since 1.1
81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*/
82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class ContentLanguage
83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    extends SIPHeader
84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    implements javax.sip.header.ContentLanguageHeader {
85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Comment for <code>serialVersionUID</code>
88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static final long serialVersionUID = -5195728427134181070L;
90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** languageTag field.
91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected Locale locale;
93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public ContentLanguage() {
95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        super(CONTENT_LANGUAGE);
96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Default constructor.
100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param languageTag String to set
101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public ContentLanguage(String languageTag) {
103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        super(CONTENT_LANGUAGE);
104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.setLanguageTag( languageTag );
105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Canonical encoding of the  value of the header.
109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return encoded body of header.
110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String encodeBody() {
112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.getLanguageTag();
113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** get the languageTag field.
116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return String
117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getLanguageTag() {
119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // JvB: Need to take sub-tags into account
120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if ( "".equals(locale.getCountry())) {
121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return locale.getLanguage();
122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else {
123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return locale.getLanguage() + '-' + locale.getCountry();
124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** set the languageTag field
128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param languageTag -- language tag to set.
129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setLanguageTag(String languageTag) {
131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        final int slash = languageTag.indexOf('-');
133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (slash>=0) {
134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            this.locale = new Locale(languageTag.substring(0,slash), languageTag.substring(slash+1) );
135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else {
136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            this.locale = new Locale(languageTag);
137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Gets the language value of the ContentLanguageHeader.
142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return the Locale value of this ContentLanguageHeader
146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Locale getContentLanguage() {
149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return locale;
150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Sets the language parameter of this ContentLanguageHeader.
154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param language - the new Locale value of the language of
156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * ContentLanguageHeader
158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setContentLanguage(Locale language) {
161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.locale = language;
162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Object clone() {
165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        ContentLanguage retval = (ContentLanguage) super.clone();
166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (this.locale != null)
167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            retval.locale = (Locale) this.locale.clone();
168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return retval;
169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}
171