package aop;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import org.jdal.annotation.SerializableProxy;
import org.jdal.aop.SerializableObject;
import org.jdal.aop.config.SerializableAnnotationBeanPostProcessor;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.aop.framework.Advised;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.ClassUtils;
import org.springframework.util.SerializationUtils;
/**
* Serializable proxy tests.
*
* @author Jose Luis Martin
* @since 2.0
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=SerializableConfig.class)
public class SerializableProxyTest {
@Autowired
private ConfigurableBean configurableBean;
@Autowired
private AutowiredBean autowiredBean;
@Autowired
private ApplicationContext context;
@Test
public void testSerializablePostProcessor() {
byte[] ser = SerializationUtils.serialize(configurableBean);
ConfigurableBean cb = (ConfigurableBean) SerializationUtils.deserialize(ser);
assertEquals(cb.getNoSerializableBean(), configurableBean.getNoSerializableBean());
ser = SerializationUtils.serialize(autowiredBean);
AutowiredBean ab = (AutowiredBean) SerializationUtils.deserialize(ser);
assertEquals(autowiredBean.getNoSerializableBean(), ab.getNoSerializableBean());
}
@Test
public void testAutoproxySerializableAdvisor() throws Exception {
NoSerializableAnnotatedBean nsab = context.getBean("noSerializableAnnotatedBean",
NoSerializableAnnotatedBean.class);
assertTrue(ClassUtils.isAssignable(Advised.class, nsab.getClass()));
Advised advised = (Advised) nsab;
List<Class<?>> proxiedInterfaces = Arrays.asList(advised.getProxiedInterfaces());
assertTrue(proxiedInterfaces.contains(SerializableObject.class));
assertFalse(advised.getTargetSource().getTarget() instanceof Advised);
}
}
@Configuration
@ImportResource("/aop/serializable.xml")
class SerializableConfig {
@Bean
public ConfigurableBean getConfigurableBean() {
ConfigurableBean bean = new ConfigurableBean();
bean.setNoSerializableBean(getNoSerializableBean());
return bean;
}
@Bean
public AutowiredBean getAutowiredBean() {
AutowiredBean autowiredBean = new AutowiredBean();
autowiredBean.setNoSerializableBean(getNoSerializableBean());
return autowiredBean;
}
@Bean
public NoSerializableBean getNoSerializableBean() {
return new NoSerializableBean();
}
@Bean
public SerializableAnnotationBeanPostProcessor serializableAnnotationBeanPostProcessor() {
return new SerializableAnnotationBeanPostProcessor();
}
}
class NoSerializableBean {
}
@SerializableProxy
class NoSerializableAnnotatedBean {
public void sayHello() {
System.out.println("Hello");
}
}
class ConfigurableBean implements Serializable {
@SerializableProxy
private NoSerializableBean noSerializableBean;
public NoSerializableBean getNoSerializableBean() {
return noSerializableBean;
}
public void setNoSerializableBean(NoSerializableBean noSerializableBean) {
this.noSerializableBean = noSerializableBean;
}
}
class AutowiredBean implements Serializable {
@Autowired
@SerializableProxy
private NoSerializableBean noSerializableBean;
public NoSerializableBean getNoSerializableBean() {
return noSerializableBean;
}
public void setNoSerializableBean(NoSerializableBean noSerializableBean) {
this.noSerializableBean = noSerializableBean;
}
}