package org.tanukisoftware.wrapper.resources; /* * Copyright (c) 1999, 2009 Tanuki Software, Ltd. * http://www.tanukisoftware.com * All rights reserved. * * This software is the proprietary information of Tanuki Software. * You shall use it only in accordance with the terms of the * license agreement you entered into with Tanuki Software. * http://wrapper.tanukisoftware.org/doc/english/licenseOverview.html * * * Portions of the Software have been derived from source code * developed by Silver Egg Technology under the following license: * * Copyright (c) 2001 Silver Egg Technology * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sub-license, and/or * sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. */ import java.util.Hashtable; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.text.MessageFormat; /** * Some helper functions for handling i18n issues. One instance of this class * should be created for each resource.<P> * * The ResourceManager is created by a call to <CODE>getResourceManager()</CODE>. * The (optional) parameter is the name of the desired resource, not including the * <code>.properties</code> suffix. * * For example,<P> * <CODE> * ResourceManager res = getResourceBundle(); * </CODE> * <P>to get the default resources, or<P> * <CODE> * ResourceManager res = getResourceBundle("sql"); * </CODE> * <P> * to load the resources in <code>sql.properties</code>. * * To use the ResourceManager make a call to any of the <CODE>format()</CODE> * methods. If a string is not found in the bundle the key is returned and a * message is logged to the debug channel for this class. * * @author Leif Mortenson <leif@tanukisoftware.com> */ public class ResourceManager { private static Hashtable m_resources = new Hashtable(); /** * Whenever the Default Locale of the JVM is changed, then any existing * resource bundles will need to update their values. The * _classRefreshCounter static variable gets updated whenever a refresh * is done. The m_refreshCounter variable then is used to tell whether * an individual ResourceManager is up to date or not. */ private int m_refreshCounter; private static int m_staticRefreshCounter = 0; /** * The ResourceBundle for this locale. */ private ResourceBundle m_bundle; private String m_bundleName; /** * Private Constructor. */ private ResourceManager( String resourceName ) { // Resolve the bundle name based on this class so that it will work correctly with obfuscators. String className = this.getClass().getName(); // Strip off the class name at the end, keeping the ending '.' int pos = className.lastIndexOf( '.' ); if ( pos > 0 ) { m_bundleName = className.substring( 0, pos + 1 ); } else { m_bundleName = ""; } m_bundleName += resourceName; // Now load the bundle for the current Locale refreshBundle(); } private void refreshBundle() { try { m_bundle = ResourceBundle.getBundle( m_bundleName ); } catch ( MissingResourceException e ) { System.out.println( e ); } m_refreshCounter = m_staticRefreshCounter; } /** * Returns the default resource manager. * An instance of the ResourceManager class is created the first * time the method is called. */ public static ResourceManager getResourceManager() { return getResourceManager( null ); } /** * Returns the named resource manager. * An instance of the ResourceManager class is created the first * time the method is called. * * @param resourceName The name of the desired resource */ public static synchronized ResourceManager getResourceManager( String resourceName ) { if ( resourceName == null ) { resourceName = "resource"; } ResourceManager resource = (ResourceManager)m_resources.get( resourceName ); if ( resource == null ) { resource = new ResourceManager( resourceName ); m_resources.put( resourceName, resource ); } return resource; } /** * Clears the resource manager's cache of bundles (this should be called * if the default locale for the application changes). */ public static synchronized void refresh() { m_resources = new Hashtable(); m_staticRefreshCounter++; } private String getString( String key ) { // Make sure that the ResourceManager is up to date in a thread safe way synchronized(this) { if ( m_refreshCounter != m_staticRefreshCounter ) { refreshBundle(); } } String msg; if ( m_bundle == null ) { msg = key; } else { try { msg = m_bundle.getString( key ); } catch ( MissingResourceException ex ) { msg = key; System.out.println( key + " is missing from resource bundle \"" + m_bundleName + "\"" ); } } return msg; } /** * Returns a string that has been obtained from the resource manager * * @param key The string that is the key to the translated message * */ public String format( String key ) { return getString( key ); } /** * Returns a string that has been obtained from the resource manager then * formatted using the passed parameters. * * @param pattern The string that is the key to the translated message * @param o0 The param passed to format replaces {0} * */ public String format( String pattern, Object o0 ) { return MessageFormat.format( getString( pattern ), new Object[] { o0 } ); } /** * Returns a string that has been obtained from the resource manager then * formatted using the passed parameters. * * @param pattern The string that is the key to the translated message * @param o0 The param passed to format replaces {0} * @param o1 The param passed to format replaces {1} * */ public String format( String pattern, Object o0, Object o1 ) { return MessageFormat.format( getString( pattern ), new Object[] { o0,o1 } ); } /** * Returns a string that has been obtained from the resource manager then * formatted using the passed parameters. * * @param pattern The string that is the key to the translated message * @param o0 The param passed to format replaces {0} * @param o1 The param passed to format replaces {1} * @param o2 The param passed to format replaces {2} * */ public String format( String pattern, Object o0, Object o1, Object o2 ) { return MessageFormat.format( getString( pattern ), new Object[] { o0,o1,o2 } ); } /** * Returns a string that has been obtained from the resource manager then * formatted using the passed parameters. * * @param pattern The string that is the key to the translated message * @param o0 The param passed to format replaces {0} * @param o1 The param passed to format replaces {1} * @param o2 The param passed to format replaces {2} * @param o3 The param passed to format replaces {3} * */ public String format( String pattern, Object o0, Object o1, Object o2, Object o3 ) { return MessageFormat.format( getString( pattern ), new Object[] { o0,o1,o2,o3 } ); } // add more if you need them... }