From 1524aac2391c5b2443f20bdd4ecec1f065b847a0 Mon Sep 17 00:00:00 2001 From: Dennis Eisold <de@itstall.de> Date: Fri, 29 Nov 2019 15:07:48 +0100 Subject: [PATCH 1/4] Codierer dokumentiert --- .../java/projekt/enigma/model/Codierer.java | 144 ++++++++++++------ 1 file changed, 95 insertions(+), 49 deletions(-) diff --git a/src/main/java/projekt/enigma/model/Codierer.java b/src/main/java/projekt/enigma/model/Codierer.java index 2217aaf..91f930f 100644 --- a/src/main/java/projekt/enigma/model/Codierer.java +++ b/src/main/java/projekt/enigma/model/Codierer.java @@ -7,24 +7,49 @@ import java.util.Calendar; import java.util.Random; /** - * TODO: Dokumentieren + * Die Codierer Klasse beschreibt den Benutzer welcher die Enigma benutzt. + * Alle Vorgänge wie z.B. das zusammenbauen der Hardware, auslesen des Codebuches und das anschließende codieren, + * finden hier statt. Dieser ist quasi die Schnittstelle zwischen der GUI (Hauptmann welcher ihm sagt was er zu + * verschlüsseln hat), der Enigma und dem Funker im Funkraum, welcher die Nachricht im Anschluß versendet. */ public class Codierer { /** - * TODO: Dokumentieren + * Der Klartext Spruchschlüssel zur codierung der Nachricht */ private String spruchschluessel; + /** + * Der Spruchschlüssel, mit den Tageswerten aus dem Codebuch, codiert + */ private String spruchschluesselCodiert; - private String kenngruppe, kenngruppeCodiert; + /** + * Die Kenngruppe für die versendeten Nachrichten gedacht sind. Diese ist relevant für den Webservice (Funkraum) + */ + private String kenngruppe; + /** + * Die Kenngruppe wird gleich nach der Eingabe codiert und global gespeichert. + */ + private String kenngruppeCodiert; + /** + * Die Nachricht, welche der Benutzer eingibt, wird als String nachricht gespeichert + * und im laufe der Benutzung ergänzt + */ private String nachricht; + /** + * Das Hardware Objekt. Hier werden alle Hardware relevanten Baugruppen gespeichert und verarbeitet. + */ private Hardware hardware; + /** + * Im Codebuch sind die Tageswerte zu finden. Über dieses Objekt kann darauf zugegriffen werden. + */ private Codebuch codebuch; /** - * TODO: Dokumentieren + * Der Konstruktor des Codierers + * Hier werden die globalen Variablen auf ihre Standart Werte gesetzt sowie die Objekte Initialisiert. */ public Codierer() { + this.nachricht = ""; this.spruchschluessel = ""; this.spruchschluesselCodiert = ""; @@ -74,16 +99,15 @@ public class Codierer { /** * Hier wird ein neuer Spruchschlüssel generiert. + * <p> * Mit diesem werden die Walzen auf eine neue Startposition gestellt und dem Kopf, mit dem * Tagesschlüssel codiert, hinzugefügt. - * <p> + * <br> * Hierfür wird mittels der Funktion "randomBuchstabe" ein zufälliger Buchstabe generiert, - * und geschaut ob dieser bereits in der globalen Variable this.spruchschluessel vorhanden ist. + * und geschaut ob dieser bereits in der globalen Variable (this.spruchschluessel) vorhanden ist. * Wenn nicht, wird der Buchstabe dem Spruchschlüssel hinzugefügt. - * <p> + * <br> * Dies wir nun so lange gemacht bis der Spruchschlüssel eine länge von drei Zeichen hat. - * <p> - * TODO: Doku aktuallisieren */ public void generateSpruchschluessel() { @@ -109,7 +133,8 @@ public class Codierer { } /** - * TODO: Dokumentieren + * Der Spruchschlüssel wird, mit dem Tagesschlüssel codiert und als globale Variable gespeichert. + * Dieser wird später an den Nachrichten Kopf angehängt. * * @return String : Der codierte Spruchschlüssel */ @@ -118,7 +143,8 @@ public class Codierer { } /** - * TODO: Dokumentieren + * Der Spruchschlüssel wird, zur internen Verwendung, auch im Klartext gespeichert. + * Wir brauchen diesen dann zum codieren der eigentlichen Nachricht. * * @return String : Der klartext Spruchschlüssel */ @@ -127,14 +153,14 @@ public class Codierer { } /** - * TODO: Dokumentieren + * Erstellen des Nachrichten Kopfes. + * Hierfür wird die aktuelle Uhrzeit ausgelesen, die Länge der Nachricht sowie der, mit den + * Tagescodes codierte, Spruchschlüssel. */ private String generateKopf() { Calendar cal = Calendar.getInstance(); // Uhrzeit an den Kopf hängen - // TODO: Da gab es doch noch eine besser Lösung für den Korrekturfaktor der Uhrzeit? - return String.format("%02d%02d", cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE)) + " " + // Zeichen Anzahl der Nachricht @@ -142,9 +168,6 @@ public class Codierer { // Spruchschlüssel anhängen this.spruchschluesselCodiert.substring(0, 3) + " " + this.spruchschluesselCodiert.substring(3, 6) + " "; - - // Kenngruppe an das Ende setzen - //this.kenngruppeCodiert; } /** @@ -191,7 +214,7 @@ public class Codierer { StringBuilder sb = new StringBuilder(); sb.append(nachricht[1], 0, 16); - for(int i = 17; i <= nachricht[1].length();) { + for (int i = 17; i <= nachricht[1].length(); ) { if ((i + 5) < nachricht[1].length()) { sb.append(nachricht[1], i, i + 5).append(" "); i += 5; @@ -240,7 +263,7 @@ public class Codierer { /** * Gibt die aktuellen Buchstaben auf den Walzen zurück * - * @return + * @return char[] : Walzen Array mit der aktuellen Position */ public char[] getWalzen() { char[] walzen = new char[3]; @@ -261,9 +284,12 @@ public class Codierer { } /** - * TODO: Dokumentieren + * Hier wird ein einzelner Buchstabe verschlüsselt. + * Man muss hier ebenfalls mitgeben ob der codierte String in Codierer.nachricht gespeichert werden soll oder nicht. + * In der Regel ist dies der Fall. * - * @param buchstabe + * @param buchstabe : char : Der zu codierende Buchstabe + * @param save : boolean : Nachricht speichern oder nicht * @return */ public char codiere(char buchstabe, boolean save) { @@ -276,11 +302,13 @@ public class Codierer { } /** - * TODO: Dokumentieren + * Codiert den Übergebenen String. + * Man muss hier ebenfalls mitgeben ob der codierte String in Codierer.nachricht gespeichert werden soll oder nicht. + * In der Regel ist dies der Fall. * - * @param klartext - * @param save - * @return + * @param klartext : String : Der zu codierende Text + * @param save : boolean : Nachricht speichern oder nicht + * @return String : Der codierte Text zusätzlich als Rückgabe */ public String codiere(String klartext, boolean save) { @@ -294,7 +322,9 @@ public class Codierer { } /** - * TODO: Dokumentieren + * Diese Funktion erwartet als (codierteNachricht) eine korrekte Enigma Nachricht. + * Ihr muss auch der Tag der codierung mitgegeben werden. Dieser weiß dein Funker im Funkraum. + * In der Regel ist dies der Tag des Nachrichten empfangs. * * @param codierteNachricht : String : Enigma codierte Nachricht * @param tag : int : Tag der Nachricht @@ -332,10 +362,11 @@ public class Codierer { } /** - * TODO: Dokumentieren + * Zerlegt den übergebenen String in einen char Array und decodiert jedes Zeichen. + * Der String wird dann decodiert zurück gegeben. * - * @param nachricht - * @return + * @param nachricht : String : Der zu decodierende Text + * @return String : Der decodierte Text */ public String decodiereString(String nachricht) { @@ -351,51 +382,66 @@ public class Codierer { } /** - * TODO: Dokumentieren + * Setzt die Enigma auf die Einstellungen des aktuellen Tages, aus dem Codebuch zurück. */ public void resetHardware() { this.initialisiereHardware(); } /** - * Setzt die Walze auf der Position (walzenPosition) in die Enigma ein. - * Mit dem char (position) sagt man auf welchen Buchstaben sie eingestellt werden soll. + * Setzt den anzuzeigenden Buchstaben (buchstabe) auf der Walze (wlazenPosition) + * TODO: Wenn die Walzen, Notches, Kabel, etc. verändert werden, muss die bisherige Nachricht (this.nachricht) gelöscht werden. * - * @param walzenPosition - * @param position + * @param walzenPosition : int : Nummer der Walze + * @param buchstabe : char : Buchstabe der zugewiesen soll */ - public void setWalze(int walzenPosition, char position) { - this.hardware.setzePosition(walzenPosition, position); + public void setWalze(int walzenPosition, char buchstabe) { + this.hardware.setzePosition(walzenPosition, buchstabe); } /** - * TODO: Dokumentieren + * Setzt den Ring auf der Walze auf einen neuen Umstprungwert. * - * @param walzenPosition - * @param position + * @param walzenPosition : int : Walze auf die der Ring gesteckt wird + * @param umsprungPunkt : int : Buchstabe auf dem der Notch sitzt */ - public void setRing(int walzenPosition, int position) { - this.hardware.setzeRing(walzenPosition, position); + public void setRing(int walzenPosition, int umsprungPunkt) { + this.hardware.setzeRing(walzenPosition, umsprungPunkt); } /** - * TODO: Dokumentieren + * Setzt die Walze (walzeNr) in die Position (walzenPosition) der Enigma ein. + * Mit (ringstellung) gibt man die Position des Umsprungpunktes an. * - * @param walzenPosition - * @param walzeNr + * @param walzenPosition : int : Position der Walze in der Enigma (1-2-3) + * @param walzeNr : int : Nummer der Walze die eingesetzt wird + * @param ringstellung : int : Stellung des Ringes */ - public void setWalzeNr(int walzenPosition, int walzeNr) { - this.hardware.setzeWalzenNr(walzenPosition, walzeNr, 1); + public void setWalzeNr(int walzenPosition, int walzeNr, int ringstellung) { + this.hardware.setzeWalzenNr(walzenPosition, walzeNr, ringstellung); } /** - * TODO: Dokumentieren + * Setzt das Kabel in beide Ports ein und fügt es dem Steckbrett Array hinzu. * - * @param feldNr - * @param verbindung + * @param feldNr : int : Kabel Nummer welches am Steckbrett eingesteckt wird + * @param verbindung : String : Verbindung welche die vertauschten Buchstaben angibt */ public void setSteckbrett(int feldNr, String verbindung) { this.hardware.getSteckbrett().setzeVertauschung(verbindung.charAt(0), verbindung.charAt(1)); } + /** + * Prüft ob der Port auf den das Kabel gesteckt werden soll, noch frei ist. + * <p> + * TODO: Prüfen ob im aktuellen Feld bereits zwei Buchstaben stehen, wenn ja, nach erfolg dieser Funktion, + * setSteckbrett ausführen mit beiden Buchstaben als String + * + * @param buchstabe : char : Der zuletzt eingegebene Buchstabe + * @return boolean : Wenn der Buchstabe nicht vorhanden ist, wird true zurückgegeben, ansonsten false + */ + public boolean pruefeSteckbrettPort(char buchstabe) { + return true; + } + } -- GitLab From 5b81c1d0e17d94e575bc8f002ce933eeb4094d2d Mon Sep 17 00:00:00 2001 From: Dennis Eisold <de@itstall.de> Date: Fri, 29 Nov 2019 15:10:45 +0100 Subject: [PATCH 2/4] =?UTF-8?q?Unn=C3=B6tige=20Variablen=20und=20Funktione?= =?UTF-8?q?n=20raus=20gel=C3=B6scht.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/projekt/enigma/model/Codierer.java | 32 +++---------------- 1 file changed, 4 insertions(+), 28 deletions(-) diff --git a/src/main/java/projekt/enigma/model/Codierer.java b/src/main/java/projekt/enigma/model/Codierer.java index 91f930f..11ccd13 100644 --- a/src/main/java/projekt/enigma/model/Codierer.java +++ b/src/main/java/projekt/enigma/model/Codierer.java @@ -26,10 +26,6 @@ public class Codierer { * Die Kenngruppe für die versendeten Nachrichten gedacht sind. Diese ist relevant für den Webservice (Funkraum) */ private String kenngruppe; - /** - * Die Kenngruppe wird gleich nach der Eingabe codiert und global gespeichert. - */ - private String kenngruppeCodiert; /** * Die Nachricht, welche der Benutzer eingibt, wird als String nachricht gespeichert * und im laufe der Benutzung ergänzt @@ -54,7 +50,6 @@ public class Codierer { this.spruchschluessel = ""; this.spruchschluesselCodiert = ""; this.kenngruppe = ""; - this.kenngruppeCodiert = ""; this.codebuch = new Codebuch(); this.codebuch.fetchTagesschluessel(); } @@ -128,18 +123,8 @@ public class Codierer { this.hardware.setzePosition(1, this.spruchschluessel.charAt(1)); this.hardware.setzePosition(2, this.spruchschluessel.charAt(2)); - // Die Kenngruppe codieren - this.kenngruppeCodiert = this.codiere(this.kenngruppe, true); - } - - /** - * Der Spruchschlüssel wird, mit dem Tagesschlüssel codiert und als globale Variable gespeichert. - * Dieser wird später an den Nachrichten Kopf angehängt. - * - * @return String : Der codierte Spruchschlüssel - */ - public String getSpruchschluesselCodiert() { - return this.spruchschluesselCodiert; + // Die Kenngruppe codieren und in der Nachricht speichern + this.codiere(this.kenngruppe, true); } /** @@ -274,15 +259,6 @@ public class Codierer { return walzen; } - /** - * Setzt ein neues Hardware Objekt - * - * @param hardware : Hardware - */ - public void setHardware(Hardware hardware) { - this.hardware = hardware; - } - /** * Hier wird ein einzelner Buchstabe verschlüsselt. * Man muss hier ebenfalls mitgeben ob der codierte String in Codierer.nachricht gespeichert werden soll oder nicht. @@ -290,7 +266,7 @@ public class Codierer { * * @param buchstabe : char : Der zu codierende Buchstabe * @param save : boolean : Nachricht speichern oder nicht - * @return + * @return char : Der codierte Buchstabe */ public char codiere(char buchstabe, boolean save) { char codiert = this.hardware.codiere(buchstabe); @@ -368,7 +344,7 @@ public class Codierer { * @param nachricht : String : Der zu decodierende Text * @return String : Der decodierte Text */ - public String decodiereString(String nachricht) { + private String decodiereString(String nachricht) { StringBuilder sb = new StringBuilder(); -- GitLab From 69147744f2fe5b0cfc8515bc22d5a7f80b81dffb Mon Sep 17 00:00:00 2001 From: Dennis Eisold <de@itstall.de> Date: Fri, 29 Nov 2019 16:17:53 +0100 Subject: [PATCH 3/4] resetDisplay beim initialisieren setzen. #1 --- .../java/projekt/enigma/GuiController.java | 59 +++++++++++-------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/src/main/java/projekt/enigma/GuiController.java b/src/main/java/projekt/enigma/GuiController.java index 2e06eb6..9a888b3 100644 --- a/src/main/java/projekt/enigma/GuiController.java +++ b/src/main/java/projekt/enigma/GuiController.java @@ -1,11 +1,11 @@ package projekt.enigma; -import projekt.enigma.model.Codierer; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.shape.Circle; import org.apache.http.HttpException; +import projekt.enigma.model.Codierer; import java.io.IOException; import java.util.ArrayList; @@ -379,17 +379,24 @@ public class GuiController { this.codierer = new Codierer(); this.codierer.setKenngruppe("enigma"); + this.resetDisplay = true; + // Walzen auf ihre Position setzen. Der Spruchschlüssel ist hier bereits berücksichtigt. mBtnStartPos1.setText(String.valueOf(this.codierer.getWalzen()[0])); mBtnStartPos2.setText(String.valueOf(this.codierer.getWalzen()[1])); mBtnStartPos3.setText(String.valueOf(this.codierer.getWalzen()[2])); } + /** + * TODO: Die Löschen Funktion muss noch ausgeschrieben werden. Der letzte char muss aus beiden + * Feldern entfernt werden. + * Der Codierer muss den letzten Buchstaben aus (codierer.nachricht) löschen und die Walzen um eines zurück drehen. + */ @FXML private void loeschen() { - if (textEingabe.length()==0){ + if (textEingabe.length() == 0) { tfKlartext.setText(""); - }else { + } else { textEingabe = textEingabe.substring(0, textEingabe.length() - 1); tfKlartext.setText(textEingabe); } @@ -431,18 +438,18 @@ public class GuiController { private void listener(MenuButton mb, MenuItem mi) { // mb.setText(mi.getText()); - if(mb.getId().equals(mBtnStartPos1.getId()))setzePosition(1,mi.getText().charAt(0)); - if(mb.getId().equals(mBtnStartPos2.getId()))setzePosition(2,mi.getText().charAt(0)); - if(mb.getId().equals(mBtnStartPos3.getId()))setzePosition(3,mi.getText().charAt(0)); - if(mb.getId().equals(mBtnWalzPos1.getId()))setzeWalze(1,mi.getText()); - if(mb.getId().equals(mBtnWalzPos2.getId()))setzeWalze(2,mi.getText()); - if(mb.getId().equals(mBtnWalzPos3.getId()))setzeWalze(3,mi.getText()); - if(mb.getId().equals(mBtnNotchPos1.getId())) - setzeRing(1,Integer.parseInt(mi.getText())-1); - if(mb.getId().equals(mBtnNotchPos2.getId())) - setzeRing(2,Integer.parseInt(mi.getText())-1); - if(mb.getId().equals(mBtnNotchPos3.getId())) - setzeRing(3,Integer.parseInt(mi.getText())-1); + if (mb.getId().equals(mBtnStartPos1.getId())) setzePosition(1, mi.getText().charAt(0)); + if (mb.getId().equals(mBtnStartPos2.getId())) setzePosition(2, mi.getText().charAt(0)); + if (mb.getId().equals(mBtnStartPos3.getId())) setzePosition(3, mi.getText().charAt(0)); + if (mb.getId().equals(mBtnWalzPos1.getId())) setzeWalze(1, mi.getText()); + if (mb.getId().equals(mBtnWalzPos2.getId())) setzeWalze(2, mi.getText()); + if (mb.getId().equals(mBtnWalzPos3.getId())) setzeWalze(3, mi.getText()); + if (mb.getId().equals(mBtnNotchPos1.getId())) + setzeRing(1, Integer.parseInt(mi.getText()) - 1); + if (mb.getId().equals(mBtnNotchPos2.getId())) + setzeRing(2, Integer.parseInt(mi.getText()) - 1); + if (mb.getId().equals(mBtnNotchPos3.getId())) + setzeRing(3, Integer.parseInt(mi.getText()) - 1); } /** @@ -508,7 +515,7 @@ public class GuiController { */ private void setText(Button b) { if (textEingabe.length() < 250) { - if(this.resetDisplay) { + if (this.resetDisplay) { this.tfCodiert.setText(""); this.tfKlartext.setText(""); this.resetDisplay = false; @@ -543,26 +550,26 @@ public class GuiController { * Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze * ->d.h. welche Walze sitzt auf welcher Position * - * @param walzeRoemischNr => gibt die Walzennummer an - * @param walzenPosition => gibt die Position der Walze + * @param walzeRoemischNr => gibt die Walzennummer an + * @param walzenPosition => gibt die Position der Walze */ private void setzeWalze(int walzenPosition, String walzeRoemischNr) { - int walzeNr=0; - switch (walzeRoemischNr){ + int walzeNr = 0; + switch (walzeRoemischNr) { case "I": - walzeNr=0; + walzeNr = 0; break; case "II": - walzeNr=1; + walzeNr = 1; break; case "III": - walzeNr=2; + walzeNr = 2; break; case "IV": - walzeNr=4; + walzeNr = 4; break; case "V": - walzeNr=4; + walzeNr = 4; break; default: break; @@ -590,7 +597,7 @@ public class GuiController { * Mitnahmeposition meint => die nächste Walze wird bei erreichen dieser Position (notch) * um eine Stelle versetzt * - * @param ringStellung => gibt die walze an + * @param ringStellung => gibt die walze an * @param walzenPosition => gibt den notch der Walze (walze) an */ private void setzeRing(int walzenPosition, int ringStellung) { -- GitLab From 0347d07b9f33f6d024b7112dfe6bd9e9426ea92c Mon Sep 17 00:00:00 2001 From: Dennis Eisold <de@itstall.de> Date: Fri, 29 Nov 2019 16:34:24 +0100 Subject: [PATCH 4/4] Pfad zur SQLite Resource korrigiert. --- src/main/java/projekt/enigma/database/DatenbankSqlite.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/projekt/enigma/database/DatenbankSqlite.java b/src/main/java/projekt/enigma/database/DatenbankSqlite.java index 401af57..ac7c902 100644 --- a/src/main/java/projekt/enigma/database/DatenbankSqlite.java +++ b/src/main/java/projekt/enigma/database/DatenbankSqlite.java @@ -22,7 +22,7 @@ public class DatenbankSqlite { */ private Connection connect() { - String url = "jdbc:sqlite::resource:enigma/codebuch.sqlite"; + String url = "jdbc:sqlite::resource:projekt/enigma/codebuch.sqlite"; Connection conn = null; try { -- GitLab