/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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.cxf.common.i18n;

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

import org.apache.cxf.common.util.PackageUtils;


/**
 * A container for static utility methods related to resource bundle
 * naming conventons.
 */
public final class BundleUtils {
    /**
     * The default resource bundle naming convention for class is a.b.c is a.b.Messages
     */
    private static final String MESSAGE_BUNDLE = ".Messages";

    /**
     * Prevents instantiation.
     */
    private BundleUtils() {
    }

    /**
     * Encapsulates the logic related to naming the default resource bundle
     * for a class. 
     *
     * @param cls the Class requiring the bundle
     * @return an appropriate ResourceBundle name
     */
    public static String getBundleName(Class<?> cls) {
        // Class.getPackage() can return null, so change to another way to get Package Name
        return PackageUtils.getPackageName(cls) + MESSAGE_BUNDLE;
        
    }
    
    /**
     * Encapsulates the logic related to naming the resource bundle
     * with the given relative name for a class. 
     *
     * @param cls the Class requiring the bundle
     * @return an appropriate ResourceBundle name
     */
    public static String getBundleName(Class<?> cls, String name) {
        return PackageUtils.getPackageName(cls) + "." + name;
    }

    /**
     * Encapsulates the logic related to locating the default resource bundle
     * for a class. 
     *
     * @param cls the Class requiring the bundle
     * @return an appropriate ResourceBundle
     */
    public static ResourceBundle getBundle(Class<?> cls) {
        
        try {
            ClassLoader loader = cls.getClassLoader();
            if (loader == null) {
                return ResourceBundle.getBundle(getBundleName(cls), Locale.getDefault());
            }
            return ResourceBundle.getBundle(getBundleName(cls),
                                        Locale.getDefault(),
                                        loader);
        } catch (MissingResourceException ex) {
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            if (loader == null) {
                return ResourceBundle.getBundle(getBundleName(cls), Locale.getDefault());
            }
            return ResourceBundle.getBundle(getBundleName(cls),
                                            Locale.getDefault(),
                                            loader);
            
        }
    }
    
    /**
     * Encapsulates the logic related to locating the resource bundle with the given 
     * relative name for a class.
     *
     * @param cls the Class requiring the bundle
     * @param name the name of the resource
     * @return an appropriate ResourceBundle
     */
    public static ResourceBundle getBundle(Class<?> cls, String name) {
        try {
            ClassLoader loader = cls.getClassLoader();
            if (loader == null) {
                return ResourceBundle.getBundle(getBundleName(cls, name), Locale.getDefault());
            }
            return ResourceBundle.getBundle(getBundleName(cls, name),
                                            Locale.getDefault(),
                                            loader);
        } catch (MissingResourceException ex) {
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            if (loader == null) {
                return ResourceBundle.getBundle(getBundleName(cls, name), Locale.getDefault());
            }
            return ResourceBundle.getBundle(getBundleName(cls, name),
                                            Locale.getDefault(),
                                            loader);
            
        }
    }
    
    /**
     * Encapsulates the logic to format a string based on the key in the resource bundle
     * 
     * @param b Resource bundle to use
     * @param key The key in the bundle to lookup
     * @param params the params to expand into the string
     * @return the formatted string
     */
    public static String getFormattedString(ResourceBundle b, String key, Object ... params) {
        return MessageFormat.format(b.getString(key), params);
    }
}
