001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package com.sun.rave.propertyeditors.util;
042:
043: import java.beans.Beans;
044: import java.text.MessageFormat;
045: import java.util.Hashtable;
046: import java.util.Map;
047: import java.util.ResourceBundle;
048:
049: /**
050: * Wraps a java.util.ResourceBundle and utilizes a java.text.MessageFormat for
051: * message formatting.
052: *
053: * @see java.util.ResourceBundle
054: * @see java.text.MessageFormat
055: */
056: public class Bundle {
057:
058: private static MessageFormat mf = new MessageFormat(""); // NOI18N
059: private ResourceBundle rb;
060:
061: protected Bundle() {
062: }
063:
064: /**
065: * If a class loader is not passed in, I will only be able to fetch ResourceBundles that
066: * are reachable from MY class loader. This is due to a bug in ResourceBundle that
067: * goes up the stack only 2 levels in order to find the appropriate class loader.
068: * Since I provide a level of indirection, I will ALWAYS be the callee, and therefore
069: * at the 2nd level.
070: * See source for ResourceBundle.getBundle() ResourceBundle.getLoader().
071: *
072: * @param baseName
073: */
074: public void init(String baseName, ClassLoader classLoader) {
075: rb = ResourceBundle.getBundle(baseName, mf.getLocale(),
076: classLoader);
077: }
078:
079: public String getMessage(String key) {
080:
081: String string = rb.getString(key);
082: return string;
083: }
084:
085: public String getMessage(String key, Object arg1) {
086: return getMessage(key, new Object[] { arg1 });
087: }
088:
089: public String getMessage(String key, Object arg1, Object arg2) {
090: return getMessage(key, new Object[] { arg1, arg2 });
091: }
092:
093: public String getMessage(String key, Object arg1, Object arg2,
094: Object arg3) {
095: return getMessage(key, new Object[] { arg1, arg2, arg3 });
096: }
097:
098: public String getMessage(String key, Object[] args) {
099: return getMessage(key, args, true);
100: }
101:
102: public String getMessage(String key, Object[] args,
103: boolean escapeSingleQuotes) {
104: String pattern = getMessage(key);
105: if (escapeSingleQuotes)
106: pattern = pattern.replaceAll("'", "''"); // NOI18N
107: String message;
108: synchronized (mf) {
109: mf.applyPattern(pattern);
110: message = mf.format(args);
111: }
112: return message;
113: }
114:
115: private static Map bundleMap = new Hashtable();
116:
117: public static Bundle getBundle(Class c) {
118:
119: return getBundle(c, null);
120: }
121:
122: /**
123: * Return the component bundle found in class c's package.
124: * The name of the bundle file is Bundle.properties. If suffix
125: * is not null and not empty, then the bundle file will be
126: * Bundle-<suffix>.properties.
127: *
128: * @param c caller's class
129: * @param suffix
130: * @return the resoruce bundle
131: */
132: public static Bundle getBundle(Class c, String suffix) {
133:
134: String className = c.getName();
135: int lastDotIndex = className.lastIndexOf('.');
136: String packageName = ""; // NOI18N
137: if (lastDotIndex > -1) {
138: packageName = className.substring(0, lastDotIndex + 1);
139: }
140: String baseName = packageName + "Bundle"; // NOI18N
141: if (suffix != null && suffix.length() > 0) {
142: baseName += suffix;
143: }
144: Bundle cb = (Bundle) bundleMap.get(baseName);
145: if (cb == null) {
146: cb = new Bundle();
147: cb.init(baseName, c.getClassLoader());
148: bundleMap.put(baseName, cb);
149: }
150: return cb;
151: }
152: }
|