blob: 50cd9e0836fef11aeef3b7151d011c9279e4e197 [file] [log] [blame]
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cocoon.woody.datatype.convertor;
import org.apache.commons.collections.FastHashMap;
import java.util.Locale;
/**
* Map using Locale objects as keys.
*
* <p>This map should be filled once using calls to {@link #put(Locale, Object)},
* before any calls are made to {@link #get(Locale)}.
*
* @version CVS $Id: LocaleMap.java,v 1.4 2004/03/05 13:02:28 bdelacretaz Exp $
*/
public class LocaleMap {
private FastHashMap map = new FastHashMap();
/**
* Gets an object based on the given locale. An automatic fallback mechanism is used:
* if nothing is found for language-COUNTRY-variant, then language-COUNTRY is searched,
* the language, and finally "" (empty string). If nothing is found null is returned.
*/
public Object get(Locale locale) {
if (map.size() == 0)
return null;
String full = getFullKey(locale);
if (!map.containsKey(full)) {
// check more general variant (lang-COUNTRY and lang), and store result in the map
// under the full key, so that next time we have a direct hit
String altKey = locale.getLanguage() + '-' + locale.getCountry();
Object object = map.get(altKey);
if (object != null) {
map.put(full, object);
return object;
}
altKey = locale.getLanguage();
object = map.get(altKey);
if (object != null) {
map.put(full, object);
return object;
}
object = map.get("");
if (object != null) {
map.put(full, object);
return object;
}
map.put(full, null);
}
return map.get(full);
}
private final String getFullKey(Locale locale) {
return locale.getLanguage() + '-' + locale.getCountry() + '-' + locale.getVariant();
}
private final String getKey(Locale locale) {
boolean hasLanguage = !locale.getLanguage().equals("");
boolean hasCountry = !locale.getCountry().equals("");
boolean hasVariant = !locale.getVariant().equals("");
if (hasLanguage && hasCountry && hasVariant)
return locale.getLanguage() + '-' + locale.getCountry() + '-' + locale.getVariant();
else if (hasLanguage && hasCountry)
return locale.getLanguage() + '-' + locale.getCountry();
else if (hasLanguage)
return locale.getLanguage();
else
return "";
}
public void put(Locale locale, Object object) {
map.put(getKey(locale), object);
}
}