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 c4557e7b..04a34f6a 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 @@ -118,46 +118,18 @@ public class FlowFacesContextMessageDelegate { * @see Jsf2FlowFacesContext#getMessageList() */ public List getMessageList() { - return getMessageList(null); + return new FacesMessageIterator().asList(); } /** * @see Jsf2FlowFacesContext#getMessageList(String) */ public List getMessageList(String clientId) { - List messages = getFacesMessages(clientId); - if (null == messages) { - return Collections.unmodifiableList(Collections. emptyList()); - } else { - return Collections.unmodifiableList(messages); - } + return new FacesMessageIterator(clientId).asList(); } // ------------------ Private helper methods ----------------------// - private List getFacesMessages() { - return getFacesMessages(null); - } - - private List getFacesMessages(String clientId) { - List translatedMessages = new ArrayList(); - - Message[] summaryMessages = context.getMessageContext().getMessagesByCriteria( - new MatchBySuffixCriteria(clientId, SUMMARY_MESSAGE_KEY)); - Message[] detailMessages = context.getMessageContext().getMessagesByCriteria( - new MatchBySuffixCriteria(clientId, DETAIL_MESSAGE_KEY)); - for (int i = 0; i < summaryMessages.length; i++) { - translatedMessages.add(toFacesMessage(summaryMessages[i], detailMessages[i])); - } - - Message[] userMessages = context.getMessageContext().getMessagesByCriteria(new UserMessageCriteria(clientId)); - for (int z = 0; z < userMessages.length; z++) { - translatedMessages.add(toFacesMessage(userMessages[z], userMessages[z])); - } - - return translatedMessages; - } - private FacesMessage toFacesMessage(Message summaryMessage, Message detailMessage) { // If we can return the actual message instance. @@ -182,31 +154,59 @@ public class FlowFacesContextMessageDelegate { private class FacesMessageIterator implements Iterator { - private FacesMessage[] messages; + private List messages; private int currentIndex = -1; protected FacesMessageIterator() { - this.messages = getFacesMessages().toArray(new FacesMessage[] {}); + Message[] summaryMessages = context.getMessageContext().getMessagesByCriteria(new SummaryMessageCriteria()); + Message[] detailMessages = context.getMessageContext().getMessagesByCriteria(new DetailMessageCriteria()); + Message[] userMessages = context.getMessageContext().getMessagesByCriteria(new UserMessageCriteria()); + + messages = new ArrayList(); + for (int i = 0; i < summaryMessages.length; i++) { + messages.add(toFacesMessage(summaryMessages[i], detailMessages[i])); + } + for (int z = 0; z < userMessages.length; z++) { + messages.add(toFacesMessage(userMessages[z], userMessages[z])); + } } protected FacesMessageIterator(String clientId) { - this.messages = getFacesMessages(clientId).toArray(new FacesMessage[] {}); + Message[] summaryMessages = context.getMessageContext().getMessagesBySource(clientId + SUMMARY_MESSAGE_KEY); + Message[] detailMessages = context.getMessageContext().getMessagesBySource(clientId + DETAIL_MESSAGE_KEY); + Message[] userMessages = context.getMessageContext().getMessagesBySource(clientId); + + this.messages = new ArrayList(); + for (int i = 0; i < summaryMessages.length; i++) { + messages.add(toFacesMessage(summaryMessages[i], detailMessages[i])); + } + for (int z = 0; z < userMessages.length; z++) { + messages.add(toFacesMessage(userMessages[z], userMessages[z])); + } } public boolean hasNext() { - return messages.length > currentIndex + 1; + return messages.size() > currentIndex + 1; } public FacesMessage next() { currentIndex++; - return messages[currentIndex]; + return messages.get(currentIndex); } public void remove() { throw new UnsupportedOperationException("Messages cannot be removed through this iterator."); } + public List asList() { + if (null == messages) { + return Collections.unmodifiableList(Collections. emptyList()); + } else { + return Collections.unmodifiableList(messages); + } + } + } private class ClientIdIterator implements Iterator { @@ -240,46 +240,34 @@ public class FlowFacesContextMessageDelegate { } - private class MatchBySuffixCriteria implements MessageCriteria { - - private String clientId; - private String suffix; - - public MatchBySuffixCriteria(String clientId, String suffix) { - this.clientId = clientId; - this.suffix = suffix; - } + private class SummaryMessageCriteria implements MessageCriteria { public boolean test(Message message) { - boolean result = false; - if (message.getSource() != null) { - if (clientId != null) { - result = message.getSource().toString().equals(clientId + suffix); - } else { - result = message.getSource().toString().endsWith(suffix); - } + if (message.getSource() == null) { + return false; } - return result; + return message.getSource().toString().endsWith(SUMMARY_MESSAGE_KEY); + } + } + + private class DetailMessageCriteria implements MessageCriteria { + + public boolean test(Message message) { + if (message.getSource() == null) { + return false; + } + return message.getSource().toString().endsWith(DETAIL_MESSAGE_KEY); } } private class UserMessageCriteria implements MessageCriteria { - private String clientId; - - public UserMessageCriteria(String clientId) { - this.clientId = clientId; - } - public boolean test(Message message) { - boolean result = false; - if (clientId != null) { - result = new MatchBySuffixCriteria(clientId, "").test(message); - } else { - result = (!new MatchBySuffixCriteria(clientId, SUMMARY_MESSAGE_KEY).test(message)) - && (!new MatchBySuffixCriteria(clientId, DETAIL_MESSAGE_KEY).test(message)); + if (message.getSource() == null) { + return true; } - return result; + return !message.getSource().toString().endsWith(SUMMARY_MESSAGE_KEY) + && !message.getSource().toString().endsWith(DETAIL_MESSAGE_KEY); } } 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 cbedefc0..ba4ced67 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 @@ -63,6 +63,42 @@ public class FlowFacesContextTests extends TestCase { } + public final void testGetGlobalMessagesOnly() { + messageContext = new DefaultMessageContext(); + EasyMock.expect(requestContext.getMessageContext()).andStubReturn(messageContext); + EasyMock.replay(new Object[] { requestContext }); + + facesContext.addMessage("foo", new FacesMessage(FacesMessage.SEVERITY_INFO, "foo", "bar")); + facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "FOO", "BAR")); + + int iterationCount = 0; + Iterator i = facesContext.getMessages(null); + while (i.hasNext()) { + FacesMessage message = (FacesMessage) i.next(); + assertNotNull(message); + iterationCount++; + } + assertEquals(1, iterationCount); + } + + public final void testGetAllMessages() { + messageContext = new DefaultMessageContext(); + EasyMock.expect(requestContext.getMessageContext()).andStubReturn(messageContext); + EasyMock.replay(new Object[] { requestContext }); + + facesContext.addMessage("foo", new FacesMessage(FacesMessage.SEVERITY_INFO, "foo", "bar")); + facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "FOO", "BAR")); + + int iterationCount = 0; + Iterator i = facesContext.getMessages(); + while (i.hasNext()) { + FacesMessage message = (FacesMessage) i.next(); + assertNotNull(message); + iterationCount++; + } + assertEquals(2, iterationCount); + } + public final void testAddMessages_MultipleNullIds() { messageContext = new DefaultMessageContext(); EasyMock.expect(requestContext.getMessageContext()).andStubReturn(messageContext); @@ -232,14 +268,14 @@ public class FlowFacesContextTests extends TestCase { .build()); prepopulatedMessageContext.addMessage(new MessageBuilder().source("null_detail").defaultText("foo").info() .build()); - prepopulatedMessageContext.addMessage(new MessageBuilder().source("componentId_summary").defaultText( - "componentId_summary1").warning().build()); - prepopulatedMessageContext.addMessage(new MessageBuilder().source("componentId_detail").defaultText( - "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("componentId_summary") + .defaultText("componentId_summary1").warning().build()); + prepopulatedMessageContext.addMessage(new MessageBuilder().source("componentId_detail") + .defaultText("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()