[seam-commits] Seam SVN: r10724 - in modules/trunk/faces/src: main/java/org/jboss/seam/faces/lifecycle and 1 other directories.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Wed Apr 29 14:04:53 EDT 2009


Author: dan.j.allen
Date: 2009-04-29 14:04:53 -0400 (Wed, 29 Apr 2009)
New Revision: 10724

Modified:
   modules/trunk/faces/src/main/java/org/jboss/seam/faces/FacesStatusMessages.java
   modules/trunk/faces/src/main/java/org/jboss/seam/faces/lifecycle/TransferStatusMessagesListener.java
   modules/trunk/faces/src/test/java/org/jboss/seam/faces/FacesStatusMessagesTest.java
Log:
test that status messages for control are registered with proper client id


Modified: modules/trunk/faces/src/main/java/org/jboss/seam/faces/FacesStatusMessages.java
===================================================================
--- modules/trunk/faces/src/main/java/org/jboss/seam/faces/FacesStatusMessages.java	2009-04-29 17:13:23 UTC (rev 10723)
+++ modules/trunk/faces/src/main/java/org/jboss/seam/faces/FacesStatusMessages.java	2009-04-29 18:04:53 UTC (rev 10724)
@@ -80,7 +80,7 @@
          String clientId = getClientId(messagesForKey.getKey(), facesContext);
          if (clientId == null)
          {
-            log.warn("Could not locate clientId " + clientId + " when registering JSF messages for control. A global message will be created instead.");
+            log.warn("Could not locate control '" + messagesForKey.getKey() + "' when registering JSF message. A global message will be created as a fallback.");
          }
          for (StatusMessage statusMessage : messagesForKey.getValue())
          {
@@ -142,7 +142,7 @@
 
    private boolean isAbsoluteClientIdPresent(String targetId, FacesContext facesContext)
    {
-      return facesContext.getViewRoot().findComponent(":" + targetId) != null;
+      return facesContext.getViewRoot().findComponent(targetId) != null;
    }
 
    private String getClientId(UIComponent component, String targetLocalId, FacesContext facesContext)

Modified: modules/trunk/faces/src/main/java/org/jboss/seam/faces/lifecycle/TransferStatusMessagesListener.java
===================================================================
--- modules/trunk/faces/src/main/java/org/jboss/seam/faces/lifecycle/TransferStatusMessagesListener.java	2009-04-29 17:13:23 UTC (rev 10723)
+++ modules/trunk/faces/src/main/java/org/jboss/seam/faces/lifecycle/TransferStatusMessagesListener.java	2009-04-29 18:04:53 UTC (rev 10724)
@@ -1,30 +1,41 @@
 package org.jboss.seam.faces.lifecycle;
 
 import java.beans.Introspector;
-import javax.faces.context.FacesContext;
-import javax.faces.event.ComponentSystemEventListener;
 import javax.faces.event.SystemEvent;
 import javax.faces.event.SystemEventListener;
 import org.jboss.seam.el.Expressions;
 import org.jboss.seam.faces.FacesExpressions;
 import org.jboss.seam.international.StatusMessages;
+import org.jboss.webbeans.log.LogProvider;
+import org.jboss.webbeans.log.Logging;
 
 /**
  * A {@link SystemEventListener} that observes the PreRenderViewEvent and
  * transposes Seam StatusMessage objects into FacesMessage objects
  * and transfers them to the FacesContext.
  *
+ * FIXME currently losing messages over a redirect after conversation ends (and perhaps when no conversation present)
+ *
  * @author Dan Allen
  */
 //@ListenerFor(systemEventClass = PreRenderViewEvent.class, sourceClass = UIViewRoot.class)
 public class TransferStatusMessagesListener implements SystemEventListener
 {
+   private static final LogProvider log = Logging.getLogProvider(TransferStatusMessagesListener.class);
+
    public void processEvent(SystemEvent preRenderViewEvent)
    {
       Expressions expressions = new FacesExpressions();
       // FIXME this is kind of ugly...reminds me of the bad old days of JSF managed beans
       StatusMessages statusMessages = (StatusMessages) expressions.createValueExpression(getBeanExpression(StatusMessages.class)).getValue();
-      statusMessages.onBeforeRender();
+      if (statusMessages != null)
+      {
+         statusMessages.onBeforeRender();
+      }
+      else
+      {
+         log.warn("Could not locate StatusMessages bean. Status messages will not be transfered to FacesContext.");
+      }
    }
 
    public boolean isListenerForSource(Object source)

Modified: modules/trunk/faces/src/test/java/org/jboss/seam/faces/FacesStatusMessagesTest.java
===================================================================
--- modules/trunk/faces/src/test/java/org/jboss/seam/faces/FacesStatusMessagesTest.java	2009-04-29 17:13:23 UTC (rev 10723)
+++ modules/trunk/faces/src/test/java/org/jboss/seam/faces/FacesStatusMessagesTest.java	2009-04-29 18:04:53 UTC (rev 10724)
@@ -1,6 +1,11 @@
 package org.jboss.seam.faces;
 
+import java.util.List;
 import javax.faces.application.FacesMessage;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIInput;
+import javax.faces.component.UINamingContainer;
+import javax.faces.component.UIViewRoot;
 import static org.testng.Assert.*;
 
 import javax.faces.context.FacesContext;
@@ -8,6 +13,7 @@
 import org.jboss.seam.el.Expressions;
 import org.jboss.seam.international.Interpolator;
 import org.jboss.seam.international.LocaleProducer;
+import org.jboss.seam.international.StatusMessage;
 import org.jboss.seam.international.StatusMessages;
 import org.jboss.seam.mock.faces.MockFacesContext;
 import org.jboss.testharness.impl.packaging.Artifact;
@@ -50,7 +56,7 @@
     * upon the call to onBeforeRender().
     */
    @Test
-   public void testStatusMessagesTransferToFacesMessages()
+   public void testGlobalStatusMessagesGetTransferedToFacesMessages()
    {
       FacesContext facesContext = FacesContext.getCurrentInstance();
       facesContext.setCurrentPhaseId(PhaseId.INVOKE_APPLICATION);
@@ -70,16 +76,58 @@
       FacesMessage facesMessage = facesContext.getMessageList().get(0);
       assertEquals(facesMessage.getSeverity(), FacesMessage.SEVERITY_INFO);
       assertEquals(facesMessage.getSummary(), "You've booked a night at Mandalay Bay. Bon chance!");
-      // this assignment happens inside the FacesMessage implementation
+      // NOTE this assignment happens inside the FacesMessage implementation
       assertEquals(facesMessage.getSummary(), facesMessage.getDetail());
    }
 
-   // TODO test addToControl() because there is important logic in the getClientId() method
-   // TODO either test TransferStatusMessagesListener here or create a dedicated test for it
+   /**
+    * Verify that a message can be added to a control based on either it's absolute client id
+    * or it's local id. Verify that if the component cannot be found, a global message is created.
+    */
+   @Test
+   public void testStatusMessagesForControlGetTransferedToFacesMessages()
+   {
+      FacesContext facesContext = FacesContext.getCurrentInstance();
 
+      facesContext.setCurrentPhaseId(PhaseId.RESTORE_VIEW);
+      UIViewRoot viewRoot = new UIViewRoot();
+      UIComponent form = new UINamingContainer();
+      form.setId("form");
+      UIComponent input = new UIInput();
+      input.setId("input");
+      form.getChildren().add(input);
+      viewRoot.getChildren().add(form);
+      facesContext.setViewRoot(viewRoot);
+
+      facesContext.setCurrentPhaseId(PhaseId.INVOKE_APPLICATION);
+      StatusMessages statusMessages = getStatusMessagesInstance();
+      statusMessages.addToControl("input", StatusMessage.Severity.WARN, "First validation message for input");
+      statusMessages.addToControl("form:input", StatusMessage.Severity.WARN, "Second validation message for input");
+      statusMessages.addToControl("NO_SUCH_ID", StatusMessage.Severity.WARN, "Validation message that becomes global");
+
+      assertEquals(statusMessages.getKeyedMessages().size(), 3);
+      assertEquals(facesContext.getMessageList().size(), 0);
+
+      facesContext.setCurrentPhaseId(PhaseId.RENDER_RESPONSE);
+      statusMessages.onBeforeRender();
+
+      assertEquals(statusMessages.getGlobalMessages().size(), 0);
+      assertEquals(facesContext.getMessageList().size(), 3);
+      assertEquals(facesContext.getMessageList(null).size(), 1);
+      FacesMessage globalMessage = facesContext.getMessageList(null).get(0);
+      assertSame(globalMessage.getSeverity(), FacesMessage.SEVERITY_WARN);
+      assertEquals(globalMessage.getSummary(), "Validation message that becomes global");
+      List<FacesMessage> messagesForInput = facesContext.getMessageList("form:input");
+      assertEquals(messagesForInput.size(), 2);
+      assertEquals(messagesForInput.get(0).getSummary(), "First validation message for input");
+      assertEquals(messagesForInput.get(1).getSummary(), "Second validation message for input");
+   }
+
+   // TODO either test TransferStatusMessagesListener here or create a dedicated test for it; to test lookup of StatusMessages from listener
+
    private void installMockFacesContext()
    {
-      new MockFacesContext().setCurrent();
+      new MockFacesContext(true).setCurrent();
    }
 
    private void activateConversationContext()




More information about the seam-commits mailing list