/* * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * */ package org.apache.taglibs.standard.resources; import java.util.*; import java.text.*; /** *

Provides locale-neutral access to string resources. Only the * documentation and code are in English. :-) * *

The major goal, aside from globalization, is convenience. * Access to resources with no parameters is made in the form:

*
 *     Resources.getMessage(MESSAGE_NAME);
 * 
* *

Access to resources with one parameter works like

*
 *     Resources.getMessage(MESSAGE_NAME, arg1);
 * 
* *

... and so on.

* * @author Shawn Bayern */ public class Resources { //********************************************************************* // Static data /** The location of our resources. */ private static final String RESOURCE_LOCATION = "org.apache.taglibs.standard.resources.Resources"; /** Our class-wide ResourceBundle. */ private static ResourceBundle rb = ResourceBundle.getBundle(RESOURCE_LOCATION); private static Hashtable formats = new Hashtable(); //********************************************************************* // Public static methods /** Retrieves a message with no arguments. */ public static String getMessage(String name) throws MissingResourceException { return rb.getString(name); } /** Retrieves a message with arbitrarily many arguments. */ public static String getMessage(String name, Object[] a) throws MissingResourceException { // MessageFormats are slow to initialize, but perform // the formating operation fairly quickly. Caching the // formats will result in more speed. However, if only // one format per message exists, high thread contention // for the same format could result in a slowdown on a // system with a heavy load. Therefore, a simple pool // of formats will allow caching of parsed formats and // reduce the amount of time threads wait on each other. // Note: Hashtable and Stack are thread safe // Retrieve pre-parsed format pool for message Stack formatPool = (Stack) formats.get(name); if (formatPool==null) { formatPool = new Stack(); formats.put(name, formatPool); } // Retrieve format from pool or create a new one if pool // is empty MessageFormat messageFormat = null; try { messageFormat = (MessageFormat) formatPool.pop(); } catch(EmptyStackException emptyx) { messageFormat = new MessageFormat(rb.getString(name)); } // Generate formatted message String message = messageFormat.format(a); // Put parsed format back in pool for re-use by // another thread formatPool.push(messageFormat); return message; } /** Retrieves a message with one argument. */ public static String getMessage(String name, Object a1) throws MissingResourceException { return getMessage(name, new Object[] { a1 }); } /** Retrieves a message with two arguments. */ public static String getMessage(String name, Object a1, Object a2) throws MissingResourceException { return getMessage(name, new Object[] { a1, a2 }); } /** Retrieves a message with three arguments. */ public static String getMessage(String name, Object a1, Object a2, Object a3) throws MissingResourceException { return getMessage(name, new Object[] { a1, a2, a3 }); } /** Retrieves a message with four arguments. */ public static String getMessage(String name, Object a1, Object a2, Object a3, Object a4) throws MissingResourceException { return getMessage(name, new Object[] { a1, a2, a3, a4 }); } /** Retrieves a message with five arguments. */ public static String getMessage(String name, Object a1, Object a2, Object a3, Object a4, Object a5) throws MissingResourceException { return getMessage(name, new Object[] { a1, a2, a3, a4, a5 }); } /** Retrieves a message with six arguments. */ public static String getMessage(String name, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws MissingResourceException { return getMessage(name, new Object[] { a1, a2, a3, a4, a5, a6 }); } }