001    /*******************************************************************************
002     * Portions created by Sebastian Thomschke are copyright (c) 2005-2011 Sebastian
003     * Thomschke.
004     * 
005     * All Rights Reserved. This program and the accompanying materials
006     * are made available under the terms of the Eclipse Public License v1.0
007     * which accompanies this distribution, and is available at
008     * http://www.eclipse.org/legal/epl-v10.html
009     * 
010     * Contributors:
011     *     Sebastian Thomschke - initial implementation.
012     *******************************************************************************/
013    package net.sf.oval.localization.message;
014    
015    import static net.sf.oval.Validator.getCollectionFactory;
016    
017    import java.util.Enumeration;
018    import java.util.LinkedList;
019    import java.util.List;
020    import java.util.Map;
021    import java.util.ResourceBundle;
022    
023    /**
024     * Default implementation that resolves messages based
025     * on the registered resource bundles.
026     * 
027     * @author Sebastian Thomschke
028     */
029    public class ResourceBundleMessageResolver implements MessageResolver
030    {
031            private final Map<ResourceBundle, List<String>> messageBundleKeys = getCollectionFactory().createMap(8);
032    
033            private final LinkedList<ResourceBundle> messageBundles = new LinkedList<ResourceBundle>();
034    
035            public static final ResourceBundleMessageResolver INSTANCE = new ResourceBundleMessageResolver();
036    
037            public ResourceBundleMessageResolver()
038            {
039                    // add the message bundle for the pre-built constraints in the default locale
040                    addMessageBundle(ResourceBundle.getBundle("net/sf/oval/Messages"));
041            }
042    
043            /**
044             * Adds a message bundle
045             * 
046             * @param messageBundle
047             * @return true if the bundle was registered and false if it was already registered
048             */
049            public final boolean addMessageBundle(final ResourceBundle messageBundle)
050            {
051                    if (messageBundles.contains(messageBundle)) return false;
052    
053                    messageBundles.addFirst(messageBundle);
054                    final List<String> keys = getCollectionFactory().createList();
055    
056                    for (final Enumeration<String> keysEnum = messageBundle.getKeys(); keysEnum.hasMoreElements();)
057                    {
058                            keys.add(keysEnum.nextElement());
059                    }
060    
061                    messageBundleKeys.put(messageBundle, keys);
062    
063                    return true;
064            }
065    
066            /**
067             * {@inheritDoc}
068             */
069            public String getMessage(final String key)
070            {
071                    for (final ResourceBundle bundle : messageBundles)
072                    {
073                            final List<String> keys = messageBundleKeys.get(bundle);
074                            if (keys.contains(key)) return bundle.getString(key);
075                    }
076                    return null;
077            }
078    
079            /**
080             * Removes the message bundle
081             * 
082             * @param messageBundle
083             * @return true if the bundle was registered and false if it wasn't registered
084             */
085            public boolean removeMessageBundle(final ResourceBundle messageBundle)
086            {
087                    if (!messageBundles.contains(messageBundle)) return false;
088    
089                    messageBundles.remove(messageBundle);
090                    return true;
091            }
092    }