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()
Show replies by date