00001
00002 #include "orbsvcs/Notify/Admin.h"
00003
00004 #if ! defined (__ACE_INLINE__)
00005 #include "orbsvcs/Notify/Admin.inl"
00006 #endif
00007
00008 ACE_RCSID (Notify,
00009 TAO_Notify_Admin,
00010 "$Id: Admin.cpp 76589 2007-01-25 18:04:11Z elliott_c $")
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
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
00040
00041
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)
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
00058 initialize (parent);
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 this->proxy_container_.reset (proxy_container);
00065
00066 this->proxy_container().init ();
00067
00068 }
00069
00070 void
00071 TAO_Notify_Admin::remove (TAO_Notify_Proxy* proxy)
00072 {
00073 this->proxy_container().remove (proxy);
00074 }
00075
00076 void
00077 TAO_Notify_Admin::subscribed_types (TAO_Notify_EventTypeSeq& subscribed_types)
00078 {
00079 ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, ace_mon, this->lock_,
00080 CORBA::INTERNAL ());
00081
00082
00083 TAO_Notify_EventTypeSeq added (this->subscribed_types_), removed;
00084
00085 added.add_and_remove (subscribed_types, removed);
00086
00087 subscribed_types = added;
00088 }
00089
00090 int
00091 TAO_Notify_Admin::shutdown (void)
00092 {
00093 int sd_ret = TAO_Notify_Object::shutdown ();
00094 if (sd_ret == 1)
00095 return 1;
00096
00097 this->proxy_container().shutdown ();
00098
00099 return 0;
00100 }
00101
00102 void
00103 TAO_Notify_Admin::insert (TAO_Notify_Proxy* proxy)
00104 {
00105 this->proxy_container().insert (proxy);
00106 }
00107
00108 void
00109 TAO_Notify_Admin::save_persistent (TAO_Notify::Topology_Saver& saver)
00110 {
00111 bool changed = this->children_changed_;
00112 this->children_changed_ = false;
00113 this->self_changed_ = false;
00114
00115 if (is_persistent ())
00116 {
00117 TAO_Notify::NVPList attrs;
00118 this->save_attrs(attrs);
00119
00120 const char* type = this->get_admin_type_name();
00121
00122 bool want_all_children =
00123 saver.begin_object(this->id(), type, attrs, changed);
00124
00125 if (want_all_children || this->filter_admin_.is_changed ())
00126 {
00127 this->filter_admin_.save_persistent(saver);
00128 }
00129 if (want_all_children || this->subscribed_types_.is_changed ())
00130 {
00131 this->subscribed_types_.save_persistent(saver);
00132 }
00133
00134 TAO_Notify::Save_Persist_Worker<TAO_Notify_Proxy>
00135 wrk(saver, want_all_children);
00136 this->proxy_container().collection()->for_each(&wrk);
00137
00138 saver.end_object(this->id(), type);
00139 }
00140 }
00141
00142 void
00143 TAO_Notify_Admin::save_attrs (TAO_Notify::NVPList& attrs)
00144 {
00145 TAO_Notify_Object::save_attrs(attrs);
00146 attrs.push_back(TAO_Notify::NVP("InterFilterGroupOperator",
00147 this->filter_operator_));
00148 if (this->is_default_)
00149 {
00150 attrs.push_back (TAO_Notify::NVP ("default", "yes"));
00151 }
00152 }
00153
00154 void
00155 TAO_Notify_Admin::load_attrs(const TAO_Notify::NVPList& attrs)
00156 {
00157 TAO_Notify_Object::load_attrs (attrs);
00158 const char* value = 0;
00159 if (attrs.find ("InterFilterGroupOperator", value))
00160 {
00161 this->filter_operator_ = static_cast <CosNotifyChannelAdmin::InterFilterGroupOperator> (ACE_OS::atoi (value));
00162 }
00163
00164 if (attrs.find ("default", value))
00165 {
00166 this->is_default_ = (ACE_OS::strcmp (value, "yes") == 0);
00167 }
00168 }
00169
00170 TAO_Notify::Topology_Object*
00171 TAO_Notify_Admin::load_child (const ACE_CString &type,
00172 CORBA::Long id,
00173 const TAO_Notify::NVPList& attrs)
00174 {
00175 ACE_UNUSED_ARG (attrs);
00176 TAO_Notify::Topology_Object* result = this;
00177 if (type == "subscriptions")
00178 {
00179 if (DEBUG_LEVEL)
00180 ACE_DEBUG ((LM_DEBUG,
00181 ACE_TEXT ("(%P|%t) Admin reload subscription %d\n"),
00182 static_cast<int> (id)
00183 ));
00184
00185
00186 this->subscribed_types_.reset();
00187 result = &this->subscribed_types_;
00188 }
00189 else if (type == "filter_admin")
00190 {
00191 if (DEBUG_LEVEL)
00192 ACE_DEBUG ((LM_DEBUG,
00193 ACE_TEXT ("(%P|%t) Admin reload filter_admin %d\n"),
00194 static_cast<int> (id)
00195 ));
00196 result = & this->filter_admin_;
00197 }
00198 return result;
00199 }
00200
00201 void
00202 TAO_Notify_Admin::reconnect (void)
00203 {
00204 TAO_Notify::Reconnect_Worker<TAO_Notify_Proxy> wrk;
00205 this->proxy_container().collection()->for_each(&wrk);
00206 }
00207
00208 TAO_END_VERSIONED_NAMESPACE_DECL