/** * L2FProd.com Common Components 7.3 License. * * Copyright 2005-2007 L2FProd.com * * Licensed 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 com.l2fprod.common.util; import java.text.MessageFormat; import java.util.HashMap; import java.util.Map; import java.util.ResourceBundle; /** * Manages application resources. <br> */ public class ResourceManager { static Map nameToRM = new HashMap(); private ResourceBundle bundle; /** * Gets the ResourceManager associated with <code>clazz</code>. * It looks for a ResourceBundle named against the class name plus * the string "RB". For example, for the com.mypackage.Main, the * ResourceBundle com.mypackage.MainRB will be looked up. * * @param clazz * @return the ResourceManager associated with the class */ public static ResourceManager get(Class clazz) { String bundleName = clazz.getName() + "RB"; return get(bundleName); } /** * Gets the ResourceManager with the given name. * * @param bundleName * @return the ResourceManager with the given name. */ public static ResourceManager get(String bundleName) { ResourceManager rm = (ResourceManager)nameToRM.get(bundleName); if (rm == null) { ResourceBundle rb = ResourceBundle.getBundle(bundleName); rm = new ResourceManager(rb); nameToRM.put(bundleName, rm); } return rm; } /** * @param clazz * @return the "AllRB" in the class package */ public static ResourceManager all(Class clazz) { return get(getPackage(clazz) + ".AllRB"); } /** * Gets the default ResourceManager. This is equivalent to * <code>all(ResourceManager.class)</code>. It returns the * ResourceManager named "AllRB" located in the same package * ResourceManager class (i.e com.l2fprod.common.util.AllRB). * * @return the default ResourceManager */ public static ResourceManager common() { return all(ResourceManager.class); } /** * @return the default ResourceManager for ui specific resources. */ public static ResourceManager ui() { return get("com.l2fprod.common.swing.AllRB"); } /** * Resolves any references to a resource bundle contained in * <code>rbAndProperty</code>. To reference a resource bundle * inside a property use <code>${com.package.FileRB:key}</code>, * this will look for <code>key</code> in the ResourceBundle * <code>com.package.FileRB</code>. * * @param rbAndProperty * @return the resolved resource or rbAndProperty if no resource was * found */ public static String resolve(String rbAndProperty) { return common().resolve0(rbAndProperty); } /** * Same as {@link #resolve(String)} but once the value as been * resolved, a MessageFormatter is applied with the given * <code>args</code>. * * @param rbAndProperty * @param args * @return the value for the resource parametrized by args */ public static String resolve(String rbAndProperty, Object[] args) { String value = common().resolve0(rbAndProperty); return MessageFormat.format(value, args); } /** * Can't be directly constructed * * @param bundle */ private ResourceManager(ResourceBundle bundle) { this.bundle = bundle; } /** * Gets the String associated with <code>key</code> after having * resolved any nested keys ({@link #resolve(String)}). * * @param key the key to lookup * @return the String associated with <code>key</code> */ public String getString(String key) { return resolve0(String.valueOf(bundle.getObject(key))); } /** * Gets the String associated with <code>key</code> after having * resolved any nested keys ({@link #resolve(String)}) and applied * a formatter using the given <code>args</code>. * * @param key the key to lookup * @param args the arguments to pass to the formatter * @return the String associated with <code>key</code> */ public String getString(String key, Object[] args) { String value = getString(key); return MessageFormat.format(value, args); } /** * Gets the first character of the String associated with * <code>key</code>. * * @param key the key to lookup * @return the first character of the String associated with * <code>key</code>. */ public char getChar(String key) { String s = getString(key); if (s == null || s.trim().length() == 0) { return (char)0; } else { return s.charAt(0); } } private String resolve0(String property) { String result = property; if (property != null) { int index = property.indexOf("${"); if (index != -1) { int endIndex = property.indexOf("}", index); String sub = property.substring(index + 2, endIndex); // check if sub contains a reference to another RB, key int colon = sub.indexOf(":"); if (colon != -1) { String rbName = sub.substring(0, colon); String keyName = sub.substring(colon + 1); sub = get(rbName).getString(keyName); } else { // it's a regular nested property sub = getString(sub); } result = property.substring(0, index) + sub + resolve0(property.substring(endIndex + 1)); } } return result; } private static String getPackage(Class clazz) { String pck = clazz.getName(); int index = pck.lastIndexOf('.'); if (index != -1) { pck = pck.substring(0, index); } else { pck = ""; } return pck; } }