package org.jboss.seam.theme; import static org.jboss.seam.ScopeType.EVENT; import static org.jboss.seam.annotations.Install.BUILT_IN; import java.util.*; 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.core.Interpolator; /** * Factory for a Map of resources that may be used for skinning the user * interface. * * @author Gavin King */ @Scope(ScopeType.STATELESS) @BypassInterceptors @Name("org.jboss.seam.theme.themeFactory") @Install(precedence = BUILT_IN) public class Theme { protected Map<String, String> createMap() { final java.util.ResourceBundle bundle = ThemeSelector.instance().getThemeResourceBundle(); 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; } if (resource == null) { return resourceKey; } else { return Interpolator.instance().interpolate(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 a Map in the event scope. When the theme is changed, ThemeSelector * is responsible for removing the Map from the event context. * */ @Factory(value = "org.jboss.seam.theme.theme", autoCreate = true, scope = EVENT) public java.util.Map getTheme() { return createMap(); } public static java.util.Map instance() { return (java.util.Map) Component.getInstance("org.jboss.seam.theme.theme", true); } }