From 18cf7a027b9c5955acf66164f14d3cd21dbfc471 Mon Sep 17 00:00:00 2001
From: Dennis Eisold <de@itstall.de>
Date: Mon, 25 Nov 2019 16:25:24 +0100
Subject: [PATCH 1/4] =?UTF-8?q?Unn=C3=B6tige=20Verzeichnisse=20ignorieren?=
 =?UTF-8?q?=20lassen=20SQLite=20Datenbank=20angelegt?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitignore                                |   2 ++
 src/main/resources/Enigma/codebuch.sqlite | Bin 0 -> 24576 bytes
 2 files changed, 2 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 src/main/resources/Enigma/codebuch.sqlite

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bba7b53
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+/target/
+/.idea/
diff --git a/src/main/resources/Enigma/codebuch.sqlite b/src/main/resources/Enigma/codebuch.sqlite
new file mode 100644
index 0000000000000000000000000000000000000000..7d4a703b04d15e43146dddaca53c1b8e3ea83877
GIT binary patch
literal 24576
zcmeI&&u-H&90zc_VXKm<EnHSj2;pO+S)jHWy&%EZ!YHZ=>mPL-P?V;oi<+cenjp3t
z><xIDy#+79bqDSoaI#KayE4R$m9Ldw68mRI@h7=ha&y1tgo1q-2A&nNGPz4ACC?cn
zgsjO}m2pQ#N`^YQmzSi_%bOdnYvfVE$;b{$cAaFuXTN6GGiRBz8%7`n0SG_<0uX=z
z1Rwwb2>gEnS%p5#S1R<h6IxwYBq!4z_Cz<b56xcR48769#+99hvE4FQYx_mbU<<ow
z1x<B&%<)4_Rqdfa4g*V8<~xrDGOdmR$FqWCHW0^LQ(IO)9>@HljL3CmQ^#^ogzs8?
z!R$jTxSDD>et#Sa*Ny!Cwd7t9`Muv}o1w4=A4Sl0{NA<EnobCP`o2Pm%!*IrBUdis
zOe+e9N!?sHYqPkpIbP!Zc&5|O`DAR;=R`^8<ED*i)6`xPn9+j7C49SH-ESMLTHiGe
z=1HexHFfCEWm!R{^|z_j{N^Tom%PYiW@B*_3EviTRb}Q=&m{}K<q0lF>R&c!I<M>W
z)JvW@t1w$j%{*~7H~DL-^_H<`H2&_-VHe-V4umKC@E`h*;<Y)=eIxQffdB*`009U<
z00Izz00bZa0SG|gb_hJCX`<#I+}|qlGA|XM@M4h{%Q8y5RN8sNcdPtmgTHF?*BxGK
z^47t{`v08d&Tq#A@s<#P00bZa0SG_<0uX=z1Rwwb2>e0d9#wR8c2mP-M7)<j-Ut%M
zii~)_KMDjO009U<00Izz00bZa0SG_<0!t#G$$8M+Pa+Q#2tWV=5P$##AOHafKmY;|
rfB*!RP(V>s73=>c{IHl31Rwwb2tWV=5P$##AOHafK;Vjiq7d~Lak5Y6

literal 0
HcmV?d00001

-- 
GitLab


From 542f774ceaf4ba26fa8f8fd7c11abebd6350adc7 Mon Sep 17 00:00:00 2001
From: Dennis Eisold <de@itstall.de>
Date: Mon, 25 Nov 2019 18:34:20 +0100
Subject: [PATCH 2/4] Morsecode Klasse fertig gestellt

---
 src/main/java/Enigma/model/Morsecode.java | 166 +++++++++++++++++-----
 1 file changed, 128 insertions(+), 38 deletions(-)

diff --git a/src/main/java/Enigma/model/Morsecode.java b/src/main/java/Enigma/model/Morsecode.java
index abb6a77..f8c759c 100644
--- a/src/main/java/Enigma/model/Morsecode.java
+++ b/src/main/java/Enigma/model/Morsecode.java
@@ -1,51 +1,141 @@
 package Enigma.model;
 
-import java.util.TreeMap;
+import java.util.*;
+import java.util.Map.Entry;
 
+/**
+ * Diese Klasse definiert die Zugehörigkeit zwischen den Buchstaben A-Z und dem zugehörigen Morsecode.
+ * Die Funktionen sollen Texte von und zu Morsecode konvertieren.
+ */
 public class Morsecode {
-	TreeMap<String, String> codeMap = new TreeMap<>();
+	// Anlegen der codeMap als TreeMap
+	private TreeMap<String, String> codeMap = new TreeMap<>();
 
 	/**
-	 * Im Konstruktor werden alle Notwendigen Zeichen und deren zugehöriger Codes, der Treemap hinzugefügt.
+	 * Im Konstruktor werden alle verfügbaren Buchstaben (A-Z) und deren zugehörigen
+	 * Morsecodes, der codeMap hinzugefügt.
 	 */
 	public Morsecode() {
-		codeMap.put("A", "10110");
-		codeMap.put("B", "110101010");
-		codeMap.put("C", "1101011010");
-		codeMap.put("D", "1101010");
-		codeMap.put("E", "10");
-		codeMap.put("F", "101011010");
-		codeMap.put("G", "11011010");
-		codeMap.put("H", "10101010");
-		codeMap.put("I", "1010");
-		codeMap.put("J", "10110110110");
-		codeMap.put("K", "11010110");
-		codeMap.put("L", "101101010");
-		codeMap.put("M", "110110");
-		codeMap.put("N", "11010");
-		codeMap.put("O", "110110110");
-		codeMap.put("P", "1011011010");
-		codeMap.put("Q", "11011010110");
-		codeMap.put("R", "1011010");
-		codeMap.put("S", "101010");
-		codeMap.put("T", "110");
-		codeMap.put("U", "1010110");
-		codeMap.put("V", "101010110");
-		codeMap.put("W", "10110110");
-		codeMap.put("X", "1101010110");
-		codeMap.put("Y", "11010110110");
-		codeMap.put("Z", "1101101010");
-		// KA - Spruchanfang
-		codeMap.put("KA", "1101011010110");
-		// AR - Spruchende
-		codeMap.put("AR", "101101011010");
-		// VE - Verstanden
-		codeMap.put("VE", "10101011010");
-		// SK - Verkehrsende
-		codeMap.put("SK", "10101011010110");
+		this.codeMap.put("A", ".-");
+		this.codeMap.put("B", "-...");
+		this.codeMap.put("C", "-.-.");
+		this.codeMap.put("D", "-..");
+		this.codeMap.put("E", ".");
+		this.codeMap.put("F", "..-.");
+		this.codeMap.put("G", "--.");
+		this.codeMap.put("H", "....");
+		this.codeMap.put("I", "..");
+		this.codeMap.put("J", ".---");
+		this.codeMap.put("K", "-.-");
+		this.codeMap.put("L", ".-..");
+		this.codeMap.put("M", "--");
+		this.codeMap.put("N", "-.");
+		this.codeMap.put("O", "---");
+		this.codeMap.put("P", ".--.");
+		this.codeMap.put("Q", "--.-");
+		this.codeMap.put("R", ".-.");
+		this.codeMap.put("S", "...");
+		this.codeMap.put("T", "-");
+		this.codeMap.put("U", "..-");
+		this.codeMap.put("V", "...-");
+		this.codeMap.put("W", ".--");
+		this.codeMap.put("X", "-..-");
+		this.codeMap.put("Y", "-.--");
+		this.codeMap.put("Z", "--..");
 	}
 
-	public void getCode(char sign) {
+	/**
+	 * Diese Funktion überprüft ob das übergebene Buchstabe in der codeMap enthalten ist.
+	 * Wenn es enthalten ist, wird der zugehörige Morsecode zurück gegeben, ansonsten null
+	 *
+	 * @param buchstabe : char : Zu übersetzender Buchstabe
+	 * @return : String : Das zugehöriger Morsecode aus der codeMap
+	 */
+	private String getMorsecode(char buchstabe) {
+		// Testen ob das Char in der codeMap enthalten ist. Wenn ja, raussuchen und zurück geben
+		return this.codeMap.getOrDefault(String.valueOf(buchstabe).toUpperCase(), null);
+	}
+
+	/**
+	 * Der übergebene String wird in seine einzelnen Zeichen (char) zerlegt und an die Funktion getMorsecode
+	 * übergeben und der zugehörige Morsecode raus gesucht.
+	 * Mittels eines StringBuilders werden die Ergebnisse zu einem Rückgabe String zusammen gesetzt.
+	 * Wenn kein zugehöriger Code in der codeMap gefunden wurde, wird das Zeichen ignoriert da es bei der
+	 * Enigma nicht vorhanden war.
+	 *
+	 * @param input : String : Zu konventierender Text
+	 * @return String : Die in Morsecode konvertierte Text
+	 */
+	public String convertBuchstabeToMorsecode(String input) {
+		StringBuilder sb = new StringBuilder();
+		String morsecode;
+
+		// Durch alle char im übergebenen String loopen
+		for(int i = 0; i < input.length(); i++) {
+
+			// Wenn der char in der codeMap enthalten ist, an den Rückgabe String anheften, ansonsten nichts ignorieren.
+			morsecode = this.getMorsecode(input.charAt(i));
+			if(morsecode != null) {
+				sb.append(morsecode).append(' ');
+			}
+		}
+
+		// Gibt den konvertierten String zurück
+		return sb.toString();
+	}
+
+	/**
+	 * Diese Funktion überprüft ob der übergebene Morsecode in der codeMap enthalten ist.
+	 * Wenn er enthalten ist, wird der zugehörige Buchstabe zurück gegeben, ansonsten null
+	 *
+	 * @param morsecode : String : Der zu übersetzende Morsecode
+	 * @return : String : Das zugehöriger Buchstaben aus der this.codeMap
+	 */
+	private String getBuchstabe(String morsecode) {
+		// Initialisieren des Rückgabe Strings
+		// TODO: Darf bei der Initialisierung gleich einen Wert setzten lauf JAVA Konventionen?
+		String result = null;
+
+		// Loopt duch die Codemap und erstellt daraus ein Set
+		for(Entry<String, String> entry : this.codeMap.entrySet()) {
+			// Wenn Value dem Morsecode entspricht, haben wir unseren Buchstaben gefunden und setzen ihn als Result
+			if(entry.getValue().equals(morsecode)) {
+				result = entry.getKey();
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	 * Der übergebene String wird in einen String Array zerlegt. Als Trennzeichen wird das Leerzeichen genutzt.
+	 * Anschließend wird der Array durchlaufen und die Elemente an die Funktion getBuchstabe übergeben um den
+	 * zugehörigen Buchstaben zu erhalten.
+	 * Mittels eines StringBuilders werden die Ergebnisse zu einem Rückgabe String zusammen gesetzt.
+	 * Wenn kein zugehöriger Buchstabe in der codeMap gefunden wurde, wird das Zeichen ignoriert da es bei der
+	 * Enigma nicht vorhanden war.
+	 *
+	 * @param input : String : Zu konventierender Morsecode
+	 * @return String : Der in Text konvertierte Morsecode
+	 */
+	public String convertMorsecodeToBuchstabe(String input) {
+		StringBuilder sb = new StringBuilder();
+		String buchstabe;
+
+		String[] morsecodes = input.split(" ");
+
+
+		// Durch alle char im übergebenen String loopen
+		for(String morsecode : morsecodes) {
+
+			// Wenn der char in der codeMap enthalten ist, an den Rückgabe String anheften, ansonsten nichts ignorieren.
+			buchstabe = this.getBuchstabe(morsecode);
+			if(buchstabe != null) {
+				sb.append(buchstabe).append(' ');
+			}
+		}
 
+		// Gibt den konvertierten String zurück
+		return sb.toString();
 	}
 }
-- 
GitLab


From 4c5001e06de6b5ab54de1e51452a4cd7d8349da0 Mon Sep 17 00:00:00 2001
From: Dennis Eisold <de@itstall.de>
Date: Mon, 25 Nov 2019 19:23:37 +0100
Subject: [PATCH 3/4] =?UTF-8?q?Dependencys=20f=C3=BCr=20MariaDB=20sowie=20?=
 =?UTF-8?q?SQLite=20hinzugef=C3=BCgt?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pom.xml | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/pom.xml b/pom.xml
index b5b6fd8..2f9c3e7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,6 +25,19 @@
             <artifactId>javafx-fxml</artifactId>
             <version>${use.javafx.version}</version>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
+        <dependency>
+            <groupId>org.xerial</groupId>
+            <artifactId>sqlite-jdbc</artifactId>
+            <version>3.28.0</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
+        <dependency>
+            <groupId>org.mariadb.jdbc</groupId>
+            <artifactId>mariadb-java-client</artifactId>
+            <version>2.5.2</version>
+        </dependency>
+
     </dependencies>
     <build>
         <plugins>
-- 
GitLab


From f49672e64564b860ffc6e5254e73d7328146b1f4 Mon Sep 17 00:00:00 2001
From: Dennis Eisold <de@itstall.de>
Date: Mon, 25 Nov 2019 21:20:57 +0100
Subject: [PATCH 4/4] =?UTF-8?q?-=20module-info.java=20gel=C3=B6scht,=20bra?=
 =?UTF-8?q?uchen=20wir=20nicht=20-=20SQLite=20Anbindung=20fertig=20gestell?=
 =?UTF-8?q?t=20-=20Codebuch=20Klasse=20geschrieben?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/Enigma/Main.java                |  11 +-
 src/main/java/Enigma/model/Codebuch.java      | 166 ++++++++++++++++++
 .../java/Enigma/model/DatenbankSqlite.java    |  64 +++++++
 src/main/java/module-info.java                |   7 -
 4 files changed, 238 insertions(+), 10 deletions(-)
 create mode 100644 src/main/java/Enigma/model/Codebuch.java
 create mode 100644 src/main/java/Enigma/model/DatenbankSqlite.java
 delete mode 100644 src/main/java/module-info.java

diff --git a/src/main/java/Enigma/Main.java b/src/main/java/Enigma/Main.java
index 37c9833..6adb920 100644
--- a/src/main/java/Enigma/Main.java
+++ b/src/main/java/Enigma/Main.java
@@ -1,9 +1,14 @@
 package Enigma;
 
+import Enigma.model.DatenbankSqlite;
+import Enigma.model.Morsecode;
+
+import java.sql.SQLException;
+
 public class Main {
 
-        public static void main(String[] args) {
-            App.main(args);
-        }
+    public static void main(String[] args) {
+        App.main(args);
+    }
 
 }
diff --git a/src/main/java/Enigma/model/Codebuch.java b/src/main/java/Enigma/model/Codebuch.java
new file mode 100644
index 0000000..c32345e
--- /dev/null
+++ b/src/main/java/Enigma/model/Codebuch.java
@@ -0,0 +1,166 @@
+package Enigma.model;
+
+/**
+ * Das Codebuch war eines der essentiel wichtigen Sachen bei der Enigma.
+ * Jeder Enigma gehörte auch ein Codebuch bei, welches notwenidg war um die Nachrichten zu ver/entschlüsseln.
+ * Im Codebuch standen für jeden Tag des Monats die notwendigen Einstellungen welche vorgenommen werden
+ * mussten um die Texte zu ver/entschlüsseln.
+ * Hiernach wurden die Walzen eingesetzt, die Ringe für den Rücksprung der Walzen gesetzt und deren Grundeinstellung
+ * vorgenommen.
+ * Bei der Enigma um welche es hier geht (Enigma I) gab es zusätzlich ein Steckbrett, welches ebenfalls im Codebuch
+ * festgelegt war.
+ *
+ * Dieses Codebuch Objekt enthält die Einstellungen eines Tages, welche mittels Getter und Setter
+ * verarbeitet werden können.
+ *
+ * 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 = new String[3];
+	private String[] Ringstellung = new String[3];
+	private String[] Grundstellung = new String[3];
+	private String[] Steckverbindung = new String[10];
+
+	/**
+	 * Gibt die aktuelle Instanz des Codebuches als String zurück.
+	 * Hierbei werden der Tag die Walzenlagen, Ring/Grundstellung sowie die Steckverbindungen zurück gegeben.
+	 *
+	 * @return String : String des gesamten Objektes
+	 */
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		boolean wlLoop = false;
+		boolean rsLoop = false;
+		boolean gsLoop = false;
+		boolean svLoop = false;
+
+		sb.append("Tag: ").append(this.getTag()).append("\n");
+
+		sb.append("Walzenlage: ");
+		for(String wl : this.getWalzenlage()) {
+			sb.append(wl).append(",");
+			wlLoop = true;
+		}
+		if(wlLoop) {
+			sb.setLength(sb.length() - 1);
+		}
+		sb.append("\n");
+
+		sb.append("Ringstellung: ");
+		for(String rs : this.getRingstellung()) {
+			sb.append(rs).append(",");
+			rsLoop = true;
+		}
+		if(rsLoop) {
+			sb.setLength(sb.length() - 1);
+		}
+		sb.append("\n");
+
+		sb.append("Grundstellung: ");
+		for (String gs : this.getGrundstellung()) {
+			sb.append(gs).append(",");
+			gsLoop = true;
+		}
+		if(gsLoop) {
+			sb.setLength(sb.length() - 1);
+		}
+		sb.append("\n");
+
+		sb.append("Steckverbindung: ");
+		for (String s : this.getSteckverbindung()) {
+			if (!s.isEmpty()) {
+				sb.append(s).append(",");
+				svLoop = true;
+			}
+		}
+		if(svLoop) {
+			sb.setLength(sb.length() - 1);
+		}
+		sb.append("\n");
+
+		return sb.toString();
+	}
+
+	/**
+	 * Gibt den Tag dieser Instanz zurück
+	 * @return int : Tag
+	 */
+	public int getTag() {
+		return tag;
+	}
+
+	/**
+	 * Gibt die Walzenlage dieser Instanz zurück
+	 * @return String[] : Walzenlage
+	 */
+	public String[] getWalzenlage() {
+		return Walzenlage;
+	}
+
+	/**
+	 * Gibt die Ringstellung dieser Instanz zurück
+	 * @return String[] : Ringstellung
+	 */
+	public String[] getRingstellung() {
+		return Ringstellung;
+	}
+
+	/**
+	 * Gibt die Grundstellung dieser Instanz zurück
+	 * @return String[] : Grundstellung
+	 */
+	public String[] getGrundstellung() {
+		return Grundstellung;
+	}
+
+	/**
+	 * Gibt die Steckverbindung dieser Instanz zurück
+	 * @return String[] : Steckverbindung
+	 */
+	public String[] getSteckverbindung() {
+		return Steckverbindung;
+	}
+
+	/**
+	 * Setzt den Tag dieser Instanz
+	 * @param tag : int
+	 */
+	public void setTag(int tag) {
+		this.tag = tag;
+	}
+
+	/**
+	 * Setzt die Walzenlage dieser Instanz
+	 * @param walzenlage : String[]
+	 */
+	public void setWalzenlage(String[] walzenlage) {
+		Walzenlage = walzenlage;
+	}
+
+	/**
+	 * Setzt die Ringstellung dieser Instanz
+	 * @param ringstellung : String[]
+	 */
+	public void setRingstellung(String[] ringstellung) {
+		Ringstellung = ringstellung;
+	}
+
+	/**
+	 * Setzt die Grundstellung dieser Instanz
+	 * @param grundstellung : String[]
+	 */
+	public void setGrundstellung(String[] grundstellung) {
+		Grundstellung = grundstellung;
+	}
+
+	/**
+	 * Setzt die Steckverbindung dieser Instanz
+	 * @param steckverbindung : String[]
+	 */
+	public void setSteckverbindung(String[] steckverbindung) {
+		Steckverbindung = steckverbindung;
+	}
+}
diff --git a/src/main/java/Enigma/model/DatenbankSqlite.java b/src/main/java/Enigma/model/DatenbankSqlite.java
new file mode 100644
index 0000000..6a203b5
--- /dev/null
+++ b/src/main/java/Enigma/model/DatenbankSqlite.java
@@ -0,0 +1,64 @@
+package Enigma.model;
+
+import java.sql.*;
+
+/**
+ * Dies ist die SQLite Datenbank Klasse
+ * In der SQLite Datei im Resources Ordner liegt das Codebuch welches benötigt wird um die
+ * Nachrichten mit der Enigma zu ver/entschlüsseln.
+ * Die Datenbank ist statisch und deshalb konnte sie im Resources Ordner hinterlegt werden.
+ * Für jeden Tag des Monats (1-31) ist ein eigener Eintrag enthalten welcher über die Funktion
+ * getCodebuch abgerufen werden kann.
+ * Zurückgegeben wird ein Array welcher in der getCodebuch Funktion genauer dokumentiert ist.
+ */
+public class DatenbankSqlite {
+
+	/**
+	 * Verbindung zur SQLite Datenbank aufbauen.
+	 * Die Datei liegt in den Resources und ändert sich nicht,
+	 * weshalb der Pfad zu derselben fest hinterlegt ist.
+	 *
+	 * @return conn : Connection
+	 */
+	private Connection connect() {
+
+		String url = "jdbc:sqlite::resource:Enigma/codebuch.sqlite";
+		Connection conn = null;
+
+		try {
+			conn = DriverManager.getConnection(url);
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+
+		return conn;
+	}
+
+	/**
+	 * Liest das Codebuch aus der SQLite Datenbank aus
+	 * Dieser Funktion muss ein tag als int Wert übergeben werden.
+	 * Anschließend wir eine Verbindung zur SQLite Datenbank aufgebaut und das Codebuch angefragt.
+	 * Dieses wird in ein Object vom Type Codebuch gepackt und zurück gegeben.
+	 *
+	 * @param tag : int : Tag für welchen ein Codebuch benötigt wird.
+	 * @return Codebuch : Codebuch Object mit dem Codebuch des angefragten Tages
+	 */
+	public Codebuch getCodebuch(int tag) throws SQLException {
+		Codebuch cb = new Codebuch();
+
+		Connection conn = this.connect();
+		PreparedStatement pstm = conn.prepareStatement("SELECT * FROM table_codebuch WHERE Tag=? LIMIT 1");
+		pstm.setInt(1, tag);
+		ResultSet rs = pstm.executeQuery();
+
+		while (rs.next()) {
+			cb.setTag(rs.getInt("Tag"));
+			cb.setWalzenlage(rs.getString("Walzenlage").split(","));
+			cb.setRingstellung(rs.getString("Ringstellung").split(","));
+			cb.setGrundstellung(rs.getString("Grundstellung").split(","));
+			cb.setSteckverbindung(rs.getString("Steckverbindung").split(","));
+		}
+
+		return cb;
+	}
+}
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
deleted file mode 100644
index c9e95ca..0000000
--- a/src/main/java/module-info.java
+++ /dev/null
@@ -1,7 +0,0 @@
-module Projektarbeit {
-    requires javafx.controls;
-    requires javafx.fxml;
-
-    opens Enigma to javafx.fxml;
-    exports Enigma;
-}
\ No newline at end of file
-- 
GitLab