Network Protocol Java

/*
 * Copyright (C) 2003 Colin Bell
 * colbell@users.sourceforge.net
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.net.URLClassLoader;
import java.net.URL;
/**
 * This class defines i18nized strings. These strings are stored in a file
 * with a base name I18NStrings.properties in each package directory.
 *
 * @author Colin Bell
 */
public class StringManager
{
  /** Contains the localised strings. */
  private ResourceBundle _rsrcBundle;
  private String _bundleBaseName;
  private URL[] _bundleLoaderUrLs = new URL[0];
  
  /** a flag to indicate whether or not to throw exception for missing resource string */
  private static boolean _testMode = false;
  /**
   * Ctor specifying the package name. Attempt to load a resource bundle
   * from the package directory.
   *
   * @param packageName Name of package
   * @param classLoader Class loader to use
   */
  StringManager(String packageName, ClassLoader loader)
  {
    super();
    _bundleBaseName = packageName + ".I18NStrings";
    _rsrcBundle = ResourceBundle.getBundle(_bundleBaseName, Locale.getDefault(), loader);
    if(loader instanceof URLClassLoader)
    {
      _bundleLoaderUrLs = ((URLClassLoader) loader).getURLs();
    }
  }
  /**
   * Retrieve the localized string for the passed key. If it isn't found
   * an error message is returned instead.
   *
   * @param key   Key to retrieve string for.
   *
   * @return  Localized string or error message.
   *
   * @throws  IllegalArgumentException
   *      Thrown if null key passed.
   */
  public String getString(String key)
  {
    if (key == null)
    {
      throw new IllegalArgumentException("key == null");
    }
    try
    {
      return _rsrcBundle.getString(key);
    }
    catch (MissingResourceException ex)
    {
      StringBuilder sb = new StringBuilder();
      sb.append("No resource string found for key '" + key + "' in bundle " + _bundleBaseName + "\n\n");
      if(0 < _bundleLoaderUrLs.length)
      {
        sb.append("The following classpath entries are available to the bundle loader:\n");
        for (int i = 0; i < _bundleLoaderUrLs.length; i++)
        {
          sb.append(_bundleLoaderUrLs[i]).append("\n");
        }
      }
     
      if (_testMode) {
        throw new IllegalStateException(sb.toString());
      }
      return "No resource found for key " + key;
    }
  }
    /**
     * Retrieve the localized string for the passed key and format it with the
     * passed arguments.
     *
     * @param   key     Key to retrieve string for.
     * @param   args    Any string arguments that should be used as values to 
     *                  parameters found in the localized string.
     *                   
     * @return  Localized string or error message.
     *
     * @throws  IllegalArgumentException
     *          Thrown if null key passed.
     */    
    public String getString(String key, String[] args) 
    {
        return getString(key, (Object[])args);
    }
    
  /**
   * Retrieve the localized string for the passed key and format it with the
   * passed arguments.
   *
   * @param key   Key to retrieve string for.
     * @param   args    Any string arguments that should be used as values to 
     *                  parameters found in the localized string. 
   *
   * @return  Localized string or error message.
   *
   * @throws  IllegalArgumentException
   *      Thrown if null key passed.
   */
  public String getString(String key, Object... args)
  {
    if (key == null)
    {
      throw new IllegalArgumentException("key == null");
    }
    if (args == null)
    {
      args = new Object[0];
    }
    final String str = getString(key);
    try
    {
      return MessageFormat.format(str, args);
    }
    catch (IllegalArgumentException ex)
    {
      String msg = "Error formatting i18 string. Key is '" + key + "'";
  
      return msg + ": " + ex.toString();
    }
  }
  
  /**
   * Allows the caller to enable/disable test mode which results in an exception being thrown for no 
   * resource string defined. 
   * 
   * @param enabled 
   */
  public static void setTestMode(boolean enabled) {
    _testMode = enabled;
  }
}