package org.oddjob.jmx.client;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import org.apache.log4j.Logger;
import org.oddjob.arooa.ArooaSession;
/**
* Simple implementation of a {@link ClientSession}
*
* @author rob
*
*/
public class ClientSessionImpl implements ClientSession {
private final Logger logger;
private final Map<Object, ObjectName> names
= new HashMap<Object, ObjectName>();
private final Map<ObjectName, Object> proxies
= new HashMap<ObjectName, Object>();
private final Map<Object, Destroyable> destroyers =
new HashMap<Object, Destroyable>();
private final ArooaSession arooaSession;
private final MBeanServerConnection serverConnection;
private final ScheduledExecutorService notificationProcessor;
/**
* Constructor.
*
* @param serverConnection The server connection.
* @param notificationProcessor The notification processor.
* @param arooaSession The local session.
* @param logger The logger.
*/
public ClientSessionImpl(
MBeanServerConnection serverConnection,
ScheduledExecutorService notificationProcessor,
ArooaSession arooaSession,
Logger logger) {
this.serverConnection = serverConnection;
this.notificationProcessor = notificationProcessor;
this.arooaSession = arooaSession;
this.logger = logger;
}
public Object create(ObjectName objectName) {
Object childProxy = proxies.get(objectName);
if (childProxy != null) {
return childProxy;
}
try {
ClientSideToolkitImpl toolkit = new ClientSideToolkitImpl(objectName, this);
ClientNode.Handle handle = ClientNode.createProxyFor(objectName,
toolkit);
childProxy = handle.getproxy();
destroyers.put(childProxy, handle.getDestroyer());
}
catch (Exception e) {
logger.error("Failed creating client node for [" + objectName +
"].", e);
// Must return something.
return new NodeCreationFailed(e);
}
names.put(childProxy, objectName);
proxies.put(objectName, childProxy);
return childProxy;
}
@Override
public ObjectName nameFor(Object proxy) {
return names.get(proxy);
}
@Override
public Object objectFor(ObjectName name) {
return proxies.get(name);
}
@Override
public void destroy(Object proxy) {
Destroyable destroyer = destroyers.get(proxy);
destroyer.destroy();
ObjectName name = names.remove(proxy);
proxies.remove(name);
}
@Override
public ArooaSession getArooaSession() {
return arooaSession;
}
@Override
public Logger logger() {
return logger;
}
public MBeanServerConnection getServerConnection() {
return serverConnection;
}
public ScheduledExecutorService getNotificationProcessor() {
return notificationProcessor;
}
@Override
public void destroyAll() {
List<Object> proxies = new ArrayList<Object>(names.keySet());
for (Object proxy : proxies) {
destroy(proxy);
}
}
}