From a2f47e57b0777ba16e8f97bab3dd838253290acd Mon Sep 17 00:00:00 2001
From: Dennis Eisold <de@itstall.de>
Date: Wed, 27 Nov 2019 23:55:16 +0100
Subject: [PATCH 1/2] =?UTF-8?q?Erster=20Step=20der=20Codierung,=20=20umwan?=
 =?UTF-8?q?dlung=20in=20Morsecode=20und=20=C3=9Cbergabe=20an=20den=20Funkr?=
 =?UTF-8?q?aum?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/Enigma/App.java                 | 146 +++++++++++-------
 src/main/java/Enigma/model/Codebuch.java      | 118 +++++++++-----
 .../java/Enigma/model/DatenbankSqlite.java    |  15 +-
 src/main/java/Enigma/model/Hardware.java      | 118 +++++++++++---
 src/main/java/Enigma/model/Reflektor.java     |   4 +-
 src/main/java/Enigma/model/Walze.java         |  17 +-
 src/test/java/Enigma/model/CodebuchTest.java  |   4 +-
 src/test/java/Enigma/model/HardwareTest.java  |  22 +--
 8 files changed, 307 insertions(+), 137 deletions(-)

diff --git a/src/main/java/Enigma/App.java b/src/main/java/Enigma/App.java
index 397e3da..d166be1 100644
--- a/src/main/java/Enigma/App.java
+++ b/src/main/java/Enigma/App.java
@@ -1,74 +1,112 @@
 package Enigma;
 
-import Enigma.model.Codebuch;
-import Enigma.model.DatenbankSqlite;
-import Enigma.model.Hardware;
+import Enigma.model.*;
 import javafx.application.Application;
 import javafx.fxml.FXMLLoader;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
 import javafx.stage.Stage;
+import org.apache.http.HttpException;
 
 import java.io.IOException;
 import java.sql.SQLException;
-import java.util.Calendar;
-import java.util.TimeZone;
+import java.time.LocalDate;
+import java.time.ZoneId;
 
 /**
  * JavaFX App
  */
 public class App extends Application {
 
-    private static Scene scene;
-    private Codebuch cb;
-    private Hardware h;
-
-    @Override
-    public void start(Stage stage) throws IOException {
-        scene = new Scene(loadFXML("gui"));
-        stage.setScene(scene);
-        stage.show();
-        holeCodebuch();
-    }
-
-    static void setRoot(String fxml) throws IOException {
-        scene.setRoot(loadFXML(fxml));
-    }
-
-    private static Parent loadFXML(String fxml) throws IOException {
-        FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
-        return fxmlLoader.load();
-    }
-
-    public static void main(String[] args) {
-        Application.launch();
-    }
-
-    public void holeCodebuch() {
-        Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
-
-        try {
-            this.cb = new DatenbankSqlite().getCodebuch(Calendar.DATE);
-        } catch (SQLException ignored) { }
-
-        for(int i = 0; i < 3; i++) {
-            h.setWalzen(i + 1, Integer.parseInt(cb.getWalzenlage()[i]), cb.getRingstellung()[i].charAt(0));
-        }
-
-        /*Walze w1 = new Walze(3);
-		w1.setzeNotch(13);
-		Walze w2 = new Walze(5);
-		w2.setzeNotch(1);
-		Walze w3 = new Walze(1);
-		w3.setzeNotch(20);
-		Reflektor r = new Reflektor();
+	private static Scene scene;
+	private Codebuch cb;
+	private Hardware h;
+
+	static void setRoot(String fxml) throws IOException {
+		scene.setRoot(loadFXML(fxml));
+	}
+
+	private static Parent loadFXML(String fxml) throws IOException {
+		FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
+		return fxmlLoader.load();
+	}
+
+	public static void main(String[] args) {
+		Application.launch();
+	}
+
+	@Override
+	public void start(Stage stage) throws IOException {
+		scene = new Scene(loadFXML("gui"));
+		stage.setScene(scene);
+		stage.show();
+
+		initialisiereHardware();
+
+        /**
+         * TODO: Nur zum Testen muss später wieder gelöscht werden.
+         */
+        //region Test
+		h.setKenngruppe("deisold");
+		String nachricht = "Hello world.";
+
+		for (char buchstabe : nachricht.toCharArray()) {
+			System.out.print(buchstabe + ":");
+			System.out.print(h.codiere(buchstabe));
+			System.out.println(" W1:" + h.getWalzen()[0].getBuchstabe() + " W2:" + h.getWalzen()[1].getBuchstabe() + " W3:" + h.getWalzen()[2].getBuchstabe());
+		}
+		try {
+			System.out.println(h.getNachricht());
+			h.sendeNachricht();
+		} catch (HttpException e) {
+			e.printStackTrace();
+		}
+		//endregion
+	}
+
+	/**
+	 * Hier lesen wir den heutigen Eintrag aus dem Codebuch aus und erstellen ein Codebuch Objekt
+	 * Nach dem Codebuch werden dann die Ringe auf die Walzen gesteckt und die Walzen anschließend
+	 * in die Hardware gebaut.
+	 * <p>
+	 * Ein Reflektor wird definiert, jedoch keine Werte zugewisen, da wir nur einen besitzen und
+	 * deshalb alle Einstellungen hierfür Statisch im Reflektor definiert haben.
+	 * <p>
+	 * Das Steck wird ebenfalls definiert und die notwendigen Kabel eingesteckt laut dem heutigen
+	 * Codebuch Eintrag.
+	 */
+	private void initialisiereHardware() {
+
+		// Hole den heutigen Eintrag aus der SQLite Datenbank und erstelle daraus ein Codebuch Objekt
+		try {
+			this.cb = new DatenbankSqlite().getCodebuch(LocalDate.now(ZoneId.of("Europe/Berlin")).getDayOfMonth());
+		} catch (SQLException ignored) {
+		}
+
+		// TODO: Was zum Henker macht der hier????!?
+        System.out.println(this.cb.toString());
+
+		// Das Steckbrett initialisieren
 		Steckbrett sb = new Steckbrett();
+		char[][] verbinder = cb.getSteckverbindung();
+		// Für jedes Kabel eine Verbindung auf dem Steckbrett setzen
+		for (char[] kabel : verbinder) {
+			sb.setzeVertauschung(kabel[0], kabel[1]);
+		}
+
+		// Die Hardware aus dem Koffer holen (initialisieren)
+		this.h = new Hardware();
+
+		// Den Ring an der Walze anbringen und die Walze dann in die Hardware einsetzen
+		h.setWalzen(0, cb.getWalzenlage()[0], cb.getRingstellung()[0]);
+		h.setWalzen(1, cb.getWalzenlage()[1], cb.getRingstellung()[1]);
+		h.setWalzen(2, cb.getWalzenlage()[2], cb.getRingstellung()[2]);
+
+		// Der Hardware das gesetzte Steckbrett zuweisen
+		h.setSteckbrett(sb);
 
-		if(w1.dreheWalze()) {
-			if(w2.dreheWalze()) {
-				w3.dreheWalze();
-			}
-		}*/
-    }
+		// Ein Reflektor Objekt erstellen und der Hardware bekannt geben
+		h.setReflektor(new Reflektor());
+	}
 
 }
