|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
package com.sun.jmx.snmp.daemon; |
|
|
|
|
|
|
|
// java import |
|
|
|
import java.io.*; |
|
import java.util.logging.Level; |
|
|
|
// jmx import |
|
|
|
import javax.management.MBeanServer; |
|
import javax.management.ObjectName; |
|
|
|
// jmx RI import |
|
|
|
import static com.sun.jmx.defaults.JmxProperties.SNMP_ADAPTOR_LOGGER; |
|
|
|
/** |
|
* The <CODE>ClientHandler</CODE> class is the base class of each |
|
* adaptor.<p> |
|
*/ |
|
|
|
abstract class ClientHandler implements Runnable { |
|
|
|
public ClientHandler(CommunicatorServer server, int id, MBeanServer f, ObjectName n) { |
|
adaptorServer = server ; |
|
requestId = id ; |
|
mbs = f ; |
|
objectName = n ; |
|
interruptCalled = false ; |
|
dbgTag = makeDebugTag() ; |
|
//if (mbs == null ){ |
|
|
|
thread = createThread(this); |
|
|
|
//} else { |
|
//thread = mbs.getThreadAllocatorSrvIf().obtainThread(objectName,this) ; |
|
//} |
|
// Note: the thread will be started by the subclass. |
|
} |
|
|
|
|
|
Thread createThread(Runnable r) { |
|
return new Thread(this); |
|
} |
|
|
|
public void interrupt() { |
|
SNMP_ADAPTOR_LOGGER.entering(dbgTag, "interrupt"); |
|
interruptCalled = true ; |
|
if (thread != null) { |
|
thread.interrupt() ; |
|
} |
|
SNMP_ADAPTOR_LOGGER.exiting(dbgTag, "interrupt"); |
|
} |
|
|
|
|
|
public void join() { |
|
if (thread != null) { |
|
try { |
|
thread.join() ; |
|
} |
|
catch(InterruptedException x) { |
|
} |
|
} |
|
} |
|
|
|
public void run() { |
|
|
|
try { |
|
// |
|
// Notify the server we are now active |
|
|
|
adaptorServer.notifyClientHandlerCreated(this) ; |
|
|
|
// |
|
// Call protocol specific sequence |
|
|
|
doRun() ; |
|
} |
|
finally { |
|
// |
|
// Now notify the adaptor server that the handler is terminating. |
|
// This is important because the server may be blocked waiting for |
|
// a handler to terminate. |
|
|
|
adaptorServer.notifyClientHandlerDeleted(this) ; |
|
} |
|
} |
|
|
|
// |
|
// The protocol-dependent part of the request |
|
|
|
public abstract void doRun() ; |
|
|
|
protected CommunicatorServer adaptorServer = null ; |
|
protected int requestId = -1 ; |
|
protected MBeanServer mbs = null ; |
|
protected ObjectName objectName = null ; |
|
protected Thread thread = null ; |
|
protected boolean interruptCalled = false ; |
|
protected String dbgTag = null ; |
|
|
|
protected String makeDebugTag() { |
|
return "ClientHandler[" + adaptorServer.getProtocol() + ":" + adaptorServer.getPort() + "][" + requestId + "]"; |
|
} |
|
} |