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