FileDocCategorySizeDatePackage
ServerTableEntry.javaAPI DocJava SE 5 API15396Fri Aug 26 14:54:18 BST 2005com.sun.corba.se.impl.activation

ServerTableEntry

public class ServerTableEntry extends Object
version
1.28
author
Anita Jindal
since
JDK1.2

Fields Summary
private static final int
DE_ACTIVATED
private static final int
ACTIVATING
private static final int
ACTIVATED
private static final int
RUNNING
private static final int
HELD_DOWN
private static final long
waitTime
private static final int
ActivationRetryMax
private int
state
private int
serverId
private HashMap
orbAndPortInfo
private Server
serverObj
private ServerDef
serverDef
private Process
process
private int
activateRetryCount
private String
activationCmd
private ActivationSystemException
wrapper
private static String
javaHome
private static String
classPath
private static String
fileSep
private static String
pathSep
private boolean
debug
Constructors Summary
ServerTableEntry(ActivationSystemException wrapper, int serverId, ServerDef serverDef, int initialPort, String dbDirName, boolean verify, boolean debug)

	javaHome  = System.getProperty("java.home");
	classPath = System.getProperty("java.class.path");
	fileSep   = System.getProperty("file.separator");
	pathSep   = System.getProperty("path.separator");
    
	this.wrapper = wrapper ;
        this.serverId = serverId;
        this.serverDef = serverDef;
	this.debug = debug ;
	// create a HashMap with capacity 255
	// Since all methods are synchronized, we don't need any
	// additional synchronization mechanisms
	orbAndPortInfo = new HashMap(255);

	activateRetryCount = 0;
        state = ACTIVATING;

	// compute the activation command
	activationCmd =

	    // add path to the java vm
	    javaHome + fileSep + "bin" + fileSep + "java " +

	    // add any arguments to the server Java VM
	    serverDef.serverVmArgs + " " +

	    // add ORB properties
	    "-Dioser=" + System.getProperty( "ioser" ) + " " +
	    "-D" + ORBConstants.INITIAL_PORT_PROPERTY	+ "=" + initialPort + " " +
	    "-D" + ORBConstants.DB_DIR_PROPERTY		+ "=" + dbDirName + " " +
	    "-D" + ORBConstants.ACTIVATED_PROPERTY	+ "=true " +
	    "-D" + ORBConstants.SERVER_ID_PROPERTY	+ "=" + serverId + " " +
	    "-D" + ORBConstants.SERVER_NAME_PROPERTY	+ "=" + serverDef.serverName + " " +
	    // we need to pass in the verify flag, so that the server is not
	    // launched, when we try to validate its definition during registration
	    // into the RepositoryImpl

	    (verify ? "-D" + ORBConstants.SERVER_DEF_VERIFY_PROPERTY + "=true ": "") +

	    // add classpath to the server
	    "-classpath " + classPath +
	    (serverDef.serverClassPath.equals("") == true ? "" : pathSep) +
	    serverDef.serverClassPath +

	    // add server class name and arguments
	    " com.sun.corba.se.impl.activation.ServerMain " + serverDef.serverArgs

	    // Add the debug flag, if any
	    + (debug ? " -debug" : "") ;

	if (debug) System.out.println(
				      "ServerTableEntry constructed with activation command " +
				      activationCmd);
    
Methods Summary
synchronized voidactivate()

        state = ACTIVATED;

        try {
            if (debug)
		printDebug("activate", "activating server");
            process = Runtime.getRuntime().exec(activationCmd);
        } catch (Exception e) {
            deActivate();
            if (debug)
		printDebug("activate", "throwing premature process exit");
	    throw wrapper.unableToStartProcess() ;
        }
    
synchronized voidcheckProcessHealth()

        // If the State in the ServerTableEntry is RUNNING and the
        // Process was shut down abnormally, The method will change the
        // server state as De-Activated.
        if( state == RUNNING ) {
            try {
                int exitVal = process.exitValue();
            } catch (IllegalThreadStateException e1) {
                return;
            }
            synchronized ( this ) {
                // Clear the PortInformation as it is old
                orbAndPortInfo.clear();
                // Move the state to De-Activated, So that the next
                // call to this server will re-activate.
                deActivate();
            }
        }
    
synchronized voiddeActivate()

        state = DE_ACTIVATED;

	if (debug)
	    printDebug( "deActivate", "server deactivated" ) ;

        notifyAll();
    
