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 }