001: /*
002: * Copyright 2005-2007 Noelios Consulting.
003: *
004: * The contents of this file are subject to the terms of the Common Development
005: * and Distribution License (the "License"). You may not use this file except in
006: * compliance with the License.
007: *
008: * You can obtain a copy of the license at
009: * http://www.opensource.org/licenses/cddl1.txt See the License for the specific
010: * language governing permissions and limitations under the License.
011: *
012: * When distributing Covered Code, include this CDDL HEADER in each file and
013: * include the License file at http://www.opensource.org/licenses/cddl1.txt If
014: * applicable, add the following below this CDDL HEADER, with the fields
015: * enclosed by brackets "[]" replaced with your own identifying information:
016: * Portions Copyright [yyyy] [name of copyright owner]
017: */
018:
019: package org.restlet.data;
020:
021: import java.util.ArrayList;
022: import java.util.List;
023:
024: /**
025: * Language used in representations and preferences. A language tag is composed
026: * of one or more parts: A primary language tag and a possibly empty series of
027: * subtags. When formatted as a string, parts are separated by hyphens.
028: *
029: * @author Jerome Louvel (contact@noelios.com)
030: */
031: public final class Language extends Metadata {
032: /** All languages acceptable. */
033: public static final Language ALL = new Language("*",
034: "All languages");
035:
036: /** English language. */
037: public static final Language ENGLISH = new Language("en",
038: "English language");
039:
040: /** English language spoken in USA. */
041: public static final Language ENGLISH_US = new Language("en-us",
042: "English language in USA");
043:
044: /** French language. */
045: public static final Language FRENCH = new Language("fr",
046: "French language");
047:
048: /** French language spoken in France. */
049: public static final Language FRENCH_FRANCE = new Language("fr-fr",
050: "French language in France");
051:
052: /** Spanish language. */
053: public static final Language SPANISH = new Language("es",
054: "Spanish language");
055:
056: /** The metadata main list of subtags taken from the metadata name. */
057: private List<String> subTags;
058:
059: /**
060: * Returns the language associated to a name. If an existing constant exists
061: * then it is returned, otherwise a new instance is created.
062: *
063: * @param name
064: * The name.
065: * @return The associated language.
066: */
067: public static Language valueOf(final String name) {
068: Language result = null;
069:
070: if (name != null) {
071: if (name.equalsIgnoreCase(ALL.getName()))
072: result = ALL;
073: else if (name.equalsIgnoreCase(ENGLISH.getName()))
074: result = ENGLISH;
075: else if (name.equalsIgnoreCase(ENGLISH_US.getName()))
076: result = ENGLISH_US;
077: else if (name.equalsIgnoreCase(FRENCH.getName()))
078: result = FRENCH;
079: else if (name.equalsIgnoreCase(FRENCH_FRANCE.getName()))
080: result = FRENCH_FRANCE;
081: else if (name.equalsIgnoreCase(SPANISH.getName()))
082: result = SPANISH;
083: else
084: result = new Language(name);
085: }
086:
087: return result;
088: }
089:
090: /**
091: * Constructor.
092: *
093: * @param name
094: * The name.
095: */
096: public Language(final String name) {
097: this (name, "Language or range of languages");
098: }
099:
100: /**
101: * Constructor.
102: *
103: * @param name
104: * The name.
105: * @param description
106: * The description.
107: */
108: public Language(final String name, final String description) {
109: super (name, description);
110: this .subTags = null;
111: }
112:
113: /** {@inheritDoc} */
114: @Override
115: public boolean equals(final Object object) {
116: return (object instanceof Language)
117: && getName().equalsIgnoreCase(
118: ((Language) object).getName());
119: }
120:
121: /**
122: * Returns the primary tag.
123: *
124: * @return The primary tag.
125: */
126: public String getPrimaryTag() {
127: int separator = getName().indexOf('-');
128:
129: if (separator == -1) {
130: return getName();
131: } else {
132: return getName().substring(0, separator);
133: }
134: }
135:
136: /**
137: * Returns the possibly empty list of subtags.
138: *
139: * @return The list of subtags for this language Tag.
140: */
141: public List<String> getSubTags() {
142: if (subTags == null) {
143: String[] tags = getName().split("-");
144: subTags = new ArrayList<String>();
145:
146: if (tags.length > 0) {
147: for (int i = 1; i < tags.length; i++) {
148: subTags.add(tags[i]);
149: }
150: }
151: }
152:
153: return subTags;
154: }
155:
156: /** {@inheritDoc} */
157: @Override
158: public int hashCode() {
159: return (getName() == null) ? 0 : getName().toLowerCase()
160: .hashCode();
161: }
162: }
|