001: /*
002: * Copyright 2004 The Apache Software Foundation.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package javax.faces.component;
017:
018: import javax.el.ValueExpression;
019: import javax.faces.application.FacesMessage;
020: import javax.faces.context.FacesContext;
021: import java.text.MessageFormat;
022: import java.util.Locale;
023: import java.util.MissingResourceException;
024: import java.util.ResourceBundle;
025:
026: /**
027: * @author Manfred Geiler (latest modification by $Author: cagatay $)
028: * @version $Revision: 518079 $ $Date: 2007-03-14 10:24:31 +0100 (Mi, 14 Mrz 2007) $
029: */
030: class _MessageUtils {
031: private static final String DETAIL_SUFFIX = "_detail";
032:
033: static void addErrorMessage(FacesContext facesContext,
034: UIComponent component, String messageId) {
035: facesContext.addMessage(component.getClientId(facesContext),
036: getMessage(facesContext, facesContext.getViewRoot()
037: .getLocale(), FacesMessage.SEVERITY_ERROR,
038: messageId, null));
039: }
040:
041: static void addErrorMessage(FacesContext facesContext,
042: UIComponent component, String messageId, Object[] args) {
043: facesContext.addMessage(component.getClientId(facesContext),
044: getMessage(facesContext, facesContext.getViewRoot()
045: .getLocale(), FacesMessage.SEVERITY_ERROR,
046: messageId, args));
047: }
048:
049: static void addErrorMessage(FacesContext facesContext,
050: UIComponent component, Throwable cause) {
051: facesContext.addMessage(component.getClientId(facesContext),
052: new FacesMessage(FacesMessage.SEVERITY_ERROR, cause
053: .getLocalizedMessage(), cause
054: .getLocalizedMessage()));
055: }
056:
057: static FacesMessage getMessage(FacesContext facesContext,
058: Locale locale, FacesMessage.Severity severity,
059: String messageId, Object args[]) {
060: ResourceBundle appBundle;
061: ResourceBundle defBundle;
062: String summary;
063: String detail;
064:
065: appBundle = getApplicationBundle(facesContext, locale);
066: summary = getBundleString(appBundle, messageId);
067: if (summary != null) {
068: detail = getBundleString(appBundle, messageId
069: + DETAIL_SUFFIX);
070: } else {
071: defBundle = getDefaultBundle(facesContext, locale);
072: summary = getBundleString(defBundle, messageId);
073: if (summary != null) {
074: detail = getBundleString(defBundle, messageId
075: + DETAIL_SUFFIX);
076: } else {
077: //Try to find detail alone
078: detail = getBundleString(appBundle, messageId
079: + DETAIL_SUFFIX);
080: if (detail != null) {
081: summary = null;
082: } else {
083: detail = getBundleString(defBundle, messageId
084: + DETAIL_SUFFIX);
085: if (detail != null) {
086: summary = null;
087: } else {
088: //Neither detail nor summary found
089: facesContext.getExternalContext().log(
090: "No message with id " + messageId
091: + " found in any bundle");
092: return new FacesMessage(severity, messageId,
093: null);
094: }
095: }
096: }
097: }
098:
099: if (args != null && args.length > 0) {
100: MessageFormat format;
101:
102: if (summary != null) {
103: format = new MessageFormat(summary, locale);
104: summary = format.format(args);
105: }
106:
107: if (detail != null) {
108: format = new MessageFormat(detail, locale);
109: detail = format.format(args);
110: }
111: }
112:
113: return new FacesMessage(severity, summary, detail);
114: }
115:
116: private static String getBundleString(ResourceBundle bundle,
117: String key) {
118: try {
119: return bundle == null ? null : bundle.getString(key);
120: } catch (MissingResourceException e) {
121: return null;
122: }
123: }
124:
125: private static ResourceBundle getApplicationBundle(
126: FacesContext facesContext, Locale locale) {
127: String bundleName = facesContext.getApplication()
128: .getMessageBundle();
129: return bundleName != null ? getBundle(facesContext, locale,
130: bundleName) : null;
131: }
132:
133: private static ResourceBundle getDefaultBundle(
134: FacesContext facesContext, Locale locale) {
135: return getBundle(facesContext, locale,
136: FacesMessage.FACES_MESSAGES);
137: }
138:
139: private static ResourceBundle getBundle(FacesContext facesContext,
140: Locale locale, String bundleName) {
141: try {
142: //First we try the JSF implementation class loader
143: return ResourceBundle.getBundle(bundleName, locale,
144: facesContext.getClass().getClassLoader());
145: } catch (MissingResourceException ignore1) {
146: try {
147: //Next we try the JSF API class loader
148: return ResourceBundle.getBundle(bundleName, locale,
149: _MessageUtils.class.getClassLoader());
150: } catch (MissingResourceException ignore2) {
151: try {
152: //Last resort is the context class loader
153: return ResourceBundle.getBundle(bundleName, locale,
154: Thread.currentThread()
155: .getContextClassLoader());
156: } catch (MissingResourceException damned) {
157: facesContext.getExternalContext().log(
158: "resource bundle " + bundleName
159: + " could not be found");
160: return null;
161: }
162: }
163: }
164: }
165:
166: static String getLabel(FacesContext facesContext,
167: UIComponent component) {
168: Object label = component.getAttributes().get("label");
169: if (label != null)
170: return label.toString();
171:
172: ValueExpression expression = component
173: .getValueExpression("label");
174: if (expression != null)
175: return (String) expression.getValue(facesContext
176: .getELContext());
177:
178: //If no label is not specified, use clientId
179: return component.getClientId(facesContext);
180: }
181: }
|