All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.arjuna.orbportability.OA Maven / Gradle / Ivy

/*
 * JBoss, Home of Professional Open Source
 * Copyright 2006, Red Hat Middleware LLC, and individual contributors
 * as indicated by the @author tags. 
 * See the copyright.txt in the distribution for a full listing 
 * of individual contributors.
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
 * of the GNU Lesser General Public License, v. 2.1.
 * This program is distributed in the hope that it will be useful, but WITHOUT A
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public License,
 * v.2.1 along with this distribution; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA  02110-1301, USA.
 * 
 * (C) 2005-2006,
 * @author JBoss Inc.
 */
/*
 * Copyright (C) 1998, 1999, 2000, 2001,
 *
 * Arjuna Solutions Limited,
 * Newcastle upon Tyne,
 * Tyne and Wear,
 * UK.
 *
 * $Id: OA.java 2342 2006-03-30 13:06:17Z  $
 */

package com.arjuna.orbportability;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;

import org.omg.CORBA.Policy;
import org.omg.CORBA.SystemException;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.Servant;
import org.omg.PortableServer.POAManagerPackage.AdapterInactive;
import org.omg.PortableServer.POAPackage.AdapterAlreadyExists;
import org.omg.PortableServer.POAPackage.InvalidPolicy;

import com.arjuna.orbportability.exceptions.FatalError;
import com.arjuna.orbportability.internal.utils.PostInitLoader;
import com.arjuna.orbportability.internal.utils.PostSetLoader;
import com.arjuna.orbportability.internal.utils.PreInitLoader;
import com.arjuna.orbportability.logging.opLogger;
import com.arjuna.orbportability.oa.Attribute;
import com.arjuna.orbportability.oa.PostShutdown;
import com.arjuna.orbportability.oa.PreShutdown;

/**
 * An attempt at some ORB portable ways of interacting with the OA. NOTE:
 * initPOA *must* be called if you want to use the pre- and post- initialisation
 * mechanisms.
 * 
 * @author Mark Little ([email protected])
 * @version $Id: OA.java 2342 2006-03-30 13:06:17Z $
 * @since JTS 2.1.
 */

public abstract class OA
{

    /**
     * Ensure that all OA specific initialisation is done even if the programmer
     * uses the OA specific init routines. This method does not need to be
     * called if using initOA methods.
     * 
     * @since JTS 2.1.1.
     */

    public synchronized void init () throws SystemException
    {
        // null op - just to ensure we create the OA object!
    }

    public synchronized void initPOA () throws InvalidName, SystemException
    {
        initPOA(null);
    }

    public ORB getAssociatedORB ()
    {
        return _associatedORB;
    }

    public void setPOA (org.omg.PortableServer.POA p) throws SystemException
    {
        if (!_oa.initialised())
        {
            _oa.rootPoa(p);

            performPostSet(this._oaName);
        }
    }

    /**
     * Loads and runs the configured pre-initialisation classes
     */

    protected void performPreInit (String oaName)
    {
        /**
         * Perform pre-initialisation classes for all OAs
         */
        PreInitLoader preInit = new PreInitLoader(PreInitLoader
                .generateOAPropertyName(ORB.ORB_INITIALISER_NS), this);

        /**
         * Perform pre-initialisation classes for all OAs
         */
        preInit = new PreInitLoader(PreInitLoader.generateOAPropertyName(
                ORB.ORB_INITIALISER_NS, _associatedORB.getName()), this);

        /**
         * Perform pre-initialisation classes for this OA only
         */
        preInit = new PreInitLoader(PreInitLoader.generateOAPropertyName(
                ORB.ORB_INITIALISER_NS, _associatedORB.getName(), oaName), this);
        preInit = null;
    }

    protected void performPostSet (String oaName)
    {
        /**
         * Perform post-set operations for all OAs
         */
        new PostSetLoader(PostSetLoader
                .generateOAPropertyName(ORB.ORB_INITIALISER_NS), this);

        /**
         * Perform post-set operations for all OAs
         */
        new PostSetLoader(PostSetLoader.generateOAPropertyName(
                ORB.ORB_INITIALISER_NS, _associatedORB.getName()), this);

        /**
         * Perform post-set operations for this OA only
         */
        new PreInitLoader(PostSetLoader.generateOAPropertyName(
                ORB.ORB_INITIALISER_NS, _associatedORB.getName(), oaName), this);
    }

    /**
     * Loads and runs the configured post-initialisation classes
     */

    protected void performPostInit (String oaName)
    {
        /**
         * Perform post-initialisation classes for all OAs
         */
        PostInitLoader postInit = new PostInitLoader(PostInitLoader
                .generateOAPropertyName(ORB.ORB_INITIALISER_NS), this);

        /**
         * Perform post-initialisation classes for all OAs
         */
        postInit = new PostInitLoader(PostInitLoader.generateOAPropertyName(
                ORB.ORB_INITIALISER_NS, _associatedORB.getName()), this);

        /**
         * Perform post-initialisation classes for this OA only
         */
        postInit = new PostInitLoader(PostInitLoader.generateOAPropertyName(
                ORB.ORB_INITIALISER_NS, _associatedORB.getName(), oaName), this);
        postInit = null;
    }

    public synchronized void initPOA (String[] args) throws InvalidName,
            SystemException
    {
        if (opLogger.logger.isTraceEnabled()) {
            opLogger.logger.trace("OA::initPOA (String[])");
        }

        if (!_oa.initialised())
        {
            if (_associatedORB._orb.initialised())
            {
                performPreInit(_oaName);

                parseProperties(args, true);

                try
                {
                    _oa.init(); // create the root poa
                }
                catch (final org.omg.CORBA.INITIALIZE ex)
                {
                    opLogger.i18NLogger.warn_OA_initialize();
                    
                    throw ex;
                }
                catch (final Exception e)
                {
                    opLogger.i18NLogger.warn_OA_caughtexception("OA.initPOA", e);

                   throw new FatalError("OA.initPOA: "+e.toString());
                }

                parseProperties(args, false);

                performPostInit(_oaName);
            }
            else
            {
                throw new FatalError( opLogger.i18NLogger.get_OA_uninitialsedorb() );
            }
        }
    }

    public synchronized ChildOA createPOA (String adapterName, Policy[] policies)
            throws AdapterAlreadyExists, InvalidPolicy, AdapterInactive
    {
        if (opLogger.logger.isTraceEnabled()) {
            opLogger.logger.trace("OA::createPOA ("
                    + adapterName + " )");
        }

        if (!_oa.initialised())
        {
            opLogger.i18NLogger.warn_OA_oanotinitialised();

            throw new AdapterInactive();
        }

        if (_defaultAdapterName == null)
            _defaultAdapterName = adapterName;

        /**
         * Perform OA pre-initialisation routines
         */
        performPreInit(adapterName);

        /**
         * Create a child POA of this POA passing the policies passed in
         */
        _oa.createPOA(adapterName, policies);
        ChildOA newChildOA = new ChildOA(_associatedORB, adapterName, _oa
                .poa(adapterName));

        /**
         * Perform OA post-initialisation routines
         */
        performPostInit(adapterName);

        return (newChildOA);
    }

    public void initOA () throws InvalidName, SystemException
    {
        initOA(null);
    }

    public void initOA (String[] args) throws InvalidName, SystemException
    {
        initPOA(args);
    }

    public synchronized boolean addAttribute (Attribute p)
    {
        if (opLogger.logger.isTraceEnabled()) {
            opLogger.logger.trace("OA::addAttribute (" + p
                    + ")");
        }

        if ((_oa.initialised()) || (p == null)) // oa already set up!
            return false;

        if (p.postOAInit())
            _postOAInitProperty.put(p, p);
        else
            _preOAInitProperty.put(p, p);

        return true;
    }

    public abstract void destroy () throws SystemException;

    public synchronized POA rootPoa ()
    {
        return _oa.rootPoa();
    }

    public synchronized POA poa (String adapterName)
    {
        return _oa.poa(adapterName);
    }

    public synchronized boolean setPoa (String adapterName, POA thePOA)
    {
        if (adapterName != null)
        {
            _oa.poa(adapterName, thePOA);

            return true;
        }
        else
            return false;
    }

    public synchronized void addPreShutdown (PreShutdown c)
    {
        if (opLogger.logger.isTraceEnabled()) {
            opLogger.logger.trace("OA::addPreShutdown ("
                    + c + ")");
        }

        _preOAShutdown.put(c, c);
    }

