diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.cpp | 345 |
1 files changed, 311 insertions, 34 deletions
diff --git a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.cpp b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.cpp index fc10e0bb552..3ea3d1ee299 100644 --- a/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.cpp +++ b/TAO/orbsvcs/orbsvcs/PortableGroup/PG_Group_Factory.cpp @@ -7,24 +7,56 @@ * $Id$ * * @author Dale Wilson <wilson_d@ociweb.com> + * @author Byron Harris <harrisb@ociweb.com> */ //============================================================================= #include "orbsvcs/PortableGroup/PG_Group_Factory.h" #include "orbsvcs/PortableGroup/PG_Property_Utils.h" +#include "orbsvcs/PortableGroup/PG_Group_List_Store.h" #include "orbsvcs/PortableGroup/PG_conf.h" #include "orbsvcs/PortableGroupC.h" #include "orbsvcs/PortableGroup/PG_Object_Group.h" +#include "orbsvcs/PortableGroup/PG_Object_Group_Storable.h" #include <orbsvcs/PortableGroup/PG_Utils.h> +#include "tao/Storable_Factory.h" + +#include <ace/SString.h> + TAO_BEGIN_VERSIONED_NAMESPACE_DECL +namespace +{ + // Find the elements in set1 that + // are missing in set2. + template <class T> + void + find_missing(const std::set<T> & set1, + const std::set<T> & set2, + std::set<T> & missing_in_2) + { + missing_in_2.clear(); + for (typename std::set<T>::const_iterator it = set1.begin(); + it != set1.end(); ++it) + { + if (set2.find(*it) == set2.end()) + { + missing_in_2.insert(*it); + } + } + } +} + TAO::PG_Group_Factory::PG_Group_Factory () - : orb_ (CORBA::ORB::_nil()) + : use_persistence_ (false) + , list_store_ (0) + , orb_ (CORBA::ORB::_nil()) , poa_ (PortableServer::POA::_nil()) , manipulator_ () - , domain_id_ ("default-domain") - + , domain_id_ (ACE_TEXT_ALWAYS_CHAR ("default-domain")) + , groups_read_ (false) + , storable_factory_ (0) { } @@ -38,6 +70,8 @@ TAO::PG_Group_Factory::~PG_Group_Factory (void) delete group; } this->group_map_.unbind_all (); + delete this->list_store_; + delete this->storable_factory_; } @@ -52,7 +86,9 @@ void TAO::PG_Group_Factory::init ( this->orb_ = CORBA::ORB::_duplicate(orb); this->poa_ = PortableServer::POA::_duplicate (poa); - this->factory_registry_ = PortableGroup::FactoryRegistry::_duplicate (factory_registry); + + this->factory_registry_ = + PortableGroup::FactoryRegistry::_duplicate (factory_registry); ACE_ASSERT (!CORBA::is_nil (this->orb_.in ())); @@ -72,11 +108,25 @@ TAO::PG_Object_Group * TAO::PG_Group_Factory::create_group ( // Create an empty group reference PortableGroup::ObjectGroupId group_id = 0; - PortableGroup::ObjectGroup_var empty_group = - this->manipulator_.create_object_group ( - type_id, - this->domain_id_, - group_id); + PortableGroup::ObjectGroup_var empty_group; + + if (this->use_persistence_) + { + group_id = this->list_store_->get_next_group_id (); + empty_group = + this->manipulator_.create_object_group_using_id ( + type_id, + this->domain_id_, + group_id); + } + else + { + empty_group = + this->manipulator_.create_object_group ( + type_id, + this->domain_id_, + group_id); + } // pick up the object group information as assigned by // ObjectGroupManager @@ -89,19 +139,37 @@ TAO::PG_Object_Group * TAO::PG_Group_Factory::create_group ( TAO::PG_Object_Group * objectGroup = 0; - ACE_NEW_THROW_EX ( - objectGroup, - TAO::PG_Object_Group ( - this->orb_.in (), - this->factory_registry_.in (), - this->manipulator_, - empty_group.in (), - tagged_component, - type_id, - the_criteria, - typeid_properties - ), - CORBA::NO_MEMORY()); + if (this->use_persistence_) + { + objectGroup = this->create_persistent_group ( + this->orb_.in (), + this->factory_registry_.in (), + this->manipulator_, + empty_group.in (), + tagged_component, + type_id, + the_criteria, + typeid_properties, + *storable_factory_); + + this->list_store_->add(group_id); + } + else + { + ACE_NEW_THROW_EX ( + objectGroup, + TAO::PG_Object_Group ( + this->orb_.in (), + this->factory_registry_.in (), + this->manipulator_, + empty_group.in (), + tagged_component, + type_id, + the_criteria, + typeid_properties + ), + CORBA::NO_MEMORY()); + } if (this->group_map_.bind (group_id, objectGroup) != 0) { @@ -111,7 +179,8 @@ TAO::PG_Object_Group * TAO::PG_Group_Factory::create_group ( return objectGroup; } -void TAO::PG_Group_Factory::delete_group (PortableGroup::ObjectGroup_ptr object_group) +void TAO::PG_Group_Factory::delete_group ( + PortableGroup::ObjectGroup_ptr object_group) { if (! destroy_group (object_group)) { @@ -120,7 +189,8 @@ void TAO::PG_Group_Factory::delete_group (PortableGroup::ObjectGroup_ptr object_ } -void TAO::PG_Group_Factory::delete_group (PortableGroup::ObjectGroupId group_id) +void TAO::PG_Group_Factory::delete_group ( + PortableGroup::ObjectGroupId group_id) { if (! destroy_group (group_id)) { @@ -134,17 +204,20 @@ int TAO::PG_Group_Factory::insert_group ( ::TAO::PG_Object_Group * group) return insert_group (group->get_object_group_id(), group); } -int TAO::PG_Group_Factory::insert_group (PortableGroup::ObjectGroupId group_id, ::TAO::PG_Object_Group * group) +int TAO::PG_Group_Factory::insert_group (PortableGroup::ObjectGroupId group_id, + ::TAO::PG_Object_Group * group) { - return (this->group_map_.bind (group_id, group) == 0); + return (this->get_group_map ().bind (group_id, group) == 0); } -int TAO::PG_Group_Factory::find_group (PortableGroup::ObjectGroupId group_id, ::TAO::PG_Object_Group *& group) const +int TAO::PG_Group_Factory::find_group (PortableGroup::ObjectGroupId group_id, + ::TAO::PG_Object_Group *& group) { - return (this->group_map_.find (group_id , group) == 0); + return (this->get_group_map ().find (group_id , group) == 0); } -int TAO::PG_Group_Factory::find_group (PortableGroup::ObjectGroup_ptr object_group, ::TAO::PG_Object_Group *& group) const +int TAO::PG_Group_Factory::find_group (PortableGroup::ObjectGroup_ptr object_group, + ::TAO::PG_Object_Group *& group) { int result = 0; PortableGroup::TagGroupTaggedComponent tc; @@ -155,13 +228,49 @@ int TAO::PG_Group_Factory::find_group (PortableGroup::ObjectGroup_ptr object_gro return result; } +int TAO::PG_Group_Factory::find_group_with_name (const char* target_group_name, + TAO::PG_Object_Group *& group_target) +{ + int result = 0; + + // Search through the group map for the group with that property + Group_Map & group_map = this->get_group_map (); + for (Group_Map_Iterator it = group_map.begin (); + it != group_map.end (); + ++it) + { + TAO::PG_Object_Group * a_group = (*it).int_id_; + // If the group has the group name in the property + // + const char* a_group_name = a_group->get_name (); + if (a_group_name != 0 && + ACE_OS::strcmp (target_group_name, + a_group_name) == 0) + { // This is the group we were looking for + group_target = a_group; + result = 1; + break; + } + } + return result; +} + int TAO::PG_Group_Factory::destroy_group (PortableGroup::ObjectGroupId group_id) { ::TAO::PG_Object_Group * group = 0; - int result = (this->group_map_.unbind (group_id, group) == 0); + int result = (this->get_group_map ().unbind (group_id, group) == 0); if (result) { - delete group; + if (this->use_persistence_) + { + PG_Object_Group_Storable *og = + dynamic_cast<PG_Object_Group_Storable *> (group); + og->set_destroyed (true); + result = (this->list_store_->remove (group->get_object_group_id ()) + == 0); + } + if (result) + delete group; } return result; } @@ -179,7 +288,8 @@ PortableGroup::ObjectGroups * TAO::PG_Group_Factory::groups_at_location ( const PortableGroup::Location & the_location) { - size_t upper_limit = this->group_map_.current_size (); + Group_Map & group_map = this->get_group_map (); + size_t upper_limit = group_map.current_size (); PortableGroup::ObjectGroups * result = 0; ACE_NEW_THROW_EX ( result, @@ -189,8 +299,8 @@ TAO::PG_Group_Factory::groups_at_location ( result->length(upper_limit); size_t group_count = 0; - for (Group_Map_Iterator it = this->group_map_.begin (); - it != this->group_map_.end (); + for (Group_Map_Iterator it = group_map.begin (); + it != group_map.end (); ++it) { TAO::PG_Object_Group * group = (*it).int_id_; @@ -204,4 +314,171 @@ TAO::PG_Group_Factory::groups_at_location ( return result; } +PortableGroup::ObjectGroups * +TAO::PG_Group_Factory::all_groups (void) +{ + Group_Map & group_map = this->get_group_map (); + size_t upper_limit = group_map.current_size (); + PortableGroup::ObjectGroups * result = 0; + ACE_NEW_THROW_EX ( + result, + PortableGroup::ObjectGroups (upper_limit), + CORBA::NO_MEMORY()); + + result->length(upper_limit); + + size_t group_count = 0; + for (Group_Map_Iterator it = group_map.begin (); + it != group_map.end (); + ++it) + { + TAO::PG_Object_Group * group = (*it).int_id_; + (*result)[group_count] = CORBA::Object::_duplicate(group->reference ()); + ++group_count; + } + result->length (group_count); + return result; +} + +void +TAO::PG_Group_Factory::set_object_group_storable_factory ( + TAO::Storable_Factory * factory) +{ + this->use_persistence_ = true; + this->storable_factory_ = factory; + ACE_NEW_THROW_EX (this->list_store_, + TAO::PG_Group_List_Store (*this->storable_factory_), + CORBA::NO_MEMORY ()); + +} + +TAO::PG_Group_Factory::Group_Map & +TAO::PG_Group_Factory::get_group_map () +{ + if (this->use_persistence_) + { + // List of groups in persistent store may + // have changed since group_map_ was last + // updated. + + if (!this->groups_read_ || this->list_store_->list_obsolete ()) + { + // Extract IDs from group_map_ to set for comparison with IDs in persistent store + // This is to avoid having to repopulate the map from scratch. + PG_Group_List_Store::Group_Ids map_ids; + for (Group_Map_Iterator it = group_map_.begin (); + it != group_map_.end (); ++it) + { + map_ids.insert (it->key ()); + } + + // Get the latest groups from persistent store + const PG_Group_List_Store::Group_Ids & persistent_ids = + list_store_->get_group_ids (); + + // Find groups added since map was last updated + PG_Group_List_Store::Group_Ids groups_added; + find_missing (persistent_ids, map_ids, groups_added); + + // Find groups removed since map was last updated + PG_Group_List_Store::Group_Ids groups_removed; + find_missing (map_ids, persistent_ids, groups_removed); + + // Bind added groups + for (PG_Group_List_Store::Group_Id_Const_Iterator it = groups_added.begin (); + it != groups_added.end (); ++it) + { + PortableGroup::ObjectGroupId group_id = *it; + TAO::PG_Object_Group * objectGroup = 0; + objectGroup = this->restore_persistent_group ( + group_id, + this->orb_.in (), + this->factory_registry_.in (), + this->manipulator_, + *storable_factory_); + + if (this->group_map_.bind (group_id, objectGroup) != 0) + { + delete objectGroup; + throw PortableGroup::ObjectNotCreated (); + } + } + + // Unbind removed groups + for (PG_Group_List_Store::Group_Id_Const_Iterator it = groups_removed.begin (); + it != groups_removed.end (); ++it) + { + PortableGroup::ObjectGroupId group_id = *it; + PG_Object_Group * group = 0; + int result = (this->get_group_map ().unbind (group_id, group) == 0); + if (result) + { + delete group; + } + else + throw PortableGroup::ObjectGroupNotFound (); + } + + this->groups_read_ = true; + + } + + } + + return group_map_; +} + +TAO::PG_Object_Group_Storable * +TAO::PG_Group_Factory::create_persistent_group ( + CORBA::ORB_ptr orb, + PortableGroup::FactoryRegistry_ptr factory_registry, + TAO::PG_Object_Group_Manipulator & manipulator, + CORBA::Object_ptr empty_group, + const PortableGroup::TagGroupTaggedComponent & tagged_component, + const char * type_id, + const PortableGroup::Criteria & the_criteria, + TAO::PG_Property_Set * type_properties, + TAO::Storable_Factory & storable_factory) +{ + TAO::PG_Object_Group_Storable * objectGroup = 0; + ACE_NEW_THROW_EX ( + objectGroup, + TAO::PG_Object_Group_Storable ( + orb, + factory_registry, + manipulator, + empty_group, + tagged_component, + type_id, + the_criteria, + type_properties, + storable_factory + ), + CORBA::NO_MEMORY()); + return objectGroup; +} + +TAO::PG_Object_Group_Storable * +TAO::PG_Group_Factory::restore_persistent_group ( + PortableGroup::ObjectGroupId group_id, + CORBA::ORB_ptr orb, + PortableGroup::FactoryRegistry_ptr factory_registry, + TAO::PG_Object_Group_Manipulator & manipulator, + TAO::Storable_Factory & storable_factory) +{ + TAO::PG_Object_Group_Storable * objectGroup = 0; + ACE_NEW_THROW_EX ( + objectGroup, + TAO::PG_Object_Group_Storable ( + group_id, + orb, + factory_registry, + manipulator, + storable_factory + ), + CORBA::NO_MEMORY()); + return objectGroup; +} + + TAO_END_VERSIONED_NAMESPACE_DECL |