Admin.cpp

Go to the documentation of this file.
00001 // Admin.cpp,v 1.28 2006/03/14 06:14:34 jtc Exp
00002 #include "orbsvcs/Notify/Admin.h"
00003 
00004 #if ! defined (__ACE_INLINE__)
00005 #include "orbsvcs/Notify/Admin.inl"
00006 #endif /* __ACE_INLINE__ */
00007 
00008 ACE_RCSID (Notify,
00009            TAO_Notify_Admin,
00010            "Admin.cpp,v 1.28 2006/03/14 06:14:34 jtc Exp")
00011 
00012 #include "orbsvcs/CosNotifyChannelAdminC.h"
00013 
00014 #include "orbsvcs/Notify/Container_T.h"
00015 #include "orbsvcs/Notify/Proxy.h"
00016 #include "orbsvcs/Notify/EventChannel.h"
00017 #include "orbsvcs/Notify/Topology_Saver.h"
00018 #include "orbsvcs/Notify/Save_Persist_Worker_T.h"
00019 #include "orbsvcs/Notify/Reconnect_Worker_T.h"
00020 #include "orbsvcs/Notify/Consumer_Map.h"
00021 #include "orbsvcs/Notify/Supplier_Map.h"
00022 #include "orbsvcs/Notify/ConsumerAdmin.h"
00023 #include "orbsvcs/Notify/SupplierAdmin.h"
00024 
00025 #include "tao/debug.h"
00026 
00027 //#define DEBUG_LEVEL 9
00028 #ifndef DEBUG_LEVEL
00029 # define DEBUG_LEVEL TAO_debug_level
00030 #endif //DEBUG_LEVEL
00031 
00032 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00033 
00034 TAO_Notify_Admin::TAO_Notify_Admin ()
00035   : ec_ (0)
00036   , filter_operator_ (CosNotifyChannelAdmin::OR_OP)
00037   , is_default_ (false)
00038 {
00039   // Initialize all Admin objects to initially be subscribed for all
00040   // events.  This is a reasonable default and is required to allow
00041   // Cos Event consumers/suppliers to send/receive events,
00042   this->subscribed_types_.insert (TAO_Notify_EventType::special ());
00043 }
00044 
00045 TAO_Notify_Admin::~TAO_Notify_Admin ()
00046 {
00047 }
00048 
00049 void
00050 TAO_Notify_Admin::init (TAO_Notify::Topology_Parent* parent ACE_ENV_ARG_DECL)
00051 {
00052   ACE_ASSERT (this->ec_.get() == 0);
00053 
00054   this->ec_.reset (dynamic_cast<TAO_Notify_EventChannel *>(parent));
00055   ACE_ASSERT (this->ec_.get() != 0);
00056 
00057   // this-> on the following line confuses VC6
00058   initialize (parent ACE_ENV_ARG_PARAMETER);
00059 
00060   TAO_Notify_Proxy_Container* proxy_container = 0;
00061   ACE_NEW_THROW_EX (proxy_container,
00062                     TAO_Notify_Proxy_Container (),
00063                     CORBA::INTERNAL ());
00064   ACE_CHECK;
00065   this->proxy_container_.reset (proxy_container);
00066 
00067   this->proxy_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
00068   ACE_CHECK;
00069 
00070 }
00071 
00072 void
00073 TAO_Notify_Admin::remove (TAO_Notify_Proxy* proxy ACE_ENV_ARG_DECL)
00074 {
00075   this->proxy_container().remove (proxy ACE_ENV_ARG_PARAMETER);
00076   ACE_CHECK;
00077 }
00078 
00079 void
00080 TAO_Notify_Admin::subscribed_types (TAO_Notify_EventTypeSeq& subscribed_types ACE_ENV_ARG_DECL)
00081 {
00082   ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
00083                       CORBA::INTERNAL ());
00084   ACE_CHECK;
00085 
00086   // Adopt the Admin's subscription.
00087   TAO_Notify_EventTypeSeq added (this->subscribed_types_), removed;
00088 
00089   added.add_and_remove (subscribed_types, removed);
00090 
00091   subscribed_types = added;
00092 }
00093 
00094 int
00095 TAO_Notify_Admin::shutdown (ACE_ENV_SINGLE_ARG_DECL)
00096 {
00097   int sd_ret = TAO_Notify_Object::shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00098   ACE_CHECK_RETURN (1);
00099   if (sd_ret == 1)
00100     return 1;
00101 
00102   this->proxy_container().shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00103   ACE_CHECK_RETURN (1);
00104 
00105   return 0;
00106 }
00107 
00108 void
00109 TAO_Notify_Admin::insert (TAO_Notify_Proxy* proxy ACE_ENV_ARG_DECL)
00110 {
00111   this->proxy_container().insert (proxy ACE_ENV_ARG_PARAMETER);
00112 }
00113 
00114 void
00115 TAO_Notify_Admin::save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL)
00116 {
00117   bool changed = this->children_changed_;
00118   this->children_changed_ = false;
00119   this->self_changed_ = false;
00120 
00121   if (is_persistent ())
00122     {
00123       TAO_Notify::NVPList attrs;
00124       this->save_attrs(attrs);
00125 
00126       const char* type = this->get_admin_type_name();
00127 
00128       bool want_all_children =
00129         saver.begin_object(this->id(), type, attrs, changed
00130                            ACE_ENV_ARG_PARAMETER);
00131       ACE_CHECK;
00132 
00133       if (want_all_children || this->filter_admin_.is_changed ())
00134         {
00135           this->filter_admin_.save_persistent(saver ACE_ENV_ARG_PARAMETER);
00136           ACE_CHECK;
00137         }
00138       if (want_all_children || this->subscribed_types_.is_changed ())
00139         {
00140           this->subscribed_types_.save_persistent(saver ACE_ENV_ARG_PARAMETER);
00141           ACE_CHECK;
00142         }
00143 
00144       TAO_Notify::Save_Persist_Worker<TAO_Notify_Proxy>
00145         wrk(saver, want_all_children);
00146       this->proxy_container().collection()->for_each(&wrk
00147                                                      ACE_ENV_ARG_PARAMETER);
00148       ACE_CHECK;
00149 
00150       saver.end_object(this->id(), type ACE_ENV_ARG_PARAMETER);
00151     }
00152 }
00153 
00154 void
00155 TAO_Notify_Admin::save_attrs (TAO_Notify::NVPList& attrs)
00156 {
00157   TAO_Notify_Object::save_attrs(attrs);
00158   attrs.push_back(TAO_Notify::NVP("InterFilterGroupOperator",
00159                                   this->filter_operator_));
00160   if (this->is_default_)
00161     {
00162       attrs.push_back (TAO_Notify::NVP ("default", "yes"));
00163     }
00164 }
00165 
00166 void
00167 TAO_Notify_Admin::load_attrs(const TAO_Notify::NVPList& attrs)
00168 {
00169   TAO_Notify_Object::load_attrs (attrs);
00170   const char* value = 0;
00171   if (attrs.find ("InterFilterGroupOperator", value))
00172     {
00173       this->filter_operator_ = static_cast <CosNotifyChannelAdmin::InterFilterGroupOperator> (ACE_OS::atoi (value));
00174     }
00175 
00176   if (attrs.find ("default", value))
00177     {
00178       this->is_default_ = (ACE_OS::strcmp (value, "yes") == 0);
00179     }
00180 }
00181 
00182 TAO_Notify::Topology_Object*
00183 TAO_Notify_Admin::load_child (const ACE_CString &type,
00184                               CORBA::Long id,
00185                               const TAO_Notify::NVPList& attrs
00186                               ACE_ENV_ARG_DECL_NOT_USED)
00187 {
00188   ACE_UNUSED_ARG (attrs);
00189   TAO_Notify::Topology_Object* result = this;
00190   if (type == "subscriptions")
00191     {
00192       if (DEBUG_LEVEL)
00193         ACE_DEBUG ((LM_DEBUG,
00194                     ACE_TEXT ("(%P|%t) Admin reload subscription %d\n"),
00195                     static_cast<int> (id)
00196                     ));
00197       // since we initialized our subscribed types to everything
00198       // in the constructor. we have to clear it out first.
00199       this->subscribed_types_.reset();
00200       result = &this->subscribed_types_;
00201     }
00202   else if (type == "filter_admin")
00203     {
00204       if (DEBUG_LEVEL)
00205         ACE_DEBUG ((LM_DEBUG,
00206                     ACE_TEXT ("(%P|%t) Admin reload filter_admin %d\n"),
00207                     static_cast<int> (id)
00208                     ));
00209       result = & this->filter_admin_;
00210     }
00211   return result;
00212 }
00213 
00214 void
00215 TAO_Notify_Admin::reconnect (ACE_ENV_SINGLE_ARG_DECL)
00216 {
00217   TAO_Notify::Reconnect_Worker<TAO_Notify_Proxy> wrk;
00218   this->proxy_container().collection()->for_each(&wrk ACE_ENV_ARG_PARAMETER);
00219   ACE_CHECK;
00220 }
00221 
00222 TAO_END_VERSIONED_NAMESPACE_DECL

Generated on Thu Nov 9 13:24:08 2006 for TAO_CosNotification by doxygen 1.3.6