Error.java

package progen.kernel.error;

import java.util.Locale;
import java.util.ResourceBundle;

import progen.context.ProGenContext;
import progen.context.UninitializedContextException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

/**
 * En esta clase es de donde se obtienen de una forma uniforme, los distintos
 * literales de error en los idiomas que estén disponibles, siguiendo la
 * nomenclatura ISO 639-1
 * 
 * @author jirsis
 */
public final class Error {

  private static final String ERROR_LITERAL = "Error";

  private static final String PROGEN_KERNEL_ERROR_STRINGS_BUNDLE = "progen.kernel.error.strings";

  /**
   * Lenguaje por defecto de la que se cargarán los distintos literales.
   */
  private static final String DEFAULT_LANGUAGE = "en_US";

  /**
   * Objeto que representa la única instancia que existirá de este objeto al ser
   * implemetado con un Singleton
   */
  private static Error error;

  /**
   * Estructura de datos que accede a los literales almacenados en el properties
   * correspondiente.
   */
  private ResourceBundle literals;

  /**
   * Constructor privado de la clase, en la que por defecto se cargan los
   * literales definidos en el fichero error_en_US.properties, si no se
   * especifica otro en el fichero de configuración general del programa, con la
   * propiedad <code>progen.language</code>
   */
  private Error() {
    final Locale locale = new Locale(DEFAULT_LANGUAGE);
    Locale.setDefault(locale);
    literals = ResourceBundle.getBundle(PROGEN_KERNEL_ERROR_STRINGS_BUNDLE);
  }

  /**
   * Método para inicializar el Singleton de esta clase.
   */
  @SuppressFBWarnings("ISC_INSTANTIATE_STATIC_CLASS")
  public static synchronized void makeInstance() {
    if (error == null) {
      error = new Error();
      try {
        final String defaultLanguage = ProGenContext.getOptionalProperty("progen.language", DEFAULT_LANGUAGE);
        final Locale locale = new Locale(defaultLanguage);
        Locale.setDefault(locale);
        error.literals = ResourceBundle.getBundle(PROGEN_KERNEL_ERROR_STRINGS_BUNDLE, locale);
      } catch (UninitializedContextException e) {
        // do nothing, because the error has a default language
      }
    }
  }

  /**
   * Imprime por la salida de error el literal identificado con
   * <code>errorId</code>
   * 
   * @param errorId
   *          el código de error a imprimir por pantalla
   */
  public static void println(int errorId) {
    if (error == null) {
      makeInstance();
    }
    System.err.println("ERROR: " + error.literals.getString(ERROR_LITERAL + errorId));
  }

  /**
   * Obtiene la cadena con el texto del error identificado con
   * <code>errorId</code>
   * 
   * @param errorId
   *          número identificador del error concreto.
   * @return la cadena que corresponde con el identificador pasado por
   *         parámetro.
   */
  public static String get(int errorId) {
    if (error == null) {
      makeInstance();
    }
    return error.literals.getString(ERROR_LITERAL + errorId);
  }

  public static void destroyMe() {
    error = null;
  }

}