| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
 | 
 | 
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 + "]";  | 
 | 
    }  | 
 | 
}  |