You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2010/11/13 02:34:04 UTC

svn commit: r1034621 - in /myfaces/commons/branches/jsf_11/myfaces-commons-utils/src/main/java/org/apache/myfaces/commons/util: MessageUtils.java ParametrizableFacesMessage.java

Author: lu4242
Date: Sat Nov 13 01:34:04 2010
New Revision: 1034621

URL: http://svn.apache.org/viewvc?rev=1034621&view=rev
Log:
MFCOMMONS-13 Update MessageUtils to new implementation in shared

Added:
    myfaces/commons/branches/jsf_11/myfaces-commons-utils/src/main/java/org/apache/myfaces/commons/util/ParametrizableFacesMessage.java
Modified:
    myfaces/commons/branches/jsf_11/myfaces-commons-utils/src/main/java/org/apache/myfaces/commons/util/MessageUtils.java

Modified: myfaces/commons/branches/jsf_11/myfaces-commons-utils/src/main/java/org/apache/myfaces/commons/util/MessageUtils.java
URL: http://svn.apache.org/viewvc/myfaces/commons/branches/jsf_11/myfaces-commons-utils/src/main/java/org/apache/myfaces/commons/util/MessageUtils.java?rev=1034621&r1=1034620&r2=1034621&view=diff
==============================================================================
--- myfaces/commons/branches/jsf_11/myfaces-commons-utils/src/main/java/org/apache/myfaces/commons/util/MessageUtils.java (original)
+++ myfaces/commons/branches/jsf_11/myfaces-commons-utils/src/main/java/org/apache/myfaces/commons/util/MessageUtils.java Sat Nov 13 01:34:04 2010
@@ -79,6 +79,18 @@ public final class MessageUtils
                           new Object[]{arg},
                           FacesContext.getCurrentInstance());
     }
