/*
 *  OrbPcoPool.java v0.10 20-DEC-1999
 *  Copyright (c) TKK/TLM/Calypso
 *  Author: Alexey Mednonogov
 */

package codec.pco;

import java.io.*;
import java.util.*;

import codec.*;
import codec.adapt.*;
import codec.convert.*;
import codec.debug.*;
import codec.dyntree.*;
import codec.export.*;
import codec.orb.*;
import codec.pco.*;
import codec.server.*;
import codec.client.*;
import codec.visit.*;
import codec.build.*;

/** Class for handling PCO objects. It registers and deregisters PCOs
 *  supplied by PcoManagerImpl. */
final public class OrbPcoPool {

    /** Pool of PCO objects. */
    private Map objects;

    public OrbPcoPool() {
        objects = Collections.synchronizedMap(new HashMap());
    }

    /** Retrieve registered object identified by "pcoName" from pool.
     *  @return <code>null</code> in case no such "pcoName" is registered. */
    public OrbPco getObject(String pcoName) {

        OrbPco object = null;
        synchronized (objects) { object = (OrbPco) objects.get(pcoName); }
        return object;
    }

    /** Create new PCO instance "pcoName" and advertise its presence to
     *  the world by saving its IOR to "refFileName". In case PCO instance
     *  with the same name already exists, it is replaced by a new one and
     *  warning message is displayed. */ 
    public void register(String pcoName, String refFileName) {

        synchronized (objects) {

            System.out.println("OrbPcoPool::register(): Creating PCO \"" +
                pcoName + "\", saving IOR to \"" + refFileName + "\".");

            CorbaServer.getCodecObject().
				getCorbaObjectPool().deregister(pcoName);

            if (objects.put(pcoName, new OrbPco(
                pcoName, refFileName)) != null) {

                System.out.println("Warning: OrbPcoPool::register(): " +
                    "Attempt to create an already existing PCO instance. " +
                    "Removing old PCO instance and creating a new one.");
            }
        }
    }

    /** Remove PCO instance identified by PCO name. */
    public void deregister(String pcoName) {

        synchronized (objects) {

            System.out.println("OrbPcoPool::deregister(): Removing PCO \"" +
                pcoName + "\".");

            CorbaServer.getCodecObject().
				getCorbaObjectPool().deregister(pcoName);

            if (objects.remove(pcoName) == null) {

                System.out.println("Warning: OrbPcoPool::deregister(): " +
                    "Attempt to remove non-existing PCO instance.");
            }
        }
    }
}
