1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 /* 19 * THE FILE HAS BEEN AUTOGENERATED BY MSGTOOL TOOL. 20 * All changes made to this file manually will be overwritten 21 * if this tool runs again. Better make changes in the template file. 22 * - Shamelessly taken from Apache Harmony. 23 */ 24 25 package org.apache.river.impl; 26 27 28 import java.security.AccessController; 29 import java.security.PrivilegedAction; 30 import java.util.Locale; 31 import java.util.MissingResourceException; 32 import java.util.ResourceBundle; 33 34 35 36 /** 37 * This class retrieves strings from a resource bundle and returns them, 38 * formatting them with MessageFormat when required. 39 * <p> 40 * It is used by the system classes to provide national language support, by 41 * looking up messages in the <code> 42 * org.apache.harmony.security.internal.nls.messages 43 * </code> 44 * resource bundle. Note that if this file is not available, or an invalid key 45 * is looked up, or resource bundle support is not available, the key itself 46 * will be returned as the associated message. This means that the <em>KEY</em> 47 * should a reasonable human-readable (english) string. 48 * @since 3.0.0 49 */ 50 public class Messages { 51 52 // ResourceBundle holding the system messages. 53 static final private ResourceBundle bundle ; 54 55 static { 56 // Attempt to load the messages. 57 ResourceBundle rb = null; 58 try { 59 rb = setLocale(Locale.getDefault(), 60 "org.apache.river.impl.messages"); //$NON-NLS-1$ 61 } catch (Throwable e) { 62 System.err.println(e); 63 } 64 bundle = rb; 65 } 66 67 /** 68 * Retrieves a message which has no arguments. 69 * 70 * @param msg 71 * String the key to look up. 72 * @return String the message for that key in the system message bundle. 73 */ 74 static public String getString(String msg) { 75 if (bundle == null) { 76 return msg; 77 } 78 try { 79 return bundle.getString(msg); 80 } catch (MissingResourceException e) { 81 return "Missing message: " + msg; //$NON-NLS-1$ 82 } 83 } 84 85 /** 86 * Retrieves a message which takes 1 argument. 87 * 88 * @param msg 89 * String the key to look up. 90 * @param arg 91 * Object the object to insert in the formatted output. 92 * @return String the message for that key in the system message bundle. 93 */ 94 static public String getString(String msg, Object arg) { 95 return getString(msg, new Object[] { arg }); 96 } 97 98 /** 99 * Retrieves a message which takes 1 integer argument. 100 * 101 * @param msg 102 * String the key to look up. 103 * @param arg 104 * int the integer to insert in the formatted output. 105 * @return String the message for that key in the system message bundle. 106 */ 107 static public String getString(String msg, int arg) { 108 return getString(msg, new Object[] { Integer.toString(arg) }); 109 } 110 111 /** 112 * Retrieves a message which takes 1 character argument. 113 * 114 * @param msg 115 * String the key to look up. 116 * @param arg 117 * char the character to insert in the formatted output. 118 * @return String the message for that key in the system message bundle. 119 */ 120 static public String getString(String msg, char arg) { 121 return getString(msg, new Object[] { String.valueOf(arg) }); 122 } 123 124 /** 125 * Retrieves a message which takes 2 arguments. 126 * 127 * @param msg 128 * String the key to look up. 129 * @param arg1 130 * Object an object to insert in the formatted output. 131 * @param arg2 132 * Object another object to insert in the formatted output. 133 * @return String the message for that key in the system message bundle. 134 */ 135 static public String getString(String msg, Object arg1, Object arg2) { 136 return getString(msg, new Object[] { arg1, arg2 }); 137 } 138 139 /** 140 * Retrieves a message which takes several arguments. 141 * 142 * @param msg 143 * String the key to look up. 144 * @param args 145 * Object[] the objects to insert in the formatted output. 146 * @return String the message for that key in the system message bundle. 147 */ 148 static public String getString(String msg, Object[] args) { 149 String format = msg; 150 151 if (bundle != null) { 152 try { 153 format = bundle.getString(msg); 154 } catch (MissingResourceException e) { 155 System.err.println(e); 156 } 157 } 158 159 return format(format, args); 160 } 161 162 /** 163 * Generates a formatted text string given a source string containing 164 * "argument markers" of the form "{argNum}" where each argNum must be in 165 * the range 0..9. The result is generated by inserting the toString of each 166 * argument into the position indicated in the string. 167 * <p> 168 * To insert the "{" character into the output, use a single backslash 169 * character to escape it (i.e. "\{"). The "}" character does not need to be 170 * escaped. 171 * 172 * @param format 173 * String the format to use when printing. 174 * @param args 175 * Object[] the arguments to use. 176 * @return String the formatted message. 177 */ 178 public static String format(String format, Object[] args) { 179 StringBuilder answer = new StringBuilder(format.length() 180 + (args.length * 20)); 181 String[] argStrings = new String[args.length]; 182 for (int i = 0; i < args.length; ++i) { 183 if (args[i] == null) { 184 argStrings[i] = "<null>"; 185 } //$NON-NLS-1$ 186 else { 187 argStrings[i] = args[i].toString(); 188 } 189 } 190 int lastI = 0; 191 for (int i = format.indexOf('{', 0); i >= 0; i = format.indexOf('{', 192 lastI)) { 193 if (i != 0 && format.charAt(i - 1) == '\\') { 194 // It's escaped, just print and loop. 195 if (i != 1) { 196 answer.append(format.substring(lastI, i - 1)); 197 } 198 answer.append('{'); 199 lastI = i + 1; 200 } else { 201 // It's a format character. 202 if (i > format.length() - 3) { 203 // Bad format, just print and loop. 204 answer.append(format.substring(lastI, format.length())); 205 lastI = format.length(); 206 } else { 207 int argnum = (byte) Character.digit(format.charAt(i + 1), 208 10); 209 if (argnum < 0 || format.charAt(i + 2) != '}') { 210 // Bad format, just print and loop. 211 answer.append(format.substring(lastI, i + 1)); 212 lastI = i + 1; 213 } else { 214 // Got a good one! 215 answer.append(format.substring(lastI, i)); 216 if (argnum >= argStrings.length) { 217 answer.append("<missing argument>"); 218 } //$NON-NLS-1$ 219 else { 220 answer.append(argStrings[argnum]); 221 } 222 lastI = i + 3; 223 } 224 } 225 } 226 } 227 if (lastI < format.length()) { 228 answer.append(format.substring(lastI, format.length())); 229 } 230 return answer.toString(); 231 } 232 233 /** 234 * Changes the locale of the messages. 235 * 236 * @param locale 237 * Locale the locale to change to. 238 */ 239 static public ResourceBundle setLocale(final Locale locale, 240 final String resource) { 241 try { 242 final ClassLoader loader = null; 243 return (ResourceBundle) AccessController 244 .doPrivileged(new PrivilegedAction<Object>() { 245 public Object run() { 246 return ResourceBundle.getBundle(resource, locale, 247 loader != null ? loader : ClassLoader.getSystemClassLoader()); 248 } 249 }); 250 } catch (MissingResourceException e) { 251 System.err.println(e); 252 } 253 return null; 254 } 255 256 257 }