/* * (c) Rob Gordon 2005 */ package org.oddjob.framework; import java.io.Serializable; import java.lang.reflect.Proxy; import junit.framework.TestCase; import org.apache.commons.beanutils.DynaBean; import org.apache.log4j.Logger; import org.oddjob.Oddjob; import org.oddjob.OddjobLookup; import org.oddjob.Resetable; import org.oddjob.Stateful; import org.oddjob.arooa.ArooaSession; import org.oddjob.arooa.life.ComponentPersister; import org.oddjob.arooa.life.MockComponentPersister; import org.oddjob.arooa.xml.XMLConfiguration; import org.oddjob.persist.OddjobPersister; import org.oddjob.state.JobState; import org.oddjob.state.ParentState; import org.oddjob.tools.OddjobTestHelper; public class SerializableWrapperTest extends TestCase { private static final Logger logger = Logger.getLogger(SerializableWrapperTest.class); public static class Test1 implements Runnable, Serializable { private static final long serialVersionUID = 20051231; private String check; public void run() { if (check != null) { check = "good bye"; } else { check = "hello"; } } public String getCheck() { return check; } @Override public String toString() { return "Test1"; } } public static class Test2 implements Runnable { public void run() {} @Override public String toString() { return "Test2"; } } public void testSimple() throws Exception { Runnable test = new Test1(); Runnable proxy = (Runnable) new RunnableProxyGenerator().generate( (Runnable) test, getClass().getClassLoader()); proxy.run(); DynaBean copy = (DynaBean) OddjobTestHelper.copy(proxy); assertTrue(copy instanceof Proxy); assertEquals("hello", copy.get("check")); } public void testNotSerializable () throws Exception { Runnable test = new Test2(); Runnable proxy = (Runnable) new RunnableProxyGenerator().generate( (Runnable) test, getClass().getClassLoader()); assertTrue(proxy instanceof Transient); } private class OurPersister implements OddjobPersister { Object save; int count; public ComponentPersister persisterFor(String id) { return new MockComponentPersister() { boolean closed; @Override public void persist(String id, Object proxy, ArooaSession session) { if (closed) { return; } logger.info("Persisting [" + proxy + "] id [" + id + "]"); assertEquals("test", id); try { save = OddjobTestHelper.copy(proxy); } catch (Exception e) { throw new RuntimeException(e); } ++count; } @Override public Object restore(String id, ClassLoader classLoader, ArooaSession session) { assertEquals("test", id); logger.info("Restoring id [" + id + "]"); return save; } @Override public void remove(String id, ArooaSession session) { if (closed) { return; } save = null; } @Override public void close() { closed = true; } }; } } public void testSerializeInOddjob() { String xml = "<oddjob>" + " <job>" + " <bean class='" + Test1.class.getName() + "' id='test'/>" + " </job>" + "</oddjob>"; Oddjob oddjob = new Oddjob(); oddjob.setConfiguration(new XMLConfiguration("XML", xml)); OurPersister persister = new OurPersister(); oddjob.setPersister(persister); oddjob.run(); assertEquals(ParentState.COMPLETE, oddjob.lastStateEvent().getState()); Proxy proxy = (Proxy) new OddjobLookup(oddjob).lookup("test"); Test1 test1 = (Test1) ((WrapperInvocationHandler) Proxy.getInvocationHandler( proxy)).getWrappedComponent(); assertEquals(JobState.COMPLETE, OddjobTestHelper.getJobState(proxy)); assertEquals("hello", test1.check); oddjob.destroy(); // restore Oddjob oddjob2 = new Oddjob(); oddjob2.setConfiguration(new XMLConfiguration("XML", xml)); oddjob2.setPersister(persister); oddjob2.load(); assertEquals(ParentState.READY, oddjob2.lastStateEvent().getState()); proxy = (Proxy) new OddjobLookup(oddjob2).lookup("test"); test1 = (Test1) ((WrapperInvocationHandler) Proxy.getInvocationHandler( proxy)).getWrappedComponent(); assertEquals(JobState.COMPLETE, ((Stateful) proxy).lastStateEvent().getState()); assertEquals("hello", test1.check); assertEquals(1, persister.count); // try and reset ((Resetable) proxy).hardReset(); assertEquals(JobState.READY, ((Stateful) proxy).lastStateEvent().getState()); ((Runnable) proxy).run(); assertEquals(JobState.COMPLETE, ((Stateful) proxy).lastStateEvent().getState()); oddjob2.destroy(); } public void testPersistCount() { Oddjob oddjob = new Oddjob(); String xml = "<oddjob>" + " <job>" + " <bean class='" + Test1.class.getName() + "' id='test'/>" + " </job>" + "</oddjob>"; oddjob.setConfiguration(new XMLConfiguration("XML", xml)); OurPersister persister = new OurPersister(); oddjob.setPersister(persister); oddjob.run(); assertEquals(ParentState.COMPLETE, oddjob.lastStateEvent().getState()); Object proxy = new OddjobLookup(oddjob).lookup("test"); ((Resetable) proxy).hardReset(); ((Runnable) proxy).run(); assertEquals(3, persister.count); oddjob.destroy(); } }