001: /*
002: * The Apache Software License, Version 1.1
003: *
004: * Copyright (c) 2001-2004 Caucho Technology, Inc. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution, if
019: * any, must include the following acknowlegement:
020: * "This product includes software developed by the
021: * Caucho Technology (http://www.caucho.com/)."
022: * Alternately, this acknowlegement may appear in the software itself,
023: * if and wherever such third-party acknowlegements normally appear.
024: *
025: * 4. The names "Hessian", "Resin", and "Caucho" must not be used to
026: * endorse or promote products derived from this software without prior
027: * written permission. For written permission, please contact
028: * info@caucho.com.
029: *
030: * 5. Products derived from this software may not be called "Resin"
031: * nor may "Resin" appear in their names without prior written
032: * permission of Caucho Technology.
033: *
034: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
035: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
036: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
037: * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
038: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
039: * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
040: * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
041: * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
042: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
043: * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
044: * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
045: *
046: * @author Sam
047: */
048:
049: package com.caucho.portal.generic;
050:
051: import java.util.*;
052:
053: public class ResourceBundleFactory {
054: private String _name;
055: private Map<String, Object> _defaultMap;
056: private Map<Locale, PortletResourceBundle> _bundleMap = new HashMap<Locale, PortletResourceBundle>();
057:
058: public ResourceBundleFactory() {
059: _defaultMap = new LinkedHashMap<String, Object>();
060: addDefault("javax.portlet.title", "");
061: addDefault("javax.portlet.short-title", "");
062: addDefault("javax.portlet.keywords", "");
063: }
064:
065: /**
066: * Set a name for the parent resoruce bundle. The name
067: * is used for a call to ResourceBundle.getBundle()
068: * for each locale.
069: */
070: public void setName(String name) {
071: _name = name;
072: _bundleMap.clear();
073: }
074:
075: /**
076: * Typical keys for defaults with portlets are:
077: *
078: * addDefault("javax.portlet.title", getPortletInfoTitle());
079: * addDefault("javax.portlet.short-title", getPortletInfoShortTitle());
080: * addDefault("javax.portlet.keywords", getPortletInfoKeywords());
081: */
082: public void addDefault(String key, String value) {
083: _defaultMap.put(key, value);
084: }
085:
086: public void addDefault(NameValuePair nameValuePair) {
087: addDefault(nameValuePair.getName(), nameValuePair.getValue());
088: }
089:
090: public ResourceBundle getResourceBundle(Locale locale) {
091: PortletResourceBundle bundle = _bundleMap.get(locale);
092:
093: if (bundle == null) {
094: bundle = new PortletResourceBundle(_name, locale,
095: _defaultMap);
096: _bundleMap.put(locale, bundle);
097: }
098:
099: return bundle;
100: }
101:
102: static class PortletResourceBundle extends ResourceBundle {
103: private Locale _locale;
104: private Map<String, Object> _defaultMap;
105: private ResourceBundle _parent;
106:
107: public PortletResourceBundle(String name, Locale locale,
108: Map<String, Object> defaultMap) {
109: _locale = locale;
110: _defaultMap = defaultMap;
111:
112: if (name != null) {
113: ClassLoader loader = Thread.currentThread()
114: .getContextClassLoader();
115:
116: _parent = ResourceBundle.getBundle(name, _locale,
117: loader);
118:
119: super .setParent(_parent);
120: }
121: }
122:
123: public Locale getLocale() {
124: return _parent == null ? _locale : _parent.getLocale();
125: }
126:
127: public Object handleGetObject(String key) {
128: if (_parent == null) {
129: if (_defaultMap != null)
130: return _defaultMap.get(key);
131: else
132: return null;
133: }
134:
135: try {
136: return _parent.getObject(key);
137: } catch (MissingResourceException ex) {
138: if (_defaultMap != null)
139: return _defaultMap.get(key);
140: else
141: return null;
142: }
143: }
144:
145: public Enumeration getKeys() {
146: if (_defaultMap != null)
147: return Collections.enumeration(_defaultMap.keySet());
148: else
149: return Collections.enumeration(Collections.EMPTY_LIST);
150: }
151: }
152: }
|