001: // jTDS JDBC Driver for Microsoft SQL Server and Sybase
002: // Copyright (C) 2004 The jTDS Project
003: //
004: // This library is free software; you can redistribute it and/or
005: // modify it under the terms of the GNU Lesser General Public
006: // License as published by the Free Software Foundation; either
007: // version 2.1 of the License, or (at your option) any later version.
008: //
009: // This library is distributed in the hope that it will be useful,
010: // but WITHOUT ANY WARRANTY; without even the implied warranty of
011: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: // Lesser General Public License for more details.
013: //
014: // You should have received a copy of the GNU Lesser General Public
015: // License along with this library; if not, write to the Free Software
016: // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: //
018: package net.sourceforge.jtds.jdbc;
019:
020: import java.text.MessageFormat;
021: import java.util.Enumeration;
022: import java.util.Map;
023: import java.util.ResourceBundle;
024:
025: /**
026: * Support class for <code>Messages.properties</code>.
027: *
028: * @author David D. Kilzer
029: * @author Mike Hutchinson
030: * @version $Id: Messages.java,v 1.8 2005/04/20 16:49:22 alin_sinpalean Exp $
031: */
032: public final class Messages {
033:
034: /**
035: * Default name for resource bundle containing the messages.
036: */
037: private static final String DEFAULT_RESOURCE = "net.sourceforge.jtds.jdbc.Messages";
038:
039: /**
040: * Cached resource bundle containing the messages.
041: * <p>
042: * <code>ResourceBundle</code> does caching internally but this caching
043: * involves a lot of string operations to generate the keys used for
044: * caching, leading to a lot of <code>StringBuffer</code> reallocation. In
045: * one run through the complete jTDS test suite there were over 60000
046: * allocations and reallocations (about one for each <code>get()</code>
047: * call).
048: */
049: private static ResourceBundle defaultResource;
050:
051: /**
052: * Default constructor. Private to prevent instantiation.
053: */
054: private Messages() {
055: }
056:
057: /**
058: * Get runtime message using supplied key.
059: *
060: * @param key The key of the message in Messages.properties
061: * @return The selected message as a <code>String</code>.
062: */
063: public static String get(String key) {
064: return get(key, null);
065: }
066:
067: /**
068: * Get runtime message using supplied key and substitute parameter
069: * into message.
070: *
071: * @param key The key of the message in Messages.properties
072: * @param param1 The object to insert into message.
073: * @return The selected message as a <code>String</code>.
074: */
075: public static String get(String key, Object param1) {
076: Object args[] = { param1 };
077: return get(key, args);
078: }
079:
080: /**
081: * Get runtime message using supplied key and substitute parameters
082: * into message.
083: *
084: * @param key The key of the message in Messages.properties
085: * @param param1 The object to insert into message.
086: * @param param2 The object to insert into message.
087: * @return The selected message as a <code>String</code>.
088: */
089: static String get(String key, Object param1, Object param2) {
090: Object args[] = { param1, param2 };
091: return get(key, args);
092: }
093:
094: /**
095: * Get runtime error using supplied key and substitute parameters
096: * into message.
097: *
098: * @param key The key of the error message in Messages.properties
099: * @param arguments The objects to insert into the message.
100: * @return The selected error message as a <code>String</code>.
101: */
102: private static String get(String key, Object[] arguments) {
103: try {
104: ResourceBundle bundle = loadResourceBundle();
105: String formatString = bundle.getString(key);
106: // No need for any formatting if no parameters are specified
107: if (arguments == null || arguments.length == 0) {
108: return formatString;
109: } else {
110: MessageFormat formatter = new MessageFormat(
111: formatString);
112: return formatter.format(arguments);
113: }
114: } catch (java.util.MissingResourceException mre) {
115: throw new RuntimeException(
116: "No message resource found for message property "
117: + key);
118: }
119: }
120:
121: /**
122: * Retrieve the list of driver property names and driver property
123: * descriptions from <code>Messages.properties</code> and populate
124: * them into {@link Map} objects.
125: * <p/>
126: * The keys used to populate both <code>propertyMap</code> and
127: * <code>descriptionMap</code> are guaranteed to match up as long
128: * as the properties defined in <code>Messages.properties</code>
129: * are well-formed.
130: *
131: * @param propertyMap The map of property names to be populated.
132: * @param descriptionMap The map of property descriptions to be populated.
133: */
134: static void loadDriverProperties(Map propertyMap, Map descriptionMap) {
135: final ResourceBundle bundle = loadResourceBundle();
136: final Enumeration keys = bundle.getKeys();
137: while (keys.hasMoreElements()) {
138: final String key = (String) keys.nextElement();
139: final String descriptionPrefix = "prop.desc.";
140: final String propertyPrefix = "prop.";
141: if (key.startsWith(descriptionPrefix)) {
142: descriptionMap.put(key.substring(descriptionPrefix
143: .length()), bundle.getString(key));
144: } else if (key.startsWith(propertyPrefix)) {
145: propertyMap.put(key.substring(propertyPrefix.length()),
146: bundle.getString(key));
147: }
148: }
149: }
150:
151: /**
152: * Load the {@link #DEFAULT_RESOURCE} resource bundle.
153: *
154: * @return The resource bundle.
155: */
156: private static ResourceBundle loadResourceBundle() {
157: if (defaultResource == null) {
158: defaultResource = ResourceBundle
159: .getBundle(DEFAULT_RESOURCE);
160: }
161: return defaultResource;
162: }
163:
164: }
|