����� POA ��ϵ�ṹ

POA ������

POA ���ڰ�������Dz�����ǵ��ʹ�����������������һ�ִ���װ�� POA ���ʹӵ�;����ԭ������ͬһ��ʱ���Ͽ����д����Ķ�����һ�����󷢳���������ͨ��ʹ�� POA ��������ɵġ�ÿ�� POA ��ͬij�� POAManager ������š�

POAManager ����������������������״̬�������͵����ǵ� POA��һ�� POAManager ������ 4 ������״̬����Ծ(active)����ֹ(inactive)������(holding)������(discarding)��������ڻ�Ծ״̬�����󱻷��͵� POA��������ڱ���״̬�����󱻷���ȴ����У�һֱ�ȵ� POAManager �ص���Ծ״̬��������ڶ���״̬������ֻ�DZ��򵥵Ķ�����

һ��ģ��㲻��Ҫ�Լ�д POAManager ��ʵ�� �������������Ľӿ���ʹ�� RootPOA �� POAManager ��

module PortableServer {
interface POA {

	POA create_POA (in string adapter_name, 
			in POAManager a_POAManager,
			in CORBA::PolicyList policies)
		raises (AdapterAllreadyExists, 
			InvalidPolicy);
	void destroy (in boolean etherealize_objects,
			in boolean wait_for_completion);
	POA find_poa (in string adapter_name, 
			in POAManager a_POAManager
			in CORBA::PolicyList ListPolicies);

	readonly attribute POA the_parent;
	readonly attribute string the_name;
	readonly attribute POAManager the_POAManager;
};
};

����:

PortableServer_POA root_poa;
PortableServer_POAManager root_poa_manager;
root_poa = CORBA_ORB_resolve_initial_references (orb, 
	"RootPOA", 
	&ev);
root_poa_manager = PortableServer_POA_get_the_POAManager (root_poa, 
	&ev);

PortableServer_POA_create_poa (root_poa, "my_own_poa", 
	root_poa_manager, 
	NULL, 
	&ev);

һ�� POA ������Ϊ��һ�� POA ���� POA �����ģ�RootPOA �� POA ���ĸ���������֪���� POA  �����֣�ͨ���� find_poa ���������ҵ��ض���һ���� POA��the_parent ����(attribute)���и� POA��the_name ���Գ���  create_poa ����������� POA ���֡� destroy_poa ��������Ϊ������������ POA �Լ����������� POA��

Ϊ�˱�������ʹӣ�����һ�� RootPOA ���� POA ����Ϊ����ʹӵ� _base_epv �� default_poa ��Ա����Ҳ����ȷ����� POA ʹ�õ� POAManager (��������˵����������һ���� RootPOA ��ӵ�е��Ǹ� POAManager)���ڼ���״̬��ԭ���� POAManager ����ʼ���ɱ���״̬�ġ����µ���һ�ڽ��ṩ�������롣

POA ����

����ÿ�� POA ��������һϵ�в���(Policies)������������dz���ȷ�Ŀ������ POA �����棬����������...

ÿ�� POA �� PortableServer_POA_createPOA ��������ʱҪͨ���� CORBA::PolicyList policies �����������IJ��ԡ�

������ݵ���һ�� NULL ������ʹ��ȱʡ�IJ��ԡ������Dz������ͺ����ǿ��ܵ�ֵ���б��� ȱʡ��ֵ��б���ֱ�ʾ��

�� 4-2. POA ����

���Ե��������ܵ�ֵ���Ե���;
ThreadPolicy(�̲߳���)ORB_CTRL_MODEL, SINGLE_THREAD_MODEL�� SINGLE_THREAD �����£�ֻ���Դ���һ��  POA �̡߳�
LifespanPolicy(�������ڲ���)TRANSIENT, PERSISTENT�� TRANSIENT �����£�����ʵ�ֽ�ͬ���� POA һ����ʧ����һ�ַ�ʽ�£�����Ҫʱ����һ���µ� POA��
ObjectIdUniqueness(ObjectId Ψһ�Բ���)UNIQUE_ID, MULTIPLE_ID�ڸ�����һ�� POA ��ÿ��������һ��Ψһ�� ObjectId��
IdAssignmentPolicy(Id �������)USER_ID, SYSTEM_IDҪô���û�Ҫô��ϵͳ���� ObjectId�� ����: ����һ�������� POA�������ʹ���������������֮һ: activate_object �� activate_object_with_id ��
ServantRetentionPolicy(�ʹӱ��ֲ���)RETAIN, NON_RETAIN�� NON RETAIN �����£���һ���ʹӵ������Ѿ��ڴ����ˣ���һ����������������һ�� ObjectNotExist ���⡣
RequestProcessingPolicy(����Ĵ�������)USE_ACTIVE_OBJECT_MAP_ONLY, USE_DEFAULT_SERVANT, USE_SERVANT_MANAGER��һ���ʹӵ������� POA ӳ����û�ҵ���������Ҫô�ǵ�һ��ȱʡ���ʹӵĵ��ã�Ҫô������һ�� ObjectNotExist ���⣬Ҫô�ǵ��ʹӹ�������һ��������Ҫ����ʹӵ�����  
ImplicitActivationPolicy(��ʽ�������)IMPLICIT_ACTIVATION, NO_IMPLICIT_ACTIVATION ���ʹ�� NO_IMPLICIT_ACTIVATION ������߽���Ҫ�������еĽ������ʹӡ�

