1 /* 2 * Copyright 2006 Assaf Arkin, Ralf Joachim 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 * 16 * $Id: Messages.java 6907 2007-03-28 21:24:52Z rjoachim $ 17 */ 18 package org.castor.core.util; 19 20 import java.text.MessageFormat; 21 import java.util.Enumeration; 22 import java.util.Hashtable; 23 import java.util.Locale; 24 import java.util.MissingResourceException; 25 import java.util.ResourceBundle; 26 27 import org.apache.commons.logging.Log; 28 import org.apache.commons.logging.LogFactory; 29 30 /** 31 * I18N message formatting class. A static factory for obtaining 32 * messages and formatting messages with arguments. 33 * <p> 34 * The resource file <tt>org.exolab.castor.util.resources.messages</tt> 35 * contains a list of all the messages in English. Additional resource 36 * files can be added for other languages and locales by placing them 37 * in the same package with a language/locale prefix. See the I18N 38 * documentation and use of resource bundles in the JDK docs. 39 * 40 * @author <a href="mailto:arkin AT intalio DOT com">Assaf Arkin</a> 41 * @author <a href="mailto:ralf DOT joachim AT syscon DOT eu">Ralf Joachim</a> 42 * @version $Revision: 6907 $ $Date: 2006-04-10 16:39:24 -0600 (Mon, 10 Apr 2006) $ 43 * @since 1.0.1 44 */ 45 public final class Messages { 46 //-------------------------------------------------------------------------- 47 48 /** The <a href="http://jakarta.apache.org/commons/logging/">Jakarta Commons 49 * Logging </a> instance used for all logging. */ 50 private static final Log LOG = LogFactory.getLog(Messages.class); 51 52 /** The name of the resource holding all the messages in the English 53 * language. Resources for other languages and locales use the same 54 * name with a language/locale prefix. */ 55 public static final String RESOURCE_NAME = "org.castor.messages"; 56 57 /** The resource bundle holds all the messages. */ 58 private static ResourceBundle _messages; 59 60 /** Once a format has been created once, it is cached here. */ 61 private static Hashtable _formats; 62 //-------------------------------------------------------------------------- 63 64 static { setDefaultLocale(); } 65 66 //-------------------------------------------------------------------------- 67 68 /** 69 * Set the default locale to use for loading messages. Calling this method 70 * will reload all the messages based on the new locale name. 71 */ 72 public static void setDefaultLocale() { 73 setLocale(Locale.getDefault()); 74 } 75 76 /** 77 * Set the locale to use for loading messages. Calling this method 78 * will reload all the messages based on the new locale name. 79 * 80 * @param locale the locale for which a resource bundle is desired. 81 */ 82 public static void setLocale(final Locale locale) { 83 try { 84 _messages = ResourceBundle.getBundle(RESOURCE_NAME, locale); 85 } catch (Exception except) { 86 _messages = new EmptyResourceBundle(); 87 LOG.error("Failed to locate messages resource " + RESOURCE_NAME); 88 } 89 _formats = new Hashtable(); 90 } 91 92 /** 93 * Format the named message using a single argument and return the 94 * full message text. 95 * 96 * @param message The message name 97 * @param arg1 The first argument 98 * @return The full message text 99 */ 100 public static String format(final String message, final Object arg1) { 101 return format(message, new Object[] {arg1}); 102 } 103 104 /** 105 * Format the named message using two argument and return the 106 * full message text. 107 * 108 * @param message The message name 109 * @param arg1 The first argument 110 * @param arg2 The second argument 111 * @return The full message text 112 */ 113 public static String format(final String message, 114 final Object arg1, final Object arg2) { 115 return format(message, new Object[] {arg1, arg2}); 116 } 117 118 /** 119 * Format the named message using three argument and return the 120 * full message text. 121 * 122 * @param message The message name 123 * @param arg1 The first argument 124 * @param arg2 The second argument 125 * @param arg3 The third argument 126 * @return The full message text 127 */ 128 public static String format(final String message, 129 final Object arg1, final Object arg2, final Object arg3) { 130 return format(message, new Object[] {arg1, arg2, arg3}); 131 } 132 133 /** 134 * Format the named message using any number of arguments and return the 135 * full message text. 136 * 137 * @param message The message name 138 * @param args Argument list 139 * @return The full message text 140 */ 141 public static String format(final String message, final Object[] args) { 142 143 try { 144 MessageFormat mf = (MessageFormat) _formats.get(message); 145 if (mf == null) { 146 String msg; 147 try { 148 msg = _messages.getString(message); 149 } catch (MissingResourceException except) { 150 return message; 151 } 152 mf = new MessageFormat(msg); 153 _formats.put(message, mf); 154 } 155 return mf.format(args); 156 } catch (Exception except) { 157 return "An internal error occured while processing message " + message; 158 } 159 } 160 161 /** 162 * Return the text of the named message without formatting. 163 * 164 * @param message The message name 165 * @return The full message text 166 */ 167 public static String message(final String message) { 168 try { 169 return _messages.getString(message); 170 } catch (MissingResourceException except) { 171 return message; 172 } 173 } 174 175 //-------------------------------------------------------------------------- 176 177 /** 178 * Hide default constructor of utility class. 179 */ 180 private Messages() { } 181 182 //-------------------------------------------------------------------------- 183 184 /** 185 * A empty resource bundle. 186 */ 187 private static class EmptyResourceBundle 188 extends ResourceBundle implements Enumeration { 189 /** 190 * {@inheritDoc} 191 * @see java.util.ResourceBundle#getKeys() 192 */ 193 public Enumeration getKeys() { 194 return this; 195 } 196 197 /** 198 * {@inheritDoc} 199 * @see java.util.ResourceBundle#handleGetObject(java.lang.String) 200 */ 201 protected Object handleGetObject(final String name) { 202 return "[Missing message " + name + "]"; 203 } 204 205 /** 206 * {@inheritDoc} 207 * @see java.util.Enumeration#hasMoreElements() 208 */ 209 public boolean hasMoreElements() { 210 return false; 211 } 212 213 /** 214 * {@inheritDoc} 215 * @see java.util.Enumeration#nextElement() 216 */ 217 public Object nextElement() { 218 return null; 219 } 220 } 221 222 //-------------------------------------------------------------------------- 223 }