    public synchronized void addPostShutdown (PostShutdown c)
    {
        if (opLogger.logger.isTraceEnabled()) {
            opLogger.logger.trace("OA::addPostShutdown ("
                    + c + ")");
        }

        _postOAShutdown.put(c, c);
    }

    /**
     * @return a CORBA object reference for the Servant/Implementation.
     */

    public abstract org.omg.CORBA.Object corbaReference (Servant obj);

    public org.omg.CORBA.Object corbaReference (Servant obj, POA poa)
    {
        try
        {
            return poa.servant_to_reference(obj);
        }
        catch (Exception e)
        {
            return null;
        }
    }

    /**
     * Register the object with the ORB.
     */
    public abstract boolean objectIsReady (Servant obj, byte[] id)
            throws SystemException;

    public abstract boolean objectIsReady (Servant obj) throws SystemException;

    /**
     * Dispose of the object, i.e., unregister it from the ORB.
     */
    public abstract boolean shutdownObject (org.omg.CORBA.Object obj);

    public abstract boolean shutdownObject (Servant obj);

    /**
     * Place the server into a state where it can begin to accept requests for
     * objects from clients.
     */

    public void run (String name) throws SystemException
    {
        if (opLogger.logger.isTraceEnabled()) {
            opLogger.logger.trace("OA::run (" + name + ")");
        }

        _oa.run(name);
    }

    public void run () throws SystemException
    {
        if (opLogger.logger.isTraceEnabled()) {
            opLogger.logger.trace("OA::run ()");
        }

        _oa.run();
    }

    private final void parseProperties (String[] params, boolean preInit)
    {
        if (opLogger.logger.isTraceEnabled()) {
            opLogger.logger.trace("OA::parseProperties (String[], " + preInit + ")");
        }

        Hashtable work = ((preInit) ? _preOAInitProperty : _postOAInitProperty);

        if (!work.isEmpty())
        {
            Enumeration elements = work.elements();

            while (elements.hasMoreElements())
            {
                Attribute p = (Attribute) elements.nextElement();

                if (p != null)
                {
                    if (opLogger.logger.isTraceEnabled()) {
                        opLogger.logger.trace("Attribute "
                                + p + " initialising.");
                    }

                    p.initialise(params);
                    p = null;
                }
            }

            // work.clear();
        }
    }

    OA(com.arjuna.orbportability.ORB orb, String oaName)
    {
        _associatedORB = orb;
        _oaName = oaName;
        _oa = new com.arjuna.orbportability.oa.core.OA(_associatedORB._orb);
    }

    /**
     * OA constructor - creates an OA which represents a given POA on a given
     * ORB
     * 
     * @param orb
     *            The ORB this OA exists in
     * @param oa
     *            The OA this class will wrap around
     */
    OA(com.arjuna.orbportability.ORB orb, String oaName, POA oa)
    {
        _associatedORB = orb;
        _oaName = oaName;

        /**
         * Create OA class and associate it with the given ORB
         */
        _oa = new com.arjuna.orbportability.oa.core.OA(_associatedORB._orb);

        /**
         * Set the Root OA for this OA class to the given OA
         */
        _oa.rootPoa(oa);
    }

    /**
     * Retrieve an OA instance given a unique name, if an OA instance with this
     * name doesn't exist then create it.
     * 
     * @param associatedORB
     *            The ORB this OA is being created for.
     * @return The OA instance referred to by the name given.
     */
    public synchronized static RootOA getRootOA (ORB associatedORB)
    {

        /**
         * Get the OA for this ORB instance
         */
        RootOA oa = (RootOA) _orbToOAMap.get(associatedORB);

        if (oa == null)
        {
            oa = new com.arjuna.orbportability.RootOA(associatedORB);

            _orbToOAMap.put(associatedORB, oa);
        }

        return (oa);
    }

    com.arjuna.orbportability.oa.core.OA _oa = null;

    com.arjuna.orbportability.ORB _associatedORB = null;

    protected String _defaultAdapterName = null;

    protected String _oaName = null;

    protected Hashtable _preOAShutdown = new Hashtable();

    protected Hashtable _postOAShutdown = new Hashtable();

    protected Hashtable _preOAInitProperty = new Hashtable();

    protected Hashtable _postOAInitProperty = new Hashtable();

    private static HashMap _orbToOAMap = new HashMap();
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy