001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package org.apache.catalina.util;
019:
020: import java.io.InputStream;
021: import java.util.Locale;
022: import java.util.Properties;
023:
024: /**
025: * Utility class that attempts to map from a Locale to the corresponding
026: * character set to be used for interpreting input text (or generating
027: * output text) when the Content-Type header does not include one. You
028: * can customize the behavior of this class by modifying the mapping data
029: * it loads, or by subclassing it (to change the algorithm) and then using
030: * your own version for a particular web application.
031: *
032: * @author Craig R. McClanahan
033: * @version $Date: 2006-10-24 05:17:11 +0200 (mar., 24 oct. 2006) $ $Version$
034: */
035:
036: public class CharsetMapper {
037:
038: // ---------------------------------------------------- Manifest Constants
039:
040: /**
041: * Default properties resource name.
042: */
043: public static final String DEFAULT_RESOURCE = "/org/apache/catalina/util/CharsetMapperDefault.properties";
044:
045: // ---------------------------------------------------------- Constructors
046:
047: /**
048: * Construct a new CharsetMapper using the default properties resource.
049: */
050: public CharsetMapper() {
051: this (DEFAULT_RESOURCE);
052: }
053:
054: /**
055: * Construct a new CharsetMapper using the specified properties resource.
056: *
057: * @param name Name of a properties resource to be loaded
058: *
059: * @exception IllegalArgumentException if the specified properties
060: * resource could not be loaded for any reason.
061: */
062: public CharsetMapper(String name) {
063: try {
064: InputStream stream = this .getClass().getResourceAsStream(
065: name);
066: map.load(stream);
067: stream.close();
068: } catch (Throwable t) {
069: throw new IllegalArgumentException(t.toString());
070: }
071: }
072:
073: // ---------------------------------------------------- Instance Variables
074:
075: /**
076: * The mapping properties that have been initialized from the specified or
077: * default properties resource.
078: */
079: private Properties map = new Properties();
080:
081: // ------------------------------------------------------- Public Methods
082:
083: /**
084: * Calculate the name of a character set to be assumed, given the specified
085: * Locale and the absence of a character set specified as part of the
086: * content type header.
087: *
088: * @param locale The locale for which to calculate a character set
089: */
090: public String getCharset(Locale locale) {
091: // Match full language_country_variant first, then language_country,
092: // then language only
093: String charset = map.getProperty(locale.toString());
094: if (charset == null) {
095: charset = map.getProperty(locale.getLanguage() + "_"
096: + locale.getCountry());
097: if (charset == null) {
098: charset = map.getProperty(locale.getLanguage());
099: }
100: }
101: return (charset);
102: }
103:
104: /**
105: * The deployment descriptor can have a
106: * locale-encoding-mapping-list element which describes the
107: * webapp's desired mapping from locale to charset. This method
108: * gets called when processing the web.xml file for a context
109: *
110: * @param locale The locale for a character set
111: * @param charset The charset to be associated with the locale
112: */
113: public void addCharsetMappingFromDeploymentDescriptor(
114: String locale, String charset) {
115: map.put(locale, charset);
116: }
117:
118: }
|