org.castor.core.util.Messages.java Source code

Java tutorial

Introduction

Here is the source code for org.castor.core.util.Messages.java

Source

/*
 * Copyright 2006 Assaf Arkin, Ralf Joachim
 *
 * 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.
 *
 * $Id: Messages.java 6907 2007-03-28 21:24:52Z rjoachim $
 */
package org.castor.core.util;

import java.text.MessageFormat;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * I18N message formatting class. A static factory for obtaining messages and formatting messages
 * with arguments.
 * <p>
 * The resource file <tt>org.exolab.castor.util.resources.messages</tt> contains a list of all the
 * messages in English. Additional resource files can be added for other languages and locales by
 * placing them in the same package with a language/locale prefix. See the I18N documentation and
 * use of resource bundles in the JDK docs.
 *
 * @author <a href="mailto:arkin AT intalio DOT com">Assaf Arkin</a>
 * @author <a href="mailto:ralf DOT joachim AT syscon DOT eu">Ralf Joachim</a>
 * @version $Revision: 6907 $ $Date: 2006-04-10 16:39:24 -0600 (Mon, 10 Apr 2006) $
 * @since 1.0.1
 */
public final class Messages {
    // --------------------------------------------------------------------------

    /**
     * The <a href="http://jakarta.apache.org/commons/logging/">Jakarta Commons Logging </a> instance
     * used for all logging.
     */
    private static final Log LOG = LogFactory.getLog(Messages.class);

    /**
     * The name of the resource holding all the messages in the English language. Resources for other
     * languages and locales use the same name with a language/locale prefix.
     */
    public static final String RESOURCE_NAME = "org.castor.messages";

    /** The resource bundle holds all the messages. */
    private static ResourceBundle _messages;

    /** Once a format has been created once, it is cached here. */
    private static Hashtable<String, MessageFormat> _formats;
    // --------------------------------------------------------------------------

    static {
        setDefaultLocale();
    }

    // --------------------------------------------------------------------------

    /**
     * Set the default locale to use for loading messages. Calling this method will reload all the
     * messages based on the new locale name.
     */
    public static void setDefaultLocale() {
        setLocale(Locale.getDefault());
    }

    /**
     * Set the locale to use for loading messages. Calling this method will reload all the messages
     * based on the new locale name.
     * 
     * @param locale the locale for which a resource bundle is desired.
     */
    public static void setLocale(final Locale locale) {
        try {
            _messages = ResourceBundle.getBundle(RESOURCE_NAME, locale);
        } catch (Exception except) {
            _messages = new EmptyResourceBundle();
            LOG.error("Failed to locate messages resource " + RESOURCE_NAME);
        }
        _formats = new Hashtable<>();
    }

    /**
     * Format the named message using a single argument and return the full message text.
     *
     * @param message The message name
     * @param arg1 The first argument
     * @return The full message text
     */
    public static String format(final String message, final Object arg1) {
        return format(message, new Object[] { arg1 });
    }

    /**
     * Format the named message using two argument and return the full message text.
     *
     * @param message The message name
     * @param arg1 The first argument
     * @param arg2 The second argument
     * @return The full message text
     */
    public static String format(final String message, final Object arg1, final Object arg2) {
        return format(message, new Object[] { arg1, arg2 });
    }

    /**
     * Format the named message using three argument and return the full message text.
     *
     * @param message The message name
     * @param arg1 The first argument
     * @param arg2 The second argument
     * @param arg3 The third argument
     * @return The full message text
     */
    public static String format(final String message, final Object arg1, final Object arg2, final Object arg3) {
        return format(message, new Object[] { arg1, arg2, arg3 });
    }

    /**
     * Format the named message using any number of arguments and return the full message text.
     *
     * @param message The message name
     * @param args Argument list
     * @return The full message text
     */
    public static String format(final String message, final Object[] args) {

        try {
            MessageFormat mf = (MessageFormat) _formats.get(message);
            if (mf == null) {
                String msg;
                try {
                    msg = _messages.getString(message);
                } catch (MissingResourceException except) {
                    return message;
                }
                mf = new MessageFormat(msg);
                _formats.put(message, mf);
            }
            return mf.format(args);
        } catch (Exception except) {
            return "An internal error occured while processing message " + message;
        }
    }

    /**
     * Return the text of the named message without formatting.
     *
     * @param message The message name
     * @return The full message text
     */
    public static String message(final String message) {
        try {
            return _messages.getString(message);
        } catch (MissingResourceException except) {
            return message;
        }
    }

    // --------------------------------------------------------------------------

    /**
     * Hide default constructor of utility class.
     */
    private Messages() {
    }

    // --------------------------------------------------------------------------

    /**
     * A empty resource bundle.
     */
    private static class EmptyResourceBundle extends ResourceBundle implements Enumeration<String> {
        /**
         * {@inheritDoc}
         * 
         * @see java.util.ResourceBundle#getKeys()
         */
        public Enumeration<String> getKeys() {
            return this;
        }

        /**
         * {@inheritDoc}
         * 
         * @see java.util.ResourceBundle#handleGetObject(java.lang.String)
         */
        protected Object handleGetObject(final String name) {
            return "[Missing message " + name + "]";
        }

        /**
         * {@inheritDoc}
         * 
         * @see java.util.Enumeration#hasMoreElements()
         */
        public boolean hasMoreElements() {
            return false;
        }

        /**
         * {@inheritDoc}
         * 
         * @see java.util.Enumeration#nextElement()
         */
        public String nextElement() {
            return null;
        }
    }

    // --------------------------------------------------------------------------
}