#pragma prefix "omg.org"

#include "orb.idl"

module PortableServer {
	// forward reference
	interface POA;

	native Servant;

	typedef sequence<octet> ObjectId;

	exception ForwardRequest {
		Object forward_reference;
	};

	// **********************************************
	//
	// Policy interfaces
	// 
	// **********************************************
	enum ThreadPolicyValue {
		ORB_CTRL_MODEL,
		SINGLE_THREAD_MODEL
	};

	interface ThreadPolicy : CORBA::Policy {
		readonly attribute ThreadPolicyValue value;
	};

	enum LifespanPolicyValue {
		TRANSIENT,
		PERSISTENT
	};

	interface LifespanPolicy : CORBA::Policy {
		readonly attribute LifespanPolicyValue value;
	};

	enum IdUniquenessPolicyValue {
		UNIQUE_ID,
		MULTIPLE_ID
	};

	interface IdUniquenessPolicy : CORBA::Policy {
		readonly attribute IdUniquenessPolicyValue value;
	};

	enum IdAssignmentPolicyValue {
		USER_ID,
		SYSTEM_ID
	};

	interface IdAssignmentPolicy : CORBA::Policy {
		readonly attribute IdAssignmentPolicyValue value;
	};

	enum ImplicitActivationPolicyValue {
		IMPLICIT_ACTIVATION,
		NO_IMPLICIT_ACTIVATION
	};

	interface ImplicitActivationPolicy : CORBA::Policy {
		readonly attribute ImplicitActivationPolicyValue value;
	};

	enum ServantRetentionPolicyValue {
		RETAIN,
		NON_RETAIN
	};

	interface ServantRetentionPolicy : CORBA::Policy {
		readonly attribute ServantRetentionPolicyValue value;
	};

	enum RequestProcessingPolicyValue {
		USE_ACTIVE_OBJECT_MAP_ONLY,
		USE_DEFAULT_SERVANT,
		USE_SERVANT_MANAGER
	};

	interface RequestProcessingPolicy : CORBA::Policy {
		readonly attribute RequestProcessingPolicyValue value;
	};

	// **************************************************
	//
	// POAManager interface
	//
	// **************************************************

	interface POAManager {
		exception AdapterInactive{};

		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);
	};

	// **************************************************
	//
	// AdapterActivator interface
	//
	// **************************************************

	interface AdapterActivator {
		boolean unknown_adapter(in POA parent, in string name);
	};

	// **************************************************
	//
	// ServantManager interface
	//
	// **************************************************

	interface ServantManager {
	};

	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 );
	};

	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);
	};

	// **************************************************
	//
	// POA interface
	//
	// **************************************************

	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 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
	//
	// **************************************************

	interface Current : CORBA::Current {
		exception NoContext {
		};

		POA get_POA() raises (NoContext);
		ObjectId get_object_id() raises (NoContext);
	};
};

