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:
DatabaseConnector:
(optional) Kapselt
den Zugriff auf die Datenbank (siehe Abschnitt 2.5.2.1)
DatabaseDescriptionCallback:
(must)
Definiert die Beschreibung für die einzelnen Datenbanktabellen
(siehe Abschnitt 2.5.2.2)
DbConfigurationCallback:
(optional)
Konfiguriert checkerberry db (siehe Abschnitt 2.5.2.3)
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.
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.