View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package javax.faces.convert;
20  
21  import javax.el.ValueExpression;
22  import javax.faces.application.FacesMessage;
23  import javax.faces.component.UIComponent;
24  import javax.faces.context.FacesContext;
25  
26  import java.text.MessageFormat;
27  import java.util.Locale;
28  import java.util.MissingResourceException;
29  import java.util.ResourceBundle;
30  
31  /**
32   * @author Manfred Geiler (latest modification by $Author: lu4242 $)
33   * @version $Revision: 940134 $ $Date: 2010-05-01 20:31:07 -0500 (Sat, 01 May 2010) $
34   */
35  class _MessageUtils
36  {
37      private static final String DETAIL_SUFFIX = "_detail";
38  
39      static FacesMessage getErrorMessage(FacesContext facesContext,
40                                          String messageId,
41                                          Object args[])
42      {
43          return getMessage(facesContext,
44                            facesContext.getViewRoot().getLocale(),
45                            FacesMessage.SEVERITY_ERROR,
46                            messageId,
47                            args);
48      }
49  
50      static FacesMessage getMessage(FacesContext facesContext,
51                                     Locale locale,
52                                     FacesMessage.Severity severity,
53                                     String messageId,
54                                     Object args[])
55      {
56          ResourceBundle appBundle;
57          ResourceBundle defBundle;
58          String summary;
59          String detail;
60  
61          appBundle = getApplicationBundle(facesContext, locale);
62          summary = getBundleString(appBundle, messageId);
63          if (summary != null)
64          {
65              detail = getBundleString(appBundle, messageId + DETAIL_SUFFIX);
66          }
67          else
68          {
69              defBundle = getDefaultBundle(facesContext, locale);
70              summary = getBundleString(defBundle, messageId);
71              if (summary != null)
72              {
73                  detail = getBundleString(defBundle, messageId + DETAIL_SUFFIX);
74              }
75              else
76              {
77                  //Try to find detail alone
78                  detail = getBundleString(appBundle, messageId + DETAIL_SUFFIX);
79                  if (detail != null)
80                  {
81                      summary = null;
82                  }
83                  else
84                  {
85                      detail = getBundleString(defBundle, messageId + DETAIL_SUFFIX);
86                      if (detail != null)
87                      {
88                          summary = null;
89                      }
90                      else
91                      {
92                          //Neither detail nor summary found
93                          facesContext.getExternalContext().log("No message with id " + messageId + " found in any bundle");
94                          return new FacesMessage(severity, messageId, null);
95                      }
96                  }
97              }
98          }
99  
100         if (args != null && args.length > 0)
101         {
102             return new _ParametrizableFacesMessage(severity, summary, detail, args, locale);
103         }
104         else
105         {
106             return new FacesMessage(severity, summary, detail);
107         }
108     }
109 
110     private static String getBundleString(ResourceBundle bundle, String key)
111     {
112         try
113         {
114             return bundle == null ? null : bundle.getString(key);
115         }
116         catch (MissingResourceException e)
117         {
118             return null;
119         }
120     }
121 
122 
123     private static ResourceBundle getApplicationBundle(FacesContext facesContext, Locale locale)
124     {
125         String bundleName = facesContext.getApplication().getMessageBundle();
126         return bundleName != null ? getBundle(facesContext, locale, bundleName) : null;
127     }
128 
129     private static ResourceBundle getDefaultBundle(FacesContext facesContext,
130                                                    Locale locale)
131     {
132         return getBundle(facesContext, locale, FacesMessage.FACES_MESSAGES);
133     }
134 
135     private static ResourceBundle getBundle(FacesContext facesContext,
136                                             Locale locale,
137                                             String bundleName)
138     {
139         try
140         {
141             //First we try the JSF implementation class loader
142             return ResourceBundle.getBundle(bundleName,
143                                             locale,
144                                             facesContext.getClass().getClassLoader());
145         }
146         catch (MissingResourceException ignore1)
147         {
148             try
149             {
150                 //Next we try the JSF API class loader
151                 return ResourceBundle.getBundle(bundleName,
152                                                 locale,
153                                                 _MessageUtils.class.getClassLoader());
154             }
155             catch (MissingResourceException ignore2)
156             {
157                 try
158                 {
159                     //Last resort is the context class loader
160                     return ResourceBundle.getBundle(bundleName,
161                                                     locale,
162                                                     Thread.currentThread().getContextClassLoader());
163                 }
164                 catch (MissingResourceException damned)
165                 {
166                     facesContext.getExternalContext().log("resource bundle " + bundleName + " could not be found");
167                     return null;
168                 }
169             }
170         }
171     }
172     
173     static Object getLabel(FacesContext facesContext, UIComponent component) {
174         Object label = component.getAttributes().get("label");
175         if(label != null)
176             return label;
177         
178         ValueExpression expression = component.getValueExpression("label");
179         if(expression != null)
180             return expression;
181         
182         //If no label is not specified, use clientId
183         return component.getClientId( facesContext );
184     }
185 }