summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.h')
-rw-r--r--TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.h314
1 files changed, 314 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.h b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.h
new file mode 100644
index 00000000000..b78cc4028f3
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_ObjectGroupManager.h
@@ -0,0 +1,314 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file PG_ObjectGroupManager.h
+ *
+ * $Id$
+ *
+ * @author Ossama Othman <ossama@uci.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_PG_OBJECT_GROUP_MANAGER_H
+#define TAO_PG_OBJECT_GROUP_MANAGER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/PortableGroup/portablegroup_export.h"
+#include "orbsvcs/PortableGroupS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+#pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "orbsvcs/PortableGroup/PG_ObjectGroup_Map.h"
+#include "orbsvcs/PortableGroup/PG_Location_Map.h"
+
+#include "tao/PortableServer/Key_Adapters.h"
+#include "tao/PortableServer/PortableServerC.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/// Forward declarations
+class TAO_PG_GenericFactory;
+
+
+/**
+ * @class TAO_PG_ObjectGroupManager
+ *
+ * @brief PortableGroup::ObjectGroupManager implementation.
+ *
+ * The ObjectGroupManager provides the interface necessary to
+ * facilitate application-controlled object group membership.
+ */
+class TAO_PortableGroup_Export TAO_PG_ObjectGroupManager
+ : public virtual POA_PortableGroup::ObjectGroupManager
+{
+public:
+
+ /// Constructor.
+ TAO_PG_ObjectGroupManager (void);
+
+ /// Destructor.
+ ~TAO_PG_ObjectGroupManager (void);
+
+ /**
+ * @name PortableGroup::ObjectGroupManager methods
+ *
+ * Methods required by the PortableGroup::ObjectGroupManager
+ * interface.
+ */
+ //@{
+
+ /// Create a member and add it to the given object group.
+ virtual PortableGroup::ObjectGroup_ptr create_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::NoFactory,
+ PortableGroup::ObjectNotCreated,
+ PortableGroup::InvalidCriteria,
+ PortableGroup::CannotMeetCriteria));
+
+ /// Add an existing object to the ObjectGroup.
+ virtual PortableGroup::ObjectGroup_ptr add_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::ObjectNotAdded));
+
+ /**
+ * Remove an object at a specific location from the given
+ * ObjectGroup. Deletion of application created objects must be
+ * deleted by the application. Objects created by the
+ * infrastructure (load balancer) will be deleted by the
+ * infrastructure.
+ */
+ virtual PortableGroup::ObjectGroup_ptr remove_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+
+ /// Return the locations of the members in the given ObjectGroup.
+ virtual PortableGroup::Locations * locations_of_members (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// Return the locations of the members in the given ObjectGroup.
+ virtual PortableGroup::ObjectGroups * groups_at_location (
+ const PortableGroup::Location & the_location
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return the ObjectGroupId for the given ObjectGroup.
+ /// @note Does this method make sense for load balanced objects?
+ virtual PortableGroup::ObjectGroupId get_object_group_id (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// @note Does this method make sense for load balanced objects?
+ virtual PortableGroup::ObjectGroup_ptr get_object_group_ref (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// Return the reference corresponding to the member of a given
+ /// ObjectGroup at the given location.
+ virtual CORBA::Object_ptr get_member_ref (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & loc
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberNotFound));
+ /**
+ * TAO-specific extension.
+ * Return the ObjectGroup reference for the given ObjectGroupId.
+ */
+ virtual PortableGroup::ObjectGroup_ptr get_object_group_ref_from_id (
+ PortableGroup::ObjectGroupId group_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ )
+ ACE_THROW_SPEC ((
+ CORBA::SystemException
+ , PortableGroup::ObjectGroupNotFound
+ ));
+
+ //@}
+
+ /// TAO-specific member addition method.
+ /**
+ * This method is meant to be invoked by TAO's GenericFactory
+ * implementation. It is designed to allow only certain exceptions
+ * to be propagated to the caller, and to prevent redundant remote
+ * RepositoryId checking.
+ */
+ PortableGroup::ObjectGroup_ptr _tao_add_member (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member,
+ const char * type_id,
+ const CORBA::Boolean propagate_member_already_present
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::NoFactory));
+
+ /// Create object group hash map entry that represents an actual
+ /// ObjectGroup.
+ /**
+ * @note This method is used mainly by the
+ * GenericFactory::create_object() method.
+ */
+ PortableGroup::ObjectGroup_ptr create_object_group (
+ CORBA::ULong group_id,
+ const PortableServer::ObjectId &oid,
+ const char * type_id,
+ const PortableGroup::Criteria & the_criteria
+ ACE_ENV_ARG_DECL);
+
+ /// Destroy the object group corresponding to the given ObjectId.
+ /**
+ * @note This method is used mainly by the
+ * GenericFactory::delete_object() method.
+ */
+ void destroy_object_group (const PortableServer::ObjectId & oid
+ ACE_ENV_ARG_DECL);
+
+ /// Return the properties set when the object group was created, and
+ /// the dynamic properties that may have overridden them.
+ PortableGroup::Properties * get_properties (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// Return the type_id for the given object group.
+ char * type_id (PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL);
+
+ /// Return the object group associated with the given ObjectId.
+ /**
+ * @return Returns PortableGroup::ObjectGroup::_nil() if no object
+ * group corresponding to the given ObjectId exists.
+ */
+ PortableGroup::ObjectGroup_ptr object_group (
+ const PortableServer::ObjectId & oid);
+
+ /// Return the number of members in the given object group.
+ CORBA::ULong member_count (PortableGroup::ObjectGroup_ptr group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+ /// Set the POA to use when converting object group references to
+ /// ObjectIds.
+ void poa (PortableServer::POA_ptr p);
+
+ /// Set the pointer to the GenericFactory associated with this
+ /// ObjectGroupManager.
+ /**
+ * The TAO_PG_GenericFactory will only be used when
+ * ObjectGroupManager::remove_member() is explicitly called so that
+ * the infrastructure may be given an opportunity to clean up any
+ * object group members it may have created.
+ */
+ void generic_factory (TAO_PG_GenericFactory * generic_factory);
+
+protected:
+
+ /// Underlying and non-locking implementation of the add_member()
+ /// and _tao_add_member() methods in this class.
+ PortableGroup::ObjectGroup_ptr add_member_i (
+ PortableGroup::ObjectGroup_ptr object_group,
+ const PortableGroup::Location & the_location,
+ CORBA::Object_ptr member,
+ const CORBA::Boolean check_type_id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound,
+ PortableGroup::MemberAlreadyPresent,
+ PortableGroup::ObjectNotAdded));
+
+ /// Obtain the ObjectGroup hash map entry corresponding to the given
+ /// ObjectGroup reference.
+ TAO_PG_ObjectGroup_Map_Entry * get_group_entry (
+ PortableGroup::ObjectGroup_ptr object_group
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableGroup::ObjectGroupNotFound));
+
+
+ /// Check if a member resides at the location to which the group
+ /// array belongs to.
+ /**
+ * A member is actually represented by the object group to which it
+ * belongs. In this implementation, a pointer to a object group
+ * hash map entry is associated with a given a location.
+ */
+ CORBA::Boolean member_already_present (
+ const TAO_PG_ObjectGroup_Array & groups,
+ TAO_PG_ObjectGroup_Map_Entry * group_entry);
+
+ /// get the position of the object_group_map_entry
+ size_t get_object_group_position (
+ const TAO_PG_ObjectGroup_Array & groups,
+ TAO_PG_ObjectGroup_Map_Entry * group_entry);
+
+ /// Verify that the member type_id matches the object group type_id.
+ /**
+ * @todo Strategize this -- e.g. strict type checking.
+ */
+ CORBA::Boolean valid_type_id (
+ PortableGroup::ObjectGroup_ptr object_group,
+ TAO_PG_ObjectGroup_Map_Entry * group_entry,
+ CORBA::Object_ptr member
+ ACE_ENV_ARG_DECL);
+
+private:
+
+ /// Reference to the POA that created the object group references.
+ PortableServer::POA_var poa_;
+
+ /// The underlying table that contains all object group
+ /// information.
+ TAO_PG_ObjectGroup_Map object_group_map_;
+
+ /// Map that contains list of all members at a given location, in
+ /// addition to the load monitor at that location.
+ TAO_PG_Location_Map location_map_;
+
+ /// Pointer to the TAO_PG_GenericFactory class responsible for
+ /// object group creation/destruction.
+ TAO_PG_GenericFactory * generic_factory_;
+
+ /// Lock used to synchronize access to the underlying tables.
+ TAO_SYNCH_MUTEX lock_;
+
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_PG_OBJECT_GROUP_MANAGER_H */