blob: 60dd7c3b72de66bb1689e7ea9e18c6c8a100be93 [file] [log] [blame]
/*
* 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;
}
}