\ No newline at end of file
diff --git a/src/main/java/Enigma/model/Codebuch.java b/src/main/java/Enigma/model/Codebuch.java
index 0c6d01d..60f699e 100644
--- a/src/main/java/Enigma/model/Codebuch.java
+++ b/src/main/java/Enigma/model/Codebuch.java
@@ -9,23 +9,38 @@ package Enigma.model;
  * vorgenommen.
  * Bei der Enigma um welche es hier geht (Enigma I) gab es zusätzlich ein Steckbrett, welches ebenfalls im Codebuch
  * festgelegt war.
- *
+ * <p>
  * Dieses Codebuch Objekt enthält die Einstellungen eines Tages, welche mittels Getter und Setter
  * verarbeitet werden können.
- *
+ * <p>
  * Zusätzlich gibt es zu Debug Zwecken eine überschriebene toString Funktion welche das Objekt als String zurück
  * geben kann.
  */
 public class Codebuch {
 	private int tag;
-	private String[] Walzenlage;
-	private String[] Ringstellung;
-	private String[] Steckverbindung;
-
-	Codebuch() {
-		this.Walzenlage = new String[3];
-		this.Ringstellung = new String[3];
-		this.Steckverbindung = new String[10];
+	private int[] walzenlage;
+	private char[] ringstellung;
+	private char[][] steckverbindung;
+
+	/**
+	 * Im Konstruktor werden die Standart Werte gesetzt
+	 * <p>
+	 * walzenlage : int[3] :            Hier wird die Position der drei Walzen festgelegt.
+	 * ringstellung : char[3] :         Jede Walze hat einen Ring. Der Index steht für die Walze und der Value für
+	 * die Position des Ringes.
+	 * steckverbindung : char[10][] :   Zehn Kabel können in das Steckbrett gesteckt werden. In diesem Array werden
+	 * die Kabel mit ihren jeweiligen Buchsen hinterlegt.
+	 */
+	public Codebuch() {
+		this.walzenlage = new int[3];
+		this.ringstellung = new char[3];
+		this.steckverbindung = new char[10][];
+
+		for(int i = 0; i < 10; i++) {
+			this.steckverbindung[i] = new char[2];
+			this.steckverbindung[i][0] = 'A';
+			this.steckverbindung[i][1] = 'A';
+		}
 	}
 
 	/**
@@ -44,33 +59,33 @@ public class Codebuch {
 		sb.append("Tag: ").append(this.getTag()).append("\n");
 
 		sb.append("Walzenlage: ");
-		for(String wl : this.getWalzenlage()) {
+		for (int wl : this.getWalzenlage()) {
 			sb.append(wl).append(",");
 			wlLoop = true;
 		}
-		if(wlLoop) {
+		if (wlLoop) {
 			sb.setLength(sb.length() - 1);
 		}
 		sb.append("\n");
 
 		sb.append("Ringstellung: ");
-		for(String rs : this.getRingstellung()) {
+		for (char rs : this.getRingstellung()) {
 			sb.append(rs).append(",");
 			rsLoop = true;
 		}
-		if(rsLoop) {
+		if (rsLoop) {
 			sb.setLength(sb.length() - 1);
 		}
 		sb.append("\n");
 
 		sb.append("Steckverbindung: ");
-		for (String s : this.getSteckverbindung()) {
-			if (!s.isEmpty()) {
-				sb.append(s).append(",");
+		for (char[] s : this.getSteckverbindung()) {
+			if (Character.isLetter(s[0])) {
+				sb.append(s[0]).append(":").append(s[1]).append(",");
 				svLoop = true;
 			}
 		}
-		if(svLoop) {
+		if (svLoop) {
 			sb.setLength(sb.length() - 1);
 		}
 		sb.append("\n");
@@ -80,65 +95,84 @@ public class Codebuch {
 
 	/**
 	 * Gibt den Tag dieser Instanz zurück
+	 *
 	 * @return int : Tag
 	 */
 	public int getTag() {
 		return tag;
 	}
 
+	/**
+	 * Setzt den Tag dieser Instanz
+	 *
+	 * @param tag : int
+	 */
+	public void setTag(int tag) {
+		this.tag = tag;
+	}
+
 	/**
 	 * Gibt die Walzenlage dieser Instanz zurück
+	 *
 	 * @return String[] : Walzenlage
 	 */
-	public String[] getWalzenlage() {
-		return Walzenlage;
+	public int[] getWalzenlage() {
+		return walzenlage;
 	}
 
 	/**
 	 * Gibt die Ringstellung dieser Instanz zurück
+	 *
 	 * @return String[] : Ringstellung
 	 */
-	public String[] getRingstellung() {
-		return Ringstellung;
+	public char[] getRingstellung() {
+		return ringstellung;
 	}
 
 	/**
 	 * Gibt die Steckverbindung dieser Instanz zurück
+	 *
 	 * @return String[] : Steckverbindung
 	 */
-	public String[] getSteckverbindung() {
-		return Steckverbindung;
+	public char[][] getSteckverbindung() {
+		return this.steckverbindung;
 	}
 
 	/**
-	 * Setzt den Tag dieser Instanz
-	 * @param tag : int
+	 * Setzt die Steckverbindung dieser Instanz
+	 *
+	 * @param steckverbindung : String[] :  Die Steckverbindungen die gesteckt werden sollen.
+	 *                        Jeder Eintrag im Array ist ein String mit zwei Zeichen.
+	 *                        Diese werden in zwei char zerlegt und anschließend im globalen
+	 *                        Array gespeichert.
 	 */
-	public void setTag(int tag) {
-		this.tag = tag;
+	public void setSteckverbindung(String[] steckverbindung) {
+		int counter = 0;
+		char[] verbindung = new char[2];
+		for (String stecker : steckverbindung) {
+			verbindung[0] = stecker.charAt(0);
+			verbindung[1] = stecker.charAt(1);
+			this.steckverbindung[counter++] = verbindung;
+		}
 	}
 
 	/**
 	 * Setzt die Walzenlage dieser Instanz
-	 * @param walzenlage : String[]
+	 *
+	 * @param position   : int : Position der Walze
+	 * @param walzenlage : int : Welche Walze wurde eingesetzt
 	 */
-	public void setWalzenlage(String[] walzenlage) {
-		Walzenlage = walzenlage;
+	public void setWalzenlage(int position, int walzenlage) {
+		this.walzenlage[position] = walzenlage;
 	}
 
 	/**
 	 * Setzt die Ringstellung dieser Instanz
-	 * @param ringstellung : String[]
-	 */
-	public void setRingstellung(String[] ringstellung) {
-		Ringstellung = ringstellung;
-	}
-
-	/**
-	 * Setzt die Steckverbindung dieser Instanz
-	 * @param steckverbindung : String[]
+	 *
+	 * @param position     : int : Auf welche Walze wird der Ring aufgesetzt?
+	 * @param ringstellung : char : An dieser Position soll die nächste Walze weiter gedreht werden.
 	 */
-	public void setSteckverbindung(String[] steckverbindung) {
-		Steckverbindung = steckverbindung;
+	public void setRingstellung(int position, char ringstellung) {
+		this.ringstellung[position] = ringstellung;
 	}
 }
diff --git a/src/main/java/Enigma/model/DatenbankSqlite.java b/src/main/java/Enigma/model/DatenbankSqlite.java
index f9e0a9b..51f34c1 100644
--- a/src/main/java/Enigma/model/DatenbankSqlite.java
+++ b/src/main/java/Enigma/model/DatenbankSqlite.java
@@ -51,10 +51,21 @@ public class DatenbankSqlite {
 		pstm.setInt(1, tag);
 		ResultSet rs = pstm.executeQuery();
 
+		String[] walzenlage, ringstellung, steckverbindung;
+
 		while (rs.next()) {
 			cb.setTag(rs.getInt("Tag"));
-			cb.setWalzenlage(rs.getString("Walzenlage").split(","));
-			cb.setRingstellung(rs.getString("Ringstellung").split(","));
+
+			walzenlage = rs.getString("Walzenlage").split(",");
+			for(int i = 0; i < 3; i++) {
+				cb.setWalzenlage(i, Integer.parseInt(walzenlage[i]));
+			}
+
+			ringstellung = rs.getString("Ringstellung").split(",");
+			for(int i = 0; i < 3; i++) {
+				cb.setRingstellung(i, ringstellung[i].charAt(0));
+			}
+
 			cb.setSteckverbindung(rs.getString("Steckverbindung").split(","));
 		}
 
diff --git a/src/main/java/Enigma/model/Hardware.java b/src/main/java/Enigma/model/Hardware.java
index 694912c..efb0517 100644
--- a/src/main/java/Enigma/model/Hardware.java
+++ b/src/main/java/Enigma/model/Hardware.java
@@ -4,6 +4,19 @@ import org.apache.http.HttpException;
 
 import java.io.IOException;
 
+/**
+ * In dieser Klasse wird die Hardware zusammen gefasst.
+ * Alle Komponenter der Enigma laufen hier zusammen.
+ *
+ * <p>
+ * walzen : Walze[] :           Ist ein Array der drei eingebauten Walzen Objekte
+ * steckbrett : Steckbrett :    Das Steckbrett mit den Verbindungen aus dem Codebuch
+ * reflektor : Reflektor :      Dies ist das Objekt der Reflektors
+ * nachricht : String :         Die verschlüsselte Nachricht wird in diesem String zusammen gesetzt und gespeichert
+ * kenngruppe : String :        Früher definierte die Kennzeichnung die Einheit welche diese Enigma benutzte.
+ * Wir missbrauchen die Kenngruppe für einen Benutzernamen
+ * </p>
+ */
 public class Hardware {
 
 	private Walze[] walzen;
@@ -12,8 +25,12 @@ public class Hardware {
 	private String nachricht;
 	private String kenngruppe;
 
-	Hardware() {
-		this.walzen = new Walze[4];
+	/**
+	 * Im Konstruktor legen wir die Anzahl der Walzen fest welche die Hardware aufnehmen kann.
+	 * Die Enigma I welche hier nachgebildet werden soll, konnte drei Walzen aufnehmen.
+	 */
+	public Hardware() {
+		this.walzen = new Walze[3];
 	}
 
 	/**
@@ -37,13 +54,18 @@ public class Hardware {
 	/**
 	 * Setzt den Startwert (position) der Walze (walze)
 	 *
-	 * @param walze : int : Nummer der Walze
+	 * @param walze     : int : Nummer der Walze
 	 * @param buchstabe : char : Buchstabe der zugewiesen soll
 	 */
 	public void setzePosition(int walze, char buchstabe) {
 	}
 
-	// Befehl die Nachricht an den Funker zu übergeben
+	/**
+	 * Befehl die Nachricht an den Funker zu übergeben
+	 *
+	 * @throws IOException   : Die Antwort konnte nicht gelesen werden
+	 * @throws HttpException : Die Nachricht konnte nicht abgesendet werden
+	 */
 	public void sendeNachricht() throws IOException, HttpException {
 		new Funkraum().sendeFunkspruch(new Morsecode().convertBuchstabeToMorsecode(this.nachricht), this.kenngruppe);
 	}
@@ -60,67 +82,125 @@ public class Hardware {
 	}
 
 	/**
-	 * Fügt die gedrückte Taste der Nachricht hinzu
+	 * Verschlüsselt den übergebenen Buchstaben und fügt ihn der Nachricht hinzu
 	 *
-	 * @param buchstabe char : Der zu verschlüsselnde Buchstabe
-	 * @return char : Der verschlüsselte Buchstabe
+	 * @param buchstabe char : Der zu ver/entschlüsselnde Buchstabe
+	 * @return char : Der ver/entschlüsselte Buchstabe
 	 */
-	public char tippeBuchstabe(char buchstabe) {
-		buchstabe = this.steckbrett.codiere(buchstabe);
+	public char codiere(char buchstabe) {
+		buchstabe = this.steckbrett.codiere(Character.toUpperCase(buchstabe));
+		buchstabe = this.walzen[0].codiere(buchstabe);
 		buchstabe = this.walzen[1].codiere(buchstabe);
 		buchstabe = this.walzen[2].codiere(buchstabe);
-		buchstabe = this.walzen[3].codiere(buchstabe);
 		buchstabe = this.reflektor.codiere(buchstabe);
-		buchstabe = this.walzen[3].codiere2(buchstabe);
 		buchstabe = this.walzen[2].codiere2(buchstabe);
 		buchstabe = this.walzen[1].codiere2(buchstabe);
+		buchstabe = this.walzen[0].codiere2(buchstabe);
 		buchstabe = this.steckbrett.codiere(buchstabe);
 
+		this.dreheWalzen();
+
 		this.nachricht += buchstabe;
 
 		return buchstabe;
 	}
 
 	/**
-	 * Nachricht entschlüsseln
-	 *
-	 * @param nachricht : String : Verschlüsselte Nachricht
-	 * @return String : Die Klartext Nachricht
+	 * Nach jeder codierung eines Buchstabens müssen die Walzen gedreht werden.
+	 * Hier überprüfen wir welche der Walzen gedreht werden müssen und stoßen die Vorgang an.
 	 */
-	private String decodiereNachricht(String nachricht) {
-
-		return "";
+	private void dreheWalzen() {
+		if (this.walzen[0].dreheWalze()) {
+			if (this.walzen[1].dreheWalze()) {
+				this.walzen[2].dreheWalze();
+			}
+		}
 	}
 
+	/**
+	 * Gibt die verbauten Walzen Objekte zurück
+	 *
+	 * @return Walze[] : Array mit den Walzen Objekten
+	 */
 	public Walze[] getWalzen() {
 		return this.walzen;
 	}
 
-	public void setWalzen(int walze, int position, int ringstellung) {
+	/**
+	 * Setzt eine Walze ein und speichert das Objekt im Walzen Array
+	 *
+	 * @param position     : int : Position der Walze
+	 * @param walze        : int : Die Nummer der Walze
+	 * @param ringstellung : int : Umsprung Punkt der Walze
+	 */
+	public void setWalzen(int position, int walze, int ringstellung) {
 		this.walzen[position] = new Walze(walze, ringstellung);
 	}
 
+	/**
+	 * Gibt das Objekt des Steckbretts zurück
+	 *
+	 * @return Steckbrett : Das eingesetzte Steckbrett mit seinen Kabeln wenn eingesteckt
+	 */
 	public Steckbrett getSteckbrett() {
 		return steckbrett;
 	}
 
+	/**
+	 * Setzt das übergebene Steckbrett Objekt in die Hardware ein
+	 *
+	 * @param steckbrett : Steckbrett : Objekt des Steckbretts mit allen verbundenen Kabeln
+	 */
 	public void setSteckbrett(Steckbrett steckbrett) {
 		this.steckbrett = steckbrett;
 	}
 
+	/**
+	 * Liest den Reflektor aus und gibt ihn zurück
+	 *
+	 * @return Reflektor : Objekt des Reflektors
+	 */
 	public Reflektor getReflektor() {
 		return reflektor;
 	}
 
+	/**
+	 * Setzt den Reflektor ein.
+	 * In der Enigma I welche hier nachgebaut wird, gab es nur einen Reflektor.
+	 * Spätere Versionen haten zwei oder mehr, deshalb haben wir hier auch schon ein Objekt dafür erstellt,
+	 * welches ausgetauscht werden kann.
+	 *
+	 * @param reflektor : Reflektor : Das Obejtk des Reflektors
+	 */
 	public void setReflektor(Reflektor reflektor) {
 		this.reflektor = reflektor;
 	}
 
+	/**
+	 * Liest die Kenngruppe aus welche die Maschine gerade besitzt. Früher war dies eine eindeutige Nummer
+	 * die einer Einheit zugewiesen war. Wir hinterlegen hier einen Benutzernamen.
+	 *
+	 * @return String : Kenngruppe
+	 */
 	public String getKenngruppe() {
 		return kenngruppe;
 	}
 
+	/**
+	 * Setzt die Kenngruppe welche die Enigma gerade benutzt.
+	 *
+	 * @param kenngruppe : String : Kenngruppe welche die Enigma gerade benutzt
+	 */
 	public void setKenngruppe(String kenngruppe) {
 		this.kenngruppe = kenngruppe;
 	}
+
+	/**
+	 * Gibt die bisher erstellte Nachricht zurück
+	 *
+	 * @return String : Erstellte Nachricht
+	 */
+	public String getNachricht() {
+		return nachricht;
+	}
 }
diff --git a/src/main/java/Enigma/model/Reflektor.java b/src/main/java/Enigma/model/Reflektor.java
index 1457cf3..a3069b8 100644
--- a/src/main/java/Enigma/model/Reflektor.java
+++ b/src/main/java/Enigma/model/Reflektor.java
@@ -10,7 +10,7 @@ package Enigma.model;
  * nach Betätigung einer Taste nicht dreht (starr montiert) und sie gibt keine Signale
  * an andere Walzen zum drehen.
  */
-class Reflektor {
+public class Reflektor {
 
     /**
      * Konstanten und Variablen der Klasse Reflektor
@@ -34,7 +34,7 @@ class Reflektor {
      *
      * @return reflektorBuchstabeRaus: Character: Der kodierte Buchstabe aus dem Reflektor
      */
-    char codiere(Character buchstabe) {
+    public char codiere(Character buchstabe) {
         int iPositionReflektor = 0;
 
         /*Ermittelt die Position des Buchstaben buchstabe auf der Alphabetswalze*/
diff --git a/src/main/java/Enigma/model/Walze.java b/src/main/java/Enigma/model/Walze.java
index 4f7317f..376934b 100644
--- a/src/main/java/Enigma/model/Walze.java
+++ b/src/main/java/Enigma/model/Walze.java
@@ -125,13 +125,13 @@ public class Walze {
 
 		boolean checkRing;
 
-		if (iPositionBuchstabe == 25) {
-			iPositionBuchstabe = 0;
+		if (this.iPositionBuchstabe == 25) {
+			this.iPositionBuchstabe = 0;
 		} else {
-			iPositionBuchstabe += 1;
+			this.iPositionBuchstabe += 1;
 		}
 
-		checkRing = iPositionBuchstabe == getRingstellung();
+		checkRing = this.iPositionBuchstabe == getRingstellung();
 
 		return checkRing;
 	}
@@ -147,12 +147,21 @@ public class Walze {
 	 * @return chiffrierterBuchstabe : Character : chiffrierter Buchstabe
 	 */
 	public char codiere(char buchstabe) {
+		/**
+		 * TODO: contains fragt ab ob der char im Alphabet enthalten ist. Das sollten wir vielleicht noch in eine
+		 * Hilfsfunktion packen. Vielleicht sogar in der Hardware Klasse.
+		 */
+		boolean contains = false;
 		for (int i = 0; i < walzeAlpha.length; i++) {
 			if (walzeAlpha[i].equals(buchstabe)) {
 				buchstabe = walzenNummer()[i];
+				contains = true;
 				break;
 			}
 		}
+		if(!contains) {
+			buchstabe = 'X';
+		}
 
 		return buchstabe;
 	}
diff --git a/src/test/java/Enigma/model/CodebuchTest.java b/src/test/java/Enigma/model/CodebuchTest.java
index 91e2653..aa64dea 100644
--- a/src/test/java/Enigma/model/CodebuchTest.java
+++ b/src/test/java/Enigma/model/CodebuchTest.java
@@ -14,11 +14,9 @@ public class CodebuchTest {
 				"Steckverbindung: CO,DI,FR,HU,JW,LS,TX\n";
 
 		try {
-			// Codebuch abrufen
-			Codebuch cb = new DatenbankSqlite().getCodebuch(1);
 			// Ausgabe auf der Konsole
 			String result = new DatenbankSqlite().getCodebuch(1).toString();
-			Assert.assertEquals(expected, result);
+			Assert.assertEquals(result, expected, result);
 		} catch (SQLException e) {
 			e.printStackTrace();
 		}
diff --git a/src/test/java/Enigma/model/HardwareTest.java b/src/test/java/Enigma/model/HardwareTest.java
index 1d7196f..78bd241 100644
--- a/src/test/java/Enigma/model/HardwareTest.java
+++ b/src/test/java/Enigma/model/HardwareTest.java
@@ -10,9 +10,9 @@ public class HardwareTest {
 		Hardware h = new Hardware();
 		h.setReflektor(new Reflektor());
 		h.setSteckbrett(new Steckbrett());
-		h.setWalzen(1, 1, 1);
-		h.setWalzen(2, 2, 1);
-		h.setWalzen(3, 3, 1);
+		h.setWalzen(0, 1, 1);
+		h.setWalzen(1, 2, 1);
+		h.setWalzen(2, 3, 1);
 
 		/*
 	        A = E = S = G = Y = O = Y = O
@@ -33,18 +33,18 @@ public class HardwareTest {
         Reflektor   {'E', 'J', 'M', 'Z', 'A', 'L', 'Y', 'X', 'V', 'B', 'W', 'F', 'C', 'R', 'Q', 'U', 'O', 'N', 'T', 'S', 'P', 'I', 'K', 'H', 'G', 'D'};
 		*/
 
-		char result = h.tippeBuchstabe('A');
+		char result = h.codiere('A');
 		Assert.assertEquals("Codiere: Erwartet O, erhalten "+ result, 'O', result);
-		result = h.tippeBuchstabe('I');
+		result = h.codiere('I');
 		Assert.assertEquals("Codiere: Erwartet S, erhalten "+ result, 'S', result);
-		result = h.tippeBuchstabe('F');
+		result = h.codiere('F');
 		Assert.assertEquals("Codiere: Erwartet P, erhalten "+ result, 'P', result);
 
-		result = h.tippeBuchstabe('O');
+		result = h.codiere('O');
 		Assert.assertEquals("Decodiere: Erwartet A, erhalten "+ result, 'A', result);
-		result = h.tippeBuchstabe('S');
+		result = h.codiere('S');
 		Assert.assertEquals("Decodiere: Erwartet I, erhalten "+ result, 'I', result);
-		result = h.tippeBuchstabe('P');
+		result = h.codiere('P');
 		Assert.assertEquals("Decodiere: Erwartet F, erhalten "+ result, 'F', result);
 
 		h.getSteckbrett().setzeVertauschung('B', 'G');
@@ -53,10 +53,10 @@ public class HardwareTest {
 		h.getSteckbrett().setzeVertauschung('M', 'Q');
 		h.getSteckbrett().setzeVertauschung('T', 'X');
 
-		result = h.tippeBuchstabe('I');
+		result = h.codiere('I');
 		Assert.assertEquals("Codiere: Erwartet F, erhalten "+ result, 'F', result);
 
-		result = h.tippeBuchstabe('F');
+		result = h.codiere('F');
 		Assert.assertEquals("Codiere: Erwartet I, erhalten "+ result, 'I', result);
 	}
 }
\ No newline at end of file
-- 
GitLab


From 3dd63db1bf112a6b9551a88dfd45ed6bc7e81e4c Mon Sep 17 00:00:00 2001
From: Dennis Eisold <de@itstall.de>
Date: Thu, 28 Nov 2019 10:17:19 +0100
Subject: [PATCH 2/2] Fehlerbehebungen und Fehlende Funktionen

- Ringstellungen und Steckverbindungen werden jetzt richtig gesetzt.
- Fehlende Funktionen ausgeschrieben.
- Nachrichten empfangen und decodieren.
---
 src/main/java/Enigma/model/Codebuch.java      | 29 ++++++++--------
 .../java/Enigma/model/DatenbankSqlite.java    |  8 ++---
 src/main/java/Enigma/model/Hardware.java      | 33 +++++++++++++++----
 3 files changed, 45 insertions(+), 25 deletions(-)

diff --git a/src/main/java/Enigma/model/Codebuch.java b/src/main/java/Enigma/model/Codebuch.java
index 60f699e..ee7b96e 100644
--- a/src/main/java/Enigma/model/Codebuch.java
+++ b/src/main/java/Enigma/model/Codebuch.java
@@ -19,7 +19,7 @@ package Enigma.model;
 public class Codebuch {
 	private int tag;
 	private int[] walzenlage;
-	private char[] ringstellung;
+	private int[] ringstellung;
 	private char[][] steckverbindung;
 
 	/**
@@ -33,10 +33,10 @@ public class Codebuch {
 	 */
 	public Codebuch() {
 		this.walzenlage = new int[3];
-		this.ringstellung = new char[3];
+		this.ringstellung = new int[3];
 		this.steckverbindung = new char[10][];
 
-		for(int i = 0; i < 10; i++) {
+		for (int i = 0; i < 10; i++) {
 			this.steckverbindung[i] = new char[2];
 			this.steckverbindung[i][0] = 'A';
 			this.steckverbindung[i][1] = 'A';
@@ -69,7 +69,7 @@ public class Codebuch {
 		sb.append("\n");
 
 		sb.append("Ringstellung: ");
-		for (char rs : this.getRingstellung()) {
+		for (int rs : this.getRingstellung()) {
 			sb.append(rs).append(",");
 			rsLoop = true;
 		}
@@ -79,11 +79,9 @@ public class Codebuch {
 		sb.append("\n");
 
 		sb.append("Steckverbindung: ");
-		for (char[] s : this.getSteckverbindung()) {
-			if (Character.isLetter(s[0])) {
-				sb.append(s[0]).append(":").append(s[1]).append(",");
-				svLoop = true;
-			}
+		for (char[] verbindung : this.getSteckverbindung()) {
+			sb.append(verbindung[0]).append(":").append(verbindung[1]).append(",");
+			svLoop = true;
 		}
 		if (svLoop) {
 			sb.setLength(sb.length() - 1);
@@ -125,7 +123,7 @@ public class Codebuch {
 	 *
 	 * @return String[] : Ringstellung
 	 */
-	public char[] getRingstellung() {
+	public int[] getRingstellung() {
 		return ringstellung;
 	}
 
@@ -141,15 +139,16 @@ public class Codebuch {
 	/**
 	 * Setzt die Steckverbindung dieser Instanz
 	 *
-	 * @param steckverbindung : String[] :  Die Steckverbindungen die gesteckt werden sollen.
+	 * @param kabel : String[] :  Die Steckverbindungen die gesteckt werden sollen.
 	 *                        Jeder Eintrag im Array ist ein String mit zwei Zeichen.
 	 *                        Diese werden in zwei char zerlegt und anschließend im globalen
 	 *                        Array gespeichert.
 	 */
-	public void setSteckverbindung(String[] steckverbindung) {
+	public void setSteckverbindung(String[] kabel) {
 		int counter = 0;
-		char[] verbindung = new char[2];
-		for (String stecker : steckverbindung) {
+
+		for (String stecker : kabel) {
+			char[] verbindung = new char[2];
 			verbindung[0] = stecker.charAt(0);
 			verbindung[1] = stecker.charAt(1);
 			this.steckverbindung[counter++] = verbindung;
@@ -172,7 +171,7 @@ public class Codebuch {
 	 * @param position     : int : Auf welche Walze wird der Ring aufgesetzt?
 	 * @param ringstellung : char : An dieser Position soll die nächste Walze weiter gedreht werden.
 	 */
-	public void setRingstellung(int position, char ringstellung) {
+	public void setRingstellung(int position, int ringstellung) {
 		this.ringstellung[position] = ringstellung;
 	}
 }
diff --git a/src/main/java/Enigma/model/DatenbankSqlite.java b/src/main/java/Enigma/model/DatenbankSqlite.java
index 51f34c1..fd7270d 100644
--- a/src/main/java/Enigma/model/DatenbankSqlite.java
+++ b/src/main/java/Enigma/model/DatenbankSqlite.java
@@ -57,13 +57,13 @@ public class DatenbankSqlite {
 			cb.setTag(rs.getInt("Tag"));
 
 			walzenlage = rs.getString("Walzenlage").split(",");
-			for(int i = 0; i < 3; i++) {
+			for (int i = 0; i < 3; i++) {
 				cb.setWalzenlage(i, Integer.parseInt(walzenlage[i]));
 			}
 
 			ringstellung = rs.getString("Ringstellung").split(",");
-			for(int i = 0; i < 3; i++) {
-				cb.setRingstellung(i, ringstellung[i].charAt(0));
+			for (int i = 0; i < 3; i++) {
+				cb.setRingstellung(i, Integer.parseInt(ringstellung[i]));
 			}
 
 			cb.setSteckverbindung(rs.getString("Steckverbindung").split(","));
@@ -136,7 +136,7 @@ public class DatenbankSqlite {
 
 	/**
 	 * Generiert einen String aus 10 * 2 unterschiedlichen Großbuchstaben
-	 * @return  String => 10 Buchstabenkombinationen mit Komma getrennt
+	 * @return String => 10 Buchstabenkombinationen mit Komma getrennt
 	 */
 	/*
 	private static String steckverbindung(){
diff --git a/src/main/java/Enigma/model/Hardware.java b/src/main/java/Enigma/model/Hardware.java
index efb0517..e9eebc5 100644
--- a/src/main/java/Enigma/model/Hardware.java
+++ b/src/main/java/Enigma/model/Hardware.java
@@ -31,6 +31,7 @@ public class Hardware {
 	 */
 	public Hardware() {
 		this.walzen = new Walze[3];
+		this.nachricht = "";
 	}
 
 	/**
@@ -39,7 +40,8 @@ public class Hardware {
 	 * @param walze    : int : Setzt die Walze mit der angegebenen Nummer ein
 	 * @param walzenNr : int : Die Nummer der einzusetzenden Walze
 	 */
-	public void setzeWalzenNr(int walze, int walzenNr) {
+	public void setzeWalzenNr(int walze, int walzenNr, int ringstellung) {
+		this.walzen[walze] = new Walze(walzenNr, ringstellung);
 	}
 
 	/**
@@ -49,6 +51,7 @@ public class Hardware {
 	 * @param position : int : Umspringpunkt auf der Walze
 	 */
 	public void setzeRing(int walze, int position) {
+		this.walzen[walze].setRingstellung(position);
 	}
 
 	/**
@@ -58,6 +61,7 @@ public class Hardware {
 	 * @param buchstabe : char : Buchstabe der zugewiesen soll
 	 */
 	public void setzePosition(int walze, char buchstabe) {
+		this.walzen[walze].setBuchstabe(buchstabe);
 	}
 
 	/**
@@ -73,12 +77,29 @@ public class Hardware {
 	/**
 	 * Gibt die letzte empfangene Nachricht zurück
 	 * <p>
-	 * String[0] = Die verschlüsselte Nachricht
-	 * String[1] = Nachricht im Klartext
+	 *     String[0} Tag wann die Nachricht gesendet wurde
+	 *     String[1] = Die verschlüsselte Nachricht
+	 *     String[2] = Nachricht im Klartext
 	 */
 	public String[] empfangeNachricht() {
+		String[] codierteNachricht = new String[3];
+		Morsecode mc = new Morsecode();
 
-		return new String[2];
+		try {
+			codierteNachricht = new Funkraum().empfangeFunkspruch(this.kenngruppe);
+			String morsecode = mc.convertMorsecodeToBuchstabe(codierteNachricht[1]);
+			String decodiert = "";
+
+			for (char buchstabe : morsecode.toCharArray()) {
+				decodiert += this.codiere(buchstabe);
+			}
+
+			codierteNachricht[2] = decodiert;
+
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return codierteNachricht;
 	}
 
 	/**
@@ -88,6 +109,8 @@ public class Hardware {
 	 * @return char : Der ver/entschlüsselte Buchstabe
 	 */
 	public char codiere(char buchstabe) {
+		this.dreheWalzen();
+
 		buchstabe = this.steckbrett.codiere(Character.toUpperCase(buchstabe));
 		buchstabe = this.walzen[0].codiere(buchstabe);
 		buchstabe = this.walzen[1].codiere(buchstabe);
@@ -98,8 +121,6 @@ public class Hardware {
 		buchstabe = this.walzen[0].codiere2(buchstabe);
 		buchstabe = this.steckbrett.codiere(buchstabe);
 
-		this.dreheWalzen();
-
 		this.nachricht += buchstabe;
 
 		return buchstabe;
-- 
GitLab