To complete the implementation of the server we need to write the code that enters it into the CORBA environment. In detail, we need to:
To do this, we need to make use of some additional operations specified in the CORBA module:
module CORBA {
...
interface ORB {
...
typedef string ObjectId;
exception InvalidName {};
Object resolve_initial_references (in ObjectId identifier)
raises (InvalidName);
void shutdown( in boolean wait_for_completion );
}
}
The CORBA standard specifies the ORB operation resolve_initial_references
. This operation provides a portable method for applications to obtain initial references to a small set of standard objects (objects other than the initial ORB). These objects are identified by a mnemonic name, using a string known as an ObjectId
. For instance, the ObjectID
for an initial POA object is RootPOA
. (References to a select few other objects, such as the InterfaceRepository
and NamingService
, can also be obtained in this manner.)
The ORB operation resolve_initial_references
returns the object associated with an ObjectId
, raising the exception InvalidName
for an unrecognized ObjectID
.
Meanwhile, the shutdown
operation instructs the ORB, and its object adapters, to shut down. If the wait_for_completion
parameter is TRUE
, the operation blocks until all pending ORB processing has completed, otherwise it simply shuts down the ORB immediately.
(defun bank-server ()
(let* ((orb (op:orb_init nil "LispWorks ORB"))
(rootPOA (op:resolve_initial_references orb "RootPOA")))
(let ((bank-impl (make-instance 'bank-implementation
:connection (connect-to-database)
:poa rootPOA)))
(let ((bank-ref (op:servant_to_reference rootPOA
bank-impl)))
(object-to-file orb bank-ref)
(capi:display (make-instance 'server-controller
:bank-poa rootPOA
:bank-ref bank-ref)))
(op:activate (op:the_poamanager rootPOA)))))
The top-level function first initializes the LispWorks ORB by calling the Common Lisp generic function op:ORB_init
, just as we initialized the ORB in the client.
The call returns an ORB pseudo-object. Invoking op:resolve_initial_references
on this ORB, passing the ObjectID
RootPOA
, returns a POA object of class PortableServer:POA
. This is the CORBA standard method for obtaining the initial POA object. Note that root POA
is initially in the holding state.
Next, we connect to the database and use the connection to make a bank servant. We register the servant with the POA
, RootPOA
, and publish the resulting object reference, encoded as a string, in the shared file.
We then obtain the POA Manager for the POA using the POA operation op:the_POAManager
. The call to op:activate
moves the POA out of the holding state, into the active state, ready to receive and process incoming requests.
This completes the description of our implementation of the server.