| /* |
| * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code 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 General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| /* |
| * Licensed Materials - Property of IBM |
| * 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997,1998 |
| * RMI-IIOP v1.0 |
| * |
| * Defect History |
| * |
| * #26964 LKR 11/25/96 \u0020 at end-of-message not handled properly by Java. |
| * #31840 LKR 06/05/97 Replace \n in templates with Java's line separator. |
| * |
| */ |
| |
| package com.sun.tools.corba.se.idl.som.cff; |
| |
| import java.io.IOException; |
| import java.util.Enumeration; |
| import java.util.Properties; |
| import java.lang.String; |
| import java.lang.System; |
| |
| /** |
| * This class provides messaging services for accessing, and merging |
| * parameters into, translatable message text. The text is presumed |
| * to reside in a .properties file. A "cff.properties" file that |
| * contains all of the message text needed for the CFF framework itself |
| * is loaded during class initialization. All of the messages in the |
| * cff.properties file that are needed by the CFF framework contain keys |
| * that begin with the string "cff.". |
| * <p> |
| * The static method Messages.msgLoad may be used to merge additional |
| * message text .properties files needed by other frameworks or user |
| * programs. |
| * |
| * @see com.sun.tools.corba.se.idl.som.cff.Messages#msgLoad |
| * |
| * @author Larry K. Raper |
| */ |
| |
| public abstract class Messages { |
| |
| /* Class variables */ |
| |
| |
| /* Metasymbol for leading or trailing blank */ |
| private static final String LTB = "%B"; |
| /* Metasymbol for line separator */ |
| private static final char NL = '\n'; |
| |
| private static final String lineSeparator = |
| System.getProperty ("line.separator"); |
| |
| private static final Properties m = new Properties (); |
| private static boolean loadNeeded = true; |
| |
| /* Class methods for message loading and formatting */ |
| |
| private static final synchronized void loadDefaultProperties () { |
| |
| if (!loadNeeded) |
| return; |
| try { |
| m.load (FileLocator.locateLocaleSpecificFileInClassPath ( |
| "com/sun/tools/corba/se/idl/som/cff/cff.properties")); |
| } catch (IOException ioe) { } |
| fixMessages (m); /* #26964 Replace any metasymbols */ |
| loadNeeded = false; |
| |
| } |
| |
| /** |
| * This method was introduced to fix defect #26964. For Java 1.0.2 |
| * on Win NT, the escape sequence \u0020 was not being handled |
| * correctly by the Java Properties class when it was the final |
| * character of a line. Instead the trailing blank was dropped |
| * and the next line was swallowed as a continuation. To work |
| * around the problem, we introduced our own metasymbol to represent |
| * a trailing blank. Hence: |
| * |
| * Performs substitution for any metasymbols in the message |
| * templates. So far only %B is needed. This was introduced |
| * to make it more convenient for .properties files to |
| * contain message templates with leading or trailing blanks |
| * (although %B may actually occur anywhere in a template). |
| * Subsequently, checking for '\n' has also been added. Now, |
| * wherever '\n' occurs in a message template, it is replaced |
| * with the value of System.getProperty ("line.separator"). |
| */ |
| private static final void fixMessages (Properties p) { |
| |
| Enumeration keys = p.keys (); |
| Enumeration elems = p.elements (); |
| while (keys.hasMoreElements ()) { |
| String key = (String) keys.nextElement (); |
| String elem = (String) elems.nextElement (); |
| int i = elem.indexOf (LTB); |
| boolean changed = false; |
| while (i != -1) { |
| if (i == 0) |
| elem = " " + elem.substring (2); |
| else |
| elem = elem.substring (0, i) + " " + elem.substring (i+2); |
| changed = true; |
| i = elem.indexOf (LTB); |
| } |
| int lsIncr = lineSeparator.length () - 1; |
| for (i=0; i<elem.length (); i++) { |
| if (elem.charAt (i) == NL) { |
| elem = elem.substring (0, i) + |
| lineSeparator + elem.substring (i+1); |
| i += lsIncr; |
| changed = true; |
| } |
| } |
| if (changed) |
| p.put (key, elem); |
| } |
| |
| } |
| |
| /** |
| * Loads additional message keys and text found in the passed |
| * properties file. The specified properties file is assumed to |
| * reside in the CLASSPATH. An IOException is thrown if the loading fails. |
| */ |
| public static final synchronized void msgLoad (String propertyFileName) |
| throws IOException { |
| |
| m.load (FileLocator.locateLocaleSpecificFileInClassPath ( |
| propertyFileName)); |
| fixMessages (m); /* #26964 Replace any metasymbols */ |
| loadNeeded = false; |
| |
| } |
| |
| /** |
| * Returns the message text corresponding to the passed msgkey |
| * string. If the msgkey cannot be found, its value is returned |
| * as the output message text. |
| */ |
| public static final String msg (String msgkey) { |
| |
| if (loadNeeded) |
| loadDefaultProperties (); |
| String msgtext = m.getProperty (msgkey, msgkey); |
| return msgtext; |
| |
| } |
| |
| /** |
| * Returns the message text corresponding to the passed msgkey |
| * string. The message text is assumed to require the insertion |
| * of a single argument, supplied by the "parm" parameter. |
| * If the message text does not contain the meta characters "%1" |
| * that indicate where to place the argument, the passed argument |
| * is appended at the end of the message text. |
| * <p> |
| * If the msgkey cannot be found, its value is used as the |
| * message text. |
| */ |
| public static final String msg (String msgkey, String parm) { |
| |
| if (loadNeeded) |
| loadDefaultProperties (); |
| String msgtext = m.getProperty (msgkey, msgkey); |
| int i = msgtext.indexOf ("%1"); |
| if (i >= 0) { |
| String ending = ""; |
| if ((i+2) < msgtext.length ()) |
| ending = msgtext.substring (i+2); |
| return msgtext.substring (0, i) + parm + ending; |
| } else |
| msgtext += " " + parm; |
| return msgtext; |
| |
| } |
| |
| /** |
| * Returns the message text corresponding to the passed msgkey |
| * string. The message text is assumed to require the insertion |
| * of a single argument, supplied by the "parm" parameter. |
| * If the message text does not contain the meta characters "%1" |
| * that indicate where to place the argument, the passed argument |
| * is appended at the end of the message text. |
| * <p> |
| * If the msgkey cannot be found, its value is used as the |
| * message text. |
| */ |
| public static final String msg (String msgkey, int parm) { |
| |
| return msg (msgkey, String.valueOf (parm)); |
| |
| } |
| |
| /** |
| * Returns the message text corresponding to the passed msgkey |
| * string. The message text is assumed to require the insertion |
| * of two arguments, supplied by the "parm1" and "parm2" parameters. |
| * If the message text does not contain the meta characters "%1" and |
| * "%2" that indicate where to place the arguments, the passed arguments |
| * are appended at the end of the message text. |
| * <p> |
| * If the msgkey cannot be found, its value is used as the |
| * message text. |
| */ |
| public static final String msg (String msgkey, String parm1, String parm2) { |
| |
| if (loadNeeded) |
| loadDefaultProperties (); |
| String result = m.getProperty (msgkey, msgkey); |
| String ending = ""; |
| int i = result.indexOf ("%1"); |
| if (i >= 0) { |
| if ((i+2) < result.length ()) |
| ending = result.substring (i+2); |
| result = result.substring (0, i) + parm1 + ending; |
| } else |
| result += " " + parm1; |
| i = result.indexOf ("%2"); |
| if (i >= 0) { |
| ending = ""; |
| if ((i+2) < result.length ()) |
| ending = result.substring (i+2); |
| result = result.substring (0, i) + parm2 + ending; |
| } else |
| result += " " + parm2; |
| return result; |
| |
| } |
| |
| /** |
| * Returns the message text corresponding to the passed msgkey |
| * string. The message text is assumed to require the insertion |
| * of two arguments, supplied by the "parm1" and "parm2" parameters. |
| * If the message text does not contain the meta characters "%1" and |
| * "%2" that indicate where to place the arguments, the passed arguments |
| * are appended at the end of the message text. |
| * <p> |
| * If the msgkey cannot be found, its value is used as the |
| * message text. |
| */ |
| public static final String msg (String msgkey, int parm1, String parm2) { |
| |
| return msg (msgkey, String.valueOf (parm1), parm2); |
| |
| } |
| |
| /** |
| * Returns the message text corresponding to the passed msgkey |
| * string. The message text is assumed to require the insertion |
| * of two arguments, supplied by the "parm1" and "parm2" parameters. |
| * If the message text does not contain the meta characters "%1" and |
| * "%2" that indicate where to place the arguments, the passed arguments |
| * are appended at the end of the message text. |
| * <p> |
| * If the msgkey cannot be found, its value is used as the |
| * message text. |
| */ |
| public static final String msg (String msgkey, String parm1, int parm2) { |
| |
| return msg (msgkey, parm1, String.valueOf (parm2)); |
| |
| } |
| |
| /** |
| * Returns the message text corresponding to the passed msgkey |
| * string. The message text is assumed to require the insertion |
| * of two arguments, supplied by the "parm1" and "parm2" parameters. |
| * If the message text does not contain the meta characters "%1" and |
| * "%2" that indicate where to place the arguments, the passed arguments |
| * are appended at the end of the message text. |
| * <p> |
| * If the msgkey cannot be found, its value is used as the |
| * message text. |
| */ |
| public static final String msg (String msgkey, int parm1, int parm2) { |
| |
| return msg (msgkey, String.valueOf (parm1), String.valueOf (parm2)); |
| |
| } |
| |
| |
| /** |
| * Returns the message text corresponding to the passed msgkey |
| * string. The message text is assumed to require the insertion |
| * of three arguments, supplied by the "parm1", "parm2" and "parm3" |
| * parameters. |
| * If the message text does not contain the meta characters "%1" and |
| * "%2" that indicate where to place the arguments, the passed arguments |
| * are appended at the end of the message text. |
| * <p> |
| * If the msgkey cannot be found, its value is used as the |
| * message text. |
| */ |
| public static final String msg (String msgkey, String parm1, |
| String parm2, String parm3) { |
| if (loadNeeded) |
| loadDefaultProperties (); |
| String result = m.getProperty (msgkey, msgkey); |
| result = substituteString(result, 1, parm1); |
| result = substituteString(result, 2, parm2); |
| result = substituteString(result, 3, parm3); |
| |
| return result; |
| } |
| |
| /* helper function for string substition. |
| @return the substituted string, it substitution is possible. |
| Otherwise, return a new string with subst at the end. |
| @orig: original string |
| @paramNum the parameter number to search. For example, |
| paramNam == 1 means search for "%1". |
| @subst: string for the substitution. |
| */ |
| private static String substituteString(String orig, int paramNum, |
| String subst){ |
| String result = orig; |
| String paramSubst = "%"+ paramNum; |
| int len = paramSubst.length(); |
| int index = result.indexOf (paramSubst); |
| String ending = ""; |
| if (index >= 0) { |
| if ((index+len) < result.length ()) |
| ending = result.substring (index+len); |
| result = result.substring (0, index) + subst + ending; |
| } |
| else result += " " + subst; |
| |
| return result; |
| } |
| |
| |
| } |