SWF-1187 Applied patch attached to JIRA issue, polished unit test a little, and did some testing.

This commit is contained in:
Rossen Stoyanchev
2010-04-07 18:52:27 +00:00
parent 59a9067634
commit 5c5d1c322f
2 changed files with 69 additions and 2 deletions

View File

@@ -1,5 +1,8 @@
package org.springframework.faces.webflow;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -271,7 +274,7 @@ public class FlowFacesContextMessageDelegate {
/**
* Adapter class to convert a {@link FacesMessage} to a Spring {@link Message}. This adapter is required to allow
* <tt>FacesMessages</tt> to be registered with spring while still retaining their mutable nature. It is not
* uncommon for <tt>FacesMessages</tt> to be changed after they gave been added to a <tt>FacesContext</tt>, for
* uncommon for <tt>FacesMessages</tt> to be changed after they have been added to a <tt>FacesContext</tt>, for
* example, from a <tt>PhaseListener</tt>.
* <p>
* NOTE: Only {@link javax.faces.application.FacesMessage} instances are directly adapted, any subclasses will be
@@ -282,8 +285,8 @@ public class FlowFacesContextMessageDelegate {
private static class FlowFacesMessageAdapter extends Message implements MessageResolver {
private String key;
private FacesMessage facesMessage;
private String source;
private transient FacesMessage facesMessage;
public FlowFacesMessageAdapter(String source, String key, FacesMessage message) {
super(null, null, null);
@@ -292,6 +295,30 @@ public class FlowFacesContextMessageDelegate {
this.facesMessage = asStandardFacesMessageInstance(message);
}
// Custom serialization to work around myfaces bug MYFACES-1347
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
oos.writeObject(facesMessage.getSummary());
oos.writeObject(facesMessage.getDetail());
oos.writeInt(facesMessage.getSeverity().getOrdinal());
}
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
ois.defaultReadObject();
String summary = (String) ois.readObject();
String detail = (String) ois.readObject();
int severityOrdinal = ois.readInt();
FacesMessage.Severity severity = FacesMessage.SEVERITY_INFO;
for (Iterator iterator = FacesMessage.VALUES.iterator(); iterator.hasNext();) {
FacesMessage.Severity value = (FacesMessage.Severity) iterator.next();
if (value.getOrdinal() == severityOrdinal) {
severity = value;
}
}
facesMessage = new FacesMessage(severity, summary, detail);
}
/**
* Use standard faces message as required to protect against bugs such as SWF-1073.
*

View File

@@ -1,5 +1,10 @@
package org.springframework.faces.webflow;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -176,6 +181,41 @@ public class FlowFacesContextTests extends TestCase {
assertEquals(3, iterationCount);
}
public final void testMessagesAreSerializable() throws Exception {
DefaultMessageContext messageContext = new DefaultMessageContext();
EasyMock.expect(requestContext.getMessageContext()).andStubReturn(messageContext);
EasyMock.replay(new Object[] { requestContext });
facesContext.addMessage("TESTID", new FacesMessage("summary1"));
FacesMessage sourceMessage = (FacesMessage) facesContext.getMessages("TESTID").next();
sourceMessage.setSummary("summary2");
sourceMessage.setSeverity(FacesMessage.SEVERITY_FATAL);
Serializable mementoWrite = messageContext.createMessagesMemento();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(mementoWrite);
oos.flush();
byte[] byteArray = bos.toByteArray();
oos.close();
ByteArrayInputStream bis = new ByteArrayInputStream(byteArray);
ObjectInputStream ois = new ObjectInputStream(bis);
Serializable mementoRead = (Serializable) ois.readObject();
ois.close();
messageContext.restoreMessages(mementoRead);
EasyMock.reset(new Object[] { requestContext });
EasyMock.expect(requestContext.getMessageContext()).andStubReturn(messageContext);
EasyMock.replay(new Object[] { requestContext });
FacesContext newFacesContext = new FlowFacesContext(requestContext, jsf.facesContext());
assertSame(FacesContext.getCurrentInstance(), newFacesContext);
FacesMessage gotMessage = (FacesMessage) newFacesContext.getMessages("TESTID").next();
assertEquals("summary2", gotMessage.getSummary());
assertEquals(FacesMessage.SEVERITY_FATAL, gotMessage.getSeverity());
}
public final void testGetMaximumSeverity() {
messageContext = prepopulatedMessageContext;
EasyMock.expect(requestContext.getMessageContext()).andStubReturn(messageContext);