00001
00002 #include "orbsvcs/Notify/Builder.h"
00003
00004 ACE_RCSID (Notify,
00005 Builder,
00006 "$Id: Builder.cpp 80974 2008-03-17 13:40:44Z johnnyw $")
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 (PortableServer::POA_ptr poa)
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 return ff->create (poa);
00181 }
00182
00183 CosNotifyChannelAdmin::EventChannelFactory_ptr
00184 TAO_Notify_Builder::build_event_channel_factory (PortableServer::POA_ptr poa,
00185 const char* name)
00186 {
00187 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00188
00189
00190 TAO_Notify_EventChannelFactory* ecf = 0;
00191 factory->create (ecf, name);
00192
00193 ecf->init (poa);
00194 return ecf->activate_self ();
00195 }
00196
00197 CosNotifyChannelAdmin::EventChannel_ptr
00198 TAO_Notify_Builder::build_event_channel (
00199 TAO_Notify_EventChannelFactory* ecf,
00200 const CosNotification::QoSProperties & initial_qos,
00201 const CosNotification::AdminProperties & initial_admin,
00202 CosNotifyChannelAdmin::ChannelID_out id,
00203 const char* ec_name)
00204 {
00205 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00206
00207 TAO_Notify_EventChannel* ec = 0;
00208 factory->create (ec, ec_name);
00209
00210 ec->init (ecf, initial_qos, initial_admin);
00211
00212
00213 ecf->ec_container().insert (ec);
00214
00215 CORBA::Object_var obj = ec->activate (ec);
00216
00217
00218 id = ec->id ();
00219
00220 return CosNotifyChannelAdmin::EventChannel::_narrow (obj.in());
00221 }
00222
00223 TAO_Notify_EventChannel *
00224 TAO_Notify_Builder::build_event_channel (
00225 TAO_Notify_EventChannelFactory* ecf,
00226 const CosNotifyChannelAdmin::ChannelID id,
00227 const char* ec_name)
00228 {
00229 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00230
00231 TAO_Notify_EventChannel* ec = 0;
00232 factory->create (ec, ec_name);
00233
00234 ec->init (ecf);
00235
00236
00237 ecf->ec_container().insert (ec);
00238
00239 ec->activate (ec, id);
00240
00241 return ec;
00242 }
00243
00244 CosNotifyChannelAdmin::ConsumerAdmin_ptr
00245 TAO_Notify_Builder::build_consumer_admin (
00246 TAO_Notify_EventChannel* ec,
00247 CosNotifyChannelAdmin::InterFilterGroupOperator op,
00248 CosNotifyChannelAdmin::AdminID_out id)
00249 {
00250 CosNotifyChannelAdmin::ConsumerAdmin_var ca_ret;
00251
00252 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00253
00254 TAO_Notify_ConsumerAdmin* ca = 0;
00255 factory->create (ca);
00256
00257 ca->init (ec);
00258
00259 ca->filter_operator (op);
00260
00261 CORBA::Object_var obj = ca->activate (ca);
00262
00263 id = ca->id ();
00264
00265 ca_ret = CosNotifyChannelAdmin::ConsumerAdmin::_narrow (obj.in());
00266
00267
00268 ec->ca_container_->insert (ca);
00269
00270 return ca_ret._retn ();
00271 }
00272
00273 TAO_Notify_ConsumerAdmin *
00274 TAO_Notify_Builder::build_consumer_admin (
00275 TAO_Notify_EventChannel* ec,
00276 const CosNotifyChannelAdmin::ChannelID id)
00277 {
00278 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00279 TAO_Notify_ConsumerAdmin * ca = 0;
00280 factory->create (ca);
00281
00282 ca->init (ec);
00283
00284 CORBA::Object_var obj = ca->activate (ca, id);
00285
00286
00287 ec->ca_container_->insert (ca);
00288 return ca;
00289 }
00290
00291 CosNotifyChannelAdmin::SupplierAdmin_ptr
00292 TAO_Notify_Builder::build_supplier_admin (TAO_Notify_EventChannel* ec,
00293 CosNotifyChannelAdmin::InterFilterGroupOperator op,
00294 CosNotifyChannelAdmin::AdminID_out id)
00295 {
00296 CosNotifyChannelAdmin::SupplierAdmin_var sa_ret;
00297
00298 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00299
00300 TAO_Notify_SupplierAdmin* sa = 0;
00301 factory->create (sa);
00302
00303 sa->init (ec);
00304
00305 sa->filter_operator (op);
00306
00307 CORBA::Object_var obj = sa->activate (sa);
00308
00309 id = sa->id ();
00310
00311 sa_ret = CosNotifyChannelAdmin::SupplierAdmin::_narrow (obj.in());
00312
00313
00314 ec->sa_container().insert (sa);
00315
00316 return sa_ret._retn ();
00317 }
00318
00319 TAO_Notify_SupplierAdmin *
00320 TAO_Notify_Builder::build_supplier_admin (
00321 TAO_Notify_EventChannel* ec,
00322 const CosNotifyChannelAdmin::ChannelID id)
00323 {
00324 TAO_Notify_Factory* factory = TAO_Notify_PROPERTIES::instance ()->factory ();
00325 TAO_Notify_SupplierAdmin * sa = 0;
00326 factory->create (sa);
00327
00328 sa->init (ec);
00329
00330 CORBA::Object_var obj = sa->activate (sa, id);
00331
00332
00333 ec->sa_container().insert (sa);
00334
00335 return sa;
00336 }
00337
00338 CosNotifyChannelAdmin::ProxyConsumer_ptr
00339 TAO_Notify_Builder::build_proxy(TAO_Notify_SupplierAdmin* sa
00340 , CosNotifyChannelAdmin::ClientType ctype
00341 , CosNotifyChannelAdmin::ProxyID_out proxy_id
00342 , const CosNotification::QoSProperties & initial_qos)
00343 {
00344 switch (ctype)
00345 {
00346 case CosNotifyChannelAdmin::ANY_EVENT:
00347 {
00348 TAO_Notify_ProxyPushConsumer_Builder pb;
00349 return pb.build (sa, proxy_id, initial_qos);
00350 }
00351 break;
00352
00353 case CosNotifyChannelAdmin::STRUCTURED_EVENT:
00354 {
00355 TAO_Notify_StructuredProxyPushConsumer_Builder pb;
00356 return pb.build (sa, proxy_id, initial_qos);
00357 }
00358 break;
00359
00360 case CosNotifyChannelAdmin::SEQUENCE_EVENT:
00361 {
00362 TAO_Notify_SequenceProxyPushConsumer_Builder pb;
00363 return pb.build (sa, proxy_id, initial_qos);
00364 }
00365 break;
00366
00367 default:
00368 throw CORBA::BAD_PARAM ();
00369 }
00370 }
00371
00372 CosNotifyChannelAdmin::ProxySupplier_ptr
00373 TAO_Notify_Builder::build_proxy(TAO_Notify_ConsumerAdmin* ca
00374 , CosNotifyChannelAdmin::ClientType ctype
00375 , CosNotifyChannelAdmin::ProxyID_out proxy_id
00376 , const CosNotification::QoSProperties & initial_qos)
00377 {
00378 switch (ctype)
00379 {
00380 case CosNotifyChannelAdmin::ANY_EVENT:
00381 {
00382 TAO_Notify_ProxyPushSupplier_Builder pb;
00383 return pb.build (ca, proxy_id, initial_qos);
00384 }
00385 break;
00386
00387 case CosNotifyChannelAdmin::STRUCTURED_EVENT:
00388 {
00389 TAO_Notify_StructuredProxyPushSupplier_Builder pb;
00390 return pb.build (ca, proxy_id, initial_qos);
00391 }
00392 break;
00393
00394 case CosNotifyChannelAdmin::SEQUENCE_EVENT:
00395 {
00396 TAO_Notify_SequenceProxyPushSupplier_Builder pb;
00397 return pb.build (ca, proxy_id, initial_qos);
00398 }
00399 break;
00400
00401 default:
00402 throw CORBA::BAD_PARAM ();
00403 }
00404 }
00405
00406 TAO_Notify_ProxyConsumer *
00407 TAO_Notify_Builder::build_proxy(TAO_Notify_SupplierAdmin* sa
00408 , CosNotifyChannelAdmin::ClientType ctype
00409 , const CosNotifyChannelAdmin::ProxyID proxy_id)
00410 {
00411 switch (ctype)
00412 {
00413 case CosNotifyChannelAdmin::ANY_EVENT:
00414 {
00415 TAO_Notify_ProxyPushConsumer_Builder pb;
00416 return pb.build (sa, proxy_id);
00417 }
00418 break;
00419
00420 case CosNotifyChannelAdmin::STRUCTURED_EVENT:
00421 {
00422 TAO_Notify_StructuredProxyPushConsumer_Builder pb;
00423 return pb.build (sa, proxy_id);
00424 }
00425 break;
00426
00427 case CosNotifyChannelAdmin::SEQUENCE_EVENT:
00428 {
00429 TAO_Notify_SequenceProxyPushConsumer_Builder pb;
00430 return pb.build (sa, proxy_id);
00431 }
00432 break;
00433
00434 default:
00435 throw CORBA::BAD_PARAM ();
00436 }
00437 }
00438
00439 TAO_Notify_ProxySupplier *
00440 TAO_Notify_Builder::build_proxy(TAO_Notify_ConsumerAdmin* ca
00441 , CosNotifyChannelAdmin::ClientType ctype
00442 , const CosNotifyChannelAdmin::ProxyID proxy_id)
00443 {
00444 switch (ctype)
00445 {
00446 case CosNotifyChannelAdmin::ANY_EVENT:
00447 {
00448 TAO_Notify_ProxyPushSupplier_Builder pb;
00449 return pb.build (ca, proxy_id);
00450 }
00451 break;
00452
00453 case CosNotifyChannelAdmin::STRUCTURED_EVENT:
00454 {
00455 TAO_Notify_StructuredProxyPushSupplier_Builder pb;
00456 return pb.build (ca, proxy_id);
00457 }
00458 break;
00459
00460 case CosNotifyChannelAdmin::SEQUENCE_EVENT:
00461 {
00462 TAO_Notify_SequenceProxyPushSupplier_Builder pb;
00463 return pb.build (ca, proxy_id);
00464 }
00465 break;
00466
00467 default:
00468 throw CORBA::BAD_PARAM ();
00469 }
00470 }
00471
00472 CosEventChannelAdmin::ProxyPushSupplier_ptr
00473 TAO_Notify_Builder::build_proxy (TAO_Notify_ConsumerAdmin* ca)
00474 {
00475 CosNotifyChannelAdmin::ProxyID proxy_id;
00476
00477 TAO_Notify_CosEC_ProxyPushSupplier_Builder pb;
00478
00479 CosNotification::QoSProperties initial_qos;
00480
00481 return pb.build (ca, proxy_id, initial_qos);
00482 }
00483
00484 CosEventChannelAdmin::ProxyPushConsumer_ptr
00485 TAO_Notify_Builder::build_proxy (TAO_Notify_SupplierAdmin* sa)
00486 {
00487 CosNotifyChannelAdmin::ProxyID proxy_id;
00488
00489 TAO_Notify_CosEC_ProxyPushConsumer_Builder pb;
00490
00491 CosNotification::QoSProperties initial_qos;
00492
00493 return pb.build (sa, proxy_id, initial_qos);
00494 }
00495
00496 void
00497 TAO_Notify_Builder::apply_reactive_concurrency (TAO_Notify_Object& object)
00498 {
00499 TAO_Notify_Reactive_Task* worker_task;
00500
00501 ACE_NEW_THROW_EX (worker_task,
00502 TAO_Notify_Reactive_Task (),
00503 CORBA::NO_MEMORY ());
00504
00505 object.set_worker_task (worker_task);
00506
00507 worker_task->init ();
00508 }
00509
00510 void
00511 TAO_Notify_Builder::apply_thread_pool_concurrency (TAO_Notify_Object& object, const NotifyExt::ThreadPoolParams& tp_params)
00512 {
00513 TAO_Notify_ThreadPool_Task* worker_task = 0;
00514
00515 ACE_NEW_THROW_EX (worker_task,
00516 TAO_Notify_ThreadPool_Task (),
00517 CORBA::NO_MEMORY ());
00518
00519 object.set_worker_task (worker_task);
00520
00521 worker_task->init (tp_params, object.admin_properties_);
00522 }
00523
00524 void
00525 TAO_Notify_Builder::apply_lane_concurrency (TAO_Notify_Object& , const NotifyExt::ThreadPoolLanesParams& )
00526 {
00527
00528 throw CORBA::NO_IMPLEMENT ();
00529 }
00530
00531 TAO_END_VERSIONED_NAMESPACE_DECL