View Javadoc
1   /**
2    * Copyright 2011-2019 PrimeFaces Extensions
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.primefaces.extensions.util;
17  
18  import java.util.Locale;
19  import java.util.MissingResourceException;
20  import java.util.ResourceBundle;
21  import javax.faces.application.FacesMessage;
22  import javax.faces.component.UIComponent;
23  import javax.faces.context.FacesContext;
24  import static org.primefaces.util.MessageFactory.getFormattedText;
25  
26  /**
27   * PrimeFaces Extensions message factory. Delegates as much as possible to {@link org.primefaces.util.MessageFactory}.
28   *
29   * @author Jasper de Vries <jepsar@gmail.com>
30   * @since 7.0
31   */
32  public class MessageFactory {
33  
34      private static final String PF_EXTENSIONS_BUNDLE_BASENAME = "org.primefaces.extensions.Messages";
35      private static final String DEFAULT_DETAIL_SUFFIX = "_detail";
36  
37      private MessageFactory() {
38      }
39  
40      public static FacesMessage getMessage(final String messageId,
41                                            final FacesMessage.Severity severity,
42                                            final Object... params) {
43          final FacesMessage message = getMessage(getLocale(), messageId, params);
44          message.setSeverity(severity);
45          return message;
46      }
47  
48      public static FacesMessage getMessage(final Locale locale,
49                                            final String messageId,
50                                            final Object... params) {
51          final FacesMessage message = org.primefaces.util.MessageFactory.getMessage(locale, messageId, params);
52          if (message.getSummary() == null) {
53              populateMessageFromExtensions(message, locale, messageId, params);
54          }
55          return message;
56      }
57  
58      public static Object getLabel(final FacesContext facesContext, final UIComponent component) {
59          return org.primefaces.util.MessageFactory.getLabel(facesContext, component);
60      }
61  
62      private static void populateMessageFromExtensions(final FacesMessage message,
63                                                        final Locale locale,
64                                                        final String messageId,
65                                                        final Object[] params) {
66          final ResourceBundle extensionsBundle = getExtensionsBundle(locale);
67          message.setSummary(getFormattedText(locale, extensionsBundle.getString(messageId), params));
68          try {
69              message.setDetail(getFormattedText(locale, extensionsBundle.getString(messageId + DEFAULT_DETAIL_SUFFIX), params));
70          }
71          catch (MissingResourceException e) {
72              // NoOp
73          }
74      }
75  
76      // TODO If PF would change their method to public access we could use that
77      @Deprecated
78      public static Locale getLocale() {
79          Locale locale = null;
80          FacesContext facesContext = FacesContext.getCurrentInstance();
81  
82          if (facesContext != null && facesContext.getViewRoot() != null) {
83              locale = facesContext.getViewRoot().getLocale();
84  
85              if (locale == null) {
86                  locale = Locale.getDefault();
87              }
88          }
89          else {
90              locale = Locale.getDefault();
91          }
92          return locale;
93      }
94  
95      private static ResourceBundle getExtensionsBundle(final Locale locale) {
96          return ResourceBundle.getBundle(PF_EXTENSIONS_BUNDLE_BASENAME,
97                                          locale,
98                                          Thread.currentThread().getContextClassLoader());
99  
100     }
101 
102 }