com.icesoft.faces.utils.MessageUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.icesoft.faces.utils.MessageUtils.java

Source

/*
 * Copyright 2004-2013 ICEsoft Technologies Canada Corp.
 *
 * Licensed 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 com.icesoft.faces.utils;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.component.UIComponent;

/**
 * This class has been designed, so the custom components can get 
 * facesMessages either from the icefaces' ResourceBundle or an 
 * application's resourceBundle. The location of ice's messages.properties
 * is under com.icesoft.faces.resources package. 
 */

public class MessageUtils {
    private static Log log = LogFactory.getLog(MessageUtils.class);
    private static String DETAIL_SUFFIX = "_detail";
    private static int SUMMARY = 0;
    private static int DETAIL = 1;
    private static String ICE_MESSAGES_BUNDLE = "com.icesoft.faces.resources.messages";

    public static FacesMessage getMessage(FacesContext context, String messageId) {
        return getMessage(context, messageId, null);
    }

    public static FacesMessage getMessage(FacesContext facesContext, String messageId, Object params[]) {
        String messageInfo[] = new String[2];

        Locale locale = facesContext.getViewRoot().getLocale();
        String bundleName = facesContext.getApplication().getMessageBundle();
        //see if the message has been overridden by the application
        if (bundleName != null) {
            try {
                loadMessageInfo(bundleName, locale, messageId, messageInfo);
            } catch (Exception e) {
                if (log.isWarnEnabled())
                    log.warn(e + ", using " + ICE_MESSAGES_BUNDLE);
            }
        }

        //TODO Use defered evaluation of the parameters, like how
        // JSF 1.2's javax.faces.component.MessageFactory.
        // BindingFacesMessage does. ICE-2290.

        //if not overridden then check in Icefaces message bundle.
        if (messageInfo[SUMMARY] == null && messageInfo[DETAIL] == null) {
            loadMessageInfo(ICE_MESSAGES_BUNDLE, locale, messageId, messageInfo);
        }
        if (params != null) {
            MessageFormat format;
            for (int i = 0; i < messageInfo.length; i++) {
                if (messageInfo[i] != null) {
                    format = new MessageFormat(messageInfo[i], locale);
                    messageInfo[i] = format.format(params);
                }
            }
        }
        return new FacesMessage(messageInfo[SUMMARY], messageInfo[DETAIL]);
    }

    private static void loadMessageInfo(String bundleName, Locale locale, String messageId, String[] messageInfo) {
        ResourceBundle bundle = ResourceBundle.getBundle(bundleName, locale, getClassLoader(bundleName));
        try {
            messageInfo[SUMMARY] = bundle.getString(messageId);
            messageInfo[DETAIL] = bundle.getString(messageId + DETAIL_SUFFIX);
        } catch (MissingResourceException e) {
        }
    }

    public static ClassLoader getClassLoader(Object fallback) {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        if (classLoader == null) {
            classLoader = fallback.getClass().getClassLoader();
        }
        return classLoader;
    }

    public static String getResource(FacesContext facesContext, String messageId) {
        String ret = null;
        Locale locale = facesContext.getViewRoot().getLocale();
        String bundleName = facesContext.getApplication().getMessageBundle();
        //see if the message has been overridden by the application
        if (bundleName != null) {
            ret = getResource(bundleName, locale, messageId);
        }
        if (ret == null) {
            ret = getResource(ICE_MESSAGES_BUNDLE, locale, messageId);
        }
        return ret;
    }

    protected static String getResource(String bundleName, Locale locale, String messageId) {
        ResourceBundle bundle = ResourceBundle.getBundle(bundleName, locale, getClassLoader(bundleName));
        String ret = null;
        try {
            ret = bundle.getString(messageId);
        } catch (Exception e) {
        }
        return ret;
    }

    public static Object getComponentLabel(FacesContext context, UIComponent comp) {
        Object label = comp.getAttributes().get("label");
        if (nullOrEmptyString(label)) {
            //TODO When doing that MessageFactory stuff, uncomment this. ICE-2290.
            ////ValueBinding vb = comp.getValueBinding("label");
            ////if(vb != null) {
            ////    label = vb;
            ////}
            ////else {
            label = comp.getClientId(context);
            ////}
        }
        return label;
    }

    private static boolean nullOrEmptyString(Object ob) {
        return ((ob == null) || ((ob instanceof String) && (ob.toString().length() == 0)));
    }
}