001: package org.contineo.web.i18n;
002:
003: import org.contineo.util.config.FacesConfigurator;
004:
005: import org.contineo.web.util.Constants;
006:
007: import java.text.MessageFormat;
008:
009: import java.util.AbstractMap;
010: import java.util.ArrayList;
011: import java.util.List;
012: import java.util.Locale;
013: import java.util.MissingResourceException;
014: import java.util.ResourceBundle;
015: import java.util.Set;
016:
017: import javax.faces.application.FacesMessage;
018: import javax.faces.context.FacesContext;
019:
020: /**
021: * A class for retrieval of localized messages. All bundles declared in
022: * faces-config.xml are searched but in the opposite order they are declared in
023: * the file. The first key match wins.
024: *
025: * @author Marco Meschieri
026: * @version $Id:$
027: * @since 3.0
028: */
029: public class Messages extends AbstractMap<String, String> {
030: /**
031: * The list of bundles in which keys will be searched
032: */
033: private static List<String> bundles = new ArrayList<String>();
034:
035: public Messages() {
036: // a static class
037: }
038:
039: public static String getMessage(String key, Locale locale) {
040: if (bundles.isEmpty()) {
041: FacesConfigurator config = new FacesConfigurator();
042: bundles = config.getBundles();
043: }
044:
045: // Iterate over bundles in reverse order
046: for (int i = bundles.size() - 1; i >= 0; i--) {
047: String path = bundles.get(i);
048: ResourceBundle bundle = ResourceBundle.getBundle(path,
049: locale);
050:
051: try {
052: return bundle.getString(key);
053: } catch (MissingResourceException e) {
054: // Continue
055: }
056: }
057:
058: return key;
059: }
060:
061: public static String getMessage(String key) {
062: FacesContext facesContext = FacesContext.getCurrentInstance();
063: Locale locale = (Locale) facesContext.getExternalContext()
064: .getSessionMap().get(Constants.LOCALE);
065:
066: if (locale == null) {
067: locale = facesContext.getApplication().getDefaultLocale();
068: }
069:
070: return getMessage(key, locale);
071: }
072:
073: public static String getMessage(String key, String val0) {
074: String msg = getMessage(key);
075:
076: return MessageFormat.format(msg, new Object[] { val0 });
077: }
078:
079: public static void addLocalizedWarn(String message) {
080: addWarn(Messages.getMessage(message));
081: }
082:
083: public static void addWarn(String message) {
084: addMessage(FacesMessage.SEVERITY_WARN, null, message, message);
085: }
086:
087: public static void addLocalizedError(String message) {
088: addError(Messages.getMessage(message));
089: }
090:
091: public static void addError(String message) {
092: addMessage(FacesMessage.SEVERITY_ERROR, null, message, message);
093: }
094:
095: public static void addLocalizedInfo(String message) {
096: addInfo(Messages.getMessage(message));
097: }
098:
099: public static void addInfo(String message) {
100: addMessage(FacesMessage.SEVERITY_INFO, null, message, message);
101: }
102:
103: public static void addMessage(FacesMessage.Severity severity,
104: String summary, String detail) {
105: addMessage(severity, null, summary, detail);
106: }
107:
108: /**
109: * Adds a message in the jsf queue
110: *
111: * @param severity The severity level
112: * @param clientId The componentID (null can be accepted)
113: * @param summary The summary part(bundle key)
114: * @param detail The detail part(bundle key)
115: */
116: public static void addMessage(FacesMessage.Severity severity,
117: String clientId, String summary, String detail) {
118: FacesContext facesContext = FacesContext.getCurrentInstance();
119: FacesMessage message = new FacesMessage(severity, summary,
120: detail);
121: facesContext.addMessage(clientId, message);
122: }
123:
124: @Override
125: public Set<java.util.Map.Entry<String, String>> entrySet() {
126: return null;
127: }
128:
129: @Override
130: public String get(Object key) {
131: return Messages.getMessage(key.toString());
132: }
133: }
|