package org.oddjob;
import junit.framework.TestCase;
import org.oddjob.arooa.ArooaBeanDescriptor;
import org.oddjob.arooa.ArooaConfiguration;
import org.oddjob.arooa.ArooaDescriptor;
import org.oddjob.arooa.ArooaParseException;
import org.oddjob.arooa.ArooaSession;
import org.oddjob.arooa.ArooaType;
import org.oddjob.arooa.ComponentTrinity;
import org.oddjob.arooa.ConfigurationHandle;
import org.oddjob.arooa.MockConfigurationHandle;
import org.oddjob.arooa.life.ArooaSessionAware;
import org.oddjob.arooa.life.InstantiationContext;
import org.oddjob.arooa.life.SimpleArooaClass;
import org.oddjob.arooa.parsing.ArooaContext;
import org.oddjob.arooa.parsing.ArooaElement;
import org.oddjob.arooa.parsing.MockArooaContext;
import org.oddjob.arooa.registry.BeanRegistry;
import org.oddjob.arooa.registry.ComponentPool;
import org.oddjob.arooa.registry.SimpleBeanRegistry;
import org.oddjob.arooa.registry.SimpleComponentPool;
import org.oddjob.arooa.runtime.MockRuntimeConfiguration;
import org.oddjob.arooa.runtime.RuntimeConfiguration;
import org.oddjob.arooa.standard.StandardArooaParser;
import org.oddjob.arooa.standard.StandardArooaSession;
import org.oddjob.arooa.xml.XMLConfiguration;
import org.oddjob.framework.SimpleJob;
import org.oddjob.state.ParentState;
/**
* Test the Arooa aspects of Oddjob.
*
* @author rob
*
*/
public class OddjobArooaTest extends TestCase {
public void testInnerJobDescriptor() throws ArooaParseException {
OddjobServices services = new MockOddjobServices() {
@Override
public ClassLoader getClassLoader() {
return getClass().getClassLoader();
}
};
Oddjob.OddjobRoot rootOddjob = new Oddjob().new OddjobRoot(
services);
StandardArooaParser parser = new StandardArooaParser(rootOddjob);
parser.parse(new ArooaConfiguration() {
public ConfigurationHandle parse(ArooaContext parentContext)
throws ArooaParseException {
ArooaElement element = new ArooaElement("watever");
element = element.addAttribute("id", "oddjob");
parentContext.getArooaHandler().onStartElement(element, parentContext);
return new MockConfigurationHandle();
}
});
ArooaSession session = parser.getSession();
ArooaDescriptor descriptor = session.getArooaDescriptor();
ArooaBeanDescriptor bd = descriptor.getBeanDescriptor(
new SimpleArooaClass(Oddjob.OddjobRoot.class),
session.getTools().getPropertyAccessor());
assertNotNull(bd);
assertEquals("job", bd.getComponentProperty());
assertNull(bd.getParsingInterceptor());
}
public static class SessionCapture implements ArooaSessionAware {
ArooaSession session;
public void setArooaSession(ArooaSession session) {
this.session = session;
}
}
public void testInnerSession() {
String xml =
"<oddjob>" +
" <job>" +
" <bean class='" + SessionCapture.class.getName() + "' id='x'/>" +
" </job>" +
"</oddjob>";
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration("XML", xml));
oddjob.run();
SessionCapture sc = (SessionCapture) new OddjobLookup(oddjob).lookup("x");
ArooaDescriptor descriptor = sc.session.getArooaDescriptor();
assertEquals(new SimpleArooaClass(Oddjob.class),
descriptor.getElementMappings().mappingFor(
new ArooaElement("oddjob"),
new InstantiationContext(ArooaType.COMPONENT, null)));
}
private class OurSession extends StandardArooaSession {
SimpleComponentPool componentPool = new SimpleComponentPool();
BeanRegistry beanRegistry = new SimpleBeanRegistry();
@Override
public ComponentPool getComponentPool() {
return componentPool;
}
@Override
public BeanRegistry getBeanRegistry() {
return beanRegistry;
}
}
private class OurContext extends MockArooaContext {
ArooaSession session;
public OurContext(ArooaSession session) {
this.session = session;
}
@Override
public RuntimeConfiguration getRuntime() {
return new MockRuntimeConfiguration() {
@Override
public void configure() {
}
};
}
@Override
public ArooaSession getSession() {
return session;
}
}
public void testHierarchicalRegistry() {
OurSession existingSession = new OurSession();
String xml = "<oddjob id='x'/>";
Oddjob oddjob = new Oddjob();
oddjob.setArooaSession(existingSession);
oddjob.setConfiguration(new XMLConfiguration("XML", xml));
ComponentPool pool = existingSession.getComponentPool();
pool.registerComponent(
new ComponentTrinity(oddjob, oddjob, new OurContext(existingSession)), "y");
oddjob.run();
Object result = existingSession.getBeanRegistry().lookup("y/x");
assertNotNull(result);
}
public static class MyEcho extends SimpleJob {
@Override
protected int execute() throws Throwable {
return 0;
}
}
String xml =
"<oddjob xmlns:arooa='http://rgordon.co.uk/oddjob/arooa'>" +
" <job>" +
" <oddjob id='x'>" +
" <descriptorFactory>" +
" <arooa:descriptor>" +
" <components>" +
" <arooa:bean-def className='" + MyEcho.class.getName() + "'" +
" element='echo'/>" +
" </components>" +
" </arooa:descriptor>" +
" </descriptorFactory>" +
" <configuration>" +
" <arooa:configuration>" +
" <xml>" +
" <xml>" +
" <oddjob>" +
" <job>" +
" <echo id='y'/>" +
" </job>" +
" </oddjob>" +
" </xml>" +
" </xml>" +
" </arooa:configuration>" +
" </configuration>" +
" </oddjob>" +
" </job>" +
"</oddjob>";
public void testDescriptorOverride() {
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration("XML", xml));
oddjob.run();
Object echo = new OddjobLookup(oddjob).lookup("x/y");
assertEquals(MyEcho.class, echo.getClass());
assertEquals(ParentState.COMPLETE,
oddjob.lastStateEvent().getState());
oddjob.destroy();
assertEquals(ParentState.DESTROYED,
oddjob.lastStateEvent().getState());
}
public void testNestedDescriptorOverride() throws ArooaParseException {
// add another layer of Oddjob.
String moreXml =
"<oddjob xmlns:arooa='http://rgordon.co.uk/oddjob/arooa'>" +
" <job>" +
" <oddjob id='z'>" +
" <configuration>" +
" <arooa:configuration>" +
" <xml>" +
" <xml>" +
xml +
" </xml>" +
" </xml>" +
" </arooa:configuration>" +
" </configuration>" +
" </oddjob>" +
" </job>" +
"</oddjob>";
Oddjob oddjob = new Oddjob();
oddjob.setConfiguration(new XMLConfiguration("XML", moreXml));
oddjob.run();
Object echo = new OddjobLookup(oddjob).lookup("z/x/y");
assertEquals(MyEcho.class, echo.getClass());
assertEquals(ParentState.COMPLETE,
oddjob.lastStateEvent().getState());
oddjob.destroy();
assertEquals(ParentState.DESTROYED,
oddjob.lastStateEvent().getState());
}
}