package org.oddjob.beanbus.mega;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import junit.framework.TestCase;
import org.oddjob.arooa.ArooaDescriptor;
import org.oddjob.arooa.ArooaSession;
import org.oddjob.arooa.ComponentTrinity;
import org.oddjob.arooa.deploy.ConfigurationDescriptorFactory;
import org.oddjob.arooa.parsing.MockArooaContext;
import org.oddjob.arooa.standard.StandardArooaSession;
import org.oddjob.arooa.xml.XMLConfiguration;
import org.oddjob.beanbus.AbstractFilter;
import org.oddjob.beanbus.BusFilter;
import org.oddjob.beanbus.Destination;
import org.oddjob.beanbus.Outbound;
import org.oddjob.framework.ComponentWrapper;
import org.oddjob.framework.DefaultInvocationHandler;
public class OutboundStratagiesTest extends TestCase {
public class AnOutbound extends AbstractFilter<String, String> {
Collection<? super String> to;
@Override
protected String filter(String from) {
return null;
}
@Override
public void setTo(Collection<? super String> destination) {
this.to = destination;
}
}
public void testInstanceAlready() {
OutboundStrategies test = new OutboundStrategies();
AnOutbound outbound = new AnOutbound();
Outbound<String> result = test.outboundFor(outbound, null);
assertSame(outbound, result);
}
public static class MyOutbound {
Collection<String> stuff;
@Destination
public void setSomeStuff(Collection<String> stuff) {
this.stuff = stuff;
}
}
public void testFromAnnotation() {
OutboundStrategies test = new OutboundStrategies();
MyOutbound outbound = new MyOutbound();
ArooaSession session = new StandardArooaSession();
session.getComponentPool().registerComponent(
new ComponentTrinity(outbound,
outbound, new MockArooaContext()), null);
Outbound<String> result = test.outboundFor(outbound, session);
List<String> list = new ArrayList<String>();
result.setTo(list);
assertSame(list, outbound.stuff);
}
public static class IndependentOutbound {
Collection<String> stuff;
public void setStuff(Collection<String> stuff) {
this.stuff = stuff;
}
}
public void testFromDescriptorAnnotation() {
String descriptorXml =
"<arooa:descriptor xmlns:arooa='http://rgordon.co.uk/oddjob/arooa'" +
" namespace='http://rgordon.co.uk/test'>" +
" <components>" +
" <arooa:bean-def element='my-bean'" +
" className='" + IndependentOutbound.class.getName() + "'>" +
" <properties>" +
" <arooa:property name='stuff' " +
" annotation='org.oddjob.beanbus.Destination'/>" +
" </properties>" +
" </arooa:bean-def>" +
" </components>" +
"</arooa:descriptor>";
ArooaDescriptor descriptor =
new ConfigurationDescriptorFactory(
new XMLConfiguration("XML", descriptorXml)
).createDescriptor(getClass().getClassLoader());
OutboundStrategies test = new OutboundStrategies();
IndependentOutbound outbound = new IndependentOutbound();
ArooaSession session = new StandardArooaSession(descriptor);
session.getComponentPool().registerComponent(
new ComponentTrinity(outbound,
outbound, new MockArooaContext()), null);
Outbound<String> result = test.outboundFor(outbound, session);
assertNotNull(result);
List<String> list = new ArrayList<String>();
result.setTo(list);
assertSame(list, outbound.stuff);
}
public void testWithProxy() {
// Method[] ms = BusFilter.class.getDeclaredMethods();
// for (Method m : ms) {
// System.out.println(m.toString());
// }
AnOutbound outbound = new AnOutbound();
DefaultInvocationHandler handler = new DefaultInvocationHandler();
Class<?>[] interfaces = new Class[] { BusFilter.class };
Object proxy = Proxy.newProxyInstance(getClass().getClassLoader(),
interfaces, handler);
handler.initialise(new ComponentWrapper() {}, new Class[0],
outbound, interfaces);
OutboundStrategies test = new OutboundStrategies();
Outbound<String> result = test.outboundFor(proxy,
new StandardArooaSession());
List<String> list = new ArrayList<String>();
result.setTo(list);
assertSame(list, outbound.to);
}
}