Of course Matt ... Here come some lines on my design.
I created a DataInterface defining all methods that are originally in Data.class. Data implements it. So does RemoteDataInterface, which also extends Remote. RemoteData implements RemoteDataInterface and basically jsut forwards requests to a nested Data object. But it also adds implementation for the locking mechanism.
The locking is managed through a LockManager class. This class has a HashMap which contains the couples (record number, owner) for each locked record. The owner is represented by the RemoteData object itself, as each client receives one. RemoteData implements Unreferenced for releasing connections of lost clients.
The server, FBNServer is the object accessible via RMI. FBNServer is a singleton. It is linked to one database and one LockManager class. Its main method is the getConnection method which returns a Stub to a RemoteData object (connection to the database).
From the client point of view, a ConnectionFactory class is called to obtain a connection to a database. If the connection is to be obtained remotely, it will contact the FBNServer. Otherwise, it will return a Data instance.
For the GUI, I let the user search on origin, destination, day and carrier. Each one is a combo box, prefilled with contents of the original database (sorted alphabetically).
Don't hesitate to ask questions on what is not sufficiently clear, it is not easy to think about everything in just a few lines
P.S. Indeed Jaun
[ December 16, 2002: Message edited by: St�phane Weber ]