TAO::Interceptor_List< InterceptorType, DetailsType > Class Template Reference

Template for portable interceptor lists. More...

#include <Interceptor_List_T.h>

Collaboration diagram for TAO::Interceptor_List< InterceptorType, DetailsType >:

Collaboration graph
[legend]
List of all members.

Public Types

typedef InterceptorType::_var_type InterceptorType_var_type
 Define the traits for the underlying portable interceptor array.

typedef InterceptorType::_ptr_type InterceptorType_ptr_type

Public Member Functions

 Interceptor_List (void)
 Constructor.

void add_interceptor (InterceptorType_ptr_type i)
void add_interceptor (InterceptorType_ptr_type i, const CORBA::PolicyList &policies)
 Register an interceptor with policies.

void destroy_interceptors (void)
RegisteredInterceptorregistered_interceptor (size_t index)
 Return the registered interceptor in sequence element index.

InterceptorType_ptr_type interceptor (size_t index)
 Return the interceptor in sequence element index.

size_t size (void)

Private Types

typedef ACE_Array_Base< RegisteredInterceptorRegisteredArray

Private Attributes

RegisteredArray interceptors_
 Dynamic array of registered interceptors.


Detailed Description

template<typename InterceptorType, typename DetailsType>
class TAO::Interceptor_List< InterceptorType, DetailsType >

Template for portable interceptor lists.

Template for the various portable interceptor lists used internally by TAO.

Definition at line 51 of file Interceptor_List_T.h.


Member Typedef Documentation

template<typename InterceptorType, typename DetailsType>
typedef InterceptorType::_ptr_type TAO::Interceptor_List< InterceptorType, DetailsType >::InterceptorType_ptr_type
 

Definition at line 56 of file Interceptor_List_T.h.

Referenced by TAO::Interceptor_List< InterceptorType, DetailsType >::add_interceptor().

template<typename InterceptorType, typename DetailsType>
typedef InterceptorType::_var_type TAO::Interceptor_List< InterceptorType, DetailsType >::InterceptorType_var_type
 

Define the traits for the underlying portable interceptor array.

Definition at line 55 of file Interceptor_List_T.h.

template<typename InterceptorType, typename DetailsType>
typedef ACE_Array_Base<RegisteredInterceptor > TAO::Interceptor_List< InterceptorType, DetailsType >::RegisteredArray [private]
 

Definition at line 85 of file Interceptor_List_T.h.


Constructor & Destructor Documentation

template<typename InterceptorType, typename DetailsType>
TAO::Interceptor_List< InterceptorType, DetailsType >::Interceptor_List void   ) 
 

Constructor.

Definition at line 17 of file Interceptor_List_T.cpp.

00018   {
00019   }


Member Function Documentation

template<typename InterceptorType, typename DetailsType>
void TAO::Interceptor_List< InterceptorType, DetailsType >::add_interceptor InterceptorType_ptr_type  interceptor,
const CORBA::PolicyList policies
 

Register an interceptor with policies.

Increase the length of the Interceptor sequence by one.

If the Interceptor is not anonymous, make sure an Interceptor with the same isn't already registered.

Definition at line 115 of file Interceptor_List_T.cpp.

References TAO::Interceptor_List< InterceptorType, DetailsType >::interceptor(), TAO::Interceptor_List< InterceptorType, DetailsType >::interceptors_, TAO::Interceptor_List< InterceptorType, DetailsType >::InterceptorType_ptr_type, CORBA::is_nil(), ACE_Array_Base< T >::size(), ACE_OS::strcmp(), and ACE_OS::strlen().

