/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * 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.
 */

package org.apache.axis2.jaxws.i18n;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

/**
 * Accept parameters for ProjectResourceBundle,
 * but defer object instantiation (and therefore
 * resource bundle loading) until required.
 */
public class MessageBundle {
    private boolean loaded = false;

    private ProjectResourceBundle _resourceBundle = null;

    private final String projectName;
    private final String packageName;
    private final String resourceName;
    private final Locale locale;
    private final ClassLoader classLoader;
    private final ResourceBundle parent;


    public final ProjectResourceBundle getResourceBundle() {
        if (!loaded) {
            _resourceBundle = ProjectResourceBundle.getBundle(projectName,
                    packageName,
                    resourceName,
                    locale,
                    classLoader,
                    parent);
            loaded = true;
        }
        return _resourceBundle;
    }

    /**
     * Construct a new ExtendMessages
     */
    public MessageBundle(String projectName,
                         String packageName,
                         String resourceName,
                         Locale locale,
                         ClassLoader classLoader,
                         ResourceBundle parent)
            throws MissingResourceException {
        this.projectName = projectName;
        this.packageName = packageName;
        this.resourceName = resourceName;
        this.locale = locale;
        this.classLoader = classLoader;
        this.parent = parent;
    }

    /**
     * Gets a string message from the resource bundle for the given key
     *
     * @param key The resource key
     * @return The message
     */
    public String getMessage(String key) throws MissingResourceException {
        return getMessage(key, (String[]) null);
    }

    /**
     * <p>Gets a string message from the resource bundle for the given key. The
     * message may contain variables that will be substituted with the given
     * arguments. Variables have the format:</p>
     * <dir>
     * This message has two variables: {0} and {1}
     * </dir>
     *
     * @param key  The resource key
     * @param arg0 The argument to place in variable {0}
     * @return The message
     */
    public String getMessage(String key, String arg0) throws MissingResourceException {
        return getMessage(key, new String[]{arg0});
    }

    /**
     * <p>Gets a string message from the resource bundle for the given key. The
     * message may contain variables that will be substituted with the given
     * arguments. Variables have the format:</p>
     * <dir>
     * This message has two variables: {0} and {1}
     * </dir>
     *
     * @param key  The resource key
     * @param arg0 The argument to place in variable {0}
     * @param arg1 The argument to place in variable {1}
     * @return The message
     */
    public String getMessage(String key, String arg0, String arg1) throws MissingResourceException {
        return getMessage(key, new String[]{arg0, arg1});
    }

    /**
     * <p>Gets a string message from the resource bundle for the given key. The
     * message may contain variables that will be substituted with the given
     * arguments. Variables have the format:</p>
     * <dir>
     * This message has two variables: {0} and {1}
     * </dir>
     *
     * @param key  The resource key
     * @param arg0 The argument to place in variable {0}
     * @param arg1 The argument to place in variable {1}
     * @param arg2 The argument to place in variable {2}
     * @return The message
     */
    public String getMessage(String key, String arg0, String arg1, String arg2) throws MissingResourceException {
        return getMessage(key, new String[]{arg0, arg1, arg2});
    }

    /**
     * <p>Gets a string message from the resource bundle for the given key. The
     * message may contain variables that will be substituted with the given
     * arguments. Variables have the format:</p>
     * <dir>
     * This message has two variables: {0} and {1}
     * </dir>
     *
     * @param key  The resource key
     * @param arg0 The argument to place in variable {0}
     * @param arg1 The argument to place in variable {1}
     * @param arg2 The argument to place in variable {2}
     * @param arg3 The argument to place in variable {3}
     * @return The message
     */
    public String getMessage(String key, String arg0, String arg1, String arg2, String arg3) throws MissingResourceException {
        return getMessage(key, new String[]{arg0, arg1, arg2, arg3});
    }

    /**
     * <p>Gets a string message from the resource bundle for the given key. The
     * message may contain variables that will be substituted with the given
     * arguments. Variables have the format:</p>
     * <dir>
     * This message has two variables: {0} and {1}
     * </dir>
     *
     * @param key  The resource key
     * @param arg0 The argument to place in variable {0}
     * @param arg1 The argument to place in variable {1}
     * @param arg2 The argument to place in variable {2}
     * @param arg3 The argument to place in variable {3}
     * @param arg4 The argument to place in variable {4}
     * @return The message
     */
    public String getMessage(String key, String arg0, String arg1, String arg2, String arg3, String arg4) throws MissingResourceException {
        return getMessage(key, new String[]{arg0, arg1, arg2, arg3, arg4});
    }

    /**
     * <p>Gets a string message from the resource bundle for the given key. The
     * message may contain variables that will be substituted with the given
     * arguments. Variables have the format:</p>
     * <dir>
     * This message has two variables: {0} and {1}
     * </dir>
     *
     * @param key   The resource key
     * @param array An array of objects to place in corresponding variables
     * @return The message
     */
    public String getMessage(String key, String[] array) throws MissingResourceException {
        String msg = null;
        if (getResourceBundle() != null) {
            msg = getResourceBundle().getString(key);
        }

        if (msg == null) {
            throw new MissingResourceException("Cannot find resource key \"" + key +
                    "\" in base name " +
                    getResourceBundle().getResourceName(),
                    getResourceBundle().getResourceName(), key);
        }

        return MessageFormat.format(msg, (Object[]) array);
    }
}