+    
+    public static FacesMessage getMessage(String bundleBaseName, 
+            FacesMessage.Severity severity,
+            String messageId,
+            Object arg)
+    {
+        return getMessage(bundleBaseName,
+                          severity,
+                          messageId,
+                          new Object[]{arg},
+                          FacesContext.getCurrentInstance());
+    }
 
     /**
      * @param severity serverity of message
@@ -96,6 +108,18 @@ public final class MessageUtils
                           args,
                           FacesContext.getCurrentInstance());
     }
+    
+    public static FacesMessage getMessage(String bundleBaseName, 
+            FacesMessage.Severity severity,
+            String messageId,
+            Object[] args)
+    {
+        return getMessage(bundleBaseName,
+                          severity,
+                          messageId,
+                          args,
+                          FacesContext.getCurrentInstance());
+    }    
 
     public static FacesMessage getMessage(FacesMessage.Severity severity,
                                           String messageId,
@@ -108,6 +132,18 @@ public final class MessageUtils
         return message;
     }
 
+    public static FacesMessage getMessage(String bundleBaseName,
+            FacesMessage.Severity severity,
+            String messageId,
+            Object[] args,
+            FacesContext facesContext)
+    {
+        FacesMessage message = getMessage(bundleBaseName, facesContext, messageId, args);
+        message.setSeverity(severity);
+        
+        return message;
+    }
+
     public static void addMessage(FacesMessage.Severity severity,
                                   String messageId,
                                   Object[] args)
@@ -115,6 +151,14 @@ public final class MessageUtils
         addMessage(severity, messageId, args, null, FacesContext.getCurrentInstance());
     }
 
+    public static void addMessage(String bundleBaseName, 
+            FacesMessage.Severity severity,
+            String messageId,
+            Object[] args)
+    {
+        addMessage(bundleBaseName, severity, messageId, args, null, FacesContext.getCurrentInstance());
+    }
+
     public static void addMessage(FacesMessage.Severity severity,
                                   String messageId,
                                   Object[] args,
@@ -123,6 +167,15 @@ public final class MessageUtils
         addMessage(severity, messageId, args, null, facesContext);
     }
 
+    public static void addMessage(String bundleBaseName, 
+            FacesMessage.Severity severity,
+            String messageId,
+            Object[] args,
+            FacesContext facesContext)
+    {
+        addMessage(bundleBaseName, severity, messageId, args, null, facesContext);
+    }
+
     public static void addMessage(FacesMessage.Severity severity,
                                   String messageId,
                                   Object[] args,
@@ -131,6 +184,15 @@ public final class MessageUtils
         addMessage(severity, messageId, args, forClientId, FacesContext.getCurrentInstance());
     }
 
+    public static void addMessage(String bundleBaseName,
+            FacesMessage.Severity severity,
+            String messageId,
+            Object[] args,
+            String forClientId)
+    {
+        addMessage(bundleBaseName, severity, messageId, args, forClientId, FacesContext.getCurrentInstance());
+    }
+
     public static void addMessage(FacesMessage.Severity severity,
                                   String messageId,
                                   Object[] args,
@@ -144,6 +206,20 @@ public final class MessageUtils
                                 getMessage(severity, messageId, args, facesContext));
     }
 
+    public static void addMessage(String bundleBaseName,
+            FacesMessage.Severity severity,
+            String messageId,
+            Object[] args,
+            String forClientId,
+            FacesContext facesContext)
+    {
+        if(log.isTraceEnabled()) {
+        log.trace("adding message " + messageId + " for clientId " + forClientId);
+        }
+        facesContext.addMessage(forClientId,
+                  getMessage(bundleBaseName, severity, messageId, args, facesContext));
+    }
+
     /**
      * Uses <code>MessageFormat</code> and the supplied parameters to fill in the param placeholders in the String.
      *
@@ -157,19 +233,23 @@ public final class MessageUtils
         String localizedStr = null;
         if(params == null || msgtext == null)
             return msgtext;
-        StringBuffer b = new StringBuffer(100);
-        MessageFormat mf = new MessageFormat(msgtext);
+
         if(locale != null)
         {
-            mf.setLocale(locale);
-            b.append(mf.format(((Object) (params))));
-            localizedStr = b.toString();
+            MessageFormat mf = new MessageFormat(msgtext,locale);            
+            localizedStr = mf.format(params);
         }
         return localizedStr;
     }
 
     public static FacesMessage getMessage(String messageId, Object params[])
     {
+        Locale locale = getCurrentLocale();
+        return getMessage(locale, messageId, params);
+    }
+
+    public static FacesMessage getMessageFromBundle(String bundleBaseName, String messageId, Object params[])
+    {
         Locale locale = null;
         FacesContext context = FacesContext.getCurrentInstance();
         if(context != null && context.getViewRoot() != null)
@@ -181,7 +261,7 @@ public final class MessageUtils
         {
             locale = Locale.getDefault();
         }
-        return getMessage(locale, messageId, params);
+        return getMessageFromBundle(bundleBaseName, context , locale, messageId, params);
     }
 
     public static FacesMessage getMessage(Locale locale, String messageId, Object params[])
@@ -227,23 +307,126 @@ public final class MessageUtils
         if (bundle == null)
         {
             throw new NullPointerException(
-                "Unable to locate ResrouceBundle: bundle is null");
+                "Unable to locate ResourceBundle: bundle is null");
+        }
+        if (params != null && locale != null)
+        {
+            try
+            {
+                detail = bundle.getString(messageId + DETAIL_SUFFIX);
+            }
+            catch(MissingResourceException e) {
+                // NoOp
+            }
+            return new ParametrizableFacesMessage(summary, detail, params, locale);
+        }
+        else
+        {
+            summary = substituteParams(locale, summary, params);
+            try
+            {
+                detail = substituteParams(locale,
+                    bundle.getString(messageId + DETAIL_SUFFIX), params);
+            }
+            catch(MissingResourceException e) {
+                // NoOp
+            }
+            return new FacesMessage(summary, detail);
+        }
+    }
+    
+    public static FacesMessage getMessageFromBundle(String bundleBaseName, FacesContext context, Locale locale, String messageId, Object params[])
+    {
+        String summary = null;
+        String detail = null;
+        String bundleName = context.getApplication().getMessageBundle();
+        ResourceBundle bundle = null;
+
+        if (bundleName != null)
+        {
+            try
+            {
+                bundle = ResourceBundle.getBundle(bundleName, locale, getCurrentLoader(bundleName));
+                summary = bundle.getString(messageId);
+            }
+            catch (MissingResourceException e) {
+                // NoOp
+            }
         }
-        summary = substituteParams(locale, summary, params);
 
-        try
+        if (summary == null)
+        {
+            try
+            {
+                bundle = ResourceBundle.getBundle(bundleBaseName, locale, getCurrentLoader(bundleBaseName));
+                if(bundle == null)
+                {
+                    throw new NullPointerException();
+                }
+                summary = bundle.getString(messageId);
+            }
+            catch(MissingResourceException e) {
+                // NoOp
+            }
+        }
+        
+        if (summary == null)
         {
-            detail = substituteParams(locale,
-                bundle.getString(messageId + DETAIL_SUFFIX), params);
+            try
+            {
+                bundle = ResourceBundle.getBundle(DEFAULT_BUNDLE, locale, getCurrentLoader(DEFAULT_BUNDLE));
+                if(bundle == null)
+                {
+                    throw new NullPointerException();
+                }
+                summary = bundle.getString(messageId);
+            }
+            catch(MissingResourceException e) {
+                // NoOp
+            }
         }
-        catch(MissingResourceException e) {
-            // NoOp
+
+        if(summary == null)
+        {
+            summary = messageId;
         }
 
-        return new FacesMessage(summary, detail);
+        if (bundle == null)
+        {
+            throw new NullPointerException(
+                "Unable to locate ResourceBundle: bundle is null");
+        }
+        
+        if (params != null && locale != null)
+        {
+            try
+            {
+                detail = bundle.getString(messageId + DETAIL_SUFFIX);
+            }
+            catch(MissingResourceException e) {
+                // NoOp
+            }
+            return new ParametrizableFacesMessage(summary, detail, params, locale);
+        }
+        else
+        {
+            summary = substituteParams(locale, summary, params);
+            try
+            {
+                detail = substituteParams(locale,
+                    bundle.getString(messageId + DETAIL_SUFFIX), params);
+            }
+            catch(MissingResourceException e) {
+                // NoOp
+            }
+            return new FacesMessage(summary, detail);
+        }
     }
 
     /**
+     *  Retrieve the message from a specific bundle. It does not look on application message bundle
+     * or default message bundle. If it is required to look on those bundles use getMessageFromBundle instead
+     * 
      * @param bundleBaseName baseName of ResourceBundle to load localized messages
      * @param messageId id of message
      * @param params parameters to set at localized message
@@ -259,14 +442,19 @@ public final class MessageUtils
      * @return  currently applicable Locale for this request.
      */
     public static Locale getCurrentLocale() {
+        return getCurrentLocale(FacesContext.getCurrentInstance());
+    }
+    
+    public static Locale getCurrentLocale(FacesContext context) {
         Locale locale;
-        
-        FacesContext context = FacesContext.getCurrentInstance();
-        if(context != null && context.getViewRoot() != null) {
+        if(context != null && context.getViewRoot() != null)
+        {
             locale = context.getViewRoot().getLocale();
             if(locale == null)
                 locale = Locale.getDefault();
-        } else {
+        }
+        else
+        {
             locale = Locale.getDefault();
         }
         
@@ -289,6 +477,9 @@ public final class MessageUtils
     }
 
     /**
+     *  Retrieve the message from a specific bundle. It does not look on application message bundle
+     * or default message bundle. If it is required to look on those bundles use getMessageFromBundle instead
+     * 
      * @param bundleBaseName baseName of ResourceBundle to load localized messages
      * @param locale current locale
      * @param messageId id of message
@@ -357,6 +548,11 @@ public final class MessageUtils
     {
         return getMessage(context, messageId, ((Object []) (null)));
     }
+    
+    public static FacesMessage getMessage(String bundleBaseName, FacesContext context, String messageId)
+    {
+        return getMessage(bundleBaseName, context, messageId, ((Object []) (null)));
+    }
 
     /**
      *
@@ -369,7 +565,7 @@ public final class MessageUtils
     {
         if(context == null || messageId == null)
             throw new NullPointerException(" context " + context + " messageId " + messageId);
-        Locale locale = getCurrentLocale();
+        Locale locale = getCurrentLocale(context);
         if(null == locale)
             throw new NullPointerException(" locale " + locale);
         FacesMessage message = getMessage(locale, messageId, params);
@@ -384,19 +580,53 @@ public final class MessageUtils
             return getMessage(locale, messageId, params);
         }
     }
+    
+    public static FacesMessage getMessage(String bundleBaseName, FacesContext context, String messageId, Object params[])
+    {
+        if(context == null || messageId == null)
+            throw new NullPointerException(" context " + context + " messageId " + messageId);
+        Locale locale = getCurrentLocale(context);
+        if(null == locale)
+            throw new NullPointerException(" locale " + locale);
+        FacesMessage message = getMessageFromBundle(bundleBaseName, context, locale, messageId, params);
+        if(message != null)
+        {
+            return message;
+        } else
+        {
+            // TODO /FIX:  Note that this has fallback behavior to default Locale for message,
+            // but similar behavior above does not.  The methods should probably behave
+            locale = Locale.getDefault();
+            return getMessageFromBundle(bundleBaseName, context, locale, messageId, params);
+        }
+    }
+    
+    public static Object getLabel(FacesContext facesContext, UIComponent component) {
+        Object label = component.getAttributes().get("label");
+        if(label != null)
+            return label;
+        
+        ValueBinding expression = component.getValueBinding("label");
+        if(expression != null)
+            return expression;
+        
+        //If no label is not specified, use clientId
+        return component.getClientId( facesContext );
+    }
 
     private static Application getApplication()
     {
         FacesContext context = FacesContext.getCurrentInstance();
         if(context != null)
         {
-            return FacesContext.getCurrentInstance().getApplication();
+            return context.getApplication();
         } else
         {
             ApplicationFactory afactory = (ApplicationFactory)FactoryFinder.getFactory("javax.faces.application.ApplicationFactory");
             return afactory.getApplication();
         }
     }
+    
     private static ClassLoader getCurrentLoader(Object defaultObject)
     {
         ClassLoader loader = Thread.currentThread().getContextClassLoader();
@@ -406,17 +636,5 @@ public final class MessageUtils
         }
         return loader;
     }
-
-    public static String getLabel(FacesContext facesContext, UIComponent component) {
-        Object label = component.getAttributes().get("label");
-        if(label != null)
-          return label.toString();
-
-        ValueBinding expression = component.getValueBinding("label");
-        if (expression != null)
-          return expression.getExpressionString();
-
-        //If no label is not specified, use clientId
-        return component.getClientId( facesContext );
-      }
+    
 }

Added: myfaces/commons/branches/jsf_11/myfaces-commons-utils/src/main/java/org/apache/myfaces/commons/util/ParametrizableFacesMessage.java
URL: http://svn.apache.org/viewvc/myfaces/commons/branches/jsf_11/myfaces-commons-utils/src/main/java/org/apache/myfaces/commons/util/ParametrizableFacesMessage.java?rev=1034621&view=auto
==============================================================================
--- myfaces/commons/branches/jsf_11/myfaces-commons-utils/src/main/java/org/apache/myfaces/commons/util/ParametrizableFacesMessage.java (added)
+++ myfaces/commons/branches/jsf_11/myfaces-commons-utils/src/main/java/org/apache/myfaces/commons/util/ParametrizableFacesMessage.java Sat Nov 13 01:34:04 2010
@@ -0,0 +1,118 @@
+/*
+ * 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.commons.util;
+
+import java.text.MessageFormat;
+import java.util.Locale;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.context.FacesContext;
+import javax.faces.el.ValueBinding;
+
+/** 
+ * This class encapsulates a FacesMessage to evaluate the label
+ * expression on render response, where f:loadBundle is available
+ * 
+ * @author Leonardo Uribe (latest modification by $Author: skitching $)
+ * @version $Revision: 676298 $ $Date: 2008-07-13 05:31:48 -0500 (Dom, 13 Jul 2008) $
+ */
+public class ParametrizableFacesMessage extends FacesMessage
+{
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 7792947730961657948L;
+
+    private final Object _args[];
+    private String _evaluatedDetail;
+    private String _evaluatedSummary;
+    private transient Object _evaluatedArgs[];
+    private Locale _locale;
+
+    public ParametrizableFacesMessage(
+            String summary, String detail, Object[] args, Locale locale)
+    {
+        super(summary, detail);
+        if(locale == null) throw new NullPointerException("locale");
+        _locale = locale;
+        _args = args;
+    }
+
+    public ParametrizableFacesMessage(FacesMessage.Severity severity,
+            String summary, String detail, Object[] args, Locale locale)
+    {
+        super(severity, summary, detail);
+        if(locale == null) throw new NullPointerException("locale");
+        _locale = locale;
+        _args = args;
+    }
+
+    public String getDetail()
+    {
+        if (_evaluatedArgs == null && _args != null)
+        {
+            evaluateArgs();
+        }
+        if (_evaluatedDetail == null)
+        {
+            MessageFormat format = new MessageFormat(super.getDetail(), _locale);
+            _evaluatedDetail = format.format(_evaluatedArgs);
+        }
+        return _evaluatedDetail;
+    }
+
+    public String getSummary()
+    {
+        if (_evaluatedArgs == null && _args != null)
+        {
+            evaluateArgs();
+        }
+        if (_evaluatedSummary == null)
+        {
+            MessageFormat format = new MessageFormat(super.getSummary(), _locale);
+            _evaluatedSummary = format.format(_evaluatedArgs);
+        }
+        return _evaluatedSummary;
+    }
+
+    private void evaluateArgs()
+    {
+        _evaluatedArgs = new Object[_args.length];
+        FacesContext facesContext = null;
+        for (int i = 0; i < _args.length; i++)
+        {
+            if (_args[i] == null)
+            {
+                continue;
+            }
+            else if (_args[i] instanceof ValueBinding)
+            {
+                if (facesContext == null)
+                {
+                    facesContext = FacesContext.getCurrentInstance();
+                }
+                _evaluatedArgs[i] = ((ValueBinding)_args[i]).getValue(facesContext);
+            }
+            else 
+            {
+                _evaluatedArgs[i] = _args[i];
+            }
+        }
+    }
+}