SWF-1406 Fix regression in iterating faces messages

This commit is contained in:
Rossen Stoyanchev
2010-10-27 08:01:40 +00:00
parent e1eefc506c
commit e70bca23fb
2 changed files with 97 additions and 73 deletions

View File

@@ -118,46 +118,18 @@ public class FlowFacesContextMessageDelegate {
* @see Jsf2FlowFacesContext#getMessageList()
*/
public List<FacesMessage> getMessageList() {
return getMessageList(null);
return new FacesMessageIterator().asList();
}
/**
* @see Jsf2FlowFacesContext#getMessageList(String)
*/
public List<FacesMessage> getMessageList(String clientId) {
List<FacesMessage> messages = getFacesMessages(clientId);
if (null == messages) {
return Collections.unmodifiableList(Collections.<FacesMessage> emptyList());
} else {
return Collections.unmodifiableList(messages);
}
return new FacesMessageIterator(clientId).asList();
}
// ------------------ Private helper methods ----------------------//
private List<FacesMessage> getFacesMessages() {
return getFacesMessages(null);
}
private List<FacesMessage> getFacesMessages(String clientId) {
List<FacesMessage> translatedMessages = new ArrayList<FacesMessage>();
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<FacesMessage> {
private FacesMessage[] messages;
private List<FacesMessage> 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<FacesMessage>();
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<FacesMessage>();
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<FacesMessage> asList() {
if (null == messages) {
return Collections.unmodifiableList(Collections.<FacesMessage> emptyList());
} else {
return Collections.unmodifiableList(messages);
}
}
}
private class ClientIdIterator implements Iterator<String> {
@@ -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);
}
}

View File

@@ -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()