package org.springframework.flex.core.io;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.core.convert.support.GenericConversionService;
import org.springframework.flex.core.io.domain.IgnorablePropsObject;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import flex.messaging.io.BeanProxy;
import flex.messaging.io.MapProxy;
import flex.messaging.io.PropertyProxy;
import flex.messaging.io.PropertyProxyRegistry;
import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.ASObject;
import flex.messaging.io.amf.AmfMessageDeserializer;
import flex.messaging.io.amf.AmfMessageSerializer;
import flex.messaging.io.amf.AmfTrace;
import flex.messaging.io.amf.MessageBody;
public class AmfIgnoreSpringPropertyProxyTests {
private static final Log log = LogFactory.getLog(AmfIgnoreSpringPropertyProxyTests.class);
AmfMessageSerializer serializer;
AmfMessageDeserializer deserializer;
AmfTrace serializerTrace;
AmfTrace deserializerTrace;
MockHttpServletResponse response;
MockHttpServletRequest request;
@BeforeClass
public static void ensureBeanProxyInitialization() {
BeanProxy.addIgnoreProperty(ASObject.class, "type");
}
@Before
public void setUp() {
this.serializer = new AmfMessageSerializer();
this.serializerTrace = new AmfTrace();
this.response = new MockHttpServletResponse();
this.serializer.initialize(new SerializationContext(), response.getOutputStream(), serializerTrace);
this.deserializer = new AmfMessageDeserializer();
this.deserializerTrace = new AmfTrace();
this.request = new MockHttpServletRequest();
}
@After
public void trace() throws UnsupportedEncodingException {
log.info("Serializer Trace:\n" + serializerTrace);
log.info("Deserializer Trace:\n" + deserializerTrace);
}
@Test
public void serializeIgnoredProperties() throws IOException, ClassNotFoundException {
PropertyProxyRegistry.getRegistry().register(IgnorablePropsObject.class, createSpringPropertyProxy());
IgnorablePropsObject data = new IgnorablePropsObject();
data.setFoo("foo");
data.setBar("bar");
data.setBaz("baz");
serialize(data);
PropertyProxyRegistry.getRegistry().register(IgnorablePropsObject.class, new ASObjectProxy());
ASObject result = (ASObject) deserialize();
assertTrue(!result.containsKey("foo"));
assertTrue(!result.containsKey("fooField"));
assertTrue(!result.containsKey("bar"));
assertTrue(!result.containsKey("barField"));
assertTrue(!result.containsKey("bazField"));
assertEquals("baz", result.get("baz"));
}
@SuppressWarnings("unchecked")
@Test
public void deserializeIgnoredProperties() throws IOException, ClassNotFoundException {
PropertyProxyRegistry.getRegistry().register(IgnorablePropsObject.class, createSpringPropertyProxy());
ASObject data = new ASObject(IgnorablePropsObject.class.getName());
data.put("foo", "foo");
data.put("bar", "bar");
data.put("baz", "baz");
data.put("zoo", "zoo");
serialize(data);
IgnorablePropsObject result = (IgnorablePropsObject) deserialize();
assertEquals("unset", result.getFoo());
assertEquals("bar", result.getBar());
assertEquals("unset", result.getBaz());
}
@Test
public void serializeIgnoredFields() throws IOException, ClassNotFoundException {
PropertyProxyRegistry.getRegistry().register(IgnorablePropsObject.class, createSpringFieldProxy());
IgnorablePropsObject data = new IgnorablePropsObject();
data.setFoo("foo");
data.setBar("bar");
data.setBaz("baz");
serialize(data);
PropertyProxyRegistry.getRegistry().register(IgnorablePropsObject.class, new ASObjectProxy());
ASObject result = (ASObject) deserialize();
assertTrue(!result.containsKey("foo"));
assertTrue(!result.containsKey("fooField"));
assertTrue(!result.containsKey("bar"));
assertTrue(!result.containsKey("barField"));
assertTrue(!result.containsKey("baz"));
assertEquals("baz", result.get("bazField"));
}
@SuppressWarnings("unchecked")
@Test
public void deserializeIgnoredFields() throws IOException, ClassNotFoundException {
PropertyProxyRegistry.getRegistry().register(IgnorablePropsObject.class, createSpringFieldProxy());
ASObject data = new ASObject(IgnorablePropsObject.class.getName());
data.put("fooField", "foo");
data.put("barField", "bar");
data.put("bazField", "baz");
data.put("zooField", "zoo");
serialize(data);
IgnorablePropsObject result = (IgnorablePropsObject) deserialize();
assertEquals("unset", result.getFoo());
assertEquals("bar", result.getBar());
assertEquals("unset", result.getBaz());
}
private void serialize(Object data) throws IOException {
MessageBody body = new MessageBody();
body.setData(data);
serializer.writeBody(body);
}
private Object deserialize() throws ClassNotFoundException, IOException {
this.request.setContent(this.response.getContentAsByteArray());
this.deserializer.initialize(new SerializationContext(), this.request.getInputStream(), deserializerTrace);
MessageBody body = new MessageBody();
this.deserializer.readBody(body, 0);
return body.getData();
}
private PropertyProxy createSpringPropertyProxy() {
GenericConversionService cs = new GenericConversionService();
cs.addConverter(new NumberConverter());
SpringPropertyProxy voProxy = SpringPropertyProxy.proxyFor(IgnorablePropsObject.class, false, cs);
return voProxy;
}
private PropertyProxy createSpringFieldProxy() {
GenericConversionService cs = new GenericConversionService();
cs.addConverter(new NumberConverter());
SpringPropertyProxy voProxy = SpringPropertyProxy.proxyFor(IgnorablePropsObject.class, true, cs);
return voProxy;
}
@SuppressWarnings("serial")
public static final class ASObjectProxy extends MapProxy {
@Override
public Object createInstance(String className) {
return super.createInstance(null);
}
}
}