
Persistent POA Example
----------------------

This example demonstrates usage of a persistent POA. Objects in a persistent
POA can by definition outlive the process they're created in. A mechanism is
provided to save the objects' state to persistent storage (for example, a
file on disk) and to restore the information when the object is reactivated.

The implementation of Bank and Account hasn't changed much compared with
the previous example (Account-2). We have added a "name" parameter to
Bank::create() so that each Account has a Name that we will use as a
file name to store the Account on disk lateron. We have also added a
Bank::shutdown() operation to demonstrate transparent reactivation of
the servant by micod.

More changes have been done in AccountManager, the ServantManager imple-
mentation. Now, when asked to incarnate a new servant, the Manager sees
if the object's state from a previous activation can be read from disk.
Upon etherealize, the object's balance is written to disk.

Unfortunately, all we get in our implementation of etherealize() is a
PortableServer::Servant value. We know that it actually points to an
Account_impl object, but we cannot directly call any of Account_impl's
methods to save the state, and we also cannot narrow the pointer to an
Account_impl (save with advanced C++ features). We must therefore keep
a map mapping Servant values to Account implementations.

The server process uses a total of three POAs: first, the Root POA.
Second, the persistent "Accounts" POA. Third, the "Bank" POA. The
Bank must also be registered in a persistent POA so that the Object
reference kept by the client does not become invalid between server
activations. We could of course register the Bank in the "Accounts"
POA, but then we'd have to distinguish between the Bank and all the
Accounts in our ServantManager. There's no penalty for using multiple
POAs -- the concept has been introduced to make our life easier after
all.

Note that the Bank, though registered in the "Bank" POA, creates all
its Account references in the "Account" POA.

The "account" shell script first starts the POA Daemon (which is contained
in micod) and adds a "poa" entry to the Implementation Repository. The POA
Daemon will then fire up the server, first upon a bind(), and then when-
ever an operation is to be done and the server is not running.

Note that the client binds not to the server, but to micod's address.
