2.5.2. Implementierung der konkreten checkerberry-db-Bridge

Nach dem Einbinden der benötigten Bibliotheken erfolgt die Implementierung der konkreten checkerberry-db-Bridge. Die Bridge bildet die Schnittstelle zwischen dem Kern von checkerberry db und der System-Umgebung des Kunden.

Die checkerberry db-Bridge besteht aus vier Java-Interfaces, von denen zwei implementiert werden müssen und von denen zwei optional sind:

  1. DatabaseConnector: (optional) Kapselt den Zugriff auf die Datenbank (siehe Abschnitt 2.5.2.1)

  2. DatabaseDescriptionCallback: (must) Definiert die Beschreibung für die einzelnen Datenbanktabellen (siehe Abschnitt 2.5.2.2)

  3. DbConfigurationCallback: (optional) Konfiguriert checkerberry db (siehe Abschnitt 2.5.2.3)

  4. ClasspathResourceLoader: (must) Lädt Testdaten aus dem Klassenpfad. (siehe Abschnitt 2.5.2.4)

Durch die Implementierung dieser Interfaces wird die Verbindung zwischen checkerberry db und der Kundenumgebung hergestellt. Die Implementierung des Interfaces ClasspathResourceLoader ist dabei optional und ist in der Regel nicht erforderlich. Die Implementierung des Interfaces DatabaseConnector ist ebenfalls optional, wobei eine eigene Implmentierung in der Regel sinnvoll ist. Gerade zum Einstieg kann es jedoch hilfreich sein, die Standard-Implementation zu verwenden und über die Konfiguration mit den erforderlichen Datenbankparametern zu versorgen.

Im Folgenden werden exemplarische Implementationen der Interfaces in einem Spring/Hibernate-Umfeld dargestellt.

2.5.2.1. Anbinden der Datenbank durch den DatabaseConnector

Wird bei der Erzeugung der checkerberry db-Bridge kein DatabaseConnector explizit angegeben, wird die Standard-Implementierung des DatabaseConnectors verwendet. Dieser erzeugt eine JDBC-Verbindung anhand der Datenbankparameter, die über die Konfiguration angegeben werden. In Abschnitt 2.5.2.3, „Konfiguration von checkerberry db mit dem DbConfigurationCallback“ ist ein entsprechendes Beispiel dargestellt.

Der Nachteil der Standard-Implementierung besteht darin, dass die JDBC-Parameter (JDBC-URL, User, Passwort, Datenbanktreiber) in der Konfiguration DbConfiguration angegeben werden müssen. Das ist für den Einstieg ein schneller Weg. In einer produktiven Umgebung mit mehreren Entwicklern kann das jedoch hinderlich sein, da jeder Entwickler sein eigenes Datenbankschema verwendet. Da alle die gleiche DbConfiguration bzw. das gleiche DbConfigurationCallback verwenden, müssten die JDBC-Parameter z.B. aus einer Property-Datei eingelesen werden. Diese Lösung ist möglich und in einigen Umgebungen vielleicht auch sinnvoll. In der Regel werden jedoch andere Frameworks wie z.B. das Spring Framework eingesetzt, die eine einfachere Integration von checkerberry ermöglichen. In einer Spring/Hibernate-Umgebung steht im Projekt checkerberry-db-spring3-bridge beispielsweise die Basisklasse SpringHibernateDatabaseConnector für diese Zwecke zur Verfügung.

Im Folgenden sei kurz das DatabaseConnector-Interface dargestellt.

Beispiel 2.64. Interface DatabaseConnector

/**
 * Connector, der den Zugriff zur Datenbank kapselt. Auf diese Art und
 * Weise wird checkerberry db von den unterschiedlichen
 * Technologien zum Datenbankzugriff entkoppelt.
 */
public interface DatabaseConnector {

  /**
   * Liefert den Namen des zu verwendenden Datenbankschemas zurück.
   *
   * @return zu verwendendes Schema.
   */
  String getDatabaseSchema();

  /**
   * Liefert die DataSource zum Zugriff auf die Datenbank zurück.
   *
   * @return DataSource.
   */
  DataSource getDataSource();

  /**
   * Erzeugt ein neues Datenbankschema. Diese Methode ist in der Regel
   * nur wichtig, falls eine Speicherbasierte Datenbank verwendet
   * wird.
   */
  void createDatabaseSchema();

  /**
   * Gibt die URL der Datenbankverbindung zurück, die z.B. für
   * die Zugriffskontrolle benötigt wird.
   *
   * @return URL der Datenbankverbindung
   */
  String getUrl();

}


Das folgende Code-Beispiel zeigt eine exemplarische Implementierung unter Verwendung der erwähnten Basisklasse. Im Konstruktor werden dieser die LocalSessionFactoryBean und die DataSource übergeben. Die Session-Factory wird verwendet, um generelle Informationen zur Datenbank zu ermitteln, während die Data-Source die Verbindung zur Datenbank darstellt.

Beispiel 2.65. Beispiel-Implementierung des DatabaseConnectors (Spring/Hibernate-Umgebung)

import javax.sql.DataSource;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.orm.hibernate3.LocalSessionFactoryBean;

import de.conceptpeople.checkerberry.db.spring.bridge.hibernate.database.\\
SpringHibernateDatabaseConnector;

  /**
   * Zugang zur Datenbank.
   */
  public class SampleDatabaseConnector extends
    SpringHibernateDatabaseConnector {

  /**
   * Erzeugt einen neuen Datenbank-Connector.
   *
   * @param beanFactory
   *            Spring-Beanfactory zum Auslesen der relevanten Beans.
   */
  public SampleDatabaseConnector(BeanFactory beanFactory) {
    super(
      (LocalSessionFactoryBean) beanFactory.getBean("&sessFactory"),
        (DataSource) beanFactory.getBean("dataSource"));
  }
}


Anmerkung: Zu diesem Beispiel sei erwähnt, dass das „&“-Zeichen vor sessFactory für die korrekte Referenzierung der SessionFactory notwendig ist und dazu dient, die Factory selbst und nicht eine durch sie erzeugte Session zu erhalten.

Die wesentliche Aufgabe des Database-Connectors besteht in der Bereitstellung einer JDBC-Verbindung zur Kommunikation mit der Datenbank. Die Implementierung dieses Interfaces ist somit sehr schnell und einfach auch in Umgebungen möglich, die nicht Spring und Hibernate verwenden.

In dem dargestellten Beispiel wird die DataSource zur Anbindung der Datenbank aus dem Application-Kontext von Spring eingelesen. Dieses Vorgehen hat den Vorteil, dass die DataSource bereits voll konfiguriert ist. Der Anwender muss sich somit nicht mehr darum kümmern, welche Datenbank mit welchem Benutzer verwendet wird, da dies bereits über Spring gekapselt ist. Auf diese Art und Weise kann sichergestellt werden, dass sowohl die zu testende Anwendung als auch checkerberry db auf die gleiche Datenbank zugreifen. Aus diesem Grund ist es sinnvoll, den DatabaseConnector individuell zu implementieren. Für die Einführung oder Evaluierung des checkerberry test centers kann es jedoch sinnvoller sein, den Standard-DatabaseConnector zu verwenden.