package org.jboss.seam.international; import static org.jboss.seam.ScopeType.EVENT; import static org.jboss.seam.annotations.Install.BUILT_IN; import java.util.AbstractMap; import java.util.Enumeration; import java.util.HashSet; import java.util.Map; import java.util.MissingResourceException; import java.util.Set; import org.jboss.seam.Component; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Factory; import org.jboss.seam.annotations.Install; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.intercept.BypassInterceptors; import org.jboss.seam.contexts.Contexts; import org.jboss.seam.core.SeamResourceBundle; /** * Factory for a Map that contains interpolated messages defined in the Seam * ResourceBundle. * * @see org.jboss.seam.core.SeamResourceBundle * * @author Gavin King */ @Scope(ScopeType.STATELESS) @BypassInterceptors @Name("org.jboss.seam.international.messagesFactory") @Install(precedence = BUILT_IN) public class Messages { protected Map<String, String> createMap() { final java.util.ResourceBundle bundle = SeamResourceBundle.getBundle(); if (bundle == null) { return null; } return new AbstractMap<String, String>() { @Override public String get(Object key) { if (key instanceof String) { String resourceKey = (String) key; String resource; try { resource = bundle.getString(resourceKey); } catch (MissingResourceException mre) { return resourceKey; } return (resource == null) ? resourceKey : resource; } else { return null; } } @Override public Set<Map.Entry<String, String>> entrySet() { Set<Map.Entry<String, String>> entrySet = new HashSet<Map.Entry<String, String>>(); Enumeration<String> keys = bundle.getKeys(); while (keys.hasMoreElements()) { final String key = keys.nextElement(); entrySet.add(new Map.Entry<String, String>() { public String getKey() { return key; } public String getValue() { return get(key); } public String setValue(String arg0) { throw new UnsupportedOperationException("not implemented"); } }); } return entrySet; } }; } /** * Create the Map and cache it in the EVENT scope. No need to cache it in * the SESSION scope, since it is inexpensive to create. * * @return a Map that interpolates messages in the Seam ResourceBundle */ @Factory(value = "org.jboss.seam.international.messages", autoCreate = true, scope = EVENT) public Map<String, String> getMessages() { return createMap(); } /** * @return the message Map instance */ public static Map<String, String> instance() { if (!Contexts.isSessionContextActive()) { throw new IllegalStateException("no event context active"); } return (Map<String, String>) Component.getInstance("org.jboss.seam.international.messages", true); } }