Skip to content
This repository was archived by the owner on Sep 18, 2020. It is now read-only.

Backend Top Routen abfragen

Maren edited this page Jan 11, 2015 · 1 revision

← zurück zur Backend-Logik Übersicht

Autor: Maren

Der Anwendungsfall "Top Routen auslesen" wurde in der Use Case Beschreibung genau definiert. Die Schnittstelle zwischen Frontend und Backend ist unter diesem Link zu sehen.

Kurzprofil der Funktion

Definition: Durch diese Funktion werden alle Top Routen, die in der H2 Datenbank gespeichert sind, ausgelesen.
Modul: Route
Dateiname: Route.java
Pfad: /toproutes

Folgende Klassen wurden erstellt, um die Abfrage der Top Routen aus der Datenbank zu ermöglichen:

Erstellen der Funktion

Erstellen der Datenklasse

Als erster Schritt wird eine Models-Klasse Route.javaangelegt. Dies ist die Datenklasse in der die Variablen: hash, data und top erzeugt werden. Diese drei Variablen beschreiben eine Route, wie sie in der Datenbank abgelegt sind. Ist der Boolean top auf true gesetzt, dann handelt es sich dabei um eine Top Route. Standardmäßig soll dieser Wert allerdings false sein, denn nur explizit bei den sieben Top Routen soll dieser auf true gesetzt werden. Bei normalen Routen ist dieser immer false.

	private String hash = "";
	private String data = "";
	private boolean top = false;

Des Weiteren werden in dieser Klasse die Getter- und Setter-Methoden sowie zwei Konstruktur für die Routen erstellt. Einer der Konstruktor ist leer, um die Datenklasse einfacher in Tests verwenden zu können.

 /** 
   * Der Route Konstruktur zur Erstellung des Routes Objekts 
   */ 
	public Route (String hash, String data, Boolean top){ 
		this.setHash(hash);
		this.setData(data); 
		this.setTop(top); 
	}

Erstellen des Interface

Nach dem Kreieren der Datenklasse Route.java wird ein Interface RouteDAO.java in dem Package de.dhbw.hh.dao erstellt. Dieses Interface enthält alle Route Methoden, durch die die Daten der Routen bearbeitet oder abgefragt werden können. Dafür wird die Datenklasse Route.java impotiert. Für die Abfrage der Top Routen ist folgende Methode relevant:

/**Diese Funktion gibt alle Top Routen zurück 
 * 
 * @param es wird nach allen Top Routen gesucht
 * @return alle Top Routen bei Erfolg, andernfalls wird null zurückgegeben
 */	
public Collection<Route> findTopRoutes();
		
}

Diese RouteDAO.java-Klasse muss anschließend in der DAOFactory.java-Klasse verlinkt werden. Dafür muss die RouteDAO.java-Klasse wie folgt mit einer Funktion hinzugefügt werden:

public abstract RouteDAO getRouteDAO();

Die Funktion der DAOFactory.java-Klasse ist unter Standardablauf beschrieben.

Erstellen der Abfrage-Funktion

Als nächstes wird eine H2RouteDAO.java-Klasse im de.dhbw.hh.dao.h2 Package hinzugefügt. Diese Klasse soll direkt mit der H2-Datenbank kommunizieren und die im RouteDAO.java Interface definiereten Funktionen bereitstellen, daher implementiert diese Klasse das Interface RouteDAO.java:

public class H2RouteDAO implements RouteDAO {
...
}

Zuerst werden wie für den Standardablauf üblich ein Logger für die Fehlerausgabe initialisiert, eine Variable zum Connectionpool der Datenbank und ein Konstruktur erstellt. Dieser Konstruktor erstellt ein Objekt der H2RouteDAO.java-Klasse. Als Parameter wird die Variable des Connectionpools mit übergeben.

 /**
   * Diese Konstruktur Funktion erstellt ein Objekt der Klasse H2RouteDAO.
   * @param cpds Der Connectionpool
   */    
 public H2RouteDAO(ComboPooledDataSource cpds) {
        this.cpds = cpds;
    }

