diff --git a/src/main/java/projekt/enigma/App.java b/src/main/java/projekt/enigma/App.java index 267c3fcc983846cacdddd73d6a2cfe30829a4677..2e97208367f7280086e9b398514f64729c03c610 100644 --- a/src/main/java/projekt/enigma/App.java +++ b/src/main/java/projekt/enigma/App.java @@ -1,12 +1,15 @@ package projekt.enigma; import javafx.application.Application; +import javafx.event.EventHandler; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; import javafx.scene.layout.VBox; import javafx.stage.Stage; import projekt.enigma.model.Fehler; @@ -23,7 +26,6 @@ public class App extends Application { private static String kenngruppe; private static GuiController gc; private static int debug; - private static Fehler fehler; Scene sce1, sce2; private static Parent loadFXML(String fxml) throws IOException { @@ -39,7 +41,7 @@ public class App extends Application { } public static void main(String[] args) { - fehler = new Fehler(); + debug = 1; launch(args); } @@ -51,10 +53,6 @@ public class App extends Application { App.debug = debug; } - public static Fehler getFehler() { - return fehler; - } - @Override public void start(Stage primaryStage) throws IOException { @@ -68,30 +66,37 @@ public class App extends Application { TextField tfield = new TextField(); Button button1 = new Button("Kenngruppe setzen!"); - VBox layout1 = new VBox(); - button1.setOnAction(e -> { - String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - boolean error = false; - - for (char c : tfield.getText().toUpperCase().toCharArray()) { - if (!alphabet.contains(String.valueOf(c))) { - error = true; - break; - } - } - if (tfield.getText().length() < 9 && !error) { - kenngruppe = tfield.getText(); - try { - primaryStage.setScene(new Scene(loadFXML("gui"), 962, 677)); - } catch (IOException ex) { - ex.printStackTrace(); - } - } else { - tfield.setStyle("-fx-background-color:#FF0000"); - tfield.setText("Fehlerhafte Kenngruppe!"); - } + VBox layout1 = new VBox(); + + tfield.setOnKeyPressed(e -> { + if (e.getCode() == KeyCode.ENTER) { + if(enter(tfield.getText())) { + kenngruppe = tfield.getText(); + try { + primaryStage.setScene(new Scene(loadFXML("gui"), 962, 677)); + } catch (IOException ex) { + ex.printStackTrace(); + } + } else { + tfield.setStyle("-fx-background-color:#FF0000"); + tfield.setText("Fehlerhafte Kenngruppe!"); + } + } + }); + + button1.setOnAction(e -> { + if(enter(tfield.getText())) { + try { + primaryStage.setScene(new Scene(loadFXML("gui"), 962, 677)); + } catch (IOException ex) { + ex.printStackTrace(); + } + } else { + tfield.setStyle("-fx-background-color:#FF0000"); + tfield.setText("Fehlerhafte Kenngruppe!"); + } }); layout1.getChildren().addAll(label1, l1, tfield, l2, button1); @@ -102,6 +107,24 @@ public class App extends Application { primaryStage.show(); } + private boolean enter(String kenngruppe) { + + String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + boolean result = true; + + for (char c :kenngruppe.toUpperCase().toCharArray()) { + if (!alphabet.contains(String.valueOf(c))) { + result = false; + break; + } + } + if (kenngruppe.length() >= 9) { + result = false; + } + + return result; + } + // /** // * TODO Dokumentieren diff --git a/src/main/java/projekt/enigma/GuiController.java b/src/main/java/projekt/enigma/GuiController.java index c95f077d3d703a3dfdf7656d71bba024ae569d8a..6c73b6e4dc8abafb19363c0eb20e27c5fdac6df6 100644 --- a/src/main/java/projekt/enigma/GuiController.java +++ b/src/main/java/projekt/enigma/GuiController.java @@ -422,8 +422,10 @@ public class GuiController { * sowie den Klartext in das Textfeld tfKlartext. Setzt den Spruchschlüssel */ private void empfangeFunkspruch() { + String[] empfangeneNachricht = codierer.empfangeNachricht(); - if (empfangeneNachricht[0] != null) { + + if (empfangeneNachricht[2] != null) { setzeTagesSchluessel(); tfKlartext.setText(empfangeneNachricht[2]); tfCodiert.setText(empfangeneNachricht[1]); @@ -439,7 +441,8 @@ public class GuiController { * Löscht die Textfelder tfKlartext und tfCodiert */ private void sendeFunkspruch() { - this.tfKlartext.setText(""); + + this.tfKlartext.setText(""); this.tfCodiert.setText(""); try { diff --git a/src/main/java/projekt/enigma/model/Codierer.java b/src/main/java/projekt/enigma/model/Codierer.java index bd9f1f5cb01b8de6fa837ad5f6ac4a4c6c57bc0a..136ab25a2e104eeeeb40f940d1950f7b3426ed71 100644 --- a/src/main/java/projekt/enigma/model/Codierer.java +++ b/src/main/java/projekt/enigma/model/Codierer.java @@ -162,10 +162,12 @@ public class Codierer { // Abrufen der letzten Nachricht, für unsere Kenngruppe, aus dem Funkraum String[] codierteNachricht = new Funkraum().empfangeFunkspruch(this.kenngruppe); - System.out.println(codierteNachricht.toString()); + new Fehler().debug(String.valueOf(codierteNachricht.length), false); + new Fehler().debug(codierteNachricht[0], false); + new Fehler().debug(codierteNachricht[1], false); // Prüfen ob Nachrichtenlänge > 1 und die codierte Nachricht mehr als drei Felder (" ") hat - if (codierteNachricht.length > 1 && codierteNachricht[1].split(" ").length > 3) { + if (codierteNachricht[1] != null && codierteNachricht[1].split(" ").length > 3) { // Den Tag der Nachricht speichern nachricht[0] = codierteNachricht[0]; // Die Nachricht von Morsecode in Buchstaben konvertieren @@ -186,10 +188,6 @@ public class Codierer { } } nachricht[1] = sb.toString(); - } else { - nachricht[0] = ""; - nachricht[1] = ""; - nachricht[2] = "Es liegen keine neuen Nachrichten im Funkraum für Sie vor."; } return nachricht; diff --git a/src/main/java/projekt/enigma/model/Fehler.java b/src/main/java/projekt/enigma/model/Fehler.java index 3abf0aadaa76781dd7296c2f3386ea69a8fbcd9f..2dfedd46bfc32b333bf0a8997f08de0419399461 100644 --- a/src/main/java/projekt/enigma/model/Fehler.java +++ b/src/main/java/projekt/enigma/model/Fehler.java @@ -20,6 +20,7 @@ public class Fehler { * @param message : Nachricht der Meldung */ public void showErrorDialog(String type, String subject, String message) { + new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true); Alert alert; @@ -54,6 +55,7 @@ public class Fehler { } public void debug(String message, boolean isFunction) { + if (App.getDebug() != 0) { if (isFunction) { System.out.println(functionPrefix + message); @@ -66,15 +68,10 @@ public class Fehler { public void debug(String message, boolean isFunction, int debugLevel) { if (App.getDebug() != 0 && (App.getDebug() >= debugLevel || App.getDebug() == 3) ) { - if (isFunction) { - System.out.println(functionPrefix + message); - } else { - System.out.println(messagePrefix + message); - } } } diff --git a/src/main/java/projekt/enigma/model/Funkraum.java b/src/main/java/projekt/enigma/model/Funkraum.java index e3b1fabe5f956edaa0c1e69739ba532b5c385edd..d1096f0b8f6541fe951740723084326ec6466266 100644 --- a/src/main/java/projekt/enigma/model/Funkraum.java +++ b/src/main/java/projekt/enigma/model/Funkraum.java @@ -10,7 +10,6 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.json.JSONObject; -import projekt.enigma.App; import java.io.BufferedReader; import java.io.IOException; @@ -64,11 +63,14 @@ public class Funkraum { } } } catch (UnsupportedEncodingException e) { - App.getFehler().showErrorDialog("error", "Fehler", "Encoding wird nicht unterstützt."); + new Fehler().showErrorDialog("error", "Encoding wird nicht unterstützt", + "Kommunikation mit dem Feind wird als Landesverrat bestraft"); } catch (IOException e) { - App.getFehler().showErrorDialog("error", "HTTP Post war nicht erfolgreich", "Bitte wenden Sie sich an ihren Vorgesetzten."); + new Fehler().showErrorDialog("error", "HTTP Post war nicht erfolgreich", + "Bitte wenden Sie sich an ihren Vorgesetzten."); } catch (NullPointerException e) { - App.getFehler().showErrorDialog("error", "Fehler", "Keine Nachrichten für diese Kenngruppe"); + new Fehler().showErrorDialog("error", "Keiner schreibt dir...", + "Es liegen keine neuen Nachrichten im Funkraum für Sie vor."); } return funkspruch; @@ -108,8 +110,9 @@ public class Funkraum { BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); JSONObject result = new JSONObject(reader.readLine()); if (result.getInt("result") != 200) { - throw new HttpException("Der andere Funker mag deine Nachricht nicht. " + - "Rüge ihn wenn du ihn wieder siehst..."); + new Fehler().showErrorDialog("error", "HTTP Exception", + "Der andere Funker mag deine Nachricht nicht. " + + "Rüge ihn wenn du ihn wieder siehst..."); } } } diff --git a/src/main/java/projekt/enigma/model/Hardware.java b/src/main/java/projekt/enigma/model/Hardware.java index 290f8c4951774533d1a7db8c0ed8fb603ad2ae79..f188a2c935d9c0f622502e1bd92a18a99a293727 100644 --- a/src/main/java/projekt/enigma/model/Hardware.java +++ b/src/main/java/projekt/enigma/model/Hardware.java @@ -15,177 +15,199 @@ package projekt.enigma.model; */ public class Hardware { - //region Variablen - /** - * TODO: Dokumentieren - */ - private Walze[] walzen; - private Steckbrett steckbrett; - private Reflektor reflektor; - //endregion - - //region Konstruktor - /** - * 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]; - } - //endregion - - //region Funktionen & Methoden - /** - * Setzt eine Walze ein - * - * @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, int ringstellung) { - this.walzen[walze] = new Walze(walzenNr, ringstellung); - } - - /** - * Setzt den Notch der Walze - * - * @param walze : int : Position der Walze - * @param position : int : Umspringpunkt auf der Walze - */ - public void setzeRing(int walze, int position) { - this.walzen[walze].setRingstellung(position); - } - - /** - * Setzt den Startwert (position) der Walze (walze) - * - * @param walze : int : Nummer der Walze - * @param buchstabe : char : Buchstabe der zugewiesen soll - */ - public void setzePosition(int walze, char buchstabe) { - this.walzen[walze].setPosition(buchstabe); - } - - /** - * Verschlüsselt den übergebenen Buchstaben und fügt ihn der Nachricht hinzu - * - * @param buchstabe char : Der zu ver/entschlüsselnde Buchstabe - * @return char : Der ver/entschlüsselte Buchstabe - */ - public char codiere(char buchstabe) { - - buchstabe = Character.toUpperCase(buchstabe); - this.dreheWalzen(1); - - buchstabe = this.steckbrett.codiere(Character.toUpperCase(buchstabe)); - buchstabe = this.walzen[2].codiere(buchstabe); - buchstabe = this.walzen[1].codiere(buchstabe); - buchstabe = this.walzen[0].codiere(buchstabe); - buchstabe = this.reflektor.codiere(buchstabe); - buchstabe = this.walzen[0].codiere2(buchstabe); - buchstabe = this.walzen[1].codiere2(buchstabe); - buchstabe = this.walzen[2].codiere2(buchstabe); - buchstabe = this.steckbrett.codiere(buchstabe); - - return buchstabe; - } - - /** - * 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. - */ - public void dreheWalzen(int richtung) { - if (richtung > 0) { - for (int i = 0; i < richtung; i++) { - if (this.walzen[2].dreheWalze(1)) { - if(this.walzen[1].dreheWalze(1)) { - this.walzen[0].dreheWalze(1); - } - } - } - } else { - for (int i = 0; i > richtung; richtung++) { - if (this.walzen[2].dreheWalze(-1)) { - if(this.walzen[1].dreheWalze(-1)) { - this.walzen[0].dreheWalze(-1); - } - } - } - } - } - - /** - * Diese Funktion setzt die Walzen auf ihren Anfangswert zurück. - * Hierfür ist der Buchstabe "A" festgelegt. - * Dies wird benötigt um zB einen neuen Spruchschlüssel einzustellen oder eine neue Nachricht zu verfassen. - */ - public void resetWalzen() { - this.getWalzen()[0].setPosition('A'); - this.getWalzen()[1].setPosition('A'); - this.getWalzen()[2].setPosition('A'); - } - //endregion - - //region Setter - /** - * 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); - } - - /** - * 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; - } - - /** - * 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; - } - //endregion - - //region Getter - /** - * Gibt das Objekt des Steckbretts zurück - * - * @return Steckbrett : Das eingesetzte Steckbrett mit seinen Kabeln wenn eingesteckt - */ - public Steckbrett getSteckbrett() { - return steckbrett; - } - - /** - * Liest den Reflektor aus und gibt ihn zurück - * - * @return Reflektor : Objekt des Reflektors - */ - public Reflektor getReflektor() { - return reflektor; - } - - /** - * Gibt die verbauten Walzen Objekte zurück - * - * @return Walze[] : Array mit den Walzen Objekten - */ - public Walze[] getWalzen() { - return this.walzen; - } - //endregion + //region Variablen + /** + * TODO: Dokumentieren + */ + private Walze[] walzen; + private Steckbrett steckbrett; + private Reflektor reflektor; + //endregion + + //region Konstruktor + + /** + * 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]; + } + //endregion + + //region Funktionen & Methoden + + /** + * Setzt eine Walze ein + * + * @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, int ringstellung) { + this.walzen[walze] = new Walze(walzenNr, ringstellung); + } + + /** + * Setzt den Notch der Walze + * + * @param walze : int : Position der Walze + * @param position : int : Umspringpunkt auf der Walze + */ + public void setzeRing(int walze, int position) { + this.walzen[walze].setRingstellung(position); + } + + /** + * Setzt den Startwert (position) der Walze (walze) + * + * @param walze : int : Nummer der Walze + * @param buchstabe : char : Buchstabe der zugewiesen soll + */ + public void setzePosition(int walze, char buchstabe) { + this.walzen[walze].setPosition(buchstabe); + } + + /** + * Verschlüsselt den übergebenen Buchstaben und fügt ihn der Nachricht hinzu + * + * @param buchstabe char : Der zu ver/entschlüsselnde Buchstabe + * @return char : Der ver/entschlüsselte Buchstabe + */ + public char codiere(char buchstabe) { + + new Fehler().debug(this.getClass().getName() + "." + + new Throwable().getStackTrace()[0].getMethodName(), true); + buchstabe = Character.toUpperCase(buchstabe); + String debug = String.format("Positionen: W1:%s W2:%s W3:%s", + this.walzen[0].getPosition(), + this.walzen[1].getPosition(), + this.walzen[2].getPosition()); + debug += "\nI\tS\t3\t2\t1\tR\t1\t2\t3\tS\n" + buchstabe; + + this.dreheWalzen(1); + + buchstabe = this.steckbrett.codiere(Character.toUpperCase(buchstabe)); + debug += "\t" + buchstabe; + buchstabe = this.walzen[2].codiere(buchstabe); + debug += "\t" + buchstabe; + buchstabe = this.walzen[1].codiere(buchstabe); + debug += "\t" + buchstabe; + buchstabe = this.walzen[0].codiere(buchstabe); + debug += "\t" + buchstabe; + buchstabe = this.reflektor.codiere(buchstabe); + debug += "\t" + buchstabe; + buchstabe = this.walzen[0].codiere2(buchstabe); + debug += "\t" + buchstabe; + buchstabe = this.walzen[1].codiere2(buchstabe); + debug += "\t" + buchstabe; + buchstabe = this.walzen[2].codiere2(buchstabe); + debug += "\t" + buchstabe; + buchstabe = this.steckbrett.codiere(buchstabe); + debug += "\t" + buchstabe; + new Fehler().debug(debug, false); + + return buchstabe; + } + + /** + * 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. + */ + public void dreheWalzen(int richtung) { + if (richtung > 0) { + for (int i = 0; i < richtung; i++) { + if (this.walzen[2].dreheWalze(1)) { + if (this.walzen[1].dreheWalze(1)) { + this.walzen[0].dreheWalze(1); + } + } + } + } else { + for (int i = 0; i > richtung; richtung++) { + if (this.walzen[2].dreheWalze(-1)) { + if (this.walzen[1].dreheWalze(-1)) { + this.walzen[0].dreheWalze(-1); + } + } + } + } + } + + /** + * Diese Funktion setzt die Walzen auf ihren Anfangswert zurück. + * Hierfür ist der Buchstabe "A" festgelegt. + * Dies wird benötigt um zB einen neuen Spruchschlüssel einzustellen oder eine neue Nachricht zu verfassen. + */ + public void resetWalzen() { + this.getWalzen()[0].setPosition('A'); + this.getWalzen()[1].setPosition('A'); + this.getWalzen()[2].setPosition('A'); + } + //endregion + + //region Setter + + /** + * 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; + } + //endregion + + //region Getter + + /** + * 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; + } + + /** + * Gibt die verbauten Walzen Objekte zurück + * + * @return Walze[] : Array mit den Walzen Objekten + */ + public Walze[] getWalzen() { + return this.walzen; + } + //endregion }