00119   {
00120     if (!CORBA::is_nil (interceptor))
00121       {
00122         size_t const old_len = this->interceptors_.size ();
00123 
00124         // Don't bother checking the name for duplicates if no
00125         // interceptors have been registered.  This saves an
00126         // allocation.
00127         if (old_len > 0)
00128           {
00129             /// If the Interceptor is not anonymous, make sure an
00130             /// Interceptor with the same isn't already registered.
00131             CORBA::String_var name =
00132               interceptor->name ();
00133 
00134             if (ACE_OS::strlen (name.in ()) != 0)
00135               {
00136                 // @@ This simple search algorithm isn't the greatest
00137                 //    thing in the world, but since we only register
00138                 //    interceptors when bootstrapping an ORB, there will
00139                 //    be no runtime penalty.
00140                 //
00141                 //    Another source of inefficiency is that
00142                 //    Interceptors duplicate their name each time the
00143                 //    name() accessor is called!  This can slow down
00144                 //    bootstrap time noticeably when registering a huge
00145                 //    number of interceptors.  We could cache the names
00146                 //    somewhere, but since this is only a bootstrapping
00147                 //    issue there's no rush to implement such a scheme.
00148 
00149                 // Prevent interceptors with the same name from being
00150                 // registered.  Anonymous interceptors are okay.
00151                 for (size_t i = 0; i < old_len; ++i)
00152                   {
00153                     CORBA::String_var existing_name =
00154                       this->interceptor (i)->name ();
00155 
00156                     if (ACE_OS::strcmp (existing_name.in (),
00157                                         name.in ()) == 0)
00158                       {
00159                         throw PortableInterceptor::ORBInitInfo::DuplicateName ();
00160                       }
00161                   }
00162               }
00163           }
00164 
00165         // Create a DetailsType object, and attempt to apply the policies.
00166         DetailsType details;
00167         details.apply_policies(policies);
00168 
00169         /// Increase the length of the Interceptor sequence by one.
00170         const size_t new_len = old_len + 1;
00171         this->interceptors_.size (new_len);
00172 
00173         // Add the interceptor
00174         this->interceptors_[old_len].interceptor_ =
00175           InterceptorType::_duplicate (interceptor);
00176 
00177         // Set the details
00178         this->interceptors_[old_len].details_ = details;
00179       }
00180     else
00181       {
00182         throw
00183             CORBA::INV_OBJREF (
00184                 CORBA::SystemException::_tao_minor_code (
00185                     0,
00186                     EINVAL
00187                   ),
00188                 CORBA::COMPLETED_NO
00189             );
00190       }
00191   }

template<typename InterceptorType, typename DetailsType>
void TAO::Interceptor_List< InterceptorType, DetailsType >::add_interceptor InterceptorType_ptr_type  interceptor  ) 
 

Increase the length of the Interceptor sequence by one.

If the Interceptor is not anonymous, make sure an Interceptor with the same isn't already registered.

Definition at line 45 of file Interceptor_List_T.cpp.

References TAO::Interceptor_List< InterceptorType, DetailsType >::interceptor(), TAO::Interceptor_List< InterceptorType, DetailsType >::interceptors_, TAO::Interceptor_List< InterceptorType, DetailsType >::InterceptorType_ptr_type, CORBA::is_nil(), ACE_Array_Base< T >::size(), ACE_OS::strcmp(), and ACE_OS::strlen().

Referenced by TAO::ClientRequestInterceptor_Adapter_Impl::add_interceptor().

00047   {
00048     if (!CORBA::is_nil (interceptor))
00049       {
00050         size_t const old_len = this->interceptors_.size ();
00051 
00052         // Don't bother checking the name for duplicates if no
00053         // interceptors have been registered.  This saves an
00054         // allocation.
00055         if (old_len > 0)
00056           {
00057             /// If the Interceptor is not anonymous, make sure an
00058             /// Interceptor with the same isn't already registered.
00059             CORBA::String_var name =
00060               interceptor->name ();
00061 
00062             if (ACE_OS::strlen (name.in ()) != 0)
00063               {
00064                 // @@ This simple search algorithm isn't the greatest
00065                 //    thing in the world, but since we only register
00066                 //    interceptors when bootstrapping an ORB, there will
00067                 //    be no runtime penalty.
00068                 //
00069                 //    Another source of inefficiency is that
00070                 //    Interceptors duplicate their name each time the
00071                 //    name() accessor is called!  This can slow down
00072                 //    bootstrap time noticeably when registering a huge
00073                 //    number of interceptors.  We could cache the names
00074                 //    somewhere, but since this is only a bootstrapping
00075                 //    issue there's no rush to implement such a scheme.
00076 
00077                 // Prevent interceptors with the same name from being
00078                 // registered.  Anonymous interceptors are okay.
00079                 for (size_t i = 0; i < old_len; ++i)
00080                   {
00081                     CORBA::String_var existing_name =
00082                       this->interceptor (i)->name ();
00083 
00084                     if (ACE_OS::strcmp (existing_name.in (),
00085                                         name.in ()) == 0)
00086                       {
00087                         throw PortableInterceptor::ORBInitInfo::DuplicateName ();
00088                       }
00089                   }
00090               }
00091           }
00092 
00093         /// Increase the length of the Interceptor sequence by one.
00094         size_t const new_len = old_len + 1;
00095         this->interceptors_.size (new_len);
00096 
00097         // Add the interceptor
00098         this->interceptors_[old_len].interceptor_ =
00099           InterceptorType::_duplicate (interceptor);
00100       }
00101     else
00102       {
00103         throw
00104             CORBA::INV_OBJREF (
00105                 CORBA::SystemException::_tao_minor_code (
00106                     0,
00107                     EINVAL
00108                   ),
00109                 CORBA::COMPLETED_NO);
00110       }
00111   }

