/*
 * 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.hadoop.mapreduce.util;

import java.util.ResourceBundle;
import java.util.MissingResourceException;

/**
 * Helper class to handle resource bundles in a saner way
 */
public class ResourceBundles {

  /**
   * Get a resource bundle
   * @param bundleName of the resource
   * @return the resource bundle
   * @throws MissingResourceException
   */
  public static ResourceBundle getBundle(String bundleName) {
    return ResourceBundle.getBundle(bundleName.replace('$', '_'));
  }

  /**
   * Get a resource given bundle name and key
   * @param <T> type of the resource
   * @param bundleName name of the resource bundle
   * @param key to lookup the resource
   * @param suffix for the key to lookup
   * @param defaultValue of the resource
   * @return the resource or the defaultValue
   * @throws ClassCastException if the resource found doesn't match T
   */
  @SuppressWarnings("unchecked")
  public static synchronized <T> T getValue(String bundleName, String key,
                                            String suffix, T defaultValue) {
    T value;
    try {
      ResourceBundle bundle = getBundle(bundleName);
      value = (T) bundle.getObject(getLookupKey(key, suffix));
    }
    catch (Exception e) {
      return defaultValue;
    }
    return value == null ? defaultValue : value;
  }

  private static String getLookupKey(String key, String suffix) {
    if (suffix == null || suffix.isEmpty()) return key;
    return key + suffix;
  }

  /**
   * Get the counter group display name
   * @param group the group name to lookup
   * @param defaultValue of the group
   * @return the group display name
   */
  public static String getCounterGroupName(String group, String defaultValue) {
    return getValue(group, "CounterGroupName", "", defaultValue);
  }

  /**
   * Get the counter display name
   * @param group the counter group name for the counter
   * @param counter the counter name to lookup
   * @param defaultValue of the counter
   * @return the counter display name
   */
  public static String getCounterName(String group, String counter,
                                      String defaultValue) {
    return getValue(group, counter, ".name", defaultValue);
  }
}
