001    /*
002     * Copyright 2003-2005 The Apache Software Foundation
003     * Copyright 2005 Stephen McConnell
004     *
005     * Licensed under the Apache License, Version 2.0 (the "License");
006     * you may not use this file except in compliance with the License.
007     * You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package net.dpml.cli.resource;
018    
019    import java.text.MessageFormat;
020    
021    import java.util.Locale;
022    import java.util.MissingResourceException;
023    import java.util.ResourceBundle;
024    
025    /**
026     * A utility class used to provide internationalisation support.
027     *
028     * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
029     * @version 1.0.0
030     */
031    public final class ResourceHelper
032    {
033        /** system property */
034        private static final String PROP_LOCALE = "net.dpml.cli.resource.bundle";
035    
036        /** default package name */
037        private static final String DEFAULT_BUNDLE =
038            "net.dpml.cli.resource.CLIMessageBundle_en_US";
039            
040        private static ResourceHelper m_HELPER;
041    
042        /** resource bundle */
043        private ResourceBundle m_bundle;
044    
045        private String m_prop;
046        
047        /**
048         * Create a new ResourceHelper for the specified class.
049         */
050        private ResourceHelper() 
051        {
052            String bundleName = System.getProperty( PROP_LOCALE );
053    
054            if( bundleName == null )
055            {
056                bundleName = DEFAULT_BUNDLE;
057            }
058    
059            m_prop = bundleName;
060            
061            int firstUnderscore = bundleName.indexOf( '_' );
062            int secondUnderscore = bundleName.indexOf( '_', firstUnderscore + 1 );
063    
064            Locale locale;
065            if( firstUnderscore != -1 )
066            { 
067                String language = bundleName.substring( firstUnderscore + 1, secondUnderscore );
068                String country = bundleName.substring( secondUnderscore + 1 );
069                locale = new Locale( language, country );
070            }
071            else 
072            {
073                locale = Locale.getDefault();
074            }
075            // initialize the bundle
076            try 
077            {
078                m_bundle = ResourceBundle.getBundle( bundleName, locale );
079            } 
080            catch( MissingResourceException exp )
081            {
082                m_bundle = ResourceBundle.getBundle( DEFAULT_BUNDLE, locale );
083            }
084        }
085    
086       /**
087        * Return the resource bundle name.
088        * @return the name
089        */
090        public String getBundleName()
091        {
092            return m_prop;
093        }
094        
095        /**
096         * Gets the ResourceHelper appropriate to the specified class.
097         * @return a ResourceHelper
098         */
099        public static ResourceHelper getResourceHelper()
100        {
101            String bundleName = System.getProperty( PROP_LOCALE );
102            if( m_HELPER == null || !m_HELPER.getBundleName().equals( bundleName ) )
103            {
104                m_HELPER = new ResourceHelper();
105            }
106            return m_HELPER;
107        }
108    
109        /**
110         * Returns the message for the specified key.
111         *
112         * @param key the unique identifier of the message
113         * @return String the formatted String
114         */
115        public String getMessage( final String key )
116        {
117            return getMessage( key, new Object[0] );
118        }
119    
120        /**
121         * Returns the message for the specified key and argument.
122         *
123         * @param key the unique identifier of the message
124         * @param value the argument value
125         * @return String the formatted String
126         */
127        public String getMessage( final String key, final Object value )
128        {
129            return getMessage( key, new Object[]{value} );
130        }
131    
132        /**
133         * Returns the message for the specified key and arguments.
134         *
135         * @param key the unique identifier of the message
136         * @param value1 an argument value
137         * @param value2 an argument value
138         * @return String the formatted String
139         */
140        public String getMessage(
141          final String key, final Object value1, final Object value2 )
142        {
143            return getMessage( key, new Object[]{value1, value2} );
144        }
145    
146        /**
147         * Returns the message for the specified key and arguments.
148         *
149         * @param key the unique identifier of the message
150         * @param value1 an argument value
151         * @param value2 an argument value
152         * @param value3 an argument value
153         *
154         * @return String the formatted String
155         */
156        public String getMessage(
157          final String key, final Object value1, final Object value2, final Object value3 )
158        {
159            return getMessage( key, new Object[]{value1, value2, value3} );
160        }
161    
162        /**
163         * Returns the message for the specified key and arguments.
164         *
165         * @param key the unique identifier of the message
166         * @param values argument values
167         * @return String the formatted String
168         */
169        public String getMessage( final String key, final Object[] values )
170        {
171            final String msgFormatStr = m_bundle.getString( key );
172            final MessageFormat msgFormat = new MessageFormat( msgFormatStr );
173            return msgFormat.format( values );
174        }
175    }