/* * (C) Copyright 2006-2008 Nuxeo SA (http://nuxeo.com/) and others. * * 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. * * Contributors: * bstefanescu * * $Id$ */ package org.nuxeo.ecm.webengine.model; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; import java.util.concurrent.ConcurrentHashMap; /** * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a> */ public class Messages { protected final Messages parent; protected final MessagesProvider provider; protected final Map<String, MessagesBundle> messages; protected MessagesBundle defaultMessages; protected static final String BUILT_IN_DEFAULT_LANG = "en"; public Messages(Messages parent, MessagesProvider provider) { this.parent = parent; this.provider = provider; messages = new ConcurrentHashMap<String, MessagesBundle>(); String serverDefaultLang = Locale.getDefault().getLanguage(); defaultMessages = getMessagesBundle(serverDefaultLang); if (defaultMessages == null) { defaultMessages = new MessagesBundle(null, new HashMap<String, String>()); } if (defaultMessages.messages.size() == 0 && !BUILT_IN_DEFAULT_LANG.equals(serverDefaultLang)) { defaultMessages = getMessagesBundle(BUILT_IN_DEFAULT_LANG); } } public MessagesBundle getMessagesBundle() { return defaultMessages; } public MessagesBundle getMessagesBundle(String language) { if (language == null) { return defaultMessages; } MessagesBundle bundle = messages.get(language); if (bundle == null) { Map<String, String> map = provider.getMessages(language); if (map == null && defaultMessages != null) { return defaultMessages; } MessagesBundle parentBundle = parent != null ? parent.getMessagesBundle(language) : null; bundle = new MessagesBundle(parentBundle, map); messages.put(language, bundle); } return bundle; } public Object getObject(String key, String language) { MessagesBundle bundle = getMessagesBundle(language); if (bundle != null) { return bundle.getObject(key); } throw new MissingResourceException("Can't find resource for bundle " + this.getClass().getName() + ", key " + key, Messages.class.getName(), key); } public Object getObject(String key) { return getObject(key, null); } public String getString(String key) { return getString(key, null); } public String getString(String key, String language) { return (String) getObject(key, language); } public String[] getStringArray(String key) { return getStringArray(key, null); } public String[] getStringArray(String key, String language) { return (String[]) getObject(key, language); } }