diff --git a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContextMessageDelegate.java b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContextMessageDelegate.java index a4221199..baf14e8b 100644 --- a/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContextMessageDelegate.java +++ b/spring-faces/src/main/java/org/springframework/faces/webflow/FlowFacesContextMessageDelegate.java @@ -203,7 +203,9 @@ public class FlowFacesContextMessageDelegate { public Object next() { Message next = messages[++currentIndex]; - if (next.getSource().toString().endsWith(SUMMARY_MESSAGE_KEY)) { + if (next.getSource() == null) { + return null; + } else if (next.getSource().toString().endsWith(SUMMARY_MESSAGE_KEY)) { return next.getSource().toString().replaceAll(SUMMARY_MESSAGE_KEY, ""); } else { return next.getSource().toString(); @@ -253,11 +255,14 @@ public class FlowFacesContextMessageDelegate { private Set identifiedMessageSources = new HashSet(); + // From getClientIdsWithMessages docs: If any messages have been queued that were not associated with + // any specific client identifier, a null value will be included in the iterated values. public boolean test(Message message) { - if (message.getSource() == null || message.getSource().equals("") - || message.getSource().equals(nullSummaryId) - || message.getSource().toString().endsWith(DETAIL_MESSAGE_KEY)) { + if (message.getSource() != null && message.getSource().toString().endsWith(DETAIL_MESSAGE_KEY)) { return false; + } else if (message.getSource() == null || message.getSource().equals("") + || message.getSource().equals(nullSummaryId)) { + return identifiedMessageSources.add(null); } return identifiedMessageSources.add(message.getSource()); } diff --git a/spring-faces/src/test/java/org/springframework/faces/webflow/FlowFacesContextTests.java b/spring-faces/src/test/java/org/springframework/faces/webflow/FlowFacesContextTests.java index 78fffc6b..79285497 100644 --- a/spring-faces/src/test/java/org/springframework/faces/webflow/FlowFacesContextTests.java +++ b/spring-faces/src/test/java/org/springframework/faces/webflow/FlowFacesContextTests.java @@ -1,6 +1,8 @@ package org.springframework.faces.webflow; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; @@ -86,7 +88,7 @@ public class FlowFacesContextTests extends TestCase { assertNotNull(i.next()); iterationCount++; } - assertEquals("There should be 5 messages to iterate", 5, iterationCount); + assertEquals("There should be 6 messages to iterate", 6, iterationCount); } public final void testMutableGetMessages() { @@ -117,11 +119,11 @@ public class FlowFacesContextTests extends TestCase { while (i.hasNext()) { FacesMessage message = (FacesMessage) i.next(); assertNotNull(message); - assertEquals("componentId_summary", message.getSummary()); - assertEquals("componentId_detail", message.getDetail()); + assertEquals("componentId_summary" + (iterationCount + 1), message.getSummary()); + assertEquals("componentId_detail" + (iterationCount + 1), message.getDetail()); iterationCount++; } - assertEquals(1, iterationCount); + assertEquals(2, iterationCount); } public final void testGetMessagesByClientId_ForUserMessage() { @@ -159,13 +161,19 @@ public class FlowFacesContextTests extends TestCase { EasyMock.expect(requestContext.getMessageContext()).andStubReturn(messageContext); EasyMock.replay(new Object[] { requestContext }); + List expectedOrderedIds = new ArrayList(); + expectedOrderedIds.add(null); + expectedOrderedIds.add("componentId"); + expectedOrderedIds.add("userMessage"); + int iterationCount = 0; Iterator i = facesContext.getClientIdsWithMessages(); while (i.hasNext()) { - i.next(); + String clientId = (String) i.next(); + assertEquals("Client id not expected", expectedOrderedIds.get(iterationCount), clientId); iterationCount++; } - assertEquals(2, iterationCount); + assertEquals(3, iterationCount); } public final void testGetMaximumSeverity() { @@ -189,9 +197,13 @@ public class FlowFacesContextTests extends TestCase { prepopulatedMessageContext.addMessage(new MessageBuilder().source("null_detail").defaultText("foo").info() .build()); prepopulatedMessageContext.addMessage(new MessageBuilder().source("componentId_summary").defaultText( - "componentId_summary").warning().build()); + "componentId_summary1").warning().build()); prepopulatedMessageContext.addMessage(new MessageBuilder().source("componentId_detail").defaultText( - "componentId_detail").warning().build()); + "componentId_detail1").warning().build()); + prepopulatedMessageContext.addMessage(new MessageBuilder().source("componentId_summary").defaultText( + "componentId_summary2").warning().build()); + prepopulatedMessageContext.addMessage(new MessageBuilder().source("componentId_detail").defaultText( + "componentId_detail2").warning().build()); prepopulatedMessageContext.addMessage(new MessageBuilder().source("userMessage").defaultText("userMessage") .info().build()); prepopulatedMessageContext.addMessage(new MessageBuilder().source("null_summary").defaultText("baz").error()