I agree that the local mode client should not implement the RemoteInterface.
I further abstracted the DataInterface layer and it helps.
I created a FlightServices class. This class does not implement the DataInterface but has methods such as BookFlight(
String FlightNumber, int numSeats) and LookupFlight(String FlightNumber). Internally it contains an object of type DataInterface which instantiates the Data object or Remote object depending upon the startup mode.
I then created a class called FlightServicesException. So all method calls from FlightServices throw FlightServicesException instead of DatabaseException or RemoteException.
Abstracting it this way also gave me the ability to write some nonGUI
test clients with which I could run simulations of many users hitting the server at the same time.
The testclients would instantiate a FlightServices object and perform all the calls that GUI does, but
alot faster, and concurrently. My testclients were in different categories: lookup clients, booking clients, lockWithNoUnlock clients, and lockWholeDB clients. Running them all together helps test out my server design.