blob: 919517b687e63578c5898a0a3e6b52da96116fd8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.myfaces.tobago.util;
import org.apache.myfaces.tobago.application.LabelValueExpressionFacesMessage;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
/**
* Utility to get internationalized error messages and create and add {@link FacesMessage} object to the context. The
* message will be internationalized with a bundle in the following order: <ol> <li>Application bundle</li> <li>Tobago
* bundle</li> <li>Default JSF bundle</li>
* </ol>
*/
public final class MessageUtils {
private static final String DETAIL_SUFFIX = "_detail";
private MessageUtils() {
}
/**
* @deprecated Since 5.0.0. Please use {@link #getMessage(FacesContext, FacesMessage.Severity, String, Object...)}.
*/
@Deprecated
public static void addMessage(
final FacesContext facesContext, final UIComponent component, final FacesMessage.Severity severity,
final String messageId, final Object[] args) {
facesContext.addMessage(component != null ? component.getClientId(facesContext) : null,
getMessage(facesContext, severity, messageId, args));
}
public static FacesMessage getMessage(
final FacesContext facesContext, final FacesMessage.Severity severity, final String messageId,
final Object... args) {
final UIViewRoot viewRoot = facesContext.getViewRoot();
final Locale locale = viewRoot != null ? viewRoot.getLocale() : null;
return getMessage(facesContext, locale, severity, messageId, args);
}
/**
* @deprecated Since 5.0.0. Please use {@link #getMessage(FacesContext, FacesMessage.Severity, String, Object...)}.
*/
@Deprecated
public static FacesMessage getMessage(
final FacesContext facesContext, final Locale locale,
final FacesMessage.Severity severity, final String messageId, final Object... args) {
final ResourceBundle appBundle = getApplicationBundle(facesContext, locale);
String summary = getBundleString(appBundle, messageId);
String detail = getBundleString(appBundle, messageId + DETAIL_SUFFIX);
if (summary == null || detail == null) {
final ResourceBundle tobagoMessages
= ResourceBundle.getBundle("org.apache.myfaces.tobago.context.TobagoMessageBundle", locale);
if (summary == null) {
summary = getBundleString(tobagoMessages, messageId);
}
if (detail == null) {
detail = getBundleString(tobagoMessages, messageId + DETAIL_SUFFIX);
}
if (summary == null || detail == null) {
final ResourceBundle tobagoBundle
= ResourceBundle.getBundle("org.apache.myfaces.tobago.context.TobagoResourceBundle", locale);
if (summary == null) {
summary = getBundleString(tobagoBundle, messageId);
}
if (detail == null) {
detail = getBundleString(tobagoBundle, messageId + DETAIL_SUFFIX);
}
if (summary == null || detail == null) {
final ResourceBundle defBundle = getDefaultBundle(facesContext, locale);
if (summary == null) {
summary = getBundleString(defBundle, messageId);
}
if (detail == null) {
detail = getBundleString(defBundle, messageId + DETAIL_SUFFIX);
}
}
}
}
if (summary == null && detail == null) {
//Neither detail nor summary found
facesContext.getExternalContext().log("No message with id " + messageId + " found in any bundle");
return new FacesMessage(severity, messageId, null);
}
if (args != null && args.length > 0) {
MessageFormat format;
if (summary != null) {
format = new MessageFormat(summary, locale);
summary = format.format(args);
}
if (detail != null) {
format = new MessageFormat(detail, locale);
detail = format.format(args);
}
}
return new LabelValueExpressionFacesMessage(severity, summary, detail);
}
private static String getBundleString(final ResourceBundle bundle, final String key) {
try {
return bundle == null ? null : bundle.getString(key);
} catch (final MissingResourceException e) {
// ignore
return null;
}
}
private static ResourceBundle getApplicationBundle(final FacesContext facesContext, final Locale locale) {
final String bundleName = facesContext.getApplication().getMessageBundle();
return bundleName != null ? getBundle(facesContext, locale, bundleName) : null;
}
private static ResourceBundle getDefaultBundle(final FacesContext facesContext, final Locale locale) {
return getBundle(facesContext, locale, FacesMessage.FACES_MESSAGES);
}
private static ResourceBundle getBundle(
final FacesContext facesContext, final Locale locale, final String bundleName) {
try {
return ResourceBundle.getBundle(bundleName, locale, MessageUtils.class.getClassLoader());
} catch (final MissingResourceException ignore2) {
try {
return ResourceBundle.getBundle(bundleName, locale, Thread.currentThread().getContextClassLoader());
} catch (final MissingResourceException damned) {
facesContext.getExternalContext().log("resource bundle " + bundleName + " could not be found");
return null;
}
}
}
public static String getLabel(final FacesContext facesContext, final UIComponent component) {
if (component == null) {
return null;
}
final Object label = component.getAttributes().get("label");
if (label != null) {
return label.toString();
}
final ValueExpression expression = component.getValueExpression("label");
if (expression != null) {
return expression.getExpressionString();
}
return component.getClientId(facesContext);
}
}