Builder.cpp

Go to the documentation of this file.
00001 // $Id: Builder.cpp 80974 2008-03-17 13:40:44Z johnnyw $
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     // insert proxy in admin container.
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     // insert proxy in admin container.
00093     parent->insert (proxy);
00094 
00095     return proxy;
00096   }
00097 
00098 };
00099 
00100 // define the ProxyConsumer Builders.
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 // define the ProxySupplier Builders.
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   // Init the static members.
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   // Create ECF
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   // insert ec in ec container.
00213   ecf->ec_container().insert (ec);
00214 
00215   CORBA::Object_var obj = ec->activate (ec);
00216 
00217   // Populate the ID to return.
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); //, initial_qos, initial_admin
00235 
00236   // insert ec in ec container.
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   // insert admin in CA container.
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   // insert admin in CA container.
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   // insert admin in SA container.
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   // insert admin in CA container.
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& /*object*/, const NotifyExt::ThreadPoolLanesParams& /*tpl_params*/)
00526 {
00527   // No lane support
00528   throw CORBA::NO_IMPLEMENT ();
00529 }
00530 
00531 TAO_END_VERSIONED_NAMESPACE_DECL

Generated on Tue Feb 2 17:45:28 2010 for TAO_CosNotification by  doxygen 1.4.7