/*
 * 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.i18n;

import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.Properties;

/**
 * CURRENTLY NOT USED
 * KEEPING FOR REFERENCE  9/19/2002
 * <p/>
 * <p>Wrapper class for resource bundles. Property files are used to store
 * resource strings, which are the only types of resources available.
 * Property files can inherit properties from other files so that
 * a base property file can be used and a small number of properties
 * can be over-ridden by another property file. For example you may
 * create an english version of a resource file named "resource.properties".
 * You then decide that the British English version of all of the properties
 * except one are the same, so there is no need to redefine all of the
 * properties in "resource_en_GB", just the one that is different.</p>
 * <p>The property file lookup searches for classes with various suffixes
 * on the basis if the desired local and the current default local
 * (as returned by Local.getDefault()). As property files are found the
 * property values are merged so that inheritance is preserved.</p>
 * <p>The order of searching is:</p>
 * <dir>
 * basename + "_" + langage + "_" + country + "_" + variant
 * basename + "_" + langage + "_" + country
 * basename + "_" + langage
 * basename + "_" + defaultLanguage + "_" + defaultCountry + "_" + defaultVariant
 * basename + "_" + defaultLanguage + "_" + defaultCountry
 * basename + "_" + defaultLanguage
 * basename
 * </dir>
 * <p>The basename is the name of the property file without the ".properties"
 * extension.</p>
 * <p>Properties will be cached for performance.<p>
 * <p>Property values stored in the property files can also contain dynamic
 * variables. Any dynamic variable defined in PropertiesUtil.getVariableValue()
 * can be used (such as {date}), as well as arguments in the form {0}, {1}, etc.
 * Argument values are specified in the various overloaded getString() methods.</p>
 */
public class RB {
    // The static cache of properties. The key is the basename + the local +
    // the default local and the element is the Properties object containing
    // the resources
    static Hashtable propertyCache = new Hashtable();

    // The default base name
    public static final String BASE_NAME = "resource";

    // The property file extension
    public static final String PROPERTY_EXT = ".properties";

    // The name of the current base property file (with extension)
    protected String basePropertyFileName;

    // The properties for the current resource bundle
    protected Properties resourceProperties;

    /**
     * Construct a new RB
     *
     * @param name The name of the property file without the ".properties" extension
     */
    public RB(String name) throws MissingResourceException {
        this(null, name, null);
    }

    /**
     * Construct a new RB
     *
     * @param caller The calling object. This is used to get the package name
     *               to further construct the basename as well as to get the proper ClassLoader
     * @param name   The name of the property file without the ".properties" extension
     */
    public RB(Object caller, String name) throws MissingResourceException {
        this(caller, name, null);
    }

    /**
     * Construct a new RB
     *
     * @param caller The calling object. This is used to get the package name
     *               to further construct the basename as well as to get the proper ClassLoader
     * @param name   The name of the property file without the ".properties" extension
     * @param locale  The locale
     */
    public RB(Object caller, String name, Locale locale) throws MissingResourceException {
        ClassLoader cl = null;

        if (caller != null) {

            Class c;
            if (caller instanceof Class) {
                c = (Class) caller;
            } else {
                c = caller.getClass();
            }

            // Get the appropriate class loader
            cl = c.getClassLoader();

            if (name.indexOf("/") == -1) {

                // Create the full basename only if not given
                String fullName = c.getName();

                int pos = fullName.lastIndexOf(".");
                if (pos > 0) {
                    name = fullName.substring(0, pos + 1).replace('.', '/') + name;
                }
            }
        } else {
            // Try the shared default properties file...
            if (name.indexOf("/") == -1) {
                name = "org/apache/axis2/default-resource";
            }
        }

        Locale defaultLocale = Locale.getDefault();

        // If the locale given is the same as the default locale, ignore it
        if (locale != null) {
            if (locale.equals(defaultLocale)) {
                locale = null;
            }
        }

        // Load the properties. If no property files exist then a
        // MissingResourceException will be thrown
        loadProperties(name, cl, locale, defaultLocale);
    }

    /**
     * Gets a string message from the resource bundle for the given key
     *
     * @param key The resource key
     * @return The message
     */
    public String getString(String key) throws MissingResourceException {
        return getString(key, (Object[]) 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 getString(String key, Object arg0) throws MissingResourceException {
        Object[] o = new Object[1];
        o[0] = arg0;
        return getString(key, o);
    }

    /**
     * <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 getString(String key, Object arg0, Object arg1) throws MissingResourceException {
        Object[] o = new Object[2];
        o[0] = arg0;
        o[1] = arg1;
        return getString(key, o);
    }

    /**
     * <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 {1}
     * @return The message
     */
    public String getString(String key, Object arg0, Object arg1, Object arg2) throws MissingResourceException {
        Object[] o = new Object[3];
        o[0] = arg0;
        o[1] = arg1;
        o[2] = arg2;
        return getString(key, o);
    }

    /**
     * <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 getString(String key, Object[] array) throws MissingResourceException {
        String msg = null;
        if (resourceProperties != null) {
            msg = resourceProperties.getProperty(key);
        }

        if (msg == null) {
            throw new MissingResourceException("Cannot find resource key \"" + key +
                    "\" in base name " + basePropertyFileName,
                    basePropertyFileName, key);
        }

        msg = MessageFormat.format(msg, array);
        return msg;
    }

    protected void loadProperties(String basename, ClassLoader loader, Locale locale,
                                  Locale defaultLocale)
            throws MissingResourceException {
        // Check the cache first
        String loaderName = "";
        if (loader != null) {
            loaderName = ":" + loader.hashCode();
        }
        String cacheKey = basename + ":" + locale + ":" + defaultLocale + loaderName;
        Properties p = (Properties) propertyCache.get(cacheKey);
        basePropertyFileName = basename + PROPERTY_EXT;

        if (p == null) {
            // The properties were not found in the cache. Search the given locale
            // first
            if (locale != null) {
                p = loadProperties(basename, loader, locale, p);
            }

            // Search the default locale
            if (defaultLocale != null) {
                p = loadProperties(basename, loader, defaultLocale, p);
            }

            // Search for the basename
            p = merge(p, loadProperties(basePropertyFileName, loader));

            if (p == null) {
                throw new MissingResourceException("Cannot find resource for base name " +
                        basePropertyFileName, basePropertyFileName, "");
            }

            // Cache the properties
            propertyCache.put(cacheKey, p);

        }

        resourceProperties = p;
    }

    protected Properties loadProperties(String basename, ClassLoader loader, Locale locale,
                                        Properties props) {

        String language = locale.getLanguage();
        String country = locale.getCountry();
        String variant = locale.getVariant();
        if (variant != null) {
            if (variant.trim().length() == 0) {
                variant = null;
            }
        }

        if (language != null) {

            if (country != null) {

                if (variant != null) {
                    props = merge(props, loadProperties(basename + "_" + language + "_" + country + "_" + variant +
                            PROPERTY_EXT, loader));
                }
                props = merge(props, loadProperties(basename + "_" + language + "_" + country +
                        PROPERTY_EXT, loader));
            }
            props = merge(props, loadProperties(basename + "_" + language + PROPERTY_EXT, loader));
        }
        return props;
    }

    protected Properties loadProperties(String resname, ClassLoader loader) {
        Properties props = null;

        // Attempt to open and load the properties
        InputStream in = null;
        try {
            if (loader != null) {
                in = loader.getResourceAsStream(resname);
            }

            // Either we're using the system class loader or we didn't find the
            // resource using the given class loader
            if (in == null) {
                in = ClassLoader.getSystemResourceAsStream(resname);
            }
            if (in != null) {
                props = new Properties();
                try {
                    props.load(in);
                } catch (IOException ex) {
                    // On error, clear the props
                    props = null;
                }
            }
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (Exception ex) {
                    // Ignore error on close
                }
            }
        }
        return props;
    }

    /**
     * Merge two Properties objects
     */
    protected Properties merge(Properties p1, Properties p2) {
        if ((p1 == null) &&
                (p2 == null)) {
            return null;
        } else if (p1 == null) {
            return p2;
        } else if (p2 == null) {
            return p1;
        }

        // Now merge. p1 takes precedence
        Enumeration enumeration = p2.keys();
        while (enumeration.hasMoreElements()) {
            String key = (String) enumeration.nextElement();
            if (p1.getProperty(key) == null) {
                p1.put(key, p2.getProperty(key));
            }
        }

        return p1;
    }

    /**
     * Get the underlying properties
     */
    public Properties getProperties() {
        return resourceProperties;
    }

    // STATIC ACCESSORS

    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @param key    The resource key
     * @return The formatted message
     */
    public static String getString(Object caller, String key)
            throws MissingResourceException {
        return getMessage(caller, BASE_NAME, null, key, null);
    }

    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @param key    The resource key
     * @param arg0   The argument to place in variable {0}
     * @return The formatted message
     */
    public static String getString(Object caller, String key, Object arg0)
            throws MissingResourceException {
        Object[] o = new Object[1];
        o[0] = arg0;
        return getMessage(caller, BASE_NAME, null, key, o);
    }

    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @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 formatted message
     */
    public static String getString(Object caller, String key, Object arg0, Object arg1)
            throws MissingResourceException {
        Object[] o = new Object[2];
        o[0] = arg0;
        o[1] = arg1;
        return getMessage(caller, BASE_NAME, null, key, o);
    }

    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @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 formatted message
     */
    public static String getString(Object caller, String key, Object arg0, Object arg1, Object arg2)
            throws MissingResourceException {
        Object[] o = new Object[3];
        o[0] = arg0;
        o[1] = arg1;
        o[2] = arg2;
        return getMessage(caller, BASE_NAME, null, key, o);
    }

    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @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 formatted message
     */
    public static String getString(Object caller, String key, Object arg0, Object arg1, Object arg2, Object arg3)
            throws MissingResourceException {
        Object[] o = new Object[4];
        o[0] = arg0;
        o[1] = arg1;
        o[2] = arg2;
        o[3] = arg3;
        return getMessage(caller, BASE_NAME, null, key, o);
    }


    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @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 Returns the formatted message.
     */
    public static String getString(Object caller, String key, Object arg0, Object arg1, Object arg2, Object arg3, Object arg4)
            throws MissingResourceException {
        Object[] o = new Object[5];
        o[0] = arg0;
        o[1] = arg1;
        o[2] = arg2;
        o[3] = arg3;
        o[4] = arg4;
        return getMessage(caller, BASE_NAME, null, key, o);
    }


    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @param key    The resource key
     * @param args  An array of objects to place in corresponding variables
     * @return Returns the formatted message.
     */
    public static String getString(Object caller, String key, Object[] args)
            throws MissingResourceException {
        return getMessage(caller, BASE_NAME, null, key, args);
    }


    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @param locale The locale
     * @param key    The resource key
     * @return The formatted message
     */
    public static String getString(Object caller, Locale locale, String key)
            throws MissingResourceException {
        return getMessage(caller, BASE_NAME, locale, key, null);
    }

    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @param locale The locale
     * @param key    The resource key
     * @param arg0   The argument to place in variable {0}
     * @return The formatted message
     */
    public static String getString(Object caller, Locale locale, String key, Object arg0)
            throws MissingResourceException {
        Object[] o = new Object[1];
        o[0] = arg0;
        return getMessage(caller, BASE_NAME, locale, key, o);
    }

    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @param locale The locale
     * @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 formatted message
     */
    public static String getString(Object caller, Locale locale, String key, Object arg0, Object arg1)
            throws MissingResourceException {
        Object[] o = new Object[2];
        o[0] = arg0;
        o[1] = arg1;
        return getMessage(caller, BASE_NAME, locale, key, o);
    }

    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @param locale The locale
     * @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 formatted message
     */
    public static String getString(Object caller, Locale locale, String key, Object arg0, Object arg1, Object arg2)
            throws MissingResourceException {
        Object[] o = new Object[3];
        o[0] = arg0;
        o[1] = arg1;
        o[2] = arg2;
        return getMessage(caller, BASE_NAME, locale, key, o);
    }

    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @param locale The locale
     * @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 formatted message
     */
    public static String getString(Object caller, Locale locale, String key, Object arg0, Object arg1, Object arg2, Object arg3)
            throws MissingResourceException {
        Object[] o = new Object[4];
        o[0] = arg0;
        o[1] = arg1;
        o[2] = arg2;
        o[3] = arg3;
        return getMessage(caller, BASE_NAME, locale, key, o);
    }

    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @param locale The locale
     * @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 Returns the formatted message.
     */
    public static String getString(Object caller, Locale locale, String key, Object arg0, Object arg1, Object arg2, Object arg3, Object arg4)
            throws MissingResourceException {
        Object[] o = new Object[5];
        o[0] = arg0;
        o[1] = arg1;
        o[2] = arg2;
        o[3] = arg3;
        o[4] = arg4;
        return getMessage(caller, BASE_NAME, locale, key, o);
    }

    /**
     * Get a message from resource.properties from the package of the given object.
     *
     * @param caller The calling object, used to get the package name and class loader
     * @param locale The locale
     * @param key    The resource key
     * @param args  An array of objects to place in corresponding variables
     * @return Returns the formatted message.
     */
    public static String getString(Object caller, Locale locale, String key, Object[] args)
            throws MissingResourceException {
        return getMessage(caller, BASE_NAME, locale, key, args);
    }

    // Workhorse that does the resource loading and key lookup
    public static String getMessage(Object caller, String basename, Locale locale, String key,
                                    Object[] args)
            throws MissingResourceException {
        String msg = null;
        MissingResourceException firstEx = null;
        String fullName = null;
        Class curClass = null;
        boolean didNull = false;

        if (caller != null) {
            if (caller instanceof Class)
                curClass = (Class) caller;
            else
                curClass = caller.getClass();
        }

        while (msg == null) {

            // Get the full name of the resource
            if (curClass != null) {

                // Create the full basename
                String pkgName = curClass.getName();

                int pos = pkgName.lastIndexOf(".");
                if (pos > 0) {
                    fullName = pkgName.substring(0, pos + 1).replace('.', '/') + basename;
                } else {
                    fullName = basename;
                }
            } else {
                fullName = basename;
            }

            try {
                RB rb = new RB(caller, fullName, locale);
                msg = rb.getString(key, args);
            } catch (MissingResourceException ex) {
                if (curClass == null) {
                    throw ex;
                }

                // Save the first exception
                if (firstEx == null) {
                    firstEx = ex;
                }

                // Get the superclass
                curClass = curClass.getSuperclass();
                if (curClass == null) {
                    if (didNull)
                        throw firstEx;
                    didNull = true;
                    caller = null;
                } else {
                    String cname = curClass.getName();
                    if (cname.startsWith("java.") ||
                            cname.startsWith("javax.")) {
                        if (didNull)
                            throw firstEx;
                        didNull = true;
                        caller = null;
                        curClass = null;
                    }
                }
            }

        }
        return msg;
    }

    /**
     * Clears the internal cache.
     */
    public static void clearCache() {
        propertyCache.clear();
    }
}
