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.convert;
017:
018: import javax.el.ValueExpression;
019: import javax.faces.application.FacesMessage;
020: import javax.faces.component.UIComponent;
021: import javax.faces.context.FacesContext;
022: import java.text.MessageFormat;
023: import java.util.Locale;
024: import java.util.MissingResourceException;
025: import java.util.ResourceBundle;
026:
027: /**
028: * @author Manfred Geiler (latest modification by $Author: cagatay $)
029: * @version $Revision: 517226 $ $Date: 2007-03-12 15:19:02 +0100 (Mo, 12 Mrz 2007) $
030: */
031: class _MessageUtils {
032: private static final String DETAIL_SUFFIX = "_detail";
033:
034: static FacesMessage getErrorMessage(FacesContext facesContext,
035: String messageId, Object args[]) {
036: return getMessage(facesContext, facesContext.getViewRoot()
037: .getLocale(), FacesMessage.SEVERITY_ERROR, messageId,
038: args);
039: }
040:
041: static FacesMessage getMessage(FacesContext facesContext,
042: Locale locale, FacesMessage.Severity severity,
043: String messageId, Object args[]) {
044: ResourceBundle appBundle;
045: ResourceBundle defBundle;
046: String summary;
047: String detail;
048:
049: appBundle = getApplicationBundle(facesContext, locale);
050: summary = getBundleString(appBundle, messageId);
051: if (summary != null) {
052: detail = getBundleString(appBundle, messageId
053: + DETAIL_SUFFIX);
054: } else {
055: defBundle = getDefaultBundle(facesContext, locale);
056: summary = getBundleString(defBundle, messageId);
057: if (summary != null) {
058: detail = getBundleString(defBundle, messageId
059: + DETAIL_SUFFIX);
060: } else {
061: //Try to find detail alone
062: detail = getBundleString(appBundle, messageId
063: + DETAIL_SUFFIX);
064: if (detail != null) {
065: summary = null;
066: } else {
067: detail = getBundleString(defBundle, messageId
068: + DETAIL_SUFFIX);
069: if (detail != null) {
070: summary = null;
071: } else {
072: //Neither detail nor summary found
073: return null;
074: }
075: }
076: }
077: }
078:
079: if (args != null && args.length > 0) {
080: MessageFormat format;
081:
082: if (summary != null) {
083: format = new MessageFormat(summary, locale);
084: summary = format.format(args);
085: }
086:
087: if (detail != null) {
088: format = new MessageFormat(detail, locale);
089: detail = format.format(args);
090: }
091: }
092:
093: return new FacesMessage(severity, summary, detail);
094: }
095:
096: private static String getBundleString(ResourceBundle bundle,
097: String key) {
098: try {
099: return bundle == null ? null : bundle.getString(key);
100: } catch (MissingResourceException e) {
101: return null;
102: }
103: }
104:
105: private static ResourceBundle getApplicationBundle(
106: FacesContext facesContext, Locale locale) {
107: String bundleName = facesContext.getApplication()
108: .getMessageBundle();
109:
110: return bundleName != null ? getBundle(facesContext, locale,
111: bundleName) : null;
112: }
113:
114: private static ResourceBundle getDefaultBundle(
115: FacesContext facesContext, Locale locale) {
116: return getBundle(facesContext, locale,
117: FacesMessage.FACES_MESSAGES);
118: }
119:
120: private static ResourceBundle getBundle(FacesContext facesContext,
121: Locale locale, String bundleName) {
122: try {
123: //First we try the JSF implementation class loader
124: return ResourceBundle.getBundle(bundleName, locale,
125: facesContext.getClass().getClassLoader());
126: } catch (MissingResourceException ignore1) {
127: try {
128: //Next we try the JSF API class loader
129: return ResourceBundle.getBundle(bundleName, locale,
130: _MessageUtils.class.getClassLoader());
131: } catch (MissingResourceException ignore2) {
132: try {
133: //Last resort is the context class loader
134: return ResourceBundle.getBundle(bundleName, locale,
135: Thread.currentThread()
136: .getContextClassLoader());
137: } catch (MissingResourceException damned) {
138: facesContext.getExternalContext().log(
139: "resource bundle " + bundleName
140: + " could not be found");
141: return null;
142: }
143: }
144: }
145: }
146:
147: static String getLabel(FacesContext facesContext,
148: UIComponent component) {
149: Object label = component.getAttributes().get("label");
150: if (label != null)
151: return label.toString();
152:
153: ValueExpression expression = component
154: .getValueExpression("label");
155: if (expression != null)
156: return (String) expression.getValue(facesContext
157: .getELContext());
158:
159: //If no label is not specified, use clientId
160: return component.getClientId(facesContext);
161: }
162:
163: }
|