package org.oddjob.jmx.handlers;
import java.lang.reflect.UndeclaredThrowableException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanException;
import javax.management.MBeanNotificationInfo;
import javax.management.MBeanOperationInfo;
import javax.management.ReflectionException;
import org.oddjob.jmx.RemoteOperation;
import org.oddjob.jmx.client.ClientHandlerResolver;
import org.oddjob.jmx.client.ClientInterfaceHandlerFactory;
import org.oddjob.jmx.client.ClientSideToolkit;
import org.oddjob.jmx.client.HandlerVersion;
import org.oddjob.jmx.client.SimpleHandlerResolver;
import org.oddjob.jmx.server.JMXOperation;
import org.oddjob.jmx.server.JMXOperationFactory;
import org.oddjob.jmx.server.ServerInterfaceHandler;
import org.oddjob.jmx.server.ServerInterfaceHandlerFactory;
import org.oddjob.jmx.server.ServerSideToolkit;
import org.oddjob.logging.LogEnabled;
import org.oddjob.logging.LogHelper;
/**
*/
public class LogEnabledHandlerFactory
implements ServerInterfaceHandlerFactory<Object, LogEnabled> {
public static final HandlerVersion VERSION = new HandlerVersion(1, 0);
private static final JMXOperation<String> GET_LOGGER =
new JMXOperationFactory(LogEnabled.class
).operationFor("loggerName", MBeanOperationInfo.INFO);
public Class<Object> interfaceClass() {
return Object.class;
}
public MBeanAttributeInfo[] getMBeanAttributeInfo() {
return new MBeanAttributeInfo[0];
}
public MBeanOperationInfo[] getMBeanOperationInfo() {
return new MBeanOperationInfo[] {
GET_LOGGER.getOpInfo() };
}
public MBeanNotificationInfo[] getMBeanNotificationInfo() {
return new MBeanNotificationInfo[0];
}
public ServerInterfaceHandler createServerHandler(Object target, ServerSideToolkit ojmb) {
return new LogEnabledServerHandler(target, ojmb);
}
public ClientHandlerResolver<LogEnabled> clientHandlerFactory() {
return new SimpleHandlerResolver<LogEnabled>(
ClientLogPollableHandlerFactory.class.getName(),
VERSION);
}
public static class ClientLogPollableHandlerFactory
implements ClientInterfaceHandlerFactory<LogEnabled> {
public LogEnabled createClientHandler(LogEnabled ignored, ClientSideToolkit toolkit) {
return new ClientLogEnabledHandler(toolkit);
}
public HandlerVersion getVersion() {
return VERSION;
}
public Class<LogEnabled> interfaceClass() {
return LogEnabled.class;
}
}
static class ClientLogEnabledHandler implements LogEnabled {
/** Remember remote logger. */
private final String remoteLoggerName;
ClientLogEnabledHandler(ClientSideToolkit toolkit) {
try {
remoteLoggerName = toolkit.invoke(GET_LOGGER);
} catch (Throwable t) {
throw new UndeclaredThrowableException(t);
}
}
public String loggerName() {
return remoteLoggerName;
}
}
class LogEnabledServerHandler implements ServerInterfaceHandler {
private final String loggerName;
LogEnabledServerHandler(Object object, ServerSideToolkit ojmb) {
this.loggerName = LogHelper.getLogger(object);
}
public Object invoke(RemoteOperation<?> operation, Object[] params)
throws MBeanException, ReflectionException {
if (GET_LOGGER.equals(operation)) {
return loggerName;
}
else {
throw new ReflectionException(
new IllegalStateException("invoked for an unknown method."),
operation.toString());
}
}
public void destroy() {
}
}
}