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.