// CORBA V2.6
// PORTABLE OBJECT ADAPTER, Chapter 9
// $Id: PortableServer.idl,v 1.8 2004/02/02 08:56:54 gerald Exp $

#ifndef _POA_IDL_
#define _POA_IDL_

#pragma prefix "omg.org"

#include <orb.idl>

module PortableServer
{
    // forward declaration

    local interface POA;
    typedef sequence<POA> POAList;
	
    native Servant;
	
    typedef CORBA::OctetSeq ObjectId;
	
    exception ForwardRequest
    {
        Object forward_reference;
    };
	
    // **********************************************
    //
    // Policy interfaces
    //
    // **********************************************

    const CORBA::PolicyType THREAD_POLICY_ID = 16;
    const CORBA::PolicyType LIFESPAN_POLICY_ID = 17;
    const CORBA::PolicyType ID_UNIQUENESS_POLICY_ID = 18;
    const CORBA::PolicyType ID_ASSIGNMENT_POLICY_ID = 19;
    const CORBA::PolicyType IMPLICIT_ACTIVATION_POLICY_ID = 20;
    const CORBA::PolicyType SERVANT_RETENTION_POLICY_ID = 21;
    const CORBA::PolicyType REQUEST_PROCESSING_POLICY_ID = 22;

    enum ThreadPolicyValue
    {
	ORB_CTRL_MODEL,
	SINGLE_THREAD_MODEL,
        MAIN_THREAD_MODEL
    };

    local interface ThreadPolicy : CORBA::Policy
    {
        readonly attribute ThreadPolicyValue value;
    };
	
    enum LifespanPolicyValue
    {
	TRANSIENT,
	PERSISTENT
    };

    local interface LifespanPolicy : CORBA::Policy
    {
        readonly attribute LifespanPolicyValue value;
    };
	
    enum IdUniquenessPolicyValue
    {
	UNIQUE_ID,
	MULTIPLE_ID
    };

    local interface IdUniquenessPolicy : CORBA::Policy
    {
	readonly attribute IdUniquenessPolicyValue value;
    };
	
    enum IdAssignmentPolicyValue
    {
	USER_ID,
	SYSTEM_ID
    };

    local interface IdAssignmentPolicy : CORBA::Policy
    {
        readonly attribute IdAssignmentPolicyValue value;
    };
	
    enum ImplicitActivationPolicyValue
    {
	IMPLICIT_ACTIVATION,
	NO_IMPLICIT_ACTIVATION
    };

    local interface ImplicitActivationPolicy : CORBA::Policy
    {
	readonly attribute ImplicitActivationPolicyValue value;
    };
	
    enum ServantRetentionPolicyValue
    {
	RETAIN,
	NON_RETAIN
    };

    local interface ServantRetentionPolicy : CORBA::Policy
    {
	readonly attribute ServantRetentionPolicyValue value;
    };
	
    enum RequestProcessingPolicyValue
    {
	USE_ACTIVE_OBJECT_MAP_ONLY,
	USE_DEFAULT_SERVANT,
	USE_SERVANT_MANAGER
    };

    local interface RequestProcessingPolicy : CORBA::Policy
    {
	readonly attribute RequestProcessingPolicyValue value;
    };
	
    // **************************************************
    //
    // POAManager interface
    //
    // **************************************************
	
    local interface POAManager
    {
	exception AdapterInactive {};
	
	enum State { HOLDING, ACTIVE, DISCARDING, INACTIVE };

	void activate () 
	    raises (AdapterInactive);
	void hold_requests (in boolean wait_for_completion) 
	    raises (AdapterInactive);
	void discard_requests (in boolean wait_for_completion)
	    raises (AdapterInactive );
	void deactivate (in boolean etherealize_objects,
			 in boolean wait_for_completion)
	    raises (AdapterInactive);
	
	State get_state ();
    };
	
    // **************************************************
    //
    // AdapterActivator interface
    //
    // **************************************************
	
    local interface AdapterActivator
    {
	boolean unknown_adapter (in POA parent, in string name);
    };
	
    // **************************************************
    //
    // ServantManager interface
    //
    // **************************************************
	
    local interface ServantManager {};
	
    local interface ServantActivator : ServantManager 
    {
	Servant incarnate (in ObjectId oid,
			   in POA adapter)
	    raises (ForwardRequest);
	
	void etherealize (in ObjectId oid,
			  in POA adapter,
			  in Servant serv,
			  in boolean cleanup_in_progress,
			  in boolean remaining_activations);
    };
	
    /* not compiled, mapping classes provided separately

    local interface ServantLocator : ServantManager 
    {
	native 	Cookie;

	Servant preinvoke (in ObjectId	       	oid,
			   in POA	       	adapter,
			   in CORBA::Identifier	operation,
			   out Cookie	       	the_cookie)
	    raises (ForwardRequest);
	
	void postinvoke(in ObjectId   		oid,
			in POA			adapter,
			in CORBA::Identifier	operation,
			in Cookie    	       	the_cookie,
			in Servant	       	the_servant	)
	    raises (ForwardRequest); // this exception is only in the Java mapping!
    };
    */
	
