package org.oddjob.jmx.handlers;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.swing.ImageIcon;
import junit.framework.TestCase;
import org.oddjob.Iconic;
import org.oddjob.images.IconEvent;
import org.oddjob.images.IconHelper;
import org.oddjob.images.IconListener;
import org.oddjob.jmx.RemoteOperation;
import org.oddjob.jmx.client.MockClientSideToolkit;
import org.oddjob.jmx.server.MockServerSideToolkit;
import org.oddjob.jmx.server.ServerInterfaceHandler;
public class IconicHandlerFactoryTest extends TestCase {
class OurIconic implements Iconic {
IconHelper helper = new IconHelper(this, IconHelper.READY);
{
helper.changeIcon(IconHelper.EXECUTING);
}
public void addIconListener(IconListener listener) {
helper.addIconListener(listener);
}
public void removeIconListener(IconListener listener) {
helper.removeIconListener(listener);
}
public ImageIcon iconForId(String iconId) {
return helper.iconForId(iconId);
}
}
class OurClientToolkit extends MockClientSideToolkit {
ServerInterfaceHandler server;
@SuppressWarnings("unchecked")
@Override
public <T> T invoke(RemoteOperation<T> remoteOperation, Object... args)
throws Throwable {
return (T) server.invoke(remoteOperation, args);
}
}
class OurServerToolkit extends MockServerSideToolkit {
long seq = 0;
@Override
public void runSynchronized(Runnable runnable) {
runnable.run();
}
@Override
public Notification createNotification(String type) {
return new Notification(type, this, seq++);
}
@Override
public void sendNotification(Notification notification) {
}
}
public void testClientIconFor() {
OurIconic iconic = new OurIconic();
IconicHandlerFactory test = new IconicHandlerFactory();
OurServerToolkit serverToolkit = new OurServerToolkit();
ServerInterfaceHandler serverHandler = test.createServerHandler(
iconic, serverToolkit);
OurClientToolkit toolkit = new OurClientToolkit();
toolkit.server = serverHandler;
Iconic h =
new IconicHandlerFactory.ClientIconicHandlerFactory(
).createClientHandler(iconic, toolkit);
ImageIcon result = h.iconForId(IconHelper.EXECUTING);
assertEquals("Executing", result.getDescription());
}
class OurClientToolkit2 extends MockClientSideToolkit {
ServerInterfaceHandler server;
NotificationListener listener;
@SuppressWarnings("unchecked")
@Override
public <T> T invoke(RemoteOperation<T> remoteOperation, Object... args)
throws Throwable {
return (T) server.invoke(remoteOperation, args);
}
public void registerNotificationListener(String eventType, NotificationListener notificationListener) {
if (listener != null) {
throw new RuntimeException("Only one listener expected.");
}
assertEquals(IconicHandlerFactory.ICON_CHANGED_NOTIF_TYPE, eventType);
this.listener = notificationListener;
}
@Override
public void removeNotificationListener(String eventType,
NotificationListener notificationListener) {
if (listener == null) {
throw new RuntimeException("Only one listener remove expected.");
}
assertEquals(IconicHandlerFactory.ICON_CHANGED_NOTIF_TYPE, eventType);
assertEquals(this.listener, notificationListener);
this.listener = null;
}
}
class OurServerToolkit2 extends MockServerSideToolkit {
long seq = 0;
NotificationListener listener;
@Override
public void runSynchronized(Runnable runnable) {
runnable.run();
}
@Override
public Notification createNotification(String type) {
return new Notification(type, this, seq++);
}
@Override
public void sendNotification(Notification notification) {
if (listener != null) {
listener.handleNotification(notification, null);
}
}
}
class Result implements IconListener {
IconEvent event;
public void iconEvent(IconEvent e) {
event = e;
}
}
public void testIconListeners() {
OurIconic iconic = new OurIconic();
IconicHandlerFactory test = new IconicHandlerFactory();
OurServerToolkit2 serverToolkit = new OurServerToolkit2();
ServerInterfaceHandler serverHandler = test.createServerHandler(
iconic, serverToolkit);
OurClientToolkit2 clientToolkit = new OurClientToolkit2();
clientToolkit.server = serverHandler;
Iconic local = new IconicHandlerFactory.ClientIconicHandlerFactory(
).createClientHandler(iconic, clientToolkit);
Result result = new Result();
local.addIconListener(result);
assertEquals(IconHelper.EXECUTING, result.event.getIconId());
Result result2 = new Result();
local.addIconListener(result2);
assertEquals(IconHelper.EXECUTING, result2.event.getIconId());
serverToolkit.listener = clientToolkit.listener;
iconic.helper.changeIcon(IconHelper.COMPLETE);
assertEquals(IconHelper.COMPLETE, result.event.getIconId());
assertEquals(IconHelper.COMPLETE, result2.event.getIconId());
local.removeIconListener(result2);
assertNotNull(clientToolkit.listener);
local.removeIconListener(result);
assertNull(clientToolkit.listener);
}
}