Nachfolgend kommen die einzelnen Methoden der Datenbankabfrage für die Route.java-Datenklasse. Für die Abfrage der Top Routen wird die public Collection<Route> findTopRoutes()-Funktion des Interface hinzugefügt und programmiert. Zunächst beginnt die Erstellung eines SQL-Abfrage-Strings sowie die Erstellung einer Collection zur Datenrückgabe.
Der SQL-Abfrage-String für das Auslesen der Top Routen aus der H2 Datenbank:
String sql = "SELECT hash, data, top FROM route WHERE top=true";

Nun wird innerhalb eines try-catch-Blocks versucht aus dem Connectionpool eine Connection zu H2 Datenbank zu holen. Dabei wird, wie in den festgesetzten verwendete Frameworks beschrieben, das automatische Commiten zur Datenbank verboten. Mit einem weiteren try-catch-Block wird ein Prepared Statement zur Datenbankabfrage erstellt (Prepared Statements sind ebenfalls in den festgesetzten verwendeten Frameworks beschrieben). In dem Prepared Statement wird der SQL-String ausgeführt und die Ergebnisse in die vorher erstellte Collection geschrieben:

// Erstellt das Prepared Statement für die Datenbankabfrage
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
     // Daten aus der Datenbank holen
     ResultSet resultSet = preparedStatement.executeQuery();

     // Schreibt die Daten aus der Datenbank in die Collection
     while(resultSet.next()) {
           Route route = new Route();
           route.setHash(resultSet.getString("hash"));
           route.setData(resultSet.getString("data"));
           route.setTop(resultSet.getBoolean("top"));
           routes.add(route);
     }

Anschließend wird die Collection zurückgegeben. Falls dies nicht möglich ist, wird eine Fehlerausgabe in den Logger geschrieben. Bei einer fehlerhaften Durchführung wird eine leere Collection zurückgegeben.

Erstellen der REST-Schnittstelle

Als nächstes wird die TopRouteREST-Klasse im package *de.dhbw.hh.rest erstellt. Diese Klasse stellt die Methoden für die REST-Schnittstelle zum Frontend über den Pfad /toproutes bereit.
Zuerst wird ein Gson-Objekt erstellt, um mit diesem später Json umzuwandeln. Anschließend wird ein Konstruktor erstellt, der die REST Schnittstellen der Top Routen definiert. Dabei wird als Parameter die daoFactory mit übergeben:

public TopRouteREST (DAOFactory daoFactory){
...
}

In diesem Konstruktor wird die Spark-Funktion get für den Pfad /toproutes definiert. Hierbei wird über die DAOFactory die Funktion findTopRoutes() aufgerufen und dadurch die Top Routen aus der Datenbank abgefragt. In einem neuen ´RESTResponse´-Rückgabeobjekt wird sowohl der Pfad /toproutes als Name als auch der aktuelle Zeitpunkt der Rückgabe gesetzt. Anschließend folgt eine if-Abfrage, in der überprüft werden, ob Top routen gefunden werden konnten oder nicht und je nach dem wird das Rückgabeobjekt berfüllt:

if (toproutes.isEmpty() ){
	// Es wurden keine Top Routen gefunden
	r.setError();
	r.setDescription("Es konnten keine Top Routen aus der Datenbank abgerufen werden");
	r.setData(null);
} 
else {
	// Die Top Routen konnten gefunden werden
	r.setSuccess();
	r.setDescription("Rückgabe der top Routes als Array");
	r.setData(toproutes);
}	

Als Ergebnis wird das befüllte Objekt umgewandelt und als Gson zurückgegben: return gson.toJson(r);
Zum Schluss muss noch diese RESTSchnittstelle TopRouteREST.java als REST-Modul in die Spark-Klasse eingebunden werden, damit sie für den Server zur Verfügung steht und aufgerufen werden kann.

Clone this wiki locally