/*
* (c) Rob Gordon 2005.
*/
package org.oddjob.jmx.client;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import junit.framework.TestCase;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;
import org.oddjob.OddjobConsole;
import org.oddjob.Structural;
import org.oddjob.arooa.ArooaDescriptor;
import org.oddjob.arooa.ClassResolver;
import org.oddjob.arooa.MockArooaDescriptor;
import org.oddjob.arooa.MockArooaSession;
import org.oddjob.arooa.MockClassResolver;
import org.oddjob.arooa.registry.ServerId;
import org.oddjob.arooa.registry.SimpleBeanRegistry;
import org.oddjob.arooa.standard.StandardArooaSession;
import org.oddjob.jmx.handlers.StructuralHandlerFactory;
import org.oddjob.jmx.server.OddjobMBeanFactory;
import org.oddjob.jmx.server.ServerContext;
import org.oddjob.jmx.server.ServerContextImpl;
import org.oddjob.jmx.server.ServerInterfaceHandlerFactory;
import org.oddjob.jmx.server.ServerInterfaceManagerFactoryImpl;
import org.oddjob.jmx.server.ServerModel;
import org.oddjob.jmx.server.ServerModelImpl;
import org.oddjob.jobs.structural.JobFolder;
import org.oddjob.tools.OddjobTestHelper;
import org.oddjob.util.MockThreadManager;
/**
*
*/
public class TransportableComponentTest extends TestCase {
private static final Logger logger = Logger.getLogger(TransportableComponentTest.class);
protected void setUp() {
logger.debug("================== Running " + getName() + "================");
System.setProperty("mx4j.log.priority", "trace");
}
public static class MyComponent {
MyComponent another;
public void setAnother(MyComponent another) {
this.another = another;
}
public MyComponent getAnother() {
return another;
}
public Object getAnotherReally() throws MalformedObjectNameException, NullPointerException {
return new ComponentTransportable(OddjobMBeanFactory.objectName(2));
}
}
private class OurArooaSession extends MockArooaSession {
@Override
public ArooaDescriptor getArooaDescriptor() {
return new MockArooaDescriptor() {
@Override
public ClassResolver getClassResolver() {
return new MockClassResolver() {
@Override
public Class<?> findClass(String className) {
try {
return Class.forName(className);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
};
}
};
}
}
/**
* Test a component can have another component set as it's property
* and the component can also be retrieved.
*
* @throws Exception
*/
public void testRoundTrip() throws Exception {
try (OddjobConsole.Close close = OddjobConsole.initialise()) {
// simulate a server side with two components in a
// folder.
MyComponent c1 = new MyComponent();
MyComponent c2 = new MyComponent();
JobFolder folder = new JobFolder();
folder.setJobs(0, c1);
folder.setJobs(0, c2);
ServerInterfaceManagerFactoryImpl imf =
new ServerInterfaceManagerFactoryImpl();
imf.addServerHandlerFactories(
new ServerInterfaceHandlerFactory<?, ?>[] {
new StructuralHandlerFactory()
});
ServerModel sm = new ServerModelImpl(
new ServerId("//whatever"),
new MockThreadManager(),
imf);
ServerContext serverContext = new ServerContextImpl(
folder, sm, new SimpleBeanRegistry());
MBeanServer mbs = MBeanServerFactory.createMBeanServer();
OddjobMBeanFactory factory = new OddjobMBeanFactory(mbs,
new StandardArooaSession());
ObjectName on = factory.createMBeanFor(folder, serverContext);
// client side.
ClientSession clientSession = new ClientSessionImpl(
mbs,
new DummyNotificationProcessor(),
new OurArooaSession(),
logger);
Object folderProxy = clientSession.create(on);
assertNotNull(folderProxy);
Object[] children = OddjobTestHelper.getChildren((Structural) folderProxy);
Object c1Proxy = children[0];
assertNotNull(c1Proxy);
Object c2Proxy = children[1];
assertNotNull(c2Proxy);
PropertyUtils.setProperty(c1Proxy, "another", c2Proxy);
Object result = PropertyUtils.getProperty(c1Proxy, "anotherReally");
assertEquals(c2Proxy, result);
}
}
}