��Щ���Զ���Ӧʹ�� POA �ӿڵ����е����������� 

module PortableServer {
interface POA {

ThreadPolicy create_thread_policy (in ThreadPolicyValue value);
LifespanPolicy create_lifespan_policy (in LifespanPolicyValue value);
IdUniquenessPolicy create_id_uniqueness_policy 
	(in IdUniquenessPolicyValue value);
IdAssignementPolicy create_id_assignment_policy 
	(in IdAssignmentPolicyValue value);
ImplicitActivationPolicy create_implicit_activation_policy 
	(in ImplicitActivationPolicyValue value);
ServantRetentionPolicy create_servant_retention_policy 
	(in ServantRetentionPolicyValue value);
ProcessingPolicy create_processing_policy 
	(in ProcessingPolicyValue value);
};
};

��Щ���Զ�Ӧ�ñ����� CORBA::PolicyList �в����ݸ� create_poa ��������������ȷ�IJ��Խ��� POA����һϵ�в��Ը�������ǿ��ķ��������������������Ϊ����߿��Ծ�ȷ����������������Ϊ�������Կ��Ʒ�������װ�ء������ǽ���һ��ʹ����Щ���Ե� POA ���������롣ע�⵱��һ�� PolicyList �е�ij���������Ͳ����ڵ�ʱ�򣬲������ͱ�ȱʡΪ����ǰ������г�����ȱʡֵ��

// ���Զ���� idl
module CORBA {
typedef unsigned long PolicyType;
interface Policy
{
	readonly attribute PolicyType policy_type;
	Policy copy();
	void destroy();
};

typedef sequence <Policy> PolicyList;
};
/* ����һ�� PolicyList ����� C ���� */

CORBA_Policy policies[2];
CORBA_PolicyList list = {2, 2, policies};

policies[1] = PortableServer_POA_create_Id_Uniqueness_Policy (MULTIPLE_ID, 
	&ev);
policies[2] = PortableServer_POA_create_Id_Assignment_Policy (USER_ID, 
	&ev);
PortableServer_POA_create_poa (poa, 
	"my_poa", 
	poa_manager, 
	list, 
	&ev);

CORBA_Policy_destroy (policies[1]);
CORBA_Policy_destroy (policies[2]);

һ���õ�����/���ɣ�hack��

������Ҫ�����ʵ�ֺ�������һЩ������(common)������������ĺ�������һ���� PortableServer_Servant �ṹ��ָ����Ϊ��һ���������鿴����Ĵ��룺

typedef struct {
	PortableServer_Servant servant;
	long my_field;
	long my_second_field;
	void *pointer_to_my_structure;
} my_POA_FruitsBasket_Apple

my_POA_FruitsBasket_Apple Apple;

 &Apple ��һ���� Apple �ṹ��ָ�룬Ҳ�ǵ�����ṹ�ĵ�һ���ֶε�ָ�룬�� C ������ &Apple == &Apple.servant������ζ����ע�����ʹӵ�ʱ��������õ��ǵ� Apple ��ָ�룬���ָ�뽫�����ݸ����е�ʵ�ֺ�����������������ԭ����һ�� my_POA_FruitsBasket_Apple ָ��Ҳ��һ���� PortableServer_Servant ��ָ�롣

��ע���ϸ��˵��������˵�Ĺ�����(common)�������൱�� C++ �����ݳ�Ա���� PortableServer_Servant �ṹ��ָ���൱�� C++ �� this ָ�롣���ﶨ��Ľṹ�� C ӳ��淶�н��� application servant��������ǿ���Եġ