Builder.cpp

Go to the documentation of this file.
00001 // $Id: Builder.cpp 79084 2007-07-30 13:13:45Z elliott_c $
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     // 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 (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   // Create ECF
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   // insert ec in ec container.
00215   ecf->ec_container().insert (ec);
00216 
00217   CORBA::Object_var obj = ec->activate (ec);
00218 
00219   // Populate the ID to return.
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); //, initial_qos, initial_admin
00237 
00238   // insert ec in ec container.
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   // insert admin in CA container.
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   // insert admin in CA container.
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   // insert admin in SA container.
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   // insert admin in CA container.
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& /*object*/, const NotifyExt::ThreadPoolLanesParams& /*tpl_params*/)
00528 {
00529   // No lane support
00530   throw CORBA::NO_IMPLEMENT ();
00531 }
00532 
00533 TAO_END_VERSIONED_NAMESPACE_DECL

Generated on Sun Jan 27 15:39:52 2008 for TAO_CosNotification by doxygen 1.3.6