synchronized voiddestroy()


        Server localServerObj = null;
        Process localProcess = null;

        synchronized (this) {
            localServerObj = serverObj;
            localProcess = process;

            deActivate();
        }

        try {
            if (localServerObj != null)
                localServerObj.shutdown();

            if (debug)
                printDebug( "destroy", "server shutdown successfully" ) ;
        } catch (Exception ex) {
            if (debug)
                printDebug( "destroy",
                            "server shutdown threw exception" + ex ) ;
            // ex.printStackTrace();
        }

        try {
            if (localProcess != null)
                localProcess.destroy();

            if (debug)
                printDebug( "destroy", "process destroyed successfully" ) ;
        } catch (Exception ex) {
            if (debug)
                printDebug( "destroy",
                            "process destroy threw exception" + ex ) ;

            // ex.printStackTrace();
        }
    
synchronized java.lang.String[]getORBList()

	String [] orbList = new String[orbAndPortInfo.size()];
	Iterator setORBids = orbAndPortInfo.keySet().iterator();

	try {
	    int numElements = 0;
	    while (setORBids.hasNext()) {
		String orbId = (String) setORBids.next();
		orbList[numElements++] = orbId ;
	    }
	} catch (NoSuchElementException e) {
	    // have everything in the table
	}
	return orbList;
    
intgetServerId()

	return serverId;
    
synchronized voidholdDown()

        state = HELD_DOWN;

	if (debug)
	    printDebug( "holdDown", "server held down" ) ;

        notifyAll();
    
voidinstall()

        Server localServerObj = null;
        synchronized ( this ) {
            if (state == RUNNING)
                localServerObj = serverObj;
            else
                throw wrapper.serverNotRunning() ;
        }
        if (localServerObj != null) {
            localServerObj.install() ;
        }

    
booleanisActive()

        return (state == RUNNING) || (state == ACTIVATED);
    
synchronized booleanisValid()

        if ((state == ACTIVATING) || (state == HELD_DOWN)) {
	    if (debug)
		printDebug( "isValid", "returns true" ) ;

            return true;
        }

        try {
            int exitVal = process.exitValue();
        } catch (IllegalThreadStateException e1) {
            return true;
        }

        if (state == ACTIVATED) {
            if (activateRetryCount < ActivationRetryMax) {
                if (debug)
		    printDebug("isValid", "reactivating server");
                activateRetryCount++;
                activate();
                return true;
            }

            if (debug)
		printDebug("isValid", "holding server down");

            holdDown();
            return true;
        }

        deActivate();
        return false;
    
synchronized com.sun.corba.se.spi.activation.ORBPortInfo[]lookup(java.lang.String endpointType)

        while ((state == ACTIVATING) || (state == ACTIVATED)) {
            try {
                wait(waitTime);
                if (!isValid()) break;
            } catch(Exception e) {}
        }
	ORBPortInfo[] orbAndPortList = null;

        if (state == RUNNING) {
	    orbAndPortList = new ORBPortInfo[orbAndPortInfo.size()];
	    Iterator setORBids = orbAndPortInfo.keySet().iterator();

	    try {
		int numElements = 0;
		int i;
	        int port;
	        while (setORBids.hasNext()) {
		    String orbId = (String) setORBids.next();
		    // get an entry corresponding to orbId
		    EndPointInfo [] serverListenerPorts = (EndPointInfo []) orbAndPortInfo.get(orbId);
	            port = -1;
	            // return the port corresponding to the endpointType
	            for (i = 0; i < serverListenerPorts.length; i++) {
		        if (debug)
		            System.out.println("lookup num-ports " + serverListenerPorts.length + "   " +
	                        serverListenerPorts[i].endpointType + "   " +
	                        serverListenerPorts[i].port );
	                if ((serverListenerPorts[i].endpointType).equals(endpointType)) {
	                    port = serverListenerPorts[i].port;
			    break;
		        }
	            }
	            orbAndPortList[numElements] = new ORBPortInfo(orbId, port);
		    numElements++;
		}
	    } catch (NoSuchElementException e) {
	        // have everything in the table
	    }
	    return orbAndPortList;
        }

        if (debug)
	    printDebug("lookup", "throwing server held down error");

        throw new ServerHeldDown( serverId ) ;
    
synchronized com.sun.corba.se.spi.activation.EndPointInfo[]lookupForORB(java.lang.String orbId)

        while ((state == ACTIVATING) || (state == ACTIVATED)) {
            try {
                wait(waitTime);
                if (!isValid()) break;
            } catch(Exception e) {}
        }
	EndPointInfo[] portList = null;

        if (state == RUNNING) {

	    try {

		// get an entry corresponding to orbId
	        EndPointInfo [] serverListenerPorts = (EndPointInfo []) orbAndPortInfo.get(orbId);

	        portList = new EndPointInfo[serverListenerPorts.length];
	        // return the port corresponding to the endpointType
	        for (int i = 0; i < serverListenerPorts.length; i++) {
		   if (debug)
		      System.out.println("lookup num-ports " + serverListenerPorts.length + "   "
	                     + serverListenerPorts[i].endpointType + "   " +
	                     serverListenerPorts[i].port );
	           portList[i] = new EndPointInfo(serverListenerPorts[i].endpointType, serverListenerPorts[i].port);
	        }
	    } catch (NoSuchElementException e) {
	        // no element in HashMap corresponding to ORBid found
	        throw new InvalidORBid();
	    }
	    return portList;
        }

        if (debug)
	    printDebug("lookup", "throwing server held down error");

        throw new ServerHeldDown( serverId ) ;
    
private voidprintDebug(java.lang.String method, java.lang.String msg)

	System.out.println("ServerTableEntry: method  =" + method);
	System.out.println("ServerTableEntry: server  =" + serverId);
	System.out.println("ServerTableEntry: state   =" + printState());
	System.out.println("ServerTableEntry: message =" + msg);
	System.out.println();
    
private java.lang.StringprintState()



      
    
	String str = "UNKNOWN";

	switch (state) {
	case (DE_ACTIVATED) : str = "DE_ACTIVATED"; break;
	case (ACTIVATING  ) : str = "ACTIVATING  "; break;
	case (ACTIVATED   ) : str = "ACTIVATED   "; break;
	case (RUNNING     ) : str = "RUNNING     "; break;
	case (HELD_DOWN   ) : str = "HELD_DOWN   "; break;
	default: break;
	}

	return str;
    
synchronized voidregister(com.sun.corba.se.spi.activation.Server server)

        if (state == ACTIVATED) {

            serverObj = server;

            //state = RUNNING;
            //notifyAll();

            if (debug)
		printDebug("register", "process registered back");

        } else {

            if (debug)
		printDebug("register", "throwing premature process exit");
	    throw wrapper.serverNotExpectedToRegister() ;
        }
    
synchronized voidregisterPorts(java.lang.String orbId, com.sun.corba.se.spi.activation.EndPointInfo[] endpointList)


	// find if the ORB is already registered, then throw an exception
	if (orbAndPortInfo.containsKey(orbId)) {
	    throw new ORBAlreadyRegistered(orbId);
	}

	// store all listener ports and their types
	int numListenerPorts = endpointList.length;
	EndPointInfo [] serverListenerPorts = new EndPointInfo[numListenerPorts];

	for (int i = 0; i < numListenerPorts; i++) {
	    serverListenerPorts[i] = new EndPointInfo (endpointList[i].endpointType, endpointList[i].port);
	if (debug)
	    System.out.println("registering type: " + serverListenerPorts[i].endpointType  +  "  port  " + serverListenerPorts[i].port);
	}

	// put this set of listener ports in the HashMap associated
	// with the orbId
	orbAndPortInfo.put(orbId, serverListenerPorts);
        if (state == ACTIVATED) {
            state = RUNNING;
            notifyAll();
        }
        // _REVISIT_, If the state is not equal to ACTIVATED then it is a bug
        // need to log that error, once the Logging framework is in place
        // for rip-int.
        if (debug)
	    printDebug("registerPorts", "process registered Ports");
    
public java.lang.StringtoString()

      
    
	return "ServerTableEntry[" + "state=" + printState() +
	    " serverId=" + serverId +
	    " activateRetryCount=" + activateRetryCount + "]" ;
    
voiduninstall()

        Server localServerObj = null;
        Process localProcess = null;

        synchronized (this) {
            localServerObj = serverObj;
            localProcess = process;

            if (state == RUNNING) {

                deActivate();

            } else {
                throw wrapper.serverNotRunning() ;
            }
        }
        try {
            if (localServerObj != null) {
                localServerObj.shutdown(); // shutdown the server
                localServerObj.uninstall() ; // call the uninstall
            }

            if (localProcess != null) {
                localProcess.destroy();
            }
        } catch (Exception ex) {
            // what kind of exception should be thrown
        }
    
public intverify()
Verify whether the server definition is valid.

	try {

	    if (debug)
	        System.out.println("Server being verified w/" + activationCmd);

            process = Runtime.getRuntime().exec(activationCmd);
	    int result = process.waitFor();
	    if (debug)
		printDebug( "verify", "returns " + ServerMain.printResult( result ) ) ;
	    return result ;
	} catch (Exception e) {
	    if (debug)
		printDebug( "verify", "returns unknown error because of exception " +
			    e ) ;
	    return ServerMain.UNKNOWN_ERROR;
	}