001: /*
002: * ====================================================================
003: * JAFFA - Java Application Framework For All
004: *
005: * Copyright (C) 2002 JAFFA Development Group
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation; either
010: * version 2.1 of the License, or (at your option) any later version.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this library; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: *
021: * Redistribution and use of this software and associated documentation ("Software"),
022: * with or without modification, are permitted provided that the following conditions are met:
023: * 1. Redistributions of source code must retain copyright statements and notices.
024: * Redistributions must also contain a copy of this document.
025: * 2. Redistributions in binary form must reproduce the above copyright notice,
026: * this list of conditions and the following disclaimer in the documentation
027: * and/or other materials provided with the distribution.
028: * 3. The name "JAFFA" must not be used to endorse or promote products derived from
029: * this Software without prior written permission. For written permission,
030: * please contact mail to: jaffagroup@yahoo.com.
031: * 4. Products derived from this Software may not be called "JAFFA" nor may "JAFFA"
032: * appear in their names without prior written permission.
033: * 5. Due credit should be given to the JAFFA Project (http://jaffa.sourceforge.net).
034: *
035: * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
036: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
037: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
038: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
039: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
040: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
041: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
042: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
043: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
044: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
045: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
046: * SUCH DAMAGE.
047: * ====================================================================
048: */
049:
050: package org.jaffa.util;
051:
052: import java.util.HashMap;
053: import java.util.Map;
054: import org.apache.struts.util.MessageResources;
055: import org.apache.struts.util.MessageResourcesFactory;
056: import org.jaffa.config.Config;
057:
058: /**
059: * Factory for PropertyMessageResources instances. The
060: * configuration paramter for such instances is the base Java package
061: * name of the resources entries from which our keys and values will be
062: * loaded.
063: *
064: * This class is based on the struts class org.apache.struts.util.PropertyMessageResourcesFactory
065: * It creates instances of org.jaffa.util.PropertyMessageResources, which loads the properties file using File I/O and supports the flushing of the message-resource cache.
066: * Only one PropertyMessageResourcesFactory instance will be created per config.
067: * @author GautamJ
068: */
069: public class PropertyMessageResourcesFactory extends
070: MessageResourcesFactory {
071:
072: /** This Map will ensure that only one instance of the MessageResources is instantiated per config.
073: * It will contain config/MessageResources pairs.
074: */
075: private static Map c_messageResourcesMap = new HashMap();
076:
077: /** This static field will maintain a reference to the default MessageResources instance, which will point to the ResourceBundle as specified in the framework.properties file. */
078: private static MessageResources c_defaultMessageResources = null;
079:
080: /** This static block will instantiate the default MessageResources object. */
081: static {
082: String config = (String) Config.getProperty(
083: Config.PROP_MESSAGE_RESOURCES_BUNDLE, null);
084: if (config != null)
085: c_defaultMessageResources = new PropertyMessageResourcesFactory()
086: .createResources(config);
087: }
088:
089: /** Create and return a newly instansiated MessageResources.
090: * This method must be implemented by concrete subclasses.
091: * It'll ensure that only one instance of the MessageResources is instantiated per config.
092: *
093: * @param config Configuration parameter(s) for the requested bundle
094: * @return a newly instansiated MessageResources.
095: */
096: public MessageResources createResources(String config) {
097: MessageResources messageResources = (MessageResources) c_messageResourcesMap
098: .get(config);
099: if (messageResources == null)
100: messageResources = instantiateMessageResources(config);
101: return messageResources;
102: }
103:
104: /** Returns a reference to the default MessageResources instance, which will point to the ResourceBundle as specified in the 'framework.messageResources.bundle' property of framework.properties file.
105: * A null will be returned in case an invalid or if no ResourceBundle is specified in the 'framework.messageResources.bundle' property of framework.properties file.
106: * @return the default MessageResources instance.
107: */
108: public static MessageResources getDefaultMessageResources() {
109: return c_defaultMessageResources;
110: }
111:
112: /** Creates an instance of PropertyMessageResources with the proper synchronized setting. */
113: private MessageResources instantiateMessageResources(String config) {
114: synchronized (c_messageResourcesMap) {
115: MessageResources messageResources = (MessageResources) c_messageResourcesMap
116: .get(config);
117: if (messageResources == null) {
118: messageResources = new PropertyMessageResources(this,
119: config, this.returnNull);
120: c_messageResourcesMap.put(config, messageResources);
121: }
122: return messageResources;
123: }
124: }
125: }
|