00001
00002
00003 #include "orbsvcs/Notify/EventChannel.h"
00004
00005 #include "orbsvcs/Notify/Container_T.h"
00006 #include "orbsvcs/Notify/EventChannelFactory.h"
00007 #include "orbsvcs/Notify/ConsumerAdmin.h"
00008 #include "orbsvcs/Notify/SupplierAdmin.h"
00009 #include "orbsvcs/Notify/Properties.h"
00010 #include "orbsvcs/Notify/Factory.h"
00011 #include "orbsvcs/Notify/Builder.h"
00012 #include "orbsvcs/Notify/Find_Worker_T.h"
00013 #include "orbsvcs/Notify/Seq_Worker_T.h"
00014 #include "orbsvcs/Notify/Topology_Saver.h"
00015 #include "orbsvcs/Notify/Save_Persist_Worker_T.h"
00016 #include "orbsvcs/Notify/Reconnect_Worker_T.h"
00017 #include "orbsvcs/Notify/Proxy.h"
00018 #include "orbsvcs/Notify/Event_Manager.h"
00019 #include "orbsvcs/Notify/POA_Helper.h"
00020
00021 #include "tao/debug.h"
00022
00023 #ifndef DEBUG_LEVEL
00024 # define DEBUG_LEVEL TAO_debug_level
00025 #endif //DEBUG_LEVEL
00026
00027 ACE_RCSID(Notify, TAO_Notify_EventChannel, "EventChannel.cpp,v 1.31 2006/03/14 06:14:34 jtc Exp")
00028
00029 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00030
00031 typedef TAO_Notify_Find_Worker_T<TAO_Notify_ConsumerAdmin
00032 , CosNotifyChannelAdmin::ConsumerAdmin
00033 , CosNotifyChannelAdmin::ConsumerAdmin_ptr
00034 , CosNotifyChannelAdmin::AdminNotFound>
00035 TAO_Notify_ConsumerAdmin_Find_Worker;
00036
00037 typedef TAO_Notify_Find_Worker_T<TAO_Notify_SupplierAdmin
00038 , CosNotifyChannelAdmin::SupplierAdmin
00039 , CosNotifyChannelAdmin::SupplierAdmin_ptr
00040 , CosNotifyChannelAdmin::AdminNotFound>
00041 TAO_Notify_SupplierAdmin_Find_Worker;
00042
00043 typedef TAO_Notify_Seq_Worker_T<TAO_Notify_ConsumerAdmin> TAO_Notify_ConsumerAdmin_Seq_Worker;
00044 typedef TAO_Notify_Seq_Worker_T<TAO_Notify_SupplierAdmin> TAO_Notify_SupplierAdmin_Seq_Worker;
00045
00046 TAO_Notify_EventChannel::TAO_Notify_EventChannel (void)
00047 : ecf_ (0)
00048 , ca_container_ (0)
00049 , sa_container_ (0)
00050 {
00051 }
00052
00053 TAO_Notify_EventChannel::~TAO_Notify_EventChannel ()
00054 {
00055 }
00056
00057 void
00058 TAO_Notify_EventChannel::init (TAO_Notify_EventChannelFactory* ecf
00059 , const CosNotification::QoSProperties & initial_qos
00060 , const CosNotification::AdminProperties & initial_admin
00061 ACE_ENV_ARG_DECL)
00062 {
00063 ACE_ASSERT (this->ca_container_.get() == 0);
00064
00065
00066 initialize (ecf ACE_ENV_ARG_PARAMETER);
00067
00068 this->ecf_.reset (ecf);
00069
00070
00071 TAO_Notify_ConsumerAdmin_Container* ca_container = 0;
00072 ACE_NEW_THROW_EX (ca_container,
00073 TAO_Notify_ConsumerAdmin_Container (),
00074 CORBA::INTERNAL ());
00075 ACE_CHECK;
00076 this->ca_container_.reset (ca_container);
00077
00078 this->ca_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
00079 ACE_CHECK;
00080
00081
00082 TAO_Notify_SupplierAdmin_Container* sa_container = 0;
00083 ACE_NEW_THROW_EX (sa_container,
00084 TAO_Notify_SupplierAdmin_Container (),
00085 CORBA::INTERNAL ());
00086 ACE_CHECK;
00087 this->sa_container_.reset (sa_container);
00088
00089 this->sa_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
00090 ACE_CHECK;
00091
00092
00093 TAO_Notify_AdminProperties* admin_properties = 0;
00094 ACE_NEW_THROW_EX (admin_properties,
00095 TAO_Notify_AdminProperties (),
00096 CORBA::NO_MEMORY ());
00097 ACE_CHECK;
00098 this->set_admin_properties (admin_properties);
00099
00100
00101 TAO_Notify_Event_Manager* event_manager = 0;
00102 ACE_NEW_THROW_EX (event_manager,
00103 TAO_Notify_Event_Manager (),
00104 CORBA::INTERNAL ());
00105 ACE_CHECK;
00106 this->set_event_manager (event_manager);
00107
00108 this->event_manager().init (ACE_ENV_SINGLE_ARG_PARAMETER);
00109 ACE_CHECK;
00110
00111 const CosNotification::QoSProperties &default_ec_qos =
00112 TAO_Notify_PROPERTIES::instance ()->default_event_channel_qos_properties ();
00113
00114 this->set_qos (default_ec_qos ACE_ENV_ARG_PARAMETER);
00115 ACE_CHECK;
00116
00117 this->set_qos (initial_qos ACE_ENV_ARG_PARAMETER);
00118 ACE_CHECK;
00119
00120 this->set_admin (initial_admin ACE_ENV_ARG_PARAMETER);
00121 ACE_CHECK;
00122
00123
00124
00125
00126
00127 }
00128
00129
00130 void
00131 TAO_Notify_EventChannel::init (TAO_Notify::Topology_Parent* parent ACE_ENV_ARG_DECL)
00132 {
00133 ACE_ASSERT (this->ecf_.get() == 0);
00134
00135 initialize (parent ACE_ENV_ARG_PARAMETER);
00136
00137 this->ecf_.reset (dynamic_cast <TAO_Notify_EventChannelFactory*>(parent));
00138 ACE_ASSERT (this->ecf_.get() !=0);
00139
00140
00141 TAO_Notify_ConsumerAdmin_Container* ca_container = 0;
00142 ACE_NEW_THROW_EX (ca_container,
00143 TAO_Notify_ConsumerAdmin_Container (),
00144 CORBA::INTERNAL ());
00145 ACE_CHECK;
00146 this->ca_container_.reset (ca_container);
00147
00148 this->ca_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
00149 ACE_CHECK;
00150
00151 TAO_Notify_SupplierAdmin_Container* sa_container = 0;
00152
00153 ACE_NEW_THROW_EX (sa_container,
00154 TAO_Notify_SupplierAdmin_Container (),
00155 CORBA::INTERNAL ());
00156 ACE_CHECK;
00157 this->sa_container_.reset (sa_container);
00158
00159 this->sa_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
00160 ACE_CHECK;
00161
00162
00163 TAO_Notify_AdminProperties* admin_properties = 0;
00164 ACE_NEW_THROW_EX (admin_properties,
00165 TAO_Notify_AdminProperties (),
00166 CORBA::NO_MEMORY ());
00167 ACE_CHECK;
00168 this->set_admin_properties (admin_properties);
00169
00170
00171 TAO_Notify_Event_Manager* event_manager = 0;
00172 ACE_NEW_THROW_EX (event_manager,
00173 TAO_Notify_Event_Manager (),
00174 CORBA::INTERNAL ());
00175 ACE_CHECK;
00176 this->set_event_manager (event_manager);
00177
00178 this->event_manager().init (ACE_ENV_SINGLE_ARG_PARAMETER);
00179 ACE_CHECK;
00180
00181 const CosNotification::QoSProperties &default_ec_qos =
00182 TAO_Notify_PROPERTIES::instance ()->default_event_channel_qos_properties ();
00183
00184 this->set_qos (default_ec_qos ACE_ENV_ARG_PARAMETER);
00185 ACE_CHECK;
00186
00187 }
00188
00189
00190 void
00191 TAO_Notify_EventChannel::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
00192 {
00193 this->_incr_refcnt ();
00194 }
00195
00196 void
00197 TAO_Notify_EventChannel::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
00198 {
00199 this->_decr_refcnt ();
00200 }
00201
00202 void
00203 TAO_Notify_EventChannel::release (void)
00204 {
00205 delete this;
00206
00207 }
00208
00209 int
00210 TAO_Notify_EventChannel::shutdown (ACE_ENV_SINGLE_ARG_DECL)
00211 {
00212 int sd_ret = TAO_Notify_Object::shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00213 ACE_CHECK_RETURN (1);
00214
00215 if (sd_ret == 1)
00216 return 1;
00217
00218 this->ca_container().shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00219 ACE_CHECK_RETURN (1);
00220
00221 this->sa_container().shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00222 ACE_CHECK_RETURN (1);
00223
00224 this->event_manager().shutdown ();
00225
00226 return 0;
00227 }
00228
00229 void
00230 TAO_Notify_EventChannel::destroy (ACE_ENV_SINGLE_ARG_DECL)
00231 ACE_THROW_SPEC ((
00232 CORBA::SystemException
00233 ))
00234 {
00235 TAO_Notify_EventChannel::Ptr guard( this );
00236
00237 int result = this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00238 ACE_CHECK;
00239 if ( result == 1)
00240 return;
00241
00242 this->ecf_->remove (this ACE_ENV_ARG_PARAMETER);
00243 ACE_CHECK;
00244
00245 this->sa_container_.reset( 0 );
00246 this->ca_container_.reset( 0 );
00247 }
00248
00249 void
00250 TAO_Notify_EventChannel::remove (TAO_Notify_ConsumerAdmin* consumer_admin ACE_ENV_ARG_DECL)
00251 {
00252 this->ca_container().remove (consumer_admin ACE_ENV_ARG_PARAMETER);
00253 }
00254
00255 void
00256 TAO_Notify_EventChannel::remove (TAO_Notify_SupplierAdmin* supplier_admin ACE_ENV_ARG_DECL)
00257 {
00258 this->sa_container().remove (supplier_admin ACE_ENV_ARG_PARAMETER);
00259 }
00260
00261 void
00262 TAO_Notify_EventChannel::set_qos (const CosNotification::QoSProperties & qos ACE_ENV_ARG_DECL)
00263 ACE_THROW_SPEC ((
00264 CORBA::SystemException
00265 , CosNotification::UnsupportedQoS
00266 ))
00267 {
00268 this->TAO_Notify_Object::set_qos (qos ACE_ENV_ARG_PARAMETER);
00269 }
00270
00271 CosNotification::QoSProperties*
00272 TAO_Notify_EventChannel::get_qos (ACE_ENV_SINGLE_ARG_DECL)
00273 ACE_THROW_SPEC ((
00274 CORBA::SystemException
00275 ))
00276 {
00277 return this->TAO_Notify_Object::get_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
00278 }
00279
00280 CosNotifyChannelAdmin::EventChannelFactory_ptr
00281 TAO_Notify_EventChannel::MyFactory (ACE_ENV_SINGLE_ARG_DECL)
00282 ACE_THROW_SPEC ((
00283 CORBA::SystemException
00284 ))
00285 {
00286 return this->ecf_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
00287 }
00288
00289 CosNotifyChannelAdmin::ConsumerAdmin_ptr
00290 TAO_Notify_EventChannel::default_consumer_admin (ACE_ENV_SINGLE_ARG_DECL)
00291 ACE_THROW_SPEC ((
00292 CORBA::SystemException
00293 ))
00294 {
00295 if (CORBA::is_nil (default_consumer_admin_.in ()))
00296 {
00297 ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->default_admin_mutex_, CosNotifyChannelAdmin::ConsumerAdmin::_nil());
00298 if (CORBA::is_nil (default_consumer_admin_.in ()))
00299 {
00300 CosNotifyChannelAdmin::AdminID id;
00301 this->default_consumer_admin_ = this->new_for_consumers (CosNotifyChannelAdmin::OR_OP, id ACE_ENV_ARG_PARAMETER);
00302 ACE_CHECK_RETURN (CosNotifyChannelAdmin::ConsumerAdmin::_nil());
00303
00304 PortableServer::ServantBase * admin_servant =
00305 this->poa()->reference_to_servant (
00306 this->default_consumer_admin_.in ()
00307 ACE_ENV_ARG_PARAMETER);
00308 ACE_CHECK_RETURN (CosNotifyChannelAdmin::ConsumerAdmin::_nil());
00309 TAO_Notify_Admin * pAdmin = dynamic_cast <TAO_Notify_Admin *> (admin_servant);
00310 ACE_ASSERT (pAdmin != 0);
00311 if (pAdmin != 0)
00312 {
00313 pAdmin->set_default (true);
00314 }
00315 }
00316 }
00317 return CosNotifyChannelAdmin::ConsumerAdmin::_duplicate (this->default_consumer_admin_.in ());
00318 }
00319
00320 CosNotifyChannelAdmin::SupplierAdmin_ptr
00321 TAO_Notify_EventChannel::default_supplier_admin (ACE_ENV_SINGLE_ARG_DECL)
00322 ACE_THROW_SPEC ((
00323 CORBA::SystemException
00324 ))
00325 {
00326 if (CORBA::is_nil (default_supplier_admin_.in ()))
00327 {
00328 ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->default_admin_mutex_, CosNotifyChannelAdmin::SupplierAdmin::_nil());
00329 if (CORBA::is_nil (default_supplier_admin_.in ()))
00330 {
00331 CosNotifyChannelAdmin::AdminID id;
00332 this->default_supplier_admin_ = this->new_for_suppliers (CosNotifyChannelAdmin::OR_OP, id ACE_ENV_ARG_PARAMETER);
00333 ACE_CHECK_RETURN (CosNotifyChannelAdmin::SupplierAdmin::_nil());
00334 PortableServer::ServantBase * admin_servant =
00335 this->poa()->poa()->reference_to_servant (
00336 this->default_supplier_admin_.in ()
00337 ACE_ENV_ARG_PARAMETER);
00338 ACE_CHECK_RETURN (0);
00339 TAO_Notify_Admin * pAdmin = dynamic_cast <TAO_Notify_Admin *> (admin_servant);
00340 ACE_ASSERT (pAdmin != 0);
00341 if (pAdmin != 0)
00342 {
00343 pAdmin->set_default (true);
00344 }
00345 }
00346 }
00347 return CosNotifyChannelAdmin::SupplierAdmin::_duplicate (this->default_supplier_admin_.in ());
00348 }
00349
00350 ::CosNotifyFilter::FilterFactory_ptr TAO_Notify_EventChannel::default_filter_factory (ACE_ENV_SINGLE_ARG_DECL)
00351 ACE_THROW_SPEC ((
00352 CORBA::SystemException
00353 ))
00354 {
00355 return this->ecf_->get_default_filter_factory (ACE_ENV_SINGLE_ARG_PARAMETER);
00356 }
00357
00358 ::CosNotifyChannelAdmin::ConsumerAdmin_ptr
00359 TAO_Notify_EventChannel::new_for_consumers (CosNotifyChannelAdmin::InterFilterGroupOperator op,
00360 CosNotifyChannelAdmin::AdminID_out id ACE_ENV_ARG_DECL
00361 )
00362 ACE_THROW_SPEC ((
00363 CORBA::SystemException
00364 ))
00365
00366 {
00367 ::CosNotifyChannelAdmin::ConsumerAdmin_var ca =
00368 TAO_Notify_PROPERTIES::instance()->builder()->build_consumer_admin (this, op, id ACE_ENV_ARG_PARAMETER);
00369 ACE_CHECK_RETURN (ca._retn ());
00370 this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
00371 ACE_CHECK_RETURN (ca._retn ());
00372 return ca._retn ();
00373 }
00374
00375 ::CosNotifyChannelAdmin::SupplierAdmin_ptr
00376 TAO_Notify_EventChannel::new_for_suppliers (CosNotifyChannelAdmin::InterFilterGroupOperator op,
00377 CosNotifyChannelAdmin::AdminID_out id
00378 ACE_ENV_ARG_DECL
00379 )
00380 ACE_THROW_SPEC ((
00381 CORBA::SystemException
00382 ))
00383 {
00384 ::CosNotifyChannelAdmin::SupplierAdmin_var sa =
00385 TAO_Notify_PROPERTIES::instance()->builder()->build_supplier_admin (this, op, id ACE_ENV_ARG_PARAMETER);
00386 ACE_CHECK_RETURN (sa._retn ());
00387 this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
00388 ACE_CHECK_RETURN (sa._retn ());
00389 return sa._retn ();
00390 }
00391
00392 CosNotifyChannelAdmin::ConsumerAdmin_ptr
00393 TAO_Notify_EventChannel::get_consumeradmin (CosNotifyChannelAdmin::AdminID id ACE_ENV_ARG_DECL)
00394 ACE_THROW_SPEC ((
00395 CORBA::SystemException
00396 , CosNotifyChannelAdmin::AdminNotFound
00397 ))
00398 {
00399 TAO_Notify_ConsumerAdmin_Find_Worker find_worker;
00400
00401 return find_worker.resolve (id, this->ca_container() ACE_ENV_ARG_PARAMETER);
00402 }
00403
00404 CosNotifyChannelAdmin::SupplierAdmin_ptr
00405 TAO_Notify_EventChannel::get_supplieradmin (CosNotifyChannelAdmin::AdminID id ACE_ENV_ARG_DECL)
00406 ACE_THROW_SPEC ((
00407 CORBA::SystemException
00408 , CosNotifyChannelAdmin::AdminNotFound
00409 ))
00410 {
00411 TAO_Notify_SupplierAdmin_Find_Worker find_worker;
00412
00413 return find_worker.resolve (id, this->sa_container() ACE_ENV_ARG_PARAMETER);
00414 }
00415
00416 CosNotifyChannelAdmin::AdminIDSeq*
00417 TAO_Notify_EventChannel::get_all_consumeradmins (ACE_ENV_SINGLE_ARG_DECL)
00418 ACE_THROW_SPEC ((
00419 CORBA::SystemException
00420 ))
00421 {
00422 TAO_Notify_ConsumerAdmin_Seq_Worker seq_worker;
00423
00424 return seq_worker.create (this->ca_container() ACE_ENV_ARG_PARAMETER);
00425 }
00426
00427 CosNotifyChannelAdmin::AdminIDSeq*
00428 TAO_Notify_EventChannel::get_all_supplieradmins (ACE_ENV_SINGLE_ARG_DECL)
00429 ACE_THROW_SPEC ((
00430 CORBA::SystemException
00431 ))
00432 {
00433 TAO_Notify_SupplierAdmin_Seq_Worker seq_worker;
00434
00435 return seq_worker.create (this->sa_container() ACE_ENV_ARG_PARAMETER);
00436 }
00437
00438 void
00439 TAO_Notify_EventChannel::set_admin (const CosNotification::AdminProperties & admin ACE_ENV_ARG_DECL_NOT_USED)
00440 ACE_THROW_SPEC ((
00441 CORBA::SystemException
00442 , CosNotification::UnsupportedAdmin
00443 ))
00444 {
00445 this->admin_properties().init (admin);
00446 }
00447
00448 CosNotification::AdminProperties*
00449 TAO_Notify_EventChannel::get_admin (ACE_ENV_SINGLE_ARG_DECL)
00450 ACE_THROW_SPEC ((
00451 CORBA::SystemException
00452 ))
00453 {
00454 CosNotification::AdminProperties_var properties;
00455
00456 ACE_NEW_THROW_EX (properties,
00457 CosNotification::AdminProperties (),
00458 CORBA::NO_MEMORY ());
00459
00460 this->admin_properties().populate (properties);
00461
00462 return properties._retn ();
00463 }
00464
00465 CosEventChannelAdmin::ConsumerAdmin_ptr
00466 TAO_Notify_EventChannel::for_consumers (ACE_ENV_SINGLE_ARG_DECL)
00467 ACE_THROW_SPEC ((
00468 CORBA::SystemException
00469 ))
00470 {
00471 return this->default_consumer_admin(ACE_ENV_SINGLE_ARG_PARAMETER);
00472 }
00473
00474 CosEventChannelAdmin::SupplierAdmin_ptr
00475 TAO_Notify_EventChannel::for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
00476 ACE_THROW_SPEC ((
00477 CORBA::SystemException
00478 ))
00479 {
00480 return this->default_supplier_admin (ACE_ENV_SINGLE_ARG_PARAMETER);
00481 }
00482
00483 void
00484 TAO_Notify_EventChannel::validate_qos (const CosNotification::QoSProperties & ,
00485 CosNotification::NamedPropertyRangeSeq_out
00486 ACE_ENV_ARG_DECL
00487 )
00488 ACE_THROW_SPEC ((
00489 CORBA::SystemException
00490 , CosNotification::UnsupportedQoS
00491 ))
00492 {
00493 ACE_THROW (CORBA::NO_IMPLEMENT ());
00494 }
00495
00496 void
00497 TAO_Notify_EventChannel::save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL)
00498 {
00499 bool changed = this->self_changed_;
00500 this->self_changed_ = false;
00501 this->children_changed_ = false;
00502
00503 if (is_persistent ())
00504 {
00505 TAO_Notify::NVPList attrs;
00506 this->save_attrs(attrs);
00507
00508 bool want_all_children = saver.begin_object(
00509 this->id(), "channel", attrs, changed ACE_ENV_ARG_PARAMETER);
00510 ACE_CHECK;
00511
00512 TAO_Notify::Save_Persist_Worker<TAO_Notify_ConsumerAdmin> ca_wrk(saver, want_all_children);
00513
00514 this->ca_container().collection()->for_each(&ca_wrk ACE_ENV_ARG_PARAMETER);
00515 ACE_CHECK;
00516
00517 TAO_Notify::Save_Persist_Worker<TAO_Notify_SupplierAdmin> sa_wrk(saver, want_all_children);
00518 this->sa_container().collection()->for_each(&sa_wrk ACE_ENV_ARG_PARAMETER);
00519 ACE_CHECK;
00520
00521 saver.end_object(this->id(), "channel" ACE_ENV_ARG_PARAMETER);
00522 }
00523 }
00524
00525 namespace {
00526 template<class T>
00527 void add_attr(TAO_Notify::NVPList& attrs, const T& prop) {
00528 if (prop.is_valid())
00529 {
00530 attrs.push_back(TAO_Notify::NVP (prop));
00531 }
00532 }
00533 }
00534
00535 void
00536 TAO_Notify_EventChannel::save_attrs(TAO_Notify::NVPList& attrs)
00537 {
00538 TAO_Notify_Object::save_attrs(attrs);
00539 add_attr(attrs, this->admin_properties().max_global_queue_length());
00540 add_attr(attrs, this->admin_properties().max_consumers());
00541 add_attr(attrs, this->admin_properties().max_suppliers());
00542 add_attr(attrs, this->admin_properties().reject_new_events());
00543 }
00544
00545 void
00546 TAO_Notify_EventChannel::load_attrs(const TAO_Notify::NVPList& attrs)
00547 {
00548 TAO_Notify_Object::load_attrs(attrs);
00549 attrs.load(this->admin_properties().max_global_queue_length());
00550 attrs.load(this->admin_properties().max_consumers());
00551 attrs.load(this->admin_properties().max_suppliers());
00552 attrs.load(this->admin_properties().reject_new_events());
00553 this->admin_properties().init();
00554 }
00555
00556 TAO_Notify::Topology_Object *
00557 TAO_Notify_EventChannel::load_child (const ACE_CString &type,
00558 CORBA::Long id,
00559 const TAO_Notify::NVPList& attrs
00560 ACE_ENV_ARG_DECL)
00561 {
00562 TAO_Notify::Topology_Object* result = this;
00563 if (type == "consumer_admin")
00564 {
00565 if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
00566 ACE_TEXT ("(%P|%t) EventChannel reload consumer_admin %d\n")
00567 , static_cast<int> (id)
00568 ));
00569
00570
00571 TAO_Notify_Builder* bld = TAO_Notify_PROPERTIES::instance()->builder();
00572 TAO_Notify_ConsumerAdmin * ca = bld->build_consumer_admin (
00573 this,
00574 id
00575 ACE_ENV_ARG_PARAMETER);
00576 ACE_CHECK_RETURN(0);
00577 ca->load_attrs (attrs);
00578 if (ca->is_default ())
00579 {
00580 CORBA::Object_var caob = this->poa()->servant_to_reference (ca ACE_ENV_ARG_PARAMETER);
00581 ACE_CHECK_RETURN(0);
00582 this->default_consumer_admin_ =
00583 CosNotifyChannelAdmin::ConsumerAdmin::_narrow (
00584 caob.in () ACE_ENV_ARG_PARAMETER);
00585 ACE_CHECK_RETURN(0);
00586 }
00587 result = ca;
00588 }
00589 else if (type == "supplier_admin")
00590 {
00591 if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
00592 ACE_TEXT ("(%P|%t) EventChannel reload supplier_admin %d\n")
00593 , static_cast<int> (id)
00594 ));
00595 TAO_Notify_Builder* bld = TAO_Notify_PROPERTIES::instance()->builder();
00596
00597 TAO_Notify_SupplierAdmin * sa = bld->build_supplier_admin (
00598 this,
00599 id
00600 ACE_ENV_ARG_PARAMETER);
00601 ACE_CHECK_RETURN(0);
00602 sa->load_attrs (attrs);
00603 if (sa->is_default ())
00604 {
00605 CORBA::Object_var saob = this->poa()->servant_to_reference (sa ACE_ENV_ARG_PARAMETER);
00606 ACE_CHECK_RETURN(0);
00607 this->default_supplier_admin_ =
00608 CosNotifyChannelAdmin::SupplierAdmin::_narrow (
00609 saob.in () ACE_ENV_ARG_PARAMETER);
00610 ACE_CHECK_RETURN(0);
00611 }
00612 result = sa;
00613 }
00614 return result;
00615 }
00616 TAO_Notify_ProxyConsumer *
00617 TAO_Notify_EventChannel::find_proxy_consumer (TAO_Notify::IdVec & id_path, size_t position ACE_ENV_ARG_DECL)
00618 {
00619 TAO_Notify_ProxyConsumer * result = 0;
00620 size_t path_size = id_path.size ();
00621 if (position < path_size)
00622 {
00623 TAO_Notify_SupplierAdmin_Find_Worker find_worker;
00624 TAO_Notify_SupplierAdmin * admin = find_worker.find (id_path[position], this->sa_container() ACE_ENV_ARG_PARAMETER);
00625 ACE_CHECK_RETURN (0);
00626 ++position;
00627 if (admin != 0)
00628 {
00629 result = admin->find_proxy_consumer (id_path, position
00630 ACE_ENV_ARG_PARAMETER);
00631 ACE_CHECK_RETURN(0);
00632 }
00633 }
00634 return result;
00635 }
00636
00637 TAO_Notify_ProxySupplier *
00638 TAO_Notify_EventChannel::find_proxy_supplier (TAO_Notify::IdVec & id_path, size_t position ACE_ENV_ARG_DECL)
00639 {
00640 TAO_Notify_ProxySupplier * result = 0;
00641 size_t path_size = id_path.size ();
00642 if (position < path_size)
00643 {
00644 TAO_Notify_ConsumerAdmin_Find_Worker find_worker;
00645 TAO_Notify_ConsumerAdmin * admin = find_worker.find (id_path[position], this->ca_container() ACE_ENV_ARG_PARAMETER);
00646 ACE_CHECK_RETURN (0);
00647 ++position;
00648 if (admin != 0)
00649 {
00650 result = admin->find_proxy_supplier (id_path, position
00651 ACE_ENV_ARG_PARAMETER);
00652 ACE_CHECK_RETURN(0);
00653 }
00654 }
00655 return result;
00656 }
00657
00658
00659 void
00660 TAO_Notify_EventChannel::reconnect (ACE_ENV_SINGLE_ARG_DECL)
00661 {
00662 TAO_Notify::Reconnect_Worker<TAO_Notify_ConsumerAdmin> ca_wrk;
00663 this->ca_container().collection()->for_each(&ca_wrk ACE_ENV_ARG_PARAMETER);
00664 ACE_CHECK;
00665
00666 TAO_Notify::Reconnect_Worker<TAO_Notify_SupplierAdmin> sa_wrk;
00667 this->sa_container().collection()->for_each(&sa_wrk ACE_ENV_ARG_PARAMETER);
00668 ACE_CHECK;
00669 }
00670
00671 TAO_Notify_EventChannel::TAO_Notify_ConsumerAdmin_Container&
00672 TAO_Notify_EventChannel::ca_container()
00673 {
00674 ACE_ASSERT( this->ca_container_.get() != 0 );
00675 return *ca_container_;
00676 }
00677
00678 TAO_Notify_EventChannel::TAO_Notify_SupplierAdmin_Container&
00679 TAO_Notify_EventChannel::sa_container()
00680 {
00681 ACE_ASSERT( this->sa_container_.get() != 0 );
00682 return *sa_container_;
00683 }
00684
00685 TAO_END_VERSIONED_NAMESPACE_DECL