[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