    // **************************************************
    //
    // POA interface
    //
    // **************************************************
	

    local interface POA
    {
	    exception AdapterAlreadyExists {};
	    exception AdapterInactive {};
	    exception AdapterNonExistent {};
	    exception InvalidPolicy {unsigned short index;};
	    exception NoServant {};
	    exception ObjectAlreadyActive {};
	    exception ObjectNotActive {};
	    exception ServantAlreadyActive {};
	    exception ServantNotActive {};
	    exception WrongAdapter {};
	    exception WrongPolicy {};
	
	    //--------------------------------------------------
	    //
	    // POA creation and destruction
	    //
	    //--------------------------------------------------
	
	    POA create_POA( in string adapter_name,
			    in POAManager a_POAManager,
			    in CORBA::PolicyList policies )
		raises ( AdapterAlreadyExists, InvalidPolicy );
	
	    POA find_POA( in string adapter_name, in boolean activate_it )
		raises ( AdapterNonExistent );
	
	    void destroy(	in boolean etherealize_objects,
				in boolean wait_for_completion );
	
	    // **************************************************
	    //
	    // Factories for Policy objects
	    //
	    // **************************************************
	    ThreadPolicy create_thread_policy
                (in ThreadPolicyValue value);
	    LifespanPolicy create_lifespan_policy
                (in LifespanPolicyValue value);
	    IdUniquenessPolicy create_id_uniqueness_policy
                (in IdUniquenessPolicyValue value);
	    IdAssignmentPolicy create_id_assignment_policy
                (in IdAssignmentPolicyValue value);
	    ImplicitActivationPolicy create_implicit_activation_policy
                (in ImplicitActivationPolicyValue value);
	    ServantRetentionPolicy create_servant_retention_policy
		(in ServantRetentionPolicyValue value);
	    RequestProcessingPolicy create_request_processing_policy
		(in RequestProcessingPolicyValue value);
	
	    //--------------------------------------------------
	    //
	    // POA attributes
	    //
	    //--------------------------------------------------
	
            readonly attribute string     the_name;
            readonly attribute POA        the_parent;
            readonly attribute POAList    the_children;
            readonly attribute POAManager the_POAManager;
            attribute AdapterActivator    the_activator;
	
	
	    //--------------------------------------------------
	    //
	    // Servant Manager registration:
	    //
	    //--------------------------------------------------
	
	    ServantManager get_servant_manager( )
		raises ( WrongPolicy );
	
	    void set_servant_manager( in ServantManager imgr )
		raises ( WrongPolicy );
	
	    //--------------------------------------------------
	    //
	    // operations for the USE_DEFAULT_SERVANT policy
	    //
	    //--------------------------------------------------
	
	    Servant get_servant( )
		raises ( NoServant, WrongPolicy );
	
	    void set_servant( in Servant p_servant )
		raises ( WrongPolicy );
	
	    // **************************************************
	    //
	    // object activation and deactivation
	    //
	    // **************************************************
	
	    ObjectId activate_object( in Servant p_servant )
		raises ( ServantAlreadyActive, WrongPolicy );
	
	    void activate_object_with_id (in ObjectId	id,
					 in Servant	p_servant)
		raises ( ServantAlreadyActive, ObjectAlreadyActive,
			 WrongPolicy );
	
	    void deactivate_object( in ObjectId oid )
		raises ( ObjectNotActive, WrongPolicy );
	
	    // **************************************************
	    //
	    // reference creation operations
	    //
	    // **************************************************
	
	    Object create_reference (in CORBA::RepositoryId intf)
		raises (WrongPolicy);
	
	    Object create_reference_with_id
            (
               in ObjectId oid,
               in CORBA::RepositoryId intf
            )
            raises (WrongPolicy);
	
	
	    //--------------------------------------------------
	    //
	    // Identity mapping operations:
	    //
	    //--------------------------------------------------
	
	    ObjectId servant_to_id (in Servant p_servant)
		raises (ServantNotActive, WrongPolicy);
	
	    Object servant_to_reference (in Servant p_servant)
		raises (ServantNotActive, WrongPolicy);
	
	    Servant reference_to_servant (in Object reference)
		raises (ObjectNotActive, WrongAdapter, WrongPolicy);
	
	    ObjectId reference_to_id (in Object reference)
		raises (WrongAdapter, WrongPolicy);
	
	    Servant id_to_servant (in ObjectId oid)
		raises (ObjectNotActive, WrongPolicy);
	
	    Object id_to_reference (in ObjectId oid)
		raises (ObjectNotActive, WrongPolicy);
    };
	
	
    // **************************************************
    //
    // Current interface
    //
    // **************************************************

    // not pseudo, because it must be returned as a subtype
    // of CORBA::Object in resolve_initial_references()
	
    local interface Current : CORBA::Current
    {
	exception NoContext {};
	
	POA get_POA () raises (NoContext);
	ObjectId get_object_id () raises (NoContext); 
	Object get_reference () raises (NoContext); 
	Servant get_servant () raises (NoContext); 
    };
	
};

#endif /* _POA_IDL_ */
