package org.liveSense.server.i18n; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.MissingResourceException; import java.util.ResourceBundle; public class CompositeProxyResourceBundle extends ResourceBundle { private final Map<String, ResourceBundle> cache = new HashMap<String, ResourceBundle>(); private class CacheResourceBundleEnumeration implements Enumeration<String> { private final Iterator<Entry<String, ResourceBundle>> cacheIterator = cache.entrySet().iterator(); private Enumeration<String> itemEnumeratrion = null; @Override public boolean hasMoreElements() { synchronized (cache) { while (true) { if (itemEnumeratrion != null) { if (itemEnumeratrion.hasMoreElements()) { return true; } else { if (cacheIterator.hasNext()) { itemEnumeratrion = cacheIterator.next().getValue().getKeys(); } else { return false; } } } else { if (cacheIterator.hasNext()) { itemEnumeratrion = cacheIterator.next().getValue().getKeys(); } else { return false; } } } } } @Override public String nextElement() { synchronized (cache) { while (true) { if (itemEnumeratrion != null) { if (itemEnumeratrion.hasMoreElements()) { return itemEnumeratrion.nextElement(); } else { if (cacheIterator.hasNext()) { itemEnumeratrion = cacheIterator.next().getValue().getKeys(); } else { return null; } } } else { if (cacheIterator.hasNext()) { itemEnumeratrion = cacheIterator.next().getValue().getKeys(); } else { return null; } } } } } } @Override public Enumeration<String> getKeys() { return new CacheResourceBundleEnumeration(); } @Override protected Object handleGetObject(String key) { synchronized (cache) { Iterator<Entry<String, ResourceBundle>> cacheIterator = cache.entrySet().iterator(); Object ret = null; while (cacheIterator.hasNext() && ret == null) { try { ret = cacheIterator.next().getValue().getObject(key); } catch (MissingResourceException e) { } } if (ret == null) throw new MissingResourceException("No message found", "CompositeProxyResourceBundle", key); return ret; } } public void addToCache(String className, ResourceBundle rb) { synchronized (cache) { cache.put(className, rb); } } public void removeFromCache(String className) { synchronized (cache) { cache.remove(className); } } }