package org.springmodules.aop.framework;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.springframework.aop.framework.ProxyFactory;
public class TouchingAfterReturningAdviceTests extends TestCase {
public TouchingAfterReturningAdviceTests() {
super();
}
private static final String BEAN_NAME = "Bean name";
private Bean getBean() {
Bean bean = new DefaultBean();
bean.setBeans(new Bean[] {
new DefaultBean() {
{
setBean(new DefaultBean());
setBeans(new Bean[] { new DefaultBean() });
}
},
new DefaultBean() {
{
setBeans(new Bean[] { new DefaultBean() });
}
}
});
bean.setBean(bean);
bean.setOtherBeans(Arrays.asList(bean.getBeans()));
return bean;
}
public void testTouchingAdvice() {
Bean bean = (Bean)getProxy(getBean(), new String[] { "autoName" }, new String[] { "autoName"}, new String[] { "getBean" });
bean.getBean();
assertEquals(BEAN_NAME, bean.getName());
bean = (Bean)getProxy(getBean(), new String[] { "autoName" }, new String[] { "#returned.{autoName}" }, new String[] { "getBeans" });
Bean[] beans = bean.getBeans();
assertEquals(BEAN_NAME, beans[0].getName());
assertEquals(BEAN_NAME, beans[1].getName());
bean = (Bean)getProxy(getBean(), new Object[] { "autoName" }, new String[] { "#returned.{autoName}" }, new String[] { "getOtherBeans" });
List otherBeans = bean.getOtherBeans();
assertEquals(BEAN_NAME, ((Bean)otherBeans.get(0)).getName());
assertEquals(BEAN_NAME, ((Bean)otherBeans.get(1)).getName());
Map map = new HashMap();
List list = new ArrayList();
list.add("autoName");
map.put("beans", list);
bean = (Bean)getProxy(getBean(), new Object[] { "autoName", map }, new String[] { "#returned.{beans.{autoName}}" }, new String[] { "getBeans" });
beans = bean.getBeans();
assertEquals(BEAN_NAME, beans[0].getName());
assertEquals(BEAN_NAME, beans[1].getName());
assertEquals(BEAN_NAME, beans[0].getBeans()[0].getName());
assertEquals(BEAN_NAME, beans[1].getBeans()[0].getName());
}
private Object getProxy(Object target, Object[] properties, String[] ognl, String[] mappedNames) {
TouchingNameMatchMethodAdvisor advisor = new TouchingNameMatchMethodAdvisor();
advisor.setMappedNames(mappedNames);
advisor.getTouchingAdvice().setProperties(properties);
advisor.getTouchingAdvice().setOgnl(ognl);
ProxyFactory pf = new ProxyFactory(target);
pf.addAdvisor(advisor);
return pf.getProxy();
}
public interface Bean {
public Bean[] getBeans();
public void setBeans(Bean[] beans);
public List getOtherBeans();
public void setOtherBeans(List otherBeans);
public Bean getBean();
public void setBean(Bean bean);
public String getName();
public String getAutoName();
}
public static class DefaultBean implements Bean {
private Bean[] beans = null;
private Bean bean = null;
private List otherBeans = null;
public String name = null;
public Bean getBean() {
return this.bean;
}
public Bean[] getBeans() {
return this.beans;
}
public String getName() {
return this.name;
}
public String getAutoName() {
this.name = BEAN_NAME;
return this.name;
}
public List getOtherBeans() {
return this.otherBeans;
}
public void setBean(Bean bean) {
this.bean = bean;
}
public void setBeans(Bean[] beans) {
this.beans = beans;
}
public void setOtherBeans(List otherBeans) {
this.otherBeans = otherBeans;
}
}
}