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 2009/09/24 04:34:54 UTC

svn commit: r818350 - in /myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html: HtmlMessageRendererBase.java HtmlMessagesRendererBase.java

Author: lu4242
Date: Thu Sep 24 02:34:53 2009
New Revision: 818350

URL: http://svn.apache.org/viewvc?rev=818350&view=rev
Log:
MYFACES-2275 UIMessages.getFor (Filter messages of a selected component) (Thanks to Jakob Korherr for provide this patch)

Modified:
    myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessageRendererBase.java
    myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessagesRendererBase.java

Modified: myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessageRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessageRendererBase.java?rev=818350&r1=818349&r2=818350&view=diff
==============================================================================
--- myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessageRendererBase.java (original)
+++ myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessageRendererBase.java Thu Sep 24 02:34:53 2009
@@ -166,7 +166,8 @@
             behaviors = ((ClientBehaviorHolder) message).getClientBehaviors();
         }
         
-        if (message.getId() != null && (!message.getId().startsWith(UIViewRoot.UNIQUE_ID_PREFIX) || !behaviors.isEmpty()))
+        if (message.getId() != null && (!message.getId().startsWith(UIViewRoot.UNIQUE_ID_PREFIX) 
+                || (behaviors != null && !behaviors.isEmpty())))
         {
             span = true;
 

Modified: myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessagesRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessagesRendererBase.java?rev=818350&r1=818349&r2=818350&view=diff
==============================================================================
--- myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessagesRendererBase.java (original)
+++ myfaces/shared/trunk_4.0.x/core/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlMessagesRendererBase.java Thu Sep 24 02:34:53 2009
@@ -18,11 +18,10 @@
  */
 package org.apache.myfaces.shared.renderkit.html;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.myfaces.shared.renderkit.JSFAttr;
-import org.apache.myfaces.shared.renderkit.RendererUtils;
-import org.apache.myfaces.shared.util.NullIterator;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.NoSuchElementException;
 
 import javax.faces.application.FacesMessage;
 import javax.faces.component.UIComponent;
@@ -30,9 +29,12 @@
 import javax.faces.component.html.HtmlMessages;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.shared.renderkit.JSFAttr;
+import org.apache.myfaces.shared.renderkit.RendererUtils;
+import org.apache.myfaces.shared.util.NullIterator;
 
 /**
  * @author Manfred Geiler (latest modification by $Author$)
@@ -51,8 +53,21 @@
                                   UIComponent messages)
             throws IOException
     {
+        // check the for attribute
+        String forAttr = getFor(messages);
+        UIComponent forComponent = null;
+        if(forAttr != null && !"".equals(forAttr))
+        {
+            forComponent = messages.findComponent(forAttr);
+            if (forComponent == null)
+            {
+                log.error("Could not render Messages. Unable to find component '" + forAttr + "' (calling findComponent on component '" + messages.getClientId(facesContext) + "'). If the provided id was correct, wrap the message and its component into an h:panelGroup or h:panelGrid.");
+                return;
+            }
+        }
+        
         MessagesIterator messagesIterator = new MessagesIterator(facesContext,
-                isGlobalOnly(messages));
+                isGlobalOnly(messages), forComponent);
 
         if (messagesIterator.hasNext())
         {
@@ -337,8 +352,16 @@
             return (String)component.getAttributes().get(JSFAttr.LAYOUT_ATTR);
         }
     }
-
-
+    
+    protected String getFor(UIComponent component)
+    {
+        if (component instanceof UIMessages)
+        {
+            return ((UIMessages) component).getFor();
+        }
+ 
+        return (String) component.getAttributes().get(JSFAttr.FOR_ATTR); 
+    }
 
     private static class MessagesIterator implements Iterator
     {
@@ -348,21 +371,32 @@
         private Iterator _componentMessagesIterator = null;
         private String _clientId = null;
 
-        public MessagesIterator(FacesContext facesContext, boolean globalOnly)
+        public MessagesIterator(FacesContext facesContext, boolean globalOnly, UIComponent forComponent)
         {
             _facesContext = facesContext;
-            if (globalOnly)
+            // The for attribute is mutually exclusive with globalOnly and take precedence if used.
+            if(forComponent != null)
             {
-                _globalMessagesIterator = facesContext.getMessages(null);
-                _clientIdsWithMessagesIterator = NullIterator.instance();
+                _clientId = forComponent.getClientId();
+                _componentMessagesIterator = facesContext.getMessages(_clientId);
+                _globalMessagesIterator = org.apache.myfaces.shared.util.NullIterator.instance();
+                _clientIdsWithMessagesIterator = org.apache.myfaces.shared.util.NullIterator.instance();
             }
-            else
+            else 
             {
-                _globalMessagesIterator = org.apache.myfaces.shared.util.NullIterator.instance();
-                _clientIdsWithMessagesIterator = facesContext.getClientIdsWithMessages();
+                if (globalOnly)
+                {
+                    _globalMessagesIterator = facesContext.getMessages(null);
+                    _clientIdsWithMessagesIterator = NullIterator.instance();
+                }
+                else
+                {
+                    _globalMessagesIterator = org.apache.myfaces.shared.util.NullIterator.instance();
+                    _clientIdsWithMessagesIterator = facesContext.getClientIdsWithMessages();
+                }
+                _componentMessagesIterator = null;
+                _clientId = null;
             }
-            _componentMessagesIterator = null;
-            _clientId = null;
         }
 
         public boolean hasNext()
@@ -382,12 +416,13 @@
             {
                 return _componentMessagesIterator.next();
             }
-            else
+            else if(_clientIdsWithMessagesIterator.hasNext())
             {
                 _clientId = (String)_clientIdsWithMessagesIterator.next();
                 _componentMessagesIterator = _facesContext.getMessages(_clientId);
                 return _componentMessagesIterator.next();
             }
+            throw new NoSuchElementException();
         }
 
         public void remove()