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