org.jboss.bqt.core.BundleUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.bqt.core.BundleUtil.java

Source

/*
 * JBoss, Home of Professional Open Source.
 * See the COPYRIGHT.txt file distributed with this work for information
 * regarding copyright ownership.  Some portions may be licensed
 * to Red Hat, Inc. under one or more contributor license agreements.
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301 USA.
 */

package org.jboss.bqt.core;

import java.text.MessageFormat;
import java.util.List;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import org.jboss.bqt.core.util.ArgCheck;

import org.apache.commons.lang.StringUtils;

public class BundleUtil {
    /**
     * The product properties used to override default localized text.
     * 
     */
    private static ResourceBundle productProps;

    /**
     * The name of the resource bundle.
     */
    private final String bundleName;

    /**
     * The {@link ResourceBundle}for localization; initialized in the
     * constructor.
     */
    private final ResourceBundle bundle;

    private final String pluginId;

    /**
     * Return the {@link BundleUtil} for the class. The bundle must be in the
     * same package or a parent package of the class.
     * 
     * @param clazz
     * @return BundleUtil
     */
    public static BundleUtil getBundleUtil(Class<?> clazz) {
        String packageName = clazz.getPackage().getName();

        while (true) {
            // scan up packages until found
            String bundleName = packageName + ".i18n"; //$NON-NLS-1$
            try {
                ResourceBundle bundle = ResourceBundle.getBundle(bundleName, Locale.getDefault(),
                        clazz.getClassLoader());
                return new BundleUtil(packageName, bundleName, bundle);
            } catch (MissingResourceException e) {
                int index = packageName.lastIndexOf('.');
                if (index < 0) {
                    throw e;
                }
                packageName = packageName.substring(0, index);
            }
        }
    }

    /**
     * Construct an instance of this class by specifying the plugin ID.
     * 
     * @param pluginId
     *            the identifier of the plugin for which this utility is being
     *            instantiated
     * @param bundleName
     *            the name of the resource bundle; used for problem reporting
     *            purposes only
     * @param bundle
     *            the resource bundle
     */
    public BundleUtil(final String pluginId, final String bundleName, final ResourceBundle bundle) {
        this.pluginId = pluginId;
        this.bundleName = bundleName;
        this.bundle = bundle;
    }

    /**
     * Get the string identified by the given key and localized to the current
     * locale.
     * 
     * @param key
     *            the key in the resource file
     * @return the localized String, or <code>
     *    "Missing message: " + key + " in: " + this.bundleName
     * </code> if the string could not be found in the current locale, or <code>
     *    "No message available"
     * </code> if the <code>key</code> is null.
     */
    public String getString(final String key) {
        try {
            // Since this string has no parameters, it will not be run through
            // MessageFormat.
            // MessageFormat eliminates double ticks, so the next two lines
            // replace double ticks
            // with single ticks. This is only needed if the localized string
            // contains double ticks
            // (the policy is that localized strings without parameters should
            // not).
            // COMMENTED OUT BECAUSE OF POLICY
            // char[] messageWithNoDoubleQuotes =
            // CharOperation.replace(text.toCharArray(), DOUBLE_QUOTES,
            // SINGLE_QUOTE);
            // text = new String(messageWithNoDoubleQuotes);

            String value = getProductValue(key);
            return ((value == null) ? this.bundle.getString(key) : value);
        } catch (final Exception err) {
            String msg;

            if (err instanceof NullPointerException) {
                msg = "<No message available>"; //$NON-NLS-1$
            } else if (err instanceof MissingResourceException) {
                msg = "<Missing message for key \"" + key + "\" in: " + this.bundleName + '>'; //$NON-NLS-1$ //$NON-NLS-2$
            } else {
                msg = err.getLocalizedMessage();
            }

            // RMH: See DataAccessPlugin.ResourceLocator.getString(...) method,
            // which tries one bundle before
            // delegating to another. Therefore, this will happen normally in
            // some situations.
            // log(msg);

            return msg;
        }
    }

    /**
     * Obtains the value that is overriding the default value.
     * 
     * @param theKey
     *            the key whose product value is being requested
     * @return the value or <code>null</code> if not overridden by the product
     */
    private String getProductValue(String theKey) {
        String result = null;

        if ((productProps != null) && !StringUtils.isEmpty(theKey)) {
            String key = this.pluginId + '.' + theKey;

            try {
                result = productProps.getString(key);
            } catch (MissingResourceException theException) {
                // not found in product properties
            }
        }

        return result;
    }

    /**
     * Determines if the given key exists in the resource file.
     * 
     * @param key
     *            the key in the resource file
     * @return True if the key exists.
     */
    public boolean keyExists(final String key) {
        try {
            return ((getProductValue(key) != null) || (this.bundle.getString(key) != null));
        } catch (final Exception err) {
            return false;
        }
    }

    /**
     * Get the string identified by the given key and localized to the current
     * locale, and replace placeholders in the localized string with the string
     * form of the parameters.
     * 
     * @param key
     *            the key in the resource file
     * @param parameters
     *            the list of parameters that should replace placeholders in the
     *            localized string (e.g., "{0}", "{1}", etc.)
     * @return the localized String, or <code>
     *    "Missing message: " + key + " in: " + this.bundleName
     * </code> if the string could not be found in the current locale, or <code>
     *    "No message available"
     * </code> if the <code>key</code> is null.
     */
    public String getString(final String key, final List parameters) {
        if (parameters == null) {
            return getString(key);
        }
        return getString(key, parameters.toArray());
    }

    /**
     * Get the string identified by the given key and localized to the current
     * locale, and replace placeholders in the localized string with the string
     * form of the parameters.
     * 
     * @param key
     *            the key in the resource file
     * @param parameters
     *            the list of parameters that should replace placeholders in the
     *            localized string (e.g., "{0}", "{1}", etc.)
     * @return the localized String, or <code>
     *    "Missing message: " + key + " in: " + this.bundleName
     * </code> if the string could not be found in the current locale, or <code>
     *    "No message available"
     * </code> if the <code>key</code> is null.
     */
    public String getString(final String key, final Object... parameters) {
        String text = getString(key);

        // Check the trivial cases ...
        if (text == null) {
            return '<' + key + '>';
        }
        if (parameters == null || parameters.length == 0) {
            return text;
        }

        return MessageFormat.format(text, parameters);
    }

    public String getStringOrKey(final String key) {
        ArgCheck.isNotNull(key);

        String value = getProductValue(key);

        if (value == null) {
            try {
                return this.bundle.getString(key);
            } catch (final MissingResourceException err) {
                return key;
            }
        }

        return value;
    }

}