A BindInterceptor object is a global Interceptor which is called on the client side before and after binds.
 
      A ClientRequestInterceptor object may be registered during a 
bind_succeeded call of a 
BindInterceptor object, and it remains active for the duration of the connection. Two of its methods are called before the invocation on the client object, one (
preinvoke_premarshal) before the parameters are marshaled and the other (
preinvoke_postmarshal) after they are. The third method (
postinvoke) is called after the request has completed.
 
      A POALifeCycleInterceptor object is a global Interceptor which is called every time a POA is created (using the 
create method) or destroyed (using the 
destroy method).
 
      An ActiveObjectLifeCycleInterceptor object is called whenever an object is added to the Active Object Map (using the 
create method) or after an object has been deactivated and etherealized (using the 
destroy method). The Interceptor may be registered by a 
POALifeCycleInterceptor on a per-POA basis at POA creation time. This Interceptor may only be registered if the POA has the 
RETAIN policy.
 
      A ServerRequestInterceptor object is called at various stages in the invocation of a server implementation of a remote object before the invocation (using the preinvoke method) and after the invocation both before and after the marshaling of the reply (using the 
postinvoke_premarshal and 
postinvoke_premarshal methods respectively). This Interceptor may be registered by a 
POALifeCycleInterceptor object at POA creation time on a per-POA basis.
 
      If a CORBA::SystemException or any sub-classes (for example 
CORBA::NO_PERMISSION) is raised on the server side, the exception should not be encrypted. This is because the ORB uses some of these exceptions internally (for example 
TRANSIENT for doing automatic rebind).
 
      An IORCreationInterceptor object is called whenever a POA creates an object reference (using the 
create method). This Interceptor may be registered by a 
POALifeCycleInterceptor at POA creation time on a per-POA basis.
 
      When you call resolve_initial_references, the resolve on all installed services gets called. The resolve then can return the appropriate object.
 
      To write service initializers, you must obtain a ServiceResolver after getting an 
InterceptorManagerControl to be able to add your services.
 
      
      In “Code listings”, each of the Interceptor API methods is simply implemented to print informational messages to the standard output.
 
      The ServiceInit class used in VisiBroker 3.x is replaced by implementing two interfaces: 
ServiceLoader and 
ServiceResolverInterceptor. For an example of how to do this, see 
“SampleServerLoader”.
 
      Since the OAD is not running, the bind call fails and the server proceeds. The client binds to the account object, and then calls the 
balance method. This request is received by the server, processed, and results are returned to the client. The client prints the results.
 
      The SampleServerLoader object is responsible for loading the 
POALifeCycleInterceptor class and instantiating an object. This class is linked to the VisiBroker ORB dynamically by 
vbroker.orb.dynamicLibs. The 
SampleServerLoader class contains the 
init method which is called by the VisiBroker ORB during initialization. Its sole purpose is to install a 
POALifeCycleInterceptor object by creating it and registering it with the 
InterceptorManager.
 
      The SamplePOALifeCycleInterceptor object is invoked every time a POA is created or destroyed. Because we have two POAs in the 
client_server example, this Interceptor is invoked twice, first during 
rootPOA creation and then at the creation of 
myPOA. We install the 
SampleServerInterceptor only at the creation of 
myPOA.
 
      The SampleServerInterceptor object is invoked every time a request is received at or a reply is made by the server.
 
      The SampleClientInterceptor is invoked every time a request is made by or a reply is received at the client.
 
      The SampleClientLoader is responsible for loading 
BindInterceptor objects. This class is linked to the VisiBroker ORB dynamically by 
vbroker.orb.dynamicLibs. The 
SampleClientLoader class contains the 
bind and 
bind_succeeded methods. These methods are called by the ORB during object binding. When the bind succeeds,
bind_succeeded will be called by the ORB and a 
BindInterceptor object is installed by creating it and registering it the 
InterceptorManager.
 
      The SampleBindInterceptor is invoked when the client attempts to bind to an object. The first step on the client side after ORB initialization is to bind to an 
AccountManager object. This bind invokes the 
SampleBindInterceptor and a 
SampleClientInterceptor is installed when the bind succeeds.
 
      Closure objects are created by the ORB at the beginning of certain sequences of Interceptor calls. The same 
Closure object is used for all calls in that particular sequence. The 
Closure object contains a single public data field 
object of type 
java.lang.Object which may be set by the Interceptor to keep state information. The sequences for which 
Closure objects are created vary depending on the Interceptor type. In the 
ClientRequestInterceptor, a new 
Closure is created before calling 
preinvoke_premarshal and the same 
Closure is used for that request until the request completes, successfully or not. Likewise, in the 
ServerInterceptor, a new 
Closure is created before calling 
preinvoke, and that 
Closure is used for all Interceptor calls related to processing that particular request.
 
      For an example of how Closure is used, see the examples in the following directory: