FileDocCategorySizeDatePackage
ServantManagerImpl.javaAPI DocJava SE 5 API5936Fri Aug 26 14:54:26 BST 2005com.sun.corba.se.impl.naming.pcosnaming

ServantManagerImpl.java

/*
 * @(#)ServantManagerImpl.java	1.12 03/12/19
 *
 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
/*
 * @(#)ServantManagerImpl.java	1.12 03/12/19
 *
 * Copyright 1993-1997 Sun Microsystems, Inc. 901 San Antonio Road,
 * Palo Alto, California, 94303, U.S.A.  All Rights Reserved.
 *
 * This software is the confidential and proprietary information of Sun
 * Microsystems, Inc. ("Confidential Information").  You shall not
 * disclose such Confidential Information and shall use it only in
 * accordance with the terms of the license agreement you entered into
 * with Sun.
 *
 * CopyrightVersion 1.2
 *
 */

package com.sun.corba.se.impl.naming.pcosnaming;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Hashtable;

import org.omg.CORBA.Policy;
import org.omg.CORBA.LocalObject;

import org.omg.PortableServer.POA;
import org.omg.PortableServer.Servant;
import org.omg.PortableServer.ForwardRequest;
import org.omg.PortableServer.ServantLocator;
import org.omg.PortableServer.LifespanPolicyValue;
import org.omg.PortableServer.RequestProcessingPolicyValue;
import org.omg.PortableServer.IdAssignmentPolicyValue;
import org.omg.PortableServer.ServantRetentionPolicyValue;
import org.omg.PortableServer.ServantLocatorPackage.CookieHolder;

import com.sun.corba.se.spi.orb.ORB;

/**
 * @version     1.6, 99/10/07
 * @author      Rohit Garg
 * @since       JDK1.2
 */

public class ServantManagerImpl extends org.omg.CORBA.LocalObject implements ServantLocator
{

    // computed using serialver tool

    private static final long serialVersionUID = 4028710359865748280L;
    private ORB orb;

    private NameService theNameService;

    private File logDir;

    private Hashtable contexts;

    private CounterDB counterDb;

    private int counter;

    private final static String objKeyPrefix = "NC";

    ServantManagerImpl(ORB orb, File logDir, NameService aNameService)
    {
	this.logDir = logDir;
	this.orb    = orb;
	// initialize the counter database
	counterDb   = new CounterDB(logDir);
	contexts    = new Hashtable();
	theNameService = aNameService;
    }


    public Servant preinvoke(byte[] oid, POA adapter, String operation, 
			     CookieHolder cookie) throws ForwardRequest
    {

	String objKey = new String(oid);

	Servant servant = (Servant) contexts.get(objKey);

	if (servant == null)
	{
		 servant =  readInContext(objKey);
	}

	return servant;
    }

    public void postinvoke(byte[] oid, POA adapter, String operation,
			   java.lang.Object cookie, Servant servant)
    {
	// nada
    }

    public NamingContextImpl readInContext(String objKey)
    {
	NamingContextImpl context = (NamingContextImpl) contexts.get(objKey);
	if( context != null )
	{
		// Returning Context from Cache
		return context;
	}	

	File contextFile = new File(logDir, objKey);
	if (contextFile.exists()) {
	    try {
		FileInputStream fis = new FileInputStream(contextFile);
		ObjectInputStream ois = new ObjectInputStream(fis);
		context = (NamingContextImpl) ois.readObject();
		context.setORB( orb );
		context.setServantManagerImpl( this );
		context.setRootNameService( theNameService );
		ois.close();
	    } catch (Exception ex) {
	    }
	}

	if (context != null)
	{
		contexts.put(objKey, context);
	}
	return context;
    }

    public NamingContextImpl addContext(String objKey, 
					NamingContextImpl context)
    {
	File contextFile =  new File(logDir, objKey);

	if (contextFile.exists()) 
	{
	    context = readInContext(objKey);
	}
	else {
	    try {
		FileOutputStream fos = new FileOutputStream(contextFile);
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(context);
		oos.close();
	    } catch (Exception ex) {
	    }
	}
	try
	{
		contexts.remove( objKey );
	}
	catch( Exception e)
	{
	}
	contexts.put(objKey, context);

	return context;
    }	

    public void updateContext( String objKey,
				   NamingContextImpl context )
    {
	File contextFile =  new File(logDir, objKey);
	if (contextFile.exists()) 
	{
		contextFile.delete( );
		contextFile =  new File(logDir, objKey);
	}
		
        try {
		FileOutputStream fos = new FileOutputStream(contextFile);
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(context);
		oos.close();
	    } catch (Exception ex) {
		ex.printStackTrace( );
	    }
    }

    public static String getRootObjectKey()
    {
	return objKeyPrefix + CounterDB.rootCounter;
    }

    public String getNewObjectKey()
    {
	return objKeyPrefix + counterDb.getNextCounter();
    }



}

class CounterDB implements Serializable
{

    CounterDB (File logDir)
    {
        counterFileName = "counter";
	counterFile = new File(logDir, counterFileName);
	if (!counterFile.exists()) {
	    counter = new Integer(rootCounter);
    	    writeCounter();
	} else {
	    readCounter();
	}
    }

    private void readCounter()
    {
	try {
	    FileInputStream fis = new FileInputStream(counterFile);
	    ObjectInputStream ois = new ObjectInputStream(fis);
	    counter = (Integer) ois.readObject();
	    ois.close();
	} catch (Exception ex) {
				}
    }

    private void writeCounter()
    {
	try {
	    counterFile.delete();
	    FileOutputStream fos = new FileOutputStream(counterFile);
	    ObjectOutputStream oos = new ObjectOutputStream(fos);
	    oos.writeObject(counter);
	    oos.flush();
	    oos.close();

	} catch (Exception ex) {
	}
    }

    public synchronized int getNextCounter()
    {
	int counterVal = counter.intValue();
	counter = new Integer(++counterVal); 
	writeCounter();

	return counterVal;
    }

	

    private Integer counter;

    private static String counterFileName = "counter";

    private transient File counterFile;

    public  final static int rootCounter = 0;
}