abstract class  
DBClientTemplate {

  protected  DatabaseAccess dba;

  abstract boolean databaseSafe();
  abstract void databaseWait() throws InterruptedException;
  abstract void databaseEnter();
  abstract void databaseExit();


  DBClientTemplate(DatabaseAccess dba) {
    this.dba = dba;
    }


  void
  enter()
  throws InterruptedException {
    
    dba.mutex.lock();

    if (!databaseSafe()) 
      databaseWait();

    assert databaseSafe() && dba.mutex.isLocked();

    databaseEnter();
    }
    

  void
  exit() {
    try { dba.mutex.lock(); }
    catch (InterruptedException ie) {
      Thread.currentThread().interrupt();
      }

    databaseExit();
    }
  }


syntax highlighted by Code2HTML, v. 0.9