00001
00002 #include "orbsvcs/Notify/Builder.h"
00003
00004 ACE_RCSID (Notify,
00005 Builder,
00006 "$Id: Builder.cpp 87253 2009-10-28 23:29:32Z dai_y $")
00007
00008 #include "ace/Dynamic_Service.h"
00009
00010 #include "tao/PortableServer/PortableServerC.h"
00011
00012 #include "orbsvcs/Notify/Factory.h"
00013 #include "orbsvcs/Notify/Properties.h"
00014 #include "orbsvcs/Notify/POA_Helper.h"
00015 #include "orbsvcs/Notify/ID_Factory.h"
00016 #include "orbsvcs/Notify/EventChannelFactory.h"
00017 #include "orbsvcs/Notify/EventChannel.h"
00018 #include "orbsvcs/Notify/SupplierAdmin.h"
00019 #include "orbsvcs/Notify/ConsumerAdmin.h"
00020 #include "orbsvcs/Notify/Worker_Task.h"
00021 #include "orbsvcs/Notify/Reactive_Task.h"
00022 #include "orbsvcs/Notify/ThreadPool_Task.h"
00023 #include "orbsvcs/Notify/FilterFactory.h"
00024 #include "orbsvcs/Notify/Object.h"
00025 #include "orbsvcs/Notify/EventType.h"
00026 #include "orbsvcs/Notify/Event.h"
00027 #include "orbsvcs/Notify/Any/AnyEvent.h"
00028 #include "orbsvcs/Notify/Any/ProxyPushConsumer.h"
00029 #include "orbsvcs/Notify/Any/ProxyPushSupplier.h"
00030 #include "orbsvcs/Notify/Any/CosEC_ProxyPushConsumer.h"
00031 #include "orbsvcs/Notify/Any/CosEC_ProxyPushSupplier.h"
00032 #include "orbsvcs/Notify/Structured/StructuredProxyPushConsumer.h"
00033 #include "orbsvcs/Notify/Structured/StructuredProxyPushSupplier.h"
00034 #include "orbsvcs/Notify/Sequence/SequenceProxyPushConsumer.h"
00035 #include "orbsvcs/Notify/Sequence/SequenceProxyPushSupplier.h"
00036 #include "orbsvcs/Notify/ETCL_FilterFactory.h"
00037 #include "orbsvcs/Notify/Container_T.h"
00038
00039 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00040
00041 template <class PROXY_IMPL,
00042 class PROXY,
00043 class PROXY_PTR,
00044 class PROXY_VAR,
00045 class PARENT>
00046 class TAO_Notify_Proxy_Builder_T
00047 {
00048 public:
00049 PROXY_PTR
00050 build (PARENT *parent, CosNotifyChannelAdmin::ProxyID_out proxy_id
00051 , const CosNotification::QoSProperties & initial_qos)
00052 {
00053 PROXY_VAR proxy_ret;
00054
00055 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00056
00057 PROXY_IMPL* proxy = 0;
00058 factory->create (proxy);
00059
00060 PortableServer::ServantBase_var servant (proxy);
00061
00062 proxy->init (parent);
00063
00064 proxy->set_qos (initial_qos);
00065
00066 CORBA::Object_var obj = proxy->activate (proxy);
00067
00068 proxy_id = proxy->id ();
00069
00070
00071 parent->insert (proxy);
00072
00073 proxy->configure (*parent, proxy_id);
00074
00075 proxy_ret = PROXY::_narrow (obj.in());
00076 return proxy_ret._retn ();
00077 }
00078
00079 PROXY_IMPL*
00080 build (PARENT *parent, const CosNotifyChannelAdmin::ProxyID proxy_id)
00081 {
00082 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00083
00084 PROXY_IMPL* proxy = 0;
00085 factory->create (proxy);
00086
00087 PortableServer::ServantBase_var servant (proxy);
00088
00089 proxy->init (parent);
00090
00091 proxy->activate (proxy, proxy_id);
00092
00093
00094 parent->insert (proxy);
00095
00096 return proxy;
00097 }
00098
00099 };
00100
00101
00102 typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_ProxyPushConsumer
00103 , CosNotifyChannelAdmin::ProxyConsumer
00104 , CosNotifyChannelAdmin::ProxyConsumer_ptr
00105 , CosNotifyChannelAdmin::ProxyConsumer_var
00106 , TAO_Notify_SupplierAdmin>
00107 TAO_Notify_ProxyPushConsumer_Builder;
00108
00109 typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_StructuredProxyPushConsumer
00110 , CosNotifyChannelAdmin::ProxyConsumer
00111 , CosNotifyChannelAdmin::ProxyConsumer_ptr
00112 , CosNotifyChannelAdmin::ProxyConsumer_var
00113 , TAO_Notify_SupplierAdmin>
00114 TAO_Notify_StructuredProxyPushConsumer_Builder;
00115
00116 typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_SequenceProxyPushConsumer
00117 , CosNotifyChannelAdmin::ProxyConsumer
00118 , CosNotifyChannelAdmin::ProxyConsumer_ptr
00119 , CosNotifyChannelAdmin::ProxyConsumer_var
00120 , TAO_Notify_SupplierAdmin>
00121 TAO_Notify_SequenceProxyPushConsumer_Builder;
00122
00123 typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_CosEC_ProxyPushConsumer
00124 , CosEventChannelAdmin::ProxyPushConsumer
00125 , CosEventChannelAdmin::ProxyPushConsumer_ptr
00126 , CosEventChannelAdmin::ProxyPushConsumer_var
00127 , TAO_Notify_SupplierAdmin>
00128 TAO_Notify_CosEC_ProxyPushConsumer_Builder;
00129
00130
00131 typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_ProxyPushSupplier
00132 , CosNotifyChannelAdmin::ProxySupplier
00133 , CosNotifyChannelAdmin::ProxySupplier_ptr
00134 , CosNotifyChannelAdmin::ProxySupplier_var
00135 , TAO_Notify_ConsumerAdmin>
00136 TAO_Notify_ProxyPushSupplier_Builder;
00137
00138 typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_StructuredProxyPushSupplier
00139 , CosNotifyChannelAdmin::ProxySupplier
00140 , CosNotifyChannelAdmin::ProxySupplier_ptr
00141 , CosNotifyChannelAdmin::ProxySupplier_var
00142 , TAO_Notify_ConsumerAdmin>
00143 TAO_Notify_StructuredProxyPushSupplier_Builder;
00144
00145 typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_SequenceProxyPushSupplier
00146 , CosNotifyChannelAdmin::ProxySupplier
00147 , CosNotifyChannelAdmin::ProxySupplier_ptr
00148 , CosNotifyChannelAdmin::ProxySupplier_var
00149 , TAO_Notify_ConsumerAdmin>
00150 TAO_Notify_SequenceProxyPushSupplier_Builder;
00151
00152 typedef TAO_Notify_Proxy_Builder_T<TAO_Notify_CosEC_ProxyPushSupplier
00153 , CosEventChannelAdmin::ProxyPushSupplier
00154 , CosEventChannelAdmin::ProxyPushSupplier_ptr
00155 , CosEventChannelAdmin::ProxyPushSupplier_var
00156 , TAO_Notify_ConsumerAdmin>
00157 TAO_Notify_CosEC_ProxyPushSupplier_Builder;
00158
00159 TAO_Notify_Builder::TAO_Notify_Builder (void)
00160 {
00161
00162 TAO_Notify_AnyEvent::event_type_ = TAO_Notify_EventType::special ();
00163 }
00164
00165 TAO_Notify_Builder::~TAO_Notify_Builder ()
00166 {
00167 }
00168
00169 CosNotifyFilter::FilterFactory_ptr
00170 TAO_Notify_Builder::build_filter_factory (PortableServer::POA_ptr poa, TAO_Notify_FilterFactory*& ff)
00171 {
00172 ff = ACE_Dynamic_Service<TAO_Notify_FilterFactory>::instance ("TAO_Notify_FilterFactory");
00173
00174 if (ff == 0)
00175 {
00176 ACE_NEW_THROW_EX (ff,
00177 TAO_Notify_ETCL_FilterFactory (),
00178 CORBA::NO_MEMORY ());
00179 }
00180
00181 return ff->create (poa);
00182 }
00183
00184 CosNotifyChannelAdmin::EventChannelFactory_ptr
00185 TAO_Notify_Builder::build_event_channel_factory (PortableServer::POA_ptr poa,
00186 const char* name)
00187 {
00188 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00189
00190
00191 TAO_Notify_EventChannelFactory* ecf = 0;
00192 factory->create (ecf, name);
00193
00194 ecf->init (poa);
00195 return ecf->activate_self ();
00196 }
00197
00198 CosNotifyChannelAdmin::EventChannel_ptr
00199 TAO_Notify_Builder::build_event_channel (
00200 TAO_Notify_EventChannelFactory* ecf,
00201 const CosNotification::QoSProperties & initial_qos,
00202 const CosNotification::AdminProperties & initial_admin,
00203 CosNotifyChannelAdmin::ChannelID_out id,
00204 const char* ec_name)
00205 {
00206 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00207
00208 TAO_Notify_EventChannel* ec = 0;
00209 factory->create (ec, ec_name);
00210
00211 ec->init (ecf, initial_qos, initial_admin);
00212
00213
00214 ecf->ec_container().insert (ec);
00215
00216 CORBA::Object_var obj = ec->activate (ec);
00217
00218
00219 id = ec->id ();
00220
00221 return CosNotifyChannelAdmin::EventChannel::_narrow (obj.in());
00222 }
00223
00224 TAO_Notify_EventChannel *
00225 TAO_Notify_Builder::build_event_channel (
00226 TAO_Notify_EventChannelFactory* ecf,
00227 const CosNotifyChannelAdmin::ChannelID id,
00228 const char* ec_name)
00229 {
00230 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00231
00232 TAO_Notify_EventChannel* ec = 0;
00233 factory->create (ec, ec_name);
00234
00235 ec->init (ecf);
00236
00237
00238 ecf->ec_container().insert (ec);
00239
00240 ec->activate (ec, id);
00241
00242 return ec;
00243 }
00244
00245 CosNotifyChannelAdmin::ConsumerAdmin_ptr
00246 TAO_Notify_Builder::build_consumer_admin (
00247 TAO_Notify_EventChannel* ec,
00248 CosNotifyChannelAdmin::InterFilterGroupOperator op,
00249 CosNotifyChannelAdmin::AdminID_out id)
00250 {
00251 CosNotifyChannelAdmin::ConsumerAdmin_var ca_ret;
00252
00253 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00254
00255 TAO_Notify_ConsumerAdmin* ca = 0;
00256 factory->create (ca);
00257
00258 ca->init (ec);
00259
00260 ca->filter_operator (op);
00261
00262 CORBA::Object_var obj = ca->activate (ca);
00263
00264 id = ca->id ();
00265
00266 ca_ret = CosNotifyChannelAdmin::ConsumerAdmin::_narrow (obj.in());
00267
00268
00269 ec->ca_container_->insert (ca);
00270
00271 return ca_ret._retn ();
00272 }
00273
00274 TAO_Notify_ConsumerAdmin *
00275 TAO_Notify_Builder::build_consumer_admin (
00276 TAO_Notify_EventChannel* ec,
00277 const CosNotifyChannelAdmin::ChannelID id)
00278 {
00279 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00280 TAO_Notify_ConsumerAdmin * ca = 0;
00281 factory->create (ca);
00282
00283 ca->init (ec);
00284
00285 CORBA::Object_var obj = ca->activate (ca, id);
00286
00287
00288 ec->ca_container_->insert (ca);
00289 return ca;
00290 }
00291
00292 CosNotifyChannelAdmin::SupplierAdmin_ptr
00293 TAO_Notify_Builder::build_supplier_admin (TAO_Notify_EventChannel* ec,
00294 CosNotifyChannelAdmin::InterFilterGroupOperator op,
00295 CosNotifyChannelAdmin::AdminID_out id)
00296 {
00297 CosNotifyChannelAdmin::SupplierAdmin_var sa_ret;
00298
00299 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00300
00301 TAO_Notify_SupplierAdmin* sa = 0;
00302 factory->create (sa);
00303
00304 sa->init (ec);
00305
00306 sa->filter_operator (op);
00307
00308 CORBA::Object_var obj = sa->activate (sa);
00309
00310 id = sa->id ();
00311
00312 sa_ret = CosNotifyChannelAdmin::SupplierAdmin::_narrow (obj.in());
00313
00314
00315 ec->sa_container().insert (sa);
00316
00317 return sa_ret._retn ();
00318 }
00319
00320 TAO_Notify_SupplierAdmin *
00321 TAO_Notify_Builder::build_supplier_admin (
00322 TAO_Notify_EventChannel* ec,
00323 const CosNotifyChannelAdmin::ChannelID id)
00324 {
00325 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00326 TAO_Notify_SupplierAdmin * sa = 0;
00327 factory->create (sa);
00328
00329 sa->init (ec);
00330
00331 CORBA::Object_var obj = sa->activate (sa, id);
00332
00333
00334 ec->sa_container().insert (sa);
00335
00336 return sa;
00337 }
00338
00339 CosNotifyChannelAdmin::ProxyConsumer_ptr
00340 TAO_Notify_Builder::build_proxy(TAO_Notify_SupplierAdmin* sa
00341 , CosNotifyChannelAdmin::ClientType ctype
00342 , CosNotifyChannelAdmin::ProxyID_out proxy_id
00343 , const CosNotification::QoSProperties & initial_qos)
00344 {
00345 switch (ctype)
00346 {
00347 case CosNotifyChannelAdmin::ANY_EVENT:
00348 {
00349 TAO_Notify_ProxyPushConsumer_Builder pb;
00350 return pb.build (sa, proxy_id, initial_qos);
00351 }
00352 break;
00353
00354 case CosNotifyChannelAdmin::STRUCTURED_EVENT:
00355 {
00356 TAO_Notify_StructuredProxyPushConsumer_Builder pb;
00357 return pb.build (sa, proxy_id, initial_qos);
00358 }
00359 break;
00360
00361 case CosNotifyChannelAdmin::SEQUENCE_EVENT:
00362 {
00363 TAO_Notify_SequenceProxyPushConsumer_Builder pb;
00364 return pb.build (sa, proxy_id, initial_qos);
00365 }
00366 break;
00367
00368 default:
00369 throw CORBA::BAD_PARAM ();
00370 }
00371 }
00372
00373 CosNotifyChannelAdmin::ProxySupplier_ptr
00374 TAO_Notify_Builder::build_proxy(TAO_Notify_ConsumerAdmin* ca
00375 , CosNotifyChannelAdmin::ClientType ctype
00376 , CosNotifyChannelAdmin::ProxyID_out proxy_id
00377 , const CosNotification::QoSProperties & initial_qos)
00378 {
00379 switch (ctype)
00380 {
00381 case CosNotifyChannelAdmin::ANY_EVENT:
00382 {
00383 TAO_Notify_ProxyPushSupplier_Builder pb;
00384 return pb.build (ca, proxy_id, initial_qos);
00385 }
00386 break;
00387
00388 case CosNotifyChannelAdmin::STRUCTURED_EVENT:
00389 {
00390 TAO_Notify_StructuredProxyPushSupplier_Builder pb;
00391 return pb.build (ca, proxy_id, initial_qos);
00392 }
00393 break;
00394
00395 case CosNotifyChannelAdmin::SEQUENCE_EVENT:
00396 {
00397 TAO_Notify_SequenceProxyPushSupplier_Builder pb;
00398 return pb.build (ca, proxy_id, initial_qos);
00399 }
00400 break;
00401
00402 default:
00403 throw CORBA::BAD_PARAM ();
00404 }
00405 }
00406
00407 TAO_Notify_ProxyConsumer *
00408 TAO_Notify_Builder::build_proxy(TAO_Notify_SupplierAdmin* sa
00409 , CosNotifyChannelAdmin::ClientType ctype
00410 , const CosNotifyChannelAdmin::ProxyID proxy_id)
00411 {
00412 switch (ctype)
00413 {
00414 case CosNotifyChannelAdmin::ANY_EVENT:
00415 {
00416 TAO_Notify_ProxyPushConsumer_Builder pb;
00417 return pb.build (sa, proxy_id);
00418 }
00419 break;
00420
00421 case CosNotifyChannelAdmin::STRUCTURED_EVENT:
00422 {
00423 TAO_Notify_StructuredProxyPushConsumer_Builder pb;
00424 return pb.build (sa, proxy_id);
00425 }
00426 break;
00427
00428 case CosNotifyChannelAdmin::SEQUENCE_EVENT:
00429 {
00430 TAO_Notify_SequenceProxyPushConsumer_Builder pb;
00431 return pb.build (sa, proxy_id);
00432 }
00433 break;
00434
00435 default:
00436 throw CORBA::BAD_PARAM ();
00437 }
00438 }
00439
00440 TAO_Notify_ProxySupplier *
00441 TAO_Notify_Builder::build_proxy(TAO_Notify_ConsumerAdmin* ca
00442 , CosNotifyChannelAdmin::ClientType ctype
00443 , const CosNotifyChannelAdmin::ProxyID proxy_id)
00444 {
00445 switch (ctype)
00446 {
00447 case CosNotifyChannelAdmin::ANY_EVENT:
00448 {
00449 TAO_Notify_ProxyPushSupplier_Builder pb;
00450 return pb.build (ca, proxy_id);
00451 }
00452 break;
00453
00454 case CosNotifyChannelAdmin::STRUCTURED_EVENT:
00455 {
00456 TAO_Notify_StructuredProxyPushSupplier_Builder pb;
00457 return pb.build (ca, proxy_id);
00458 }
00459 break;
00460
00461 case CosNotifyChannelAdmin::SEQUENCE_EVENT:
00462 {
00463 TAO_Notify_SequenceProxyPushSupplier_Builder pb;
00464 return pb.build (ca, proxy_id);
00465 }
00466 break;
00467
00468 default:
00469 throw CORBA::BAD_PARAM ();
00470 }
00471 }
00472
00473 CosEventChannelAdmin::ProxyPushSupplier_ptr
00474 TAO_Notify_Builder::build_proxy (TAO_Notify_ConsumerAdmin* ca)
00475 {
00476 CosNotifyChannelAdmin::ProxyID proxy_id;
00477
00478 TAO_Notify_CosEC_ProxyPushSupplier_Builder pb;
00479
00480 CosNotification::QoSProperties initial_qos;
00481
00482 return pb.build (ca, proxy_id, initial_qos);
00483 }
00484
00485 CosEventChannelAdmin::ProxyPushConsumer_ptr
00486 TAO_Notify_Builder::build_proxy (TAO_Notify_SupplierAdmin* sa)
00487 {
00488 CosNotifyChannelAdmin::ProxyID proxy_id;
00489
00490 TAO_Notify_CosEC_ProxyPushConsumer_Builder pb;
00491
00492 CosNotification::QoSProperties initial_qos;
00493
00494 return pb.build (sa, proxy_id, initial_qos);
00495 }
00496
00497 void
00498 TAO_Notify_Builder::apply_reactive_concurrency (TAO_Notify_Object& object)
00499 {
00500 TAO_Notify_Reactive_Task* worker_task;
00501
00502 ACE_NEW_THROW_EX (worker_task,
00503 TAO_Notify_Reactive_Task (),
00504 CORBA::NO_MEMORY ());
00505
00506 object.set_worker_task (worker_task);
00507
00508 worker_task->init ();
00509 }
00510
00511 void
00512 TAO_Notify_Builder::apply_thread_pool_concurrency (TAO_Notify_Object& object, const NotifyExt::ThreadPoolParams& tp_params)
00513 {
00514 TAO_Notify_ThreadPool_Task* worker_task = 0;
00515
00516 ACE_NEW_THROW_EX (worker_task,
00517 TAO_Notify_ThreadPool_Task (),
00518 CORBA::NO_MEMORY ());
00519
00520 object.set_worker_task (worker_task);
00521
00522 worker_task->init (tp_params, object.admin_properties_);
00523 }
00524
00525 void
00526 TAO_Notify_Builder::apply_lane_concurrency (TAO_Notify_Object& , const NotifyExt::ThreadPoolLanesParams& )
00527 {
00528
00529 throw CORBA::NO_IMPLEMENT ();
00530 }
00531
00532 TAO_END_VERSIONED_NAMESPACE_DECL