template<typename InterceptorType, typename DetailsType>
void TAO::Interceptor_List< InterceptorType, DetailsType >::destroy_interceptors void   ) 
 

Definition at line 195 of file Interceptor_List_T.cpp.

References ACE_DEBUG, ACE_TEXT, TAO::Interceptor_List< InterceptorType, DetailsType >::interceptor(), TAO::Interceptor_List< InterceptorType, DetailsType >::interceptors_, LM_DEBUG, ACE_Array_Base< T >::size(), and TAO_debug_level.

Referenced by TAO::ClientRequestInterceptor_Adapter_Impl::destroy_interceptors().

00197   {
00198     size_t const len = this->interceptors_.size ();
00199     size_t ilen = len;
00200 
00201     try
00202       {
00203         for (size_t k = 0; k < len; ++k)
00204           {
00205             // Destroy the interceptors in reverse order in case the
00206             // array list is only partially destroyed and another
00207             // invocation occurs afterwards.
00208             --ilen;
00209 
00210             this->interceptor (k)->destroy ();
00211 
00212             // Since Interceptor::destroy() can throw an exception,
00213             // decrease the size of the interceptor array incrementally
00214             // since some interceptors may not have been destroyed yet.
00215             // Note that this size reduction is fast since no memory is
00216             // actually deallocated.
00217             this->interceptors_.size (ilen);
00218           }
00219       }
00220     catch (...)
00221       {
00222         // Exceptions should not be propagated beyond this call.
00223         if (TAO_debug_level > 3)
00224           {
00225             ACE_DEBUG ((LM_DEBUG,
00226                         ACE_TEXT ("TAO (%P|%t) - Exception in ")
00227                         ACE_TEXT ("Interceptor_List")
00228                         ACE_TEXT ("::destroy_interceptors () \n")));
00229           }
00230       }
00231   }

template<typename InterceptorType, typename DetailsType>
Interceptor_List< InterceptorType, DetailsType >::InterceptorType_ptr_type TAO::Interceptor_List< InterceptorType, DetailsType >::interceptor size_t  index  ) 
 

Return the interceptor in sequence element index.

Definition at line 31 of file Interceptor_List_T.cpp.

References TAO::Interceptor_List< InterceptorType, DetailsType >::interceptors_.

Referenced by TAO::Interceptor_List< InterceptorType, DetailsType >::add_interceptor(), and TAO::Interceptor_List< InterceptorType, DetailsType >::destroy_interceptors().

00032   {
00033     return this->interceptors_[index].interceptor_.in ();
00034   }

template<typename InterceptorType, typename DetailsType>
Interceptor_List< InterceptorType, DetailsType >::RegisteredInterceptor & TAO::Interceptor_List< InterceptorType, DetailsType >::registered_interceptor size_t  index  ) 
 

Return the registered interceptor in sequence element index.

Definition at line 23 of file Interceptor_List_T.cpp.

References TAO::Interceptor_List< InterceptorType, DetailsType >::interceptors_.

Referenced by TAO::ClientRequestInterceptor_Adapter_Impl::receive_exception(), TAO::ClientRequestInterceptor_Adapter_Impl::receive_other(), TAO::ClientRequestInterceptor_Adapter_Impl::receive_reply(), and TAO::ClientRequestInterceptor_Adapter_Impl::send_request().

00025   {
00026     return this->interceptors_[index];
00027   }

template<typename InterceptorType, typename DetailsType>
size_t TAO::Interceptor_List< InterceptorType, DetailsType >::size void   ) 
 

Definition at line 38 of file Interceptor_List_T.cpp.

References TAO::Interceptor_List< InterceptorType, DetailsType >::interceptors_, and ACE_Array_Base< T >::size().

Referenced by TAO::ClientRequestInterceptor_Adapter_Impl::send_request().

00039   {
00040     return this->interceptors_.size ();
00041   }


Member Data Documentation

template<typename InterceptorType, typename DetailsType>
RegisteredArray TAO::Interceptor_List< InterceptorType, DetailsType >::interceptors_ [private]
 

Dynamic array of registered interceptors.

Definition at line 88 of file Interceptor_List_T.h.

Referenced by TAO::Interceptor_List< InterceptorType, DetailsType >::add_interceptor(), TAO::Interceptor_List< InterceptorType, DetailsType >::destroy_interceptors(), TAO::Interceptor_List< InterceptorType, DetailsType >::interceptor(), TAO::Interceptor_List< InterceptorType, DetailsType >::registered_interceptor(), and TAO::Interceptor_List< InterceptorType, DetailsType >::size().


The documentation for this class was generated from the following files:
Generated on Sun Jan 27 13:30:23 2008 for TAO_PI by doxygen 1.3.6