Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • d.eisold/enigma
  • Janschubi1993/enigma
  • TsunamiKlaus/enigma
  • alfatrainingkurse/java/enigma
  • FloriN/enigma
  • PaoloPinkel/enigma
6 results
Show changes
Commits on Source (113)
Showing
with 1662 additions and 1783 deletions
Praesentation/Screenshot.JPG

84.9 KiB

...@@ -24,4 +24,84 @@ ...@@ -24,4 +24,84 @@
![alt text](Folie13.PNG "Präsentation Folie 13") ![alt text](Folie13.PNG "Präsentation Folie 13")
![alt text](Folie14.PNG "Präsentation Folie 14") ![alt text](Folie14.PNG "Präsentation Folie 14")
\ No newline at end of file
## Der Beginn einer Reise
* [Anforderungskatalog und Planung](https://www.gitrepo.de/alfatrainingkurse/java/enigma/wikis/Anforderungskatalog)
## Ablauf des Projektes
* Wie wurde gearbeitet
* gitrepo.de
* Git
* Was ist Git?
* Repository / Fork
* Funktionen Commit/Push/Pull
* Tickets
* CI/CD
* Welche Probleme sind aufgetreten
* Codierung von Buchstaben (Knoten im Hirn)
* Generierung von Steckbrett Ports
* lampen leuchten lassen
* Abrufen und senden von Nachrichten
* Besondere (für uns) Lösungen
### Zahlen, Daten, Fakten
* Zeilen insgesamt: 3056
* Code: 1619 (53%)
* XML: 110
* Kommentare: 1076 (35%)
* Leerzeilen: 365 (12%)
* Commits: 461
* Merge Requests: 146
* Tickets: 29
* Pipelines 471
## Klassendiagram
![Ablaufdiagram Enigma](http://plantuml.gitrepo.de/png/U9oTM4jpspOGlkjNyDPaNFhGeoVJIU97aedbU2GrpiJrU21gHI820HO0uzHfyjkx8CK7G81Yh8D4xRTOBFODlbIQI5tcR3RJL3E8xk_d7yxEBtzJqIaZIaLdbAIIvFVtV_FPB8euoK4L986eaE8BxFGnS9hc9FgEO1_EnGROdXf5IINBNd9SiHoVulUwJBAMrtpYI9CqEeaernRrWR17u8oaK8EtTnOiAK-L1iPAddeP44nsNq6kAT_KF4b6vEtTxLt3qsC_YXhTdZsto5lGIRP29PHACbRY3p27HOkbDjeuv1GqhXiIRzfp3R55xr13T6cVwDdp5kvn_epKSEFO48F2AtGWt6NmwFrZDidd52H8n-Sxu3oLPL4OxzRsit1EaapI9DD-M1KIVTMvP1fNhKj090R7ve58ey_R_QE59qtmdhInuWPGTL37RqbDdaI5lDWIdi9LS_W0pa4kdQFvmdOacYhSSJbm7rFjzZ1ovHwumZw2t9QGhj68husUcgm7Ggfp40q7ZeA1_xuDbY4MifN9bt713FIZ1lKPS3NmIm7A_3fCA0AsK5bgBK7hQo7TdIHWTZGXus0A-2ReJZLoCiGUOJ6iAXMzKyU7rdwv5efgAjppT1oEu-Bw77vTusW3lf3jqJqrC6vT_5uKMmUY7DKZZ2gps6izr8ZmZSZR0FgbkdC16GFPBpeeyEAlgzFLkmzNzzUByujtdto50BdcvylbgpVdOqneo4myd4if97PD9ko38smAn07Yf5EKV2T9cLlLioi41gwBd2_kFEYKFHjdE1MxxiTeZIfwVCssYiZANCqV9xws33SJ4baMpREbTI29_CLo8o43RtKoZRIH7-YYlkHfUxCllxs82c-aHZOQ4VS8OtaRgWU3IZp5pNCXbKbUry-6D2S5EcabmJozgCF_ztqQ_6djtqeP-8nZPz5jxgx40SuMNebXmjUQeOD6eA7yALPe_UTac1jpKsHr3dTCYjgH4hkBxZL3_n0Y94qf9soSxoWAnfO_LweemPvSgp4S1mxX9Qn1rgsmp-MV2yPx_nH3Ll7is92m8aD1WU7DkGsOIT--OfIIg-0bevNfLBM7VLuD5XxLHV1NHhq_WkLhM8R2DI2CZ5yTlBDQRwmV8Ds4r_DSzzrT_ZO4_KiKZD__6gxZCvm6-9hmtV8VHZKuMOUQUkzXfYfn3edsAkFTyLLHz8H_noZKDFbXpfpWK68yRdvdtGvfWiGt9JqLN4l1S7ZeWLNdTiAWbNaKvOJsNO8ECLTjYu97EtDc0kpZN5iNXbPaTOjR2A5zO1mnGJONd-QNUtJ43DQ1UWQ9wvolRhPBtuGSZmyPFzi1pWfWT5H6jzjJAXDcqrS4etD1ogs7MZfcC1LpWzKcsMceE2oCGMbAARU9m_4zZdBWfKK8ZKLxUyoH_xNcA_YcNSX7ypRhsDkguzxW7hXnnRrUFfaSKi1xh-ZcSM_xGDz9i43dieEI7oYM1KF-Y8Fxsd5n_kzAf2d3gg-ruCh2C2nJ7AHKFIsNuDdtHiYT4mRxsM0X8AVetfNuJ3Bcup3qbMZuaEDGNimnOttrmSfbixxgLxM86rWha5zf0lN2y8NzA39A0MKEKWdpQVBYlxWiukWB-Kgstuv9KJ2Q4EDOKyUQv-5QK-JsIprIX_nsDV2lH9d3XSwx714FbZbl-4wyRyw6WeEDOSeMlNRnT9NVTkzzikwzppXhKDYYTyUHJnUpx5-drFhfWkf9wcG_oHmAY36RrrR4qUhfbculinWS-yUGi9OrAAoxlfn4UL2fZii8wXBOcAJz4rIYUeNWKy7aoEmbDXFpDlr_rhUkvW00 "Ablaufdiagram der Enigma")
## Interesannte Codestellen
* Walze:
* [Konstruktor](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Walze.java#L53)
* Steckbrett
* [setzeVertauschung](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Steckbrett.java#L52)
* [ueberpruefeVertauschung](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Steckbrett.java#L104)
* Codebuch
* [Konstruktor](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Codebuch.java#L59)
* [fetchTagesschluessel](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Codebuch.java#L81)
* Funkraum
* [empfangeFunkspruch](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Funkraum.java#L38)
* [sendeFunkspruch](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Funkraum.java#L90)
* Morsecode
* [Konstruktor](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Morsecode.java#L18)
* [convertBuchstabeToMorsecode](`convertBuchstabeToMorsecode`)
* DatenbankSqlite
* [getCodebuch](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/database/DatenbankSqlite.java#L54)
* Zusammenfassung codiere
* [Codiere Funktion](https://www.gitrepo.de/alfatrainingkurse/java/enigma/snippets/12)
### Ablauf der Codierung
![Ablaufdiagram Codierung](http://plantuml.gitrepo.de/png/U9o5aR4EWZ0GXlS-HHCNwA01Drmm3kegCGx6eT0J21NCSOJ4frTeD35feTCbttVNQ_-u9OdKFJGR2nO9iMjK2GWy8IphN8WDwujI0_T-28LOPgRqZENxZFF8AcI5H7zby46YwYM23I-su_ct54815wbVK7lV8Gb1LgK8H8vRZ2_4DRXDyt26h-ty17SD5JMkLrhwmxa574BW4AR-06h5nyJOaER-VEJRhirb2aEKBJLF5d-K8V8tFTUTQm00 "Ablaufdiagram Codierung")
### Erklärung Datentyp char - String - Enum
* Zuerst char[] (Warum)
* Dann String (Warum)
* Vorteile Enum (Warum)
## Enigma Demo
* Kenngruppe Abfrage
* Testen Kenngruppe Dialog und Fehler
* Enigma
* Senden ohne Nachricht und Fehler
* Empfangen ohne hinterlegte Nachricht und Fehler
* Tagesschlüssel
* Eingabe Nachricht
* Senden einer Nachricht
* Empfang einer Nachricht
* Zurücksetzen
* Setzen von Walzen und Ringen
* Setzen von gleichen Walzen und Fehler
* Senden & Empfangen
## GUI Controller
![Screenshot](Screenshot.JPG "Screenshot der Enigma")
\ No newline at end of file
...@@ -17,3 +17,5 @@ Ebenfalls wichtig ist eure Kenngruppe. Dies hat früher den Personenkreis bezeic ...@@ -17,3 +17,5 @@ Ebenfalls wichtig ist eure Kenngruppe. Dies hat früher den Personenkreis bezeic
Wenn ihr also auf mehreren Clients die selbe Kenngruppe nutzt, dann könnt ihr untereinander eure Nachrichten lesen.\ Wenn ihr also auf mehreren Clients die selbe Kenngruppe nutzt, dann könnt ihr untereinander eure Nachrichten lesen.\
\ \
Im [Wiki](https://www.gitrepo.de/alfatrainingkurse/java/enigma/wikis/home) findet ihr auch noch einige Informationen zu dem Projekt. Im [Wiki](https://www.gitrepo.de/alfatrainingkurse/java/enigma/wikis/home) findet ihr auch noch einige Informationen zu dem Projekt.
![Screenshot](Praesentation/Screenshot.JPG "Screenshot der Enigma")
\ No newline at end of file
doc/Klassendiagram.jpg

144 KiB

File added
...@@ -2,6 +2,7 @@ package projekt.enigma; ...@@ -2,6 +2,7 @@ package projekt.enigma;
import javafx.application.Application; import javafx.application.Application;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.geometry.Insets;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.Label; import javafx.scene.control.Label;
...@@ -20,135 +21,114 @@ import java.io.IOException; ...@@ -20,135 +21,114 @@ import java.io.IOException;
*/ */
public class App extends Application { public class App extends Application {
private static String kenngruppe; /**
private static GuiController gc; * Deklariert den GuiController.
private static int debug; */
private static GuiController gc;
public static void main(String[] args) {
debug = 1; /**
launch(args); * debug : int : fuer die Funktion debug der Klasse Fehler notwendig.
} */
private static int debug;
public static int getDebug() {
return debug; /**
} * Startet die Klasse App und setzt den debug-Wert 1.
*
@Override * @param args : String[] : Standard-Kommandozeilen-Argument.
public void start(Stage primaryStage) throws IOException { */
public static void main(String[] args) {
primaryStage.setTitle("Kenngruppenabfrage"); debug = 0;
launch(args);
Label label1 = new Label("Bitte Kenngruppe eingeben!"); }
label1.setTranslateX(55);
Label l1 = new Label(""); /**
Label l2 = new Label(""); * Gibt der Getter einen int > 0 zurueck, wird eine Meldung auf der Konsole ausgegeben.
TextField tfield = new TextField(); *
Button button1 = new Button("Kenngruppe setzen!"); * @return debug : int : bestimmt die Eingabe der debung-Methode in der Klasse Fehler.
VBox layout1 = new VBox(); */
public static int getDebug() {
layout1.getChildren().addAll(label1, l1, tfield, l2, button1); return debug;
Scene sceKenngruppe = new Scene(layout1, 234, 137); }
FXMLLoader guiLoader = new FXMLLoader(App.class.getResource("gui.fxml")); /**
* Initialisierung der Variablen fuer die JavaFX Scene Kenngruppe.
Scene sceApp = new Scene(guiLoader.load(), 962, 677); * Abfrage der Kenngruppe und Reaktion auf die Eingabe.
*
tfield.setOnKeyPressed(e -> { * @param primaryStage : Stage : Fenster zur Eingabe der Kenngruppe.
if (e.getCode() == KeyCode.ENTER) { * @throws IOException : wird bei fehlerhafter Eingabe geworfen.
if (enter(tfield.getText())) { */
gc = guiLoader.getController(); @Override
gc.setKenngruppe(tfield.getText()); public void start(Stage primaryStage) throws IOException {
primaryStage.setScene(sceApp); primaryStage.setTitle("Enigma");
} else { primaryStage.setResizable(false);
tfield.setText("");
new Fehler().showErrorDialog("error", "Kenngruppe falsch", Label lblEingbae = new Label("Bitte Kenngruppe eingeben!");
"Regeln für die Kenngruppe: 4-8 Zeichen sowie nur Buchstaben von A-Z."); TextField tfEingabe = new TextField();
} Button btnKenngruppe = new Button("Kenngruppe setzen!");
} VBox layout = new VBox();
}); layout.setSpacing(10);
layout.setPadding(new Insets(20, 30, 10, 30));
button1.setOnAction(e -> { btnKenngruppe.setMaxWidth(Double.MAX_VALUE);
if (enter(tfield.getText())) {
gc = guiLoader.getController(); // baut die Scene fuer die Kenngruppenabfrage auf
gc.setKenngruppe(tfield.getText()); layout.getChildren().addAll(lblEingbae, tfEingabe, btnKenngruppe);
primaryStage.setScene(sceApp); Scene sceKenngruppe = new Scene(layout);
} else {
tfield.setText(""); // laden der FXML und der Enigma-Ansicht, um Ladezeiten zu verringern
new Fehler().showErrorDialog("error", "Kenngruppe falsch", FXMLLoader guiLoader = new FXMLLoader(App.class.getResource("gui.fxml"));
"Regeln für die Kenngruppe: 4-8 Zeichen sowie Buchstaben von A-Z."); Scene sceApp = new Scene(guiLoader.load(), 962, 677);
}
}); /*Bestaetigen der Kenngruppe, Ausgabe einer Fehlermeldung im Fall einer falschen Eingabe und starten
des Enigma-Fensters */
primaryStage.setScene(sceKenngruppe); tfEingabe.setOnKeyPressed(e -> {
primaryStage.show(); if (e.getCode() == KeyCode.ENTER) {
} if (enter(tfEingabe.getText())) {
gc = guiLoader.getController();
private boolean enter(String kenngruppe) { gc.setKenngruppe(tfEingabe.getText());
primaryStage.setScene(sceApp);
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; } else {
boolean result = true; tfEingabe.setText("");
new Fehler().showErrorDialog("error", "Kenngruppe falsch",
for (char c : kenngruppe.toUpperCase().toCharArray()) { "Regeln für die Kenngruppe: 4-8 Zeichen sowie nur Buchstaben von A-Z.");
if (!alphabet.contains(String.valueOf(c))) { }
result = false; }
break; });
} btnKenngruppe.setOnAction(e -> {
} if (enter(tfEingabe.getText())) {
if (kenngruppe.length() > 8 || kenngruppe.length() < 4) { gc = guiLoader.getController();
result = false; gc.setKenngruppe(tfEingabe.getText());
} primaryStage.setScene(sceApp);
} else {
return result; tfEingabe.setText("");
} new Fehler().showErrorDialog("error", "Kenngruppe falsch",
"Regeln für die Kenngruppe: 4-8 Zeichen sowie Buchstaben von A-Z.");
// /** }
// * TODO Dokumentieren });
// */ primaryStage.setScene(sceKenngruppe);
// private static Scene scene; primaryStage.show();
// /** }
// * TODO Dokumentieren
// * /**
// * @param fxml * Ueberprueft die Gueltigkeit der Kenngruppeneingabe.
// * @throws IOException * Nur Zeichen von A-Z sind zugelassen und die Kenngruppe muss aus mind. 4 und max. 8 Zeichen bestehen.
// */ *
// static void setRoot(String fxml) throws IOException { * @param kenngruppe : String : Eingabewert aus dem Fenster.
// scene.setRoot(loadFXML(fxml)); * @return result : boolean : ist die Kenngruppe ungueltig wird false zurueckgegeben, sonst true.
// */
// } private boolean enter(String kenngruppe) {
// String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// /** boolean result = true;
// * TODO Dokumentieren
// * for (char c : kenngruppe.toUpperCase().toCharArray()) {
// * @param fxml if (!alphabet.contains(String.valueOf(c))) {
// * @return result = false;
// * @throws IOException break;
// */ }
// private static Parent loadFXML(String fxml) throws IOException { }
// FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml")); if ((kenngruppe.length() > 8) || (kenngruppe.length() < 4)) {
// return fxmlLoader.load(); result = false;
// } }
//
// /** return result;
// * TODO Dokumentieren }
// *
// * @param args
// */
// public static void main(String[] args) {
// Application.launch();
// }
//
// /**
// * TODO Dokumentieren
// *
// * @param stage
// * @throws IOException
// */
// @Override
// public void start(Stage stage) throws IOException {
// scene = new Scene(loadFXML("kenngruppe"));
// stage.setScene(scene);
// stage.setResizable(true);
// stage.show();
// }
} }
package projekt.enigma; package projekt.enigma;
import javafx.collections.FXCollections; import javafx.beans.value.ChangeListener;
import javafx.collections.ObservableList; import javafx.beans.value.ObservableValue;
import javafx.concurrent.Task; import javafx.concurrent.Task;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseEvent; import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import javafx.scene.shape.Circle; import javafx.scene.shape.Circle;
import javafx.stage.StageStyle; import javafx.stage.StageStyle;
import org.apache.http.HttpException;
import org.controlsfx.control.CheckComboBox;
import org.controlsfx.dialog.ProgressDialog; import org.controlsfx.dialog.ProgressDialog;
import projekt.enigma.model.Codierer; import projekt.enigma.model.Codierer;
import projekt.enigma.model.Fehler; import projekt.enigma.model.Fehler;
import projekt.enigma.view.ChkBoxGridPane;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
public class GuiController { public class GuiController {
//region Klassenvariablen //region Klassenvariablen
private final static String[] walzenNr = {"I", "II", "III", "IV", "V"}; private final static String[] walzenNr = {"I", "II", "III", "IV", "V"};
private final static String[] ringNr = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26"}; private final static String[] ringNr = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14",
private final static String[] position = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26"};
private ArrayList<MenuItem> mItem; private final static String[] position = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N",
private String textEingabe; "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
private String textCodiert; @FXML
private boolean resetDisplay; private static ToggleButton[] tBtnPort;
private Codierer codierer; private String[] empfangeneNachricht;
private char chiffrierterBuchstabe; private String textEingabe;
private String[] empfangeneNachricht; private String textCodiert;
//deklariert die benötigten Textfelder private char chiffrierterBuchstabe;
@FXML private boolean resetDisplay;
private TextField tfStecker1, tfStecker2, tfStecker3, tfStecker4, tfStecker5, tfStecker6, tfStecker7, tfStecker8, private Codierer codierer;
tfStecker9, tfStecker10, tfCodiert, tfKlartext;
//endregion //region GUI-Elemente
//deklariert die benötigten Buttons
//region GUI-Elemente @FXML
private Button btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN, btnO, btnP, btnQ,
//deklariert die benötigten Buttons btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ, btnSenden, btnEmpfangen, btnDelete, btnReset;
@FXML @FXML
private Button btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN, btnO, btnP, btnQ, private Button[] btnArray;
btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ, btnSenden, btnEmpfangen, btnDelete, btnReset; //endregion
//deklariert die benötigten Kreise //deklariert die benötigten Kreise
@FXML @FXML
private Circle circA, circB, circC, circD, circE, circF, circG, circH, circI, circJ, circK, circL, circM, circN, private Circle circA, circB, circC, circD, circE, circF, circG, circH, circI, circJ, circK, circL, circM, circN,
circO, circP, circQ, circR, circS, circT, circU, circV, circW, circX, circY, circZ; circO, circP, circQ, circR, circS, circT, circU, circV, circW, circX, circY, circZ;
//deklariert die benötigten Label //deklariert die benötigten Label
@FXML @FXML
private Label lblA, lblB, lblC, lblD, lblE, lblF, lblG, lblH, lblI, lblJ, lblK, lblL, lblM, lblN, lblO, lblP, lblQ, private Label lblSpruchschluessel, lblKenngruppe;
lblR, lblS, lblT, lblU, lblV, lblW, lblX, lblY, lblZ, lblLadeNachricht, lblTagesschluessel, //deklariert die MenueButtons
lblSpruchschluessel; @FXML
//deklariert die ProgressBar private MenuButton mBtnWalzPos1, mBtnWalzPos2, mBtnWalzPos3, mBtnNotchPos1, mBtnNotchPos2, mBtnNotchPos3,
@FXML mBtnStartPos1, mBtnStartPos2, mBtnStartPos3;
private ProgressBar pbLadeNachricht; //deklariert die benötigten Textfelder
//deklariert die MenueButtons @FXML
@FXML private TextArea tfCodiert, tfKlartext;
private MenuButton mBtnWalzPos1, mBtnWalzPos2, mBtnWalzPos3, mBtnNotchPos1, mBtnNotchPos2, mBtnNotchPos3, //deklariert benötigtes GridPane
mBtnStartPos1, mBtnStartPos2, mBtnStartPos3; @FXML
private ChkBoxGridPane[] chkBoxGridPane;
@FXML @FXML
private GridPane mainGrid; private GridPane mainGrid;
@FXML
private static final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private AnchorPane anchorPane;
//endregion /**
* Initialisiert die Elemente GUI und setzt deren Startwerte
//region Init */
@FXML
/** void initialize() {
* Initialisiert die Elemente GUI und setzt deren Startwerte // Variablen setzen
*/ textEingabe = "";
@FXML textCodiert = "";
void initialize() { resetDisplay = true;
// Variablen setzen //Einträge für Walzen
textEingabe = ""; menu(mBtnWalzPos1, walzenNr);
textCodiert = ""; menu(mBtnWalzPos2, walzenNr);
resetDisplay = true; menu(mBtnWalzPos3, walzenNr);
//Einträge für Walzen //Einträge für die Ringe
menu(mBtnWalzPos1, walzenNr); menu(mBtnNotchPos1, ringNr);
menu(mBtnWalzPos2, walzenNr); menu(mBtnNotchPos2, ringNr);
menu(mBtnWalzPos3, walzenNr); menu(mBtnNotchPos3, ringNr);
//Einträge für die Ringe //Einträge für die Startpositionen
menu(mBtnNotchPos1, ringNr); menu(mBtnStartPos1, position);
menu(mBtnNotchPos2, ringNr); menu(mBtnStartPos3, position);
menu(mBtnNotchPos3, ringNr); menu(mBtnStartPos2, position);
btnArray = new Button[]{btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN,
//Einträge für die Startpositionen btnO, btnP, btnQ, btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ};
menu(mBtnStartPos1, position);
menu(mBtnStartPos3, position); tfKlartext.textProperty().addListener((ChangeListener<Object>) (observableValue, o, t1) ->
menu(mBtnStartPos2, position); tfKlartext.setScrollTop(Double.MAX_VALUE));
} tfCodiert.textProperty().addListener((ChangeListener<Object>) (observableValue, o, t1) ->
tfCodiert.setScrollTop(Double.MAX_VALUE));
/** }
* Für das Steckbrett müssen zehn CheckComboBoxen erstellt werden. //endregion
* Hier wird die Funktion zum erstellen und Befüllen der Boxen, die Funktion zehn mal aufgerufen.
*/ //region Init
private void generateSteckbrett() {
/**
for (int i = 0; i <= 9; i++) { * init Methode zur Erstellung der Einträge und Action Listener für die einzelnen Menüs
this.createSteckbrettPort(i); *
} * @param button : Button für die die Einträge erstellt werden sollen
} */
private void menu(MenuButton button, String[] str) {
/** ArrayList<MenuItem> mItem = new ArrayList<>();
* Die Funktion createSteckbrettPort erstellt zehn CheckComboBoxen, holt sich die verfügbaren Buchstaben,
* die bereits gesteckten Kabel und weißt sie zu. for (int i = 0; i < str.length; i++) {
* Im Anschluss werden die CheckComboBoxen auf dem GridPane positioniert. // Eintrag aus str der Arraylist mi hinzufügen
* mItem.add(new MenuItem(str[i]));
* @param port : int : Kabel Nummer (0-9) // MenuItem mi dem Button button hinzufügen
*/ button.getItems().add(mItem.get(i));
private void createSteckbrettPort(int port) { int finalI = i;
// Listener für die einzelnen Einträge
// Item Liste anlegen mItem.get(i).setOnAction(e -> setMenuBtnText(button, mItem.get(finalI)));
ObservableList<Character> items = FXCollections.observableArrayList(); }
}
// Holt die verfügbaren Buchstaben für diesen Port ab und erstellt ein char Array daraus
char[] verfuegbareBuchstaben = this.codierer.fetchVerfuegbareBuchstaben(port).toCharArray(); /**
* Erzeugt Buttons um die Steckverbindungen zu auszuwählen
// Sortiert das Array nach dem Alphabet */
Arrays.sort(verfuegbareBuchstaben); private void myToggleButtons() {
if (chkBoxGridPane != null) {
StringBuilder sb = new StringBuilder(); for (ChkBoxGridPane boxGridPane : chkBoxGridPane) {
anchorPane.getChildren().remove(boxGridPane);
/** }
* Die Buchstaben in die CheckComboBox laden und zusätzlich in einen String um später den }
* Index des Buchstaben auslesen zu können chkBoxGridPane = new ChkBoxGridPane[10];
*/
for (char c : verfuegbareBuchstaben) { final ToggleGroup cabelConnect = new ToggleGroup();
items.add(c); tBtnPort = new ToggleButton[chkBoxGridPane.length];
sb.append(c);
} for (int i = 0; i < chkBoxGridPane.length; i++) {
tBtnPort[i] = new ToggleButton(this.codierer.fetchSteckverbindungen()[i][0] + "" +
// Eine CheckComboBox erstellen this.codierer.fetchSteckverbindungen()[i][1]);
CheckComboBox<Character> ccb = new CheckComboBox<Character>(items); tBtnPort[i].setToggleGroup(cabelConnect);
tBtnPort[i].setMinWidth(50.0);
// Die CheckComboBox dem GridPane in der Oberfläche zuordnen GridPane.setHalignment(tBtnPort[i], HPos.CENTER);
mainGrid.add(ccb, 1 + port, 8); mainGrid.add(tBtnPort[i], i + 1, 8);
this.createPortPane(i);
// Die Gesteckten Buchstaben in der CheckComboBox selektieren chkBoxGridPane[i].setVisible(false);
ccb.getCheckModel().check(sb.toString().indexOf(this.codierer.fetchSteckverbindungen()[port][0])); }
ccb.getCheckModel().check(sb.toString().indexOf(this.codierer.fetchSteckverbindungen()[port][1])); // ToggleButtonGroup Listener
} cabelConnect.selectedToggleProperty().
addListener((observable, oldValue, newValue) -> {
/**
* init Methode zur Erstellung der Einträge und Action Listener für die einzelnen Menüs for (int j = 0; j < chkBoxGridPane.length; j++) {
*
* @param button : Button für die die Einträge erstellt werden sollen if (cabelConnect.getSelectedToggle() == tBtnPort[j]) {
*/ this.createPortPane(j);
private void menu(MenuButton button, String[] str) { } else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) {
mItem = new ArrayList<>(); if (chkBoxGridPane[j] != null) {
for (int i = 0; i < str.length; i++) { chkBoxGridPane[j].setVisible(false);
//Eintrag aus str der Arraylist mi hinzufügen }
mItem.add(new MenuItem(str[i])); }
//MenuItem mi dem Button button hinzufügen }
button.getItems().add(mItem.get(i)); });
int finalI = i; }
//Listener für die einzelnen Einträge
ArrayList<MenuItem> finalMi = mItem; /**
mItem.get(i).setOnAction(e -> setMenuBtnText(button, finalMi.get(finalI))); * Erstellt ein GridPane mit CheckBoxen an der Position des übergebenen port
} *
} * @param port => entspricht der Position des gewählten ToggleButton
//endregion */
private void createPortPane(int port) {
//region EventHandler/Listener
if (chkBoxGridPane[port] != null) {
/** anchorPane.getChildren().remove(chkBoxGridPane[port]);
* Wird ausgelöst wenn der gedrückte Button losgelassen wird. }
* Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf grau, chkBoxGridPane[port] = new ChkBoxGridPane(
* durch Aufruf der Methode leuchten. this.codierer,
* port,
* @param e => übergibt den zuletzt losgelassenen Button tBtnPort[port]);
*/ chkBoxGridPane[port].setVisible(false);
@FXML chkBoxGridPane[port].setStyle("-fx-background-color: white; -fx-border-color: black;");
void tasteRauf(MouseEvent e) { chkBoxGridPane[port].setPrefHeight(chkBoxGridPane[port].getCharSize() * 22);
if (e.getSource() == btnA) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); chkBoxGridPane[port].setPrefWidth(85.0);
if (e.getSource() == btnB) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); chkBoxGridPane[port].setPadding(new Insets(10, 10, 10, 10));
if (e.getSource() == btnC) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); chkBoxGridPane[port].setAlignment(Pos.CENTER);
if (e.getSource() == btnD) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); chkBoxGridPane[port].setLayoutX(
if (e.getSource() == btnE) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); (anchorPane.getWidth() / 12) * (port + 1) -
if (e.getSource() == btnF) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); ((chkBoxGridPane[port].getPrefWidth() - anchorPane.getWidth() / 12) / 2));
if (e.getSource() == btnG) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); chkBoxGridPane[port].setLayoutY(
if (e.getSource() == btnH) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); mainGrid.getLayoutY() + ((anchorPane.getHeight() -
if (e.getSource() == btnI) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); mainGrid.getLayoutY()) / 10 * 9) - chkBoxGridPane[port].getPrefHeight() - 15);
if (e.getSource() == btnJ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnK) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); anchorPane.getChildren().add(chkBoxGridPane[port]);
if (e.getSource() == btnL) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); chkBoxGridPane[port].setVisible(true);
if (e.getSource() == btnM) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); }
if (e.getSource() == btnN) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnO) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); /**
if (e.getSource() == btnP) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); * Wird ausgelöst wenn der gedrückte Button losgelassen wird.
if (e.getSource() == btnQ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); * Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf grau,
if (e.getSource() == btnR) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); * durch Aufruf der Methode leuchten.
if (e.getSource() == btnS) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); *
if (e.getSource() == btnT) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); * @param e => übergibt den zuletzt losgelassenen Button
if (e.getSource() == btnU) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); */
if (e.getSource() == btnV) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); @FXML
if (e.getSource() == btnW) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); void tasteRauf(MouseEvent e) {
if (e.getSource() == btnX) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); for(Button btn : btnArray) {
if (e.getSource() == btnY) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); if (e.getSource() == btn) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
if (e.getSource() == btnZ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS); }
} }
//endregion
/**
* Wird ausgelöst sobald eine Taste gedrückt wird (beim drücken der Taste) //region EventHandler/Listener
* Auswertung welche Buchstaben-Taste gedrückt ist.
* Übergabe des entspechenden Buchstaben als Parameter der Methode setText welche den chiffrierten Buchstaben /**
* in der Klassen-Variablen chiffrierterBuchstabe ablegt. * Wird ausgelöst sobald eine Taste gedrückt wird (beim drücken der Taste)
* Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf gelb * Auswertung welche Buchstaben-Taste gedrückt ist.
* * Übergabe des entspechenden Buchstaben als Parameter der Methode setText welche den chiffrierten Buchstaben
* @param e => übergibt den momentan gedrückten Buttons * in der Klassen-Variablen chiffrierterBuchstabe ablegt.
*/ * Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf gelb
@FXML *
void tasteRunter(MouseEvent e) { * @param e => übergibt den momentan gedrückten Buttons
if (e.getSource() == btnA) { */
setText(btnA); @FXML
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN); void tasteRunter(MouseEvent e) {
} for(Button btn : btnArray) {
if (e.getSource() == btnB) { if (e.getSource() == btn) {
setText(btnB); if (setText(btn)) {
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN); leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnC) {
setText(btnC);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnD) {
setText(btnD);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnE) {
setText(btnE);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnF) {
setText(btnF);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnG) {
setText(btnG);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnH) {
setText(btnH);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnI) {
setText(btnI);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnJ) {
setText(btnJ);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnK) {
setText(btnK);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnL) {
setText(btnL);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnM) {
setText(btnM);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnN) {
setText(btnN);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnO) {
setText(btnO);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnP) {
setText(btnP);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnQ) {
setText(btnQ);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnR) {
setText(btnR);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnS) {
setText(btnS);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnT) {
setText(btnT);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnU) {
setText(btnU);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnV) {
setText(btnV);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnW) {
setText(btnW);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnX) {
setText(btnX);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnY) {
setText(btnY);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
if (e.getSource() == btnZ) {
setText(btnZ);
leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
}
}
/**
* Auswertung welcher Button (senden, empfangen oder löschen) gedrückt wurde.
* Funktionsaufruf entsprechend des gedrückten Button
*
* @param e => ActionEvent des auslösenden Button
*/
@FXML
private void gedrueckteTaste(ActionEvent e) {
if (e.getSource() == btnSenden) {
if (tfCodiert.getText().equals("")) {
new Fehler().showErrorDialog("warning", "Haben Sie heute nichts zu sagen?",
"Nutzung von militärischer Infrastruktur ohne Grund ist verboten.");
} else {
sendeFunkspruch();
}
}
if (e.getSource() == btnEmpfangen) empfangeFunkspruch();
if (e.getSource() == btnDelete) loeschen();
if (e.getSource() == btnReset) {
codierer.resetHardware();
this.resetDisplay = true;
this.setzeTagesSchluessel();
}
}
//endregion
//region Methoden
/**
* Setzt die Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb bzw. auf grau.
*
* @param leuchte => gibt an welcher Kreis (chiffrierter Buchstabe) den Hintergrund ändern soll
* @param shiningLetter => "AN" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb
* "AUS" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf grau
*/
private void leuchten(Circle leuchte, BUCHSTABE_LEUCHTET shiningLetter) {
if (shiningLetter == BUCHSTABE_LEUCHTET.AN) leuchte.setStyle("-fx-fill: #FFA500");
else if (shiningLetter == BUCHSTABE_LEUCHTET.AUS) {
leuchte.setStyle("-fx-background-color: grey");
leuchte.setStyle("-fx-border-color: #000000");
}
}
/**
* Gibt den Buchstabenkreis entsprechend des chiffrierten Buchstabens zurück
*
* @param chiffLetter => chiffrierter Buchstabe
* @return => Kreis des chiffrierten Buchstabens (der leuchten soll)
*/
private Circle chiffCircle(char chiffLetter) {
switch (chiffLetter) {
case 'A':
return circA;
case 'B':
return circB;
case 'C':
return circC;
case 'D':
return circD;
case 'E':
return circE;
case 'F':
return circF;
case 'G':
return circG;
case 'H':
return circH;
case 'I':
return circI;
case 'J':
return circJ;
case 'K':
return circK;
case 'L':
return circL;
case 'M':
return circM;
case 'N':
return circN;
case 'O':
return circO;
case 'P':
return circP;
case 'Q':
return circQ;
case 'R':
return circR;
case 'S':
return circS;
case 'T':
return circT;
case 'U':
return circU;
case 'V':
return circV;
case 'W':
return circW;
case 'X':
return circX;
case 'Y':
return circY;
case 'Z':
return circZ;
}
return null;
}
/**
* Methode zum setzen des menuButton Textes auf das ausgewählte MenuItem
*
* @param mBtn : MenuButton der Walze
* @param mItm : MenuItem
*/
private void setMenuBtnText(MenuButton mBtn, MenuItem mItm) {
if (mBtn.getId().equals(mBtnStartPos1.getId())) setzePosition(1, mItm.getText().charAt(0));
if (mBtn.getId().equals(mBtnStartPos2.getId())) setzePosition(2, mItm.getText().charAt(0));
if (mBtn.getId().equals(mBtnStartPos3.getId())) setzePosition(3, mItm.getText().charAt(0));
if (mBtn.getId().equals(mBtnWalzPos1.getId())) setzeWalze(1, mItm.getText());
if (mBtn.getId().equals(mBtnWalzPos2.getId())) setzeWalze(2, mItm.getText());
if (mBtn.getId().equals(mBtnWalzPos3.getId())) setzeWalze(3, mItm.getText());
if (mBtn.getId().equals(mBtnNotchPos1.getId()))
setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
if (mBtn.getId().equals(mBtnNotchPos2.getId()))
setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
if (mBtn.getId().equals(mBtnNotchPos3.getId()))
setzeRing(3, Integer.parseInt(mItm.getText()) - 1);
tfCodiert.setText("");
tfKlartext.setText("");
}
/**
* Hier werden die TextFelder, welche die Steckverbindungen darstellen,
* mit dem Werten die die Klasse Codierer zur Verfügung stellt gefüllt.
*/
private void setzeSteckverbindungen() {
tfStecker1.setText(codierer.fetchSteckverbindungen()[0][0] + "" + codierer.fetchSteckverbindungen()[0][1]);
tfStecker2.setText(codierer.fetchSteckverbindungen()[1][0] + "" + codierer.fetchSteckverbindungen()[1][1]);
tfStecker3.setText(codierer.fetchSteckverbindungen()[2][0] + "" + codierer.fetchSteckverbindungen()[2][1]);
tfStecker4.setText(codierer.fetchSteckverbindungen()[3][0] + "" + codierer.fetchSteckverbindungen()[3][1]);
tfStecker5.setText(codierer.fetchSteckverbindungen()[4][0] + "" + codierer.fetchSteckverbindungen()[4][1]);
tfStecker6.setText(codierer.fetchSteckverbindungen()[5][0] + "" + codierer.fetchSteckverbindungen()[5][1]);
tfStecker7.setText(codierer.fetchSteckverbindungen()[6][0] + "" + codierer.fetchSteckverbindungen()[6][1]);
tfStecker8.setText(codierer.fetchSteckverbindungen()[7][0] + "" + codierer.fetchSteckverbindungen()[7][1]);
tfStecker9.setText(codierer.fetchSteckverbindungen()[8][0] + "" + codierer.fetchSteckverbindungen()[8][1]);
tfStecker10.setText(codierer.fetchSteckverbindungen()[9][0] + "" + codierer.fetchSteckverbindungen()[9][1]);
}
/**
* Die Löschen Funktion löscht das letzte Zeichen im Klartext sowie im Codiert Feld,
* der Codierer wird aufgerufen um ebenfalls das letzte Zeichen zu löschen
*/
private void loeschen() {
if (textEingabe.length() == 0) {
tfKlartext.setText("");
tfCodiert.setText("");
} else {
textEingabe = textEingabe.substring(0, textEingabe.length() - 1);
textCodiert = textCodiert.substring(0, textCodiert.length() - 1);
tfKlartext.setText(textEingabe);
tfCodiert.setText(textCodiert);
codierer.letztesZeichenLoeschen();
mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
}
}
/**
* Holt Nachricht von Klasse Codierer und setzt den chiffrierten Text in das Textfeld tfCodiert,
* sowie den Klartext in das Textfeld tfKlartext. Setzt den Spruchschlüssel
*/
private void empfangeFunkspruch() {
progressDialogue("rx");
try {
if (this.empfangeneNachricht[2] != null && this.empfangeneNachricht[1] != null) {
setzeTagesSchluessel();
tfKlartext.setText(this.empfangeneNachricht[2]);
tfCodiert.setText(this.empfangeneNachricht[1]);
resetDisplay = true;
// Spruchschluessel in das Feld lblSpruchschluessel schreiben
lblSpruchschluessel.setText(codierer.empfangenerSpruchschluessel(this.empfangeneNachricht[2]));
}
} catch (NullPointerException ignored) {
new Fehler().showErrorDialog(
"warning",
"Keiner schreibt dir...",
"Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
}
}
/**
* Senden der Nachricht mit Hilfe der Klasse Codierer
* Löscht die Textfelder tfKlartext und tfCodiert
*/
private void sendeFunkspruch() {
this.tfKlartext.setText("");
this.tfCodiert.setText("");
progressDialogue("tx");
}
private void progressDialogue(String strRxTx) {
Task copyWorker = createWorker(strRxTx);
ProgressDialog dialog = new ProgressDialog(copyWorker);
dialog.initStyle(StageStyle.TRANSPARENT);
dialog.setGraphic(null);
dialog.initStyle(StageStyle.TRANSPARENT);
dialog.setTitle("Kommunikation zum Funkraum");
if (strRxTx.equals("rx")) {
dialog.setContentText("Empfange Nachricht");
} else if (strRxTx.equals("tx")) {
dialog.setContentText("Sende Nachricht");
}
dialog.setHeaderText(null);
dialog.setGraphic(null);
dialog.initStyle(StageStyle.UTILITY);
new Thread(copyWorker).start();
dialog.showAndWait();
}
public Task createWorker(String strRxTx) {
return new Task() {
@Override
protected Object call() throws Exception {
if (strRxTx.equals("rx")) {
empfangeneNachricht = codierer.empfangeNachricht();
} else if (strRxTx.equals("tx")) {
try {
codierer.sendeNachricht();
} catch (HttpException | IOException e) {
e.printStackTrace();
}
} }
return true;
} }
};
}
/**
* Schreibt Buchstaben des gedrückten Button in Textfeld tfKlartext.
* Übergabe des Buchstaben vom gedrückten Button an die Klasse Codierer
* Ablegen des chiffrierten Buchstaben in der char Variable chiffrierterBuchstabe
* Hinzufügen des chiffrierten Buchstaben in Textfeld tfCodiert
* Aktualisierung der Walzenstellung
*
* @param pressedButton : gedrückter Knopf
*/
private void setText(Button pressedButton) {
if (textEingabe.length() < 250) {
if (this.resetDisplay) {
this.tfCodiert.setText("");
this.tfKlartext.setText("");
this.resetDisplay = false;
this.codierer.resetHardware();
textCodiert = "";
textEingabe = "";
// Spruchschlüssel generieren und codieren
this.codierer.generateSpruchschluessel();
// Spruchschluessel in das Feld lblSpruchschluessel schreiben
lblSpruchschluessel.setText(this.codierer.getSpruchschluessel());
}
textEingabe += pressedButton.getText();
chiffrierterBuchstabe = codierer.codiere(pressedButton.getText().charAt(0), true);
textCodiert += chiffrierterBuchstabe;
tfKlartext.setText(textEingabe);
tfCodiert.setText(textCodiert);
// Position der Walzen aktuallisieren
mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
}
}
/**
* 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
*/
private void setzeWalze(int walzenPosition, String walzeRoemischNr) {
int walzeNr = 0;
switch (walzeRoemischNr) {
case "I":
walzeNr = 0;
break;
case "II":
walzeNr = 1;
break;
case "III":
walzeNr = 2;
break;
case "IV":
walzeNr = 4;
break;
case "V":
walzeNr = 4;
break;
default:
break;
}
switch (walzenPosition) {
case 1:
mBtnWalzPos1.setText(walzenNr[walzeNr]);
break;
case 2:
mBtnWalzPos2.setText(walzenNr[walzeNr]);
break;
case 3:
mBtnWalzPos3.setText(walzenNr[walzeNr]);
break;
default:
break;
}
}
/**
* Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
* -> d.h. welche Walze sitzt auf welcher Position
*
* @param walzenPosition => gibt die Position der Walze
* @param walzeNr => gibt die Walzennummer an
*/
private void setzeWalze(int walzenPosition, int walzeNr) {
//int walzeNr = 0;
switch (walzeNr) {
case 1:
walzeNr = 0;
break;
case 2:
walzeNr = 1;
break;
case 3:
walzeNr = 2;
break;
case 4:
walzeNr = 3;
break;
case 5:
walzeNr = 4;
break;
default:
break;
}
switch (walzenPosition) {
case 1:
mBtnWalzPos1.setText(walzenNr[walzeNr]);
//codierer.setWalze(walzeNr, walzenPosition)
break;
case 2:
mBtnWalzPos2.setText(walzenNr[walzeNr]);
break;
case 3:
mBtnWalzPos3.setText(walzenNr[walzeNr]);
break;
default:
break;
}
}
/**
* Setzt den Notch (position)=> die Mitnahmeposition der Walze (walze) fest
* Mitnahmeposition meint => die nächste Walze wird bei erreichen dieser Position (notch)
* um eine Stelle versetzt
*
* @param ringStellung => gibt die walze an
* @param walzenPosition => gibt den notch der Walze (walze) an
*/
private void setzeRing(int walzenPosition, int ringStellung) {
switch (walzenPosition) {
case 1:
mBtnNotchPos1.setText(ringNr[ringStellung]);
break;
case 2:
mBtnNotchPos2.setText(ringNr[ringStellung]);
break;
case 3:
mBtnNotchPos3.setText(ringNr[ringStellung]);
break;
default:
break;
}
}
/**
* Setzt die Startposition/ aktuelle Position der Walze
*
* @param walze => gibt die walze an
* @param buchstabe gibt den Startwert bzw die aktuelle Position der Walze (walze) an
*/
private void setzePosition(int walze, char buchstabe) {
switch (walze) {
case 1:
mBtnStartPos1.setText(String.valueOf(buchstabe));
break;
case 2:
mBtnStartPos2.setText(buchstabe + "");
break;
case 3:
mBtnStartPos3.setText(buchstabe + "");
break;
default:
break;
} }
} }
/** /**
* Setzt den aktuellen TagesSchluessel und zeigt diesen in der GUI an * Auswertung welcher Button (senden, empfangen oder löschen) gedrückt wurde.
*/ * Funktionsaufruf entsprechend des gedrückten Button
private void setzeTagesSchluessel() { *
* @param e => ActionEvent des auslösenden Button
// Umsprungpunkte anzeigen */
mBtnNotchPos1.setText(String.valueOf(codierer.fetchRingstellung()[0])); @FXML
mBtnNotchPos2.setText(String.valueOf(codierer.fetchRingstellung()[1])); private void gedrueckteTaste(ActionEvent e) {
mBtnNotchPos3.setText(String.valueOf(codierer.fetchRingstellung()[2])); if (e.getSource() == btnSenden) {
if (tfCodiert.getText().equals("")) {
// Walzennummern anzeigen new Fehler().showErrorDialog("warning", "Haben Sie heute nichts zu sagen?",
setzeWalze(1, codierer.fetchWalzenNr()[0]); "Nutzung von militärischer Infrastruktur ohne Grund ist verboten.");
setzeWalze(2, codierer.fetchWalzenNr()[1]); } else {
setzeWalze(3, codierer.fetchWalzenNr()[2]); sendeFunkspruch();
}
// Position der Walzen anzeigen }
mBtnStartPos1.setText(String.valueOf(codierer.fetchWalzen()[0])); if (e.getSource() == btnEmpfangen) empfangeFunkspruch();
mBtnStartPos2.setText(String.valueOf(codierer.fetchWalzen()[1])); if (e.getSource() == btnDelete) loeschen();
mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2])); if (e.getSource() == btnReset) {
codierer.resetHardware();
// Steckbrett Felder setzen this.resetDisplay = true;
this.lblSpruchschluessel.setText("");
// Setzt das Steckbrett this.setzeTagesSchluessel();
generateSteckbrett(); }
}
/*
tfStecker1.setText(codierer.fetchSteckverbindungen()[0][0] + "" + /**
codierer.fetchSteckverbindungen()[0][1]); * Setzt die Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb bzw. auf grau.
tfStecker2.setText(codierer.fetchSteckverbindungen()[1][0] + "" + *
codierer.fetchSteckverbindungen()[1][1]); * @param leuchte => gibt an welcher Kreis (chiffrierter Buchstabe) den Hintergrund ändern soll
tfStecker3.setText(codierer.fetchSteckverbindungen()[2][0] + "" + * @param shiningLetter => "AN" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb
codierer.fetchSteckverbindungen()[2][1]); * "AUS" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf grau
tfStecker4.setText(codierer.fetchSteckverbindungen()[3][0] + "" + */
codierer.fetchSteckverbindungen()[3][1]); private void leuchten(Circle leuchte, BUCHSTABE_LEUCHTET shiningLetter) {
tfStecker5.setText(codierer.fetchSteckverbindungen()[4][0] + "" + if (shiningLetter == BUCHSTABE_LEUCHTET.AN) leuchte.setStyle("-fx-fill: #FFA500");
codierer.fetchSteckverbindungen()[4][1]); else if (shiningLetter == BUCHSTABE_LEUCHTET.AUS) {
tfStecker6.setText(codierer.fetchSteckverbindungen()[5][0] + "" + leuchte.setStyle("-fx-background-color: grey");
codierer.fetchSteckverbindungen()[5][1]); leuchte.setStyle("-fx-border-color: #000000");
tfStecker7.setText(codierer.fetchSteckverbindungen()[6][0] + "" + }
codierer.fetchSteckverbindungen()[6][1]); }
tfStecker8.setText(codierer.fetchSteckverbindungen()[7][0] + "" + //endregion
codierer.fetchSteckverbindungen()[7][1]);
tfStecker9.setText(codierer.fetchSteckverbindungen()[8][0] + "" + //region Methoden
codierer.fetchSteckverbindungen()[8][1]);
tfStecker10.setText(codierer.fetchSteckverbindungen()[9][0] + "" + /**
codierer.fetchSteckverbindungen()[9][1]);*/ * Gibt den Buchstabenkreis entsprechend des chiffrierten Buchstabens zurück
this.textCodiert = ""; *
this.textEingabe = ""; * @param chiffLetter => chiffrierter Buchstabe
this.tfKlartext.setText(""); * @return => Kreis des chiffrierten Buchstabens (der leuchten soll)
this.tfCodiert.setText(""); */
} private Circle chiffCircle(char chiffLetter) {
switch (chiffLetter) {
private enum BUCHSTABE_LEUCHTET {AN, AUS} case 'A':
return circA;
public void setKenngruppe(String kenngruppe) { case 'B':
return circB;
// Initialisieren des Codierers und setzen der Kenngruppe case 'C':
codierer = new Codierer(kenngruppe); return circC;
case 'D':
this.codierer.resetHardware(); return circD;
case 'E':
// Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden. return circE;
resetDisplay = true; case 'F':
return circF;
// Einstellungen aus dem Logbuch auslesen und setzen case 'G':
setzeTagesSchluessel(); return circG;
setzeSteckverbindungen(); case 'H':
} return circH;
//endregion case 'I':
return circI;
case 'J':
return circJ;
case 'K':
return circK;
case 'L':
return circL;
case 'M':
return circM;
case 'N':
return circN;
case 'O':
return circO;
case 'P':
return circP;
case 'Q':
return circQ;
case 'R':
return circR;
case 'S':
return circS;
case 'T':
return circT;
case 'U':
return circU;
case 'V':
return circV;
case 'W':
return circW;
case 'X':
return circX;
case 'Y':
return circY;
case 'Z':
return circZ;
}
return null;
}
/**
* Methode zum setzen des menuButton Textes auf das ausgewählte MenuItem
*
* @param mBtn : MenuButton der Walze
* @param mItm : MenuItem
*/
private void setMenuBtnText(MenuButton mBtn, MenuItem mItm) {
if (mBtn.getId().equals(mBtnStartPos1.getId())) {
setzePosition(1, mItm.getText().charAt(0));
this.codierer.setzeWalzenPosition(0, mItm.getText().charAt(0));
}
if (mBtn.getId().equals(mBtnStartPos2.getId())) {
setzePosition(2, mItm.getText().charAt(0));
this.codierer.setzeWalzenPosition(1, mItm.getText().charAt(0));
}
if (mBtn.getId().equals(mBtnStartPos3.getId())) {
setzePosition(3, mItm.getText().charAt(0));
this.codierer.setzeWalzenPosition(2, mItm.getText().charAt(0));
}
if (mBtn.getId().equals(mBtnWalzPos1.getId())) {
setzeWalze(1, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(0,
convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos1.getText().charAt(0));
} else {
setzeWalze(1, convertZahlToRoemisch(this.codierer.fetchWalzenNr(0)));
new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
}
}
if (mBtn.getId().equals(mBtnWalzPos2.getId())) {
setzeWalze(2, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(1,
convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos2.getText().charAt(0));
} else {
setzeWalze(2, convertZahlToRoemisch(this.codierer.fetchWalzenNr(1)));
new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
}
}
if (mBtn.getId().equals(mBtnWalzPos3.getId())) {
setzeWalze(3, mItm.getText());
if (!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText()) &&
!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
this.codierer.setzeWalzeNr(2,
convertRoemischToZahl(mItm.getText()) + 1,
mBtnNotchPos3.getText().charAt(0));
} else {
setzeWalze(3, convertZahlToRoemisch(this.codierer.fetchWalzenNr(2)));
new Fehler().showErrorDialog("error",
"Walze nicht gefunden",
"Es scheint so das wir von jeder Walze nur eine da haben");
}
}
if (mBtn.getId().equals(mBtnNotchPos1.getId())) {
setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(0, Integer.parseInt(mItm.getText()) - 1);
}
if (mBtn.getId().equals(mBtnNotchPos2.getId())) {
setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
}
if (mBtn.getId().equals(mBtnNotchPos3.getId())) {
setzeRing(3, Integer.parseInt(mItm.getText()) - 1);
this.codierer.setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
}
tfCodiert.setText("");
tfKlartext.setText("");
}
/**
* Die Löschen Funktion löscht das letzte Zeichen im Klartext sowie im Codiert Feld,
* der Codierer wird aufgerufen um ebenfalls das letzte Zeichen zu löschen
*/
private void loeschen() {
if (textEingabe.length() == 0) {
tfKlartext.setText("");
tfCodiert.setText("");
} else {
textEingabe = textEingabe.substring(0, textEingabe.length() - 1);
textCodiert = textCodiert.substring(0, textCodiert.length() - 1);
tfKlartext.setText(textEingabe);
tfCodiert.setText(textCodiert);
codierer.letztesZeichenLoeschen();
mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
}
}
/**
* Holt Nachricht von Klasse Codierer und setzt den chiffrierten Text in das Textfeld tfCodiert,
* sowie den Klartext in das Textfeld tfKlartext. Setzt den Spruchschlüssel
*/
private void empfangeFunkspruch() {
progressDialogue("rx");
try {
if (this.empfangeneNachricht[2] != null && this.empfangeneNachricht[1] != null) {
setzeTagesSchluessel();
tfKlartext.setText(this.empfangeneNachricht[2]);
tfCodiert.setText(this.empfangeneNachricht[1]);
resetDisplay = true;
// Spruchschluessel in das Feld lblSpruchschluessel schreiben
lblSpruchschluessel.setText(codierer.empfangenerSpruchschluessel(this.empfangeneNachricht[2]));
}
} catch (NullPointerException ignored) {
new Fehler().showErrorDialog(
"warning",
"Keiner schreibt dir...",
"Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
}
}
/**
* Senden der Nachricht mit Hilfe der Klasse Codierer
* Löscht die Textfelder tfKlartext und tfCodiert
*/
private void sendeFunkspruch() {
this.tfKlartext.setText("");
this.tfCodiert.setText("");
progressDialogue("tx");
}
/**
* Methode die das ProgressDialog Fenster erstellt und verwaltet
*
* @param strRxTx : String : RX => empfangen
* TX => senden
*/
private void progressDialogue(String strRxTx) {
Task copyWorker = createWorker(strRxTx);
ProgressIndicator pi = new ProgressIndicator();
pi.setProgress(-1);
ProgressDialog dialog = new ProgressDialog(copyWorker);
dialog.initStyle(StageStyle.TRANSPARENT);
dialog.setTitle("Kommunikation zum Funkraum");
if (strRxTx.equals("rx")) {
dialog.setContentText("Empfange Nachricht");
} else if (strRxTx.equals("tx")) {
dialog.setContentText("Sende Nachricht");
}
dialog.setHeaderText(null);
dialog.setGraphic(pi);
dialog.initStyle(StageStyle.UTILITY);
new Thread(copyWorker).start();
dialog.showAndWait();
}
/**
* Thread Worker für Nachricht senden / empfangen
*
* @param strRxTx : String : RX => empfangen
* TX => senden
* @return boolean
*/
private Task createWorker(String strRxTx) {
return new Task() {
@Override
protected Object call() {
if (strRxTx.equals("rx")) {
empfangeneNachricht = codierer.empfangeNachricht();
} else if (strRxTx.equals("tx")) {
try {
codierer.sendeNachricht();
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
};
}
/**
* Schreibt Buchstaben des gedrückten Button in Textfeld tfKlartext.
* Übergabe des Buchstaben vom gedrückten Button an die Klasse Codierer
* Ablegen des chiffrierten Buchstaben in der char Variable chiffrierterBuchstabe
* Hinzufügen des chiffrierten Buchstaben in Textfeld tfCodiert
* Aktualisierung der Walzenstellung
*
* @param pressedButton : gedrückter Knopf
*/
private boolean setText(Button pressedButton) {
if (textEingabe.length() < 250) {
if (this.resetDisplay) {
this.tfCodiert.setText("");
this.tfKlartext.setText("");
this.lblSpruchschluessel.setText("");
this.resetDisplay = false;
this.codierer.resetHardware();
textCodiert = "";
textEingabe = "";
// Spruchschlüssel generieren und codieren
this.codierer.generateSpruchschluessel();
// Spruchschluessel in das Feld lblSpruchschluessel schreiben
lblSpruchschluessel.setText(this.codierer.getSpruchschluessel());
}
textEingabe += pressedButton.getText();
chiffrierterBuchstabe = codierer.codiere(pressedButton.getText().charAt(0), true);
textCodiert += chiffrierterBuchstabe;
tfKlartext.setText(textEingabe);
tfKlartext.appendText("");
tfCodiert.setText(textCodiert);
tfKlartext.appendText("");
// Position der Walzen aktuallisieren
mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
return true;
} else {
new Fehler().showErrorDialog("error", "Wir wussten das du das testen wirst", "250 Zeichen sind " +
"selbst für die Wehrmacht zu viel!");
return false;
}
}
/**
* Konvertiert eine rämische Zahl in eine arabische Zahl
*
* @param nummer : String : Römische Zahl
* @return int : arabische Zahl
*/
private int convertRoemischToZahl(String nummer) {
int result = 0;
switch (nummer) {
case "I":
result = 0;
break;
case "II":
result = 1;
break;
case "III":
result = 2;
break;
case "IV":
result = 3;
break;
case "V":
result = 4;
break;
default:
break;
}
return result;
}
/**
* Konvertiert eine arabische Zahl in eine rämische Zahl
*
* @param nummer : int : arabische Zahl
* @return String : römische Zahl
*/
private String convertZahlToRoemisch(int nummer) {
String result = "";
switch (nummer) {
case 0:
result = "I";
break;
case 1:
result = "II";
break;
case 2:
result = "III";
break;
case 3:
result = "IV";
break;
case 4:
result = "V";
break;
default:
break;
}
return result;
}
/**
* 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
*/
private void setzeWalze(int walzenPosition, String walzeRoemischNr) {
switch (walzenPosition) {
case 1:
mBtnWalzPos1.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
break;
case 2:
mBtnWalzPos2.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
break;
case 3:
mBtnWalzPos3.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
break;
default:
break;
}
}
/**
* Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
* -> d.h. welche Walze sitzt auf welcher Position
*
* @param walzenPosition => gibt die Position der Walze
* @param walzeNr => gibt die Walzennummer an
*/
private void setzeWalze(int walzenPosition, int walzeNr) {
switch (walzenPosition) {
case 1:
mBtnWalzPos1.setText(walzenNr[walzeNr - 1]);
break;
case 2:
mBtnWalzPos2.setText(walzenNr[walzeNr - 1]);
break;
case 3:
mBtnWalzPos3.setText(walzenNr[walzeNr - 1]);
break;
default:
break;
}
}
/**
* Setzt den Notch (position)=> die Mitnahmeposition der Walze (walze) fest
* Mitnahmeposition meint => die nächste Walze wird bei erreichen dieser Position (notch)
* um eine Stelle versetzt
*
* @param ringStellung => gibt die walze an
* @param walzenPosition => gibt den notch der Walze (walze) an
*/
private void setzeRing(int walzenPosition, int ringStellung) {
switch (walzenPosition) {
case 1:
mBtnNotchPos1.setText(ringNr[ringStellung]);
break;
case 2:
mBtnNotchPos2.setText(ringNr[ringStellung]);
break;
case 3:
mBtnNotchPos3.setText(ringNr[ringStellung]);
break;
default:
break;
}
}
/**
* Setzt die Startposition/ aktuelle Position der Walze
*
* @param walze => gibt die walze an
* @param buchstabe gibt den Startwert bzw die aktuelle Position der Walze (walze) an
*/
private void setzePosition(int walze, char buchstabe) {
switch (walze) {
case 1:
mBtnStartPos1.setText(String.valueOf(buchstabe));
break;
case 2:
mBtnStartPos2.setText(buchstabe + "");
break;
case 3:
mBtnStartPos3.setText(buchstabe + "");
break;
default:
break;
}
}
/**
* Setzt den aktuellen TagesSchluessel und zeigt diesen in der GUI an
*/
private void setzeTagesSchluessel() {
// Umsprungpunkte anzeigen
mBtnNotchPos1.setText(String.valueOf(codierer.fetchRingstellung()[0]));
mBtnNotchPos2.setText(String.valueOf(codierer.fetchRingstellung()[1]));
mBtnNotchPos3.setText(String.valueOf(codierer.fetchRingstellung()[2]));
// Walzennummern anzeigen
setzeWalze(1, codierer.fetchWalzenNr()[0]);
setzeWalze(2, codierer.fetchWalzenNr()[1]);
setzeWalze(3, codierer.fetchWalzenNr()[2]);
// Position der Walzen anzeigen
mBtnStartPos1.setText(String.valueOf(codierer.fetchWalzen()[0]));
mBtnStartPos2.setText(String.valueOf(codierer.fetchWalzen()[1]));
mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2]));
// Steckbrett Felder setzen
myToggleButtons();
// Felder zurück setzen
this.textCodiert = "";
this.textEingabe = "";
this.tfKlartext.setText("");
this.tfCodiert.setText("");
}
/**
* Lädt die Daten aus dem Codebuch und setzt die Kenngruppe in der Gui
*
* @param kenngruppe : String : aktuelle Kenngruppe
*/
void setKenngruppe(String kenngruppe) {
// Initialisieren des Codierers und setzen der Kenngruppe
codierer = new Codierer(kenngruppe.toUpperCase());
this.codierer.resetHardware();
// Setzt die Kenngruppe in der GUI
lblKenngruppe.setText("Kenngruppe: " + this.codierer.getKenngruppe());
// Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden.
resetDisplay = true;
// Einstellungen aus dem Logbuch auslesen und setzen
setzeTagesSchluessel();
}
private enum BUCHSTABE_LEUCHTET {AN, AUS}
//endregion
} }
package projekt.enigma; package projekt.enigma;
/**
import projekt.enigma.threads.ThreadApp; * Startpunkt des Programms. Startet die Klasse App und damit die GUI.
import projekt.enigma.threads.ThreadFunkraum; */
import java.sql.SQLException;
public class Main { public class Main {
public static void main(String[] args) throws SQLException { /**
* Startet die App
*
* @param args : String[] : Standard-Kommandozeilen-Parameter.
*/
public static void main(String[] args) {
App.main(args); App.main(args);
} }
} }
...@@ -3,25 +3,24 @@ package projekt.enigma.database; ...@@ -3,25 +3,24 @@ package projekt.enigma.database;
import java.sql.*; import java.sql.*;
/** /**
* Dies ist die SQLite Datenbank Klasse * Dies ist die SQLite Datenbank Klasse.
* In der SQLite Datei im Resources Ordner liegt das Codebuch welches benötigt wird um die * In der SQLite Datei im Resources Ordner liegt das Codebuch welches benoetigt wird um die
* Nachrichten mit der Enigma zu ver/entschlüsseln. * Nachrichten mit der Enigma zu ver/entschluesseln.
* Die Datenbank ist statisch und deshalb konnte sie im Resources Ordner hinterlegt werden. * 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 * Für jeden Tag des Monats (1-31) ist ein eigener Eintrag enthalten welcher ueber die Funktion
* getCodebuch abgerufen werden kann. * getCodebuch abgerufen werden kann.
* Zurückgegeben wird ein Array welcher in der getCodebuch Funktion genauer dokumentiert ist. * Zurueckgegeben wird ein Array welcher in der getCodebuch Funktion genauer dokumentiert ist.
*/ */
public class DatenbankSqlite { public class DatenbankSqlite {
/** /**
* Verbindung zur SQLite Datenbank aufbauen. * Verbindung zur SQLite Datenbank aufbauen.
* Die Datei liegt in den Resources und ändert sich nicht, * Die Datei liegt in den Resources und aendert sich nicht,
* weshalb der Pfad zu derselben fest hinterlegt ist. * weshalb der Pfad zu derselben fest hinterlegt ist.
* *
* @return conn : Connection * @return conn : Connection: statische Datenbankverbindung.
*/ */
private Connection connect() { private Connection connect() {
String url = "jdbc:sqlite::resource:projekt/enigma/codebuch.sqlite"; String url = "jdbc:sqlite::resource:projekt/enigma/codebuch.sqlite";
Connection conn = null; Connection conn = null;
...@@ -35,15 +34,15 @@ public class DatenbankSqlite { ...@@ -35,15 +34,15 @@ public class DatenbankSqlite {
} }
/** /**
* Liest das Codebuch aus der SQLite Datenbank aus * Liest das Codebuch aus der SQLite Datenbank aus.
* Dieser Funktion muss ein tag als int Wert übergeben werden. * Dieser Funktion muss ein tag als int Wert uebergeben werden.
* Anschließend wir eine Verbindung zur SQLite Datenbank aufgebaut und das Codebuch angefragt. * Anschließend wird eine Verbindung zur SQLite Datenbank aufgebaut und das Codebuch angefragt.
* Dieses wird in ein Object vom Type Codebuch gepackt und zurück gegeben. * Dieses wird in ein Objekt vom Typ Codebuch gepackt und zurueckgegeben.
* *
* Hole den heutigen Eintrag aus der SQLite Datenbank und erstelle daraus ein Codebuch Objekt * Holt den heutigen Eintrag aus der SQLite Datenbank und erstellt daraus ein Codebuch Objekt.
* *
* @param tag : int : Tag für welchen ein Codebuch benötigt wird. * @param tag : int : Tag fuer welchen ein Codebuch benoetigt wird.
* @return String : Die Einstellungen des angefragten Tages * @return String : Die Einstellungen des angefragten Tages.
* <p> * <p>
* String[0] : Tag * String[0] : Tag
* String[1] : Walzenlage * String[1] : Walzenlage
...@@ -52,12 +51,11 @@ public class DatenbankSqlite { ...@@ -52,12 +51,11 @@ public class DatenbankSqlite {
* </p> * </p>
*/ */
public String[] getCodebuch(int tag) { public String[] getCodebuch(int tag) {
String[] codebuch = new String[4]; String[] codebuch = new String[4];
try { try {
Connection conn = this.connect(); Connection conn = this.connect();
PreparedStatement pstm = conn.prepareStatement("SELECT * FROM table_codebuch WHERE Tag=? LIMIT 1"); PreparedStatement pstm = conn.prepareStatement("SELECT * FROM table_codebuch WHERE Tag = ? LIMIT 1");
pstm.setInt(1, tag); pstm.setInt(1, tag);
ResultSet rs = pstm.executeQuery(); ResultSet rs = pstm.executeQuery();
...@@ -67,101 +65,8 @@ public class DatenbankSqlite { ...@@ -67,101 +65,8 @@ public class DatenbankSqlite {
codebuch[2] = rs.getString("Ringstellung"); codebuch[2] = rs.getString("Ringstellung");
codebuch[3] = rs.getString("Steckverbindung"); codebuch[3] = rs.getString("Steckverbindung");
} }
} catch (SQLException ignored) { } catch (SQLException ignored) {}
}
return codebuch; return codebuch;
} }
//region Random New Codebuch generieren
/**
* Setzt zufällige Codebuch Einträge in die SQLite Datenbank
* Tag => int
* Walzenlage => String w1,w2,w3
* Ringstellung => String r1,r2,r3
* Steckverbindungen => s0,s1,s2,s3,s4,s5,s6,s7,s8,s9
*/
/*
public void autoGenCodebuch() throws SQLException {
Connection conn = connect();
conn.setAutoCommit(false);
PreparedStatement pstmtInsert = conn.prepareStatement("INSERT INTO table_codebuch (Tag, Walzenlage, Ringstellung, Steckverbindung) VALUES (?, ?, ?, ?);");
for (int i = 3; i < 32; i++) {
pstmtInsert.setInt(1, i);
pstmtInsert.setString(2, walzenlage());
pstmtInsert.setString(3, ringstellung());
pstmtInsert.setString(4, steckverbindung());
pstmtInsert.executeUpdate();
}
conn.commit();
}
/**
* Generiert einen String aus 3 Zufalls-Zahlen(zwischen 1 und 5)
* die Zahlen sind durch Komma getrennt
* @return String => walzenlage mit drei Kommaseparierten Zufallszahlen zwischen 1 und 5
*/
/*
private static String walzenlage(){
String walzenlage;
Random random = new Random();
int[] w = new int[3];
for (int i = 0; i < 3; i++) {
w[i] = (random.nextInt(5))+1;
if (i==1&&w[0]==w[i])w[i]=(random.nextInt(5))+1;
if ((i==2&&w[0]==w[2])||(i==2&&w[1]==w[i]))w[i]=(random.nextInt(5))+1;
}
walzenlage= w[0]+","+w[1]+","+w[2];
return walzenlage;
}*/
/**
* Generiert einen String aus 3 Zufalls-Zahlen(zwischen 1 und 26)
* die Zahlen sind durch Komma getrennt
* @return String => ringstellung mit drei Kommaseparierten Zufallszahlen zwischen 1 und 26
*/
/*
private static String ringstellung(){
String ringstellung;
Random random = new Random();
int[] w = new int[3];
for (int i = 0; i < 3; i++) {
w[i] = (random.nextInt(26))+1;
}
ringstellung= w[0]+","+w[1]+","+w[2];
return ringstellung;
}*/
/**
* Generiert einen String aus 10 * 2 unterschiedlichen Großbuchstaben
* @return String => 10 Buchstabenkombinationen mit Komma getrennt
*//*
private static String steckverbindung(){
Random rnd = new Random();
String steckverbindung="";
char[] c = new char[20];
for (int i = 0; i < 20; i++) {
c[i] = (char) (rnd.nextInt(26) + 'A');
for (int j = i; j >= 0; j--) {
if (i>j) {
while (c[i]==c[j]) {
c[i] = (char) (rnd.nextInt(26) + 'A');
j= i-1;
}
}
}
}
steckverbindung = ((""+c[0]) + (""+c[1]) +"," +(""+c[2]) +(""+c[3]) + ","+(""+c[4]) +(""+c[5]) + ","+(""+c[6]) +(""+c[7]) + ","
+(""+c[8]) +(""+c[9]) + ","+(""+c[10]) +(""+c[11]) + ","+(""+c[12]) +(""+c[13]) + ","+(""+c[14]) +(""+c[15]) + ","+(""+c[16]) +(""+c[17]) + ","
+(""+c[18]) +(""+c[19]));
// System.out.println(steckverbindung);
// steckverbindung= (String) steckverbindung.subSequence(0,steckverbindung.lastIndexOf(","));
return steckverbindung;
}*/
//endregion
} }
...@@ -6,42 +6,41 @@ import java.time.LocalDate; ...@@ -6,42 +6,41 @@ import java.time.LocalDate;
import java.time.ZoneId; import java.time.ZoneId;
/** /**
* Das Codebuch war eines der essentiel wichtigen Sachen bei der Enigma. * Das Codebuch war eines der essentiell wichtigen Sachen bei der Enigma.
* Jeder Enigma gehoerte auch ein Codebuch bei, welches notwendig war um die Nachrichten zu ver/entschluesseln. * Jeder Enigma gehoerte auch ein Codebuch bei, welches notwendig war um die Nachrichten zu ver/entschluesseln.
* Im Codebuch standen für jeden Tag des Monats die notwendigen Einstellungen welche vorgenommen werden * Im Codebuch standen für jeden Tag des Monats die notwendigen Einstellungen welche vorgenommen werden
* mussten um die Texte zu ver/entschluesseln. * mussten, um die Texte zu ver/entschluesseln.
* Hiernach wurden die Walzen eingesetzt, die Ringe für den Ruecksprung der Walze gesetzt und deren Grundeinstellung * Hiernach wurden die Walzen eingesetzt, die Ringe für den Ruecksprung der Walze gesetzt und deren Grundeinstellung
* vorgenommen. * vorgenommen.
* Bei der Enigma um welche es hier geht (Enigma I) gab es zusaetzlich ein Steckbrett, welches ebenfalls im Codebuch * Bei der Enigma I, um welche es hier geht, gab es zusaetzlich ein Steckbrett, welches ebenfalls im Codebuch
* festgelegt war. * festgelegt war.
* <p> * <p>
* Dieses Codebuch Objekt enthaelt die Einstellungen eines Tages, welche mittels Getter und Setter * Dieses Codebuch enthaelt die Einstellungen eines Tages, welche mittels Getter und Setter
* verarbeitet werden koennen. * verarbeitet werden koennen.
* <p> * <p>
* Zusaetzlich gibt es zu Debug Zwecken eine ueberschriebene toString Funktion welche das Objekt als String zurueck * Zusaetzlich gibt es zu Debug-Zwecken eine ueberschriebene toString Funktion, welche das Objekt als String
* geben kann. * zurueckgeben kann.
*/ */
public class Codebuch { public class Codebuch {
//region Variablen //region Variablen
/** /**
* TODO: Dokumentieren tag * tag : int : gibt den Tag eines Monats an.
* tag : int : gibt den Tag an
*/ */
private int tag; private int tag;
/** /**
* walzenlage : int[] : legt die Positionen der Walzen fest * walzenlage : int[] : legt die Positionen der drei Walzen fest.
*/ */
private int[] walzenlage; private int[] walzenlage;
/** /**
* ringstellung : int[] : TODO ringstellung: char || int ? * ringstellung : int[] : legt die Ringstellungen der drei Walzen fest.
*/ */
private int[] ringstellung; private int[] ringstellung;
/** /**
* steckverbindung : char[][] : stellt die Steckverbindungen im Steckbrett dar * steckverbindung : char[][] : legt die Steckverbindungen im Steckbrett fest.
*/ */
private char[][] steckverbindung; private char[][] steckverbindung;
...@@ -49,12 +48,12 @@ public class Codebuch { ...@@ -49,12 +48,12 @@ public class Codebuch {
//region Konstruktor //region Konstruktor
/** /**
* Im Konstruktor werden die Standardwerte gesetzt * Im Konstruktor werden die Standardwerte gesetzt.
* <p> * <p>
* walzenlage : int[3] : Hier wird die Position der drei Walzen festgelegt. * 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 * ringstellung : char[3] : Jede Walze hat einen Ring. Der Index steht fuer die Walze und der Value fuer
* die Position des Ringes. * die Position des Ringes.
* steckverbindung : char[10][] : Zehn Kabel können in das Steckbrett gesteckt werden. In diesem Array werden * steckverbindung : char[10][] : Zehn Kabel koennen in das Steckbrett gesteckt werden. In diesem Array werden
* die Kabel mit ihren jeweiligen Buchsen hinterlegt. * die Kabel mit ihren jeweiligen Buchsen hinterlegt.
*/ */
public Codebuch() { public Codebuch() {
...@@ -77,7 +76,7 @@ public class Codebuch { ...@@ -77,7 +76,7 @@ public class Codebuch {
* Aus dem Tagesschluessel werden die Werte fuer die Walzenlage, Ringstellung und Steckverbindung * Aus dem Tagesschluessel werden die Werte fuer die Walzenlage, Ringstellung und Steckverbindung
* gesetzt. * gesetzt.
* *
* @param tag : int[] : gibt keinen, einen Tag oder mehrere Tage mit * @param tag : int[] : gibt keinen, einen Tag oder mehrere Tage mit.
*/ */
public void fetchTagesschluessel(int... tag) { public void fetchTagesschluessel(int... tag) {
String[] walzenlage, ringstellung, db; String[] walzenlage, ringstellung, db;
...@@ -106,9 +105,9 @@ public class Codebuch { ...@@ -106,9 +105,9 @@ public class Codebuch {
/** /**
* Gibt die aktuelle Instanz des Codebuches als String zurueck. * Gibt die aktuelle Instanz des Codebuches als String zurueck.
* Hierbei werden der Tag die Walzenlagen, Ring-/Grundstellung sowie die Steckverbindungen zurueck gegeben. * Hierbei werden der Tag die Walzenlagen, Ring-/Grundstellung sowie die Steckverbindungen zurueckgegeben.
* *
* @return String : String des gesamten Objektes * @return String : String des gesamten Objektes.
*/ */
@Override @Override
public String toString() { public String toString() {
...@@ -154,7 +153,7 @@ public class Codebuch { ...@@ -154,7 +153,7 @@ public class Codebuch {
//region Setter //region Setter
/** /**
* Setzt die Steckverbindung dieser Instanz * Setzt die Steckverbindung dieser Instanz.
* *
* @param kabel : 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. * Jeder Eintrag im Array ist ein String mit zwei Zeichen.
...@@ -172,17 +171,17 @@ public class Codebuch { ...@@ -172,17 +171,17 @@ public class Codebuch {
} }
/** /**
* Setzt die Walzenlage dieser Instanz * Setzt die Walzenlage dieser Instanz.
* *
* @param position : int : Position der Walze * @param position : int : Position der Walze.
* @param walzenlage : int : Welche Walze wurde eingesetzt * @param walzenlage : int : Welche Walze wurde eingesetzt.
*/ */
private void setWalzenlage(int position, int walzenlage) { private void setWalzenlage(int position, int walzenlage) {
this.walzenlage[position] = walzenlage; this.walzenlage[position] = walzenlage;
} }
/** /**
* Setzt die Ringstellung dieser Instanz * Setzt die Ringstellung dieser Instanz.
* *
* @param position : int : Auf welche Walze wird der Ring aufgesetzt? * @param position : int : Auf welche Walze wird der Ring aufgesetzt?
* @param ringstellung : int : An dieser Position soll die nächste Walze weiter gedreht werden. * @param ringstellung : int : An dieser Position soll die nächste Walze weiter gedreht werden.
...@@ -192,9 +191,9 @@ public class Codebuch { ...@@ -192,9 +191,9 @@ public class Codebuch {
} }
/** /**
* Setzt den Tag dieser Instanz * Setzt den Tag dieser Instanz.
* *
* @param tag : int : Tag * @param tag : int : Tag.
*/ */
void setTag(int tag) { void setTag(int tag) {
this.tag = tag; this.tag = tag;
...@@ -204,36 +203,36 @@ public class Codebuch { ...@@ -204,36 +203,36 @@ public class Codebuch {
//region Getter //region Getter
/** /**
* Gibt den Tag dieser Instanz zurueck * Gibt den Tag dieser Instanz zurueck.
* *
* @return int : Tag * @return int : Tag.
*/ */
public int getTag() { public int getTag() {
return tag; return tag;
} }
/** /**
* Gibt die Walzenlage dieser Instanz zurueck * Gibt die Walzenlage dieser Instanz zurueck.
* *
* @return walzenlage : int[] : Walzenlage * @return walzenlage : int[] : Walzenlage.
*/ */
public int[] getWalzenlage() { public int[] getWalzenlage() {
return walzenlage; return walzenlage;
} }
/** /**
* Gibt die Ringstellung dieser Instanz zurueck * Gibt die Ringstellung dieser Instanz zurueck.
* *
* @return ringstellung : int : Ringstellung * @return ringstellung : int : Ringstellung.
*/ */
public int[] getRingstellung() { public int[] getRingstellung() {
return ringstellung; return ringstellung;
} }
/** /**
* Gibt die Steckverbindungen dieser Instanz zurueck * Gibt die Steckverbindungen dieser Instanz zurueck.
* *
* @return steckerverbindung : char[][] : Steckverbindung * @return steckerverbindung : char[][] : Steckverbindung.
*/ */
public char[][] getSteckverbindung() { public char[][] getSteckverbindung() {
return this.steckverbindung; return this.steckverbindung;
......
package projekt.enigma.model; package projekt.enigma.model;
import org.apache.http.HttpException;
import java.io.IOException; import java.io.IOException;
import java.util.Calendar; import java.util.Calendar;
import java.util.Random; import java.util.Random;
/** /**
* Die Codierer Klasse beschreibt den Benutzer welcher die Enigma benutzt. * 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, * Alle Vorgaenge, 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 * 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. * verschluesseln hat), der Enigma und dem Funker im Funkraum, welcher die Nachricht im Anschluss versendet.
*/ */
public class Codierer { public class Codierer {
//region Variablen //region Variablen
/** /**
* Der Klartext Spruchschlüssel zur codierung der Nachricht * Der Spruchschluessel als Klartext zur Codierung der Nachricht.
*/ */
private String spruchschluessel; private String spruchschluessel;
/** /**
* Der Spruchschlüssel, mit den Tageswerten aus dem Codebuch, codiert * Der Spruchschluessel, mit den Tageswerten aus dem Codebuch, codiert.
*/ */
private String spruchschluesselCodiert; private String spruchschluesselCodiert;
/** /**
* Die Kenngruppe für die versendeten Nachrichten gedacht sind. Diese ist relevant für den Webservice (Funkraum) * Die Kenngruppe fuer die die versendeten Nachrichten gedacht sind.
* Diese ist relevant fuer den Webservice (Funkraum).
*/ */
private String kenngruppe; private String kenngruppe;
/** /**
* Die Nachricht, welche der Benutzer eingibt, wird als String nachricht gespeichert * Die Nachricht, welche der Benutzer eingibt, wird als String "nachricht" gespeichert
* und im laufe der Benutzung ergänzt * und im Laufe der Benutzung ergaenzt.
*/ */
private String nachricht; private String nachricht;
/** /**
* Das Hardware Objekt. Hier werden alle Hardware relevanten Baugruppen gespeichert und verarbeitet. * Das Hardware-Objekt. Hier werden alle hardwarerelevanten Baugruppen gespeichert und verarbeitet.
*/ */
private Hardware hardware; private Hardware hardware;
/** /**
* Im Codebuch sind die Tageswerte zu finden. Über dieses Objekt kann darauf zugegriffen werden. * Im Codebuch sind die Tageswerte zu finden. Ueber dieses Objekt kann darauf zugegriffen werden.
*/ */
private Codebuch codebuch; private Codebuch codebuch;
//TODO Dokumentieren
private Thread funk;
//endregion //endregion
//region Konstruktor //region Konstruktor
/** /**
* Der Konstruktor des Codierers * Der Konstruktor des Codierers.
* Hier werden die globalen Variablen auf ihre Standart Werte gesetzt sowie die Objekte Initialisiert. * Hier werden die globalen Variablen auf ihre Standardwerte gesetzt sowie die Objekte initialisiert.
*/ */
public Codierer(String kenngruppe) { public Codierer(String kenngruppe) {
this.nachricht = ""; this.nachricht = "";
this.spruchschluessel = ""; this.spruchschluessel = "";
this.spruchschluesselCodiert = ""; this.spruchschluesselCodiert = "";
this.kenngruppe = kenngruppe; this.kenngruppe = kenngruppe;
this.codebuch = new Codebuch(); this.codebuch = new Codebuch();
this.codebuch.fetchTagesschluessel(); this.codebuch.fetchTagesschluessel();
} }
//endregion //endregion
//region Funktionen & Methoden //region Funktionen & Methoden
//region Reset & Initialisieren //region Reset & Initialisieren
/** /**
* Hier lesen wir den heutigen Eintrag aus dem Codebuch aus und erstellen ein Codebuch Objekt * 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 * Nach dem Codebuch werden dann die Ringe auf die Walzen gesteckt und die Walzen anschließend
* in die Hardware gebaut. * in die Hardware gebaut.
* <br> * <br>
* Ein Reflektor wird definiert, jedoch keine Werte zugewisen, da wir nur einen besitzen und * Ein Reflektor wird definiert, jedoch keine Werte zugewiesen, da wir nur einen besitzen und
* deshalb alle Einstellungen hierfür Statisch im Reflektor definiert haben. * deshalb alle Einstellungen hierfuer statisch im Reflektor definiert haben.
* <br> * <br>
* Das Steck wird ebenfalls definiert und die notwendigen Kabel eingesteckt laut dem heutigen * Das Steckbrett wird ebenfalls definiert und die notwendigen Kabel eingesteckt nach dem heutigen
* Codebuch Eintrag. * Codebucheintrag.
*/ */
private void initialisiereHardware() { private void initialisiereHardware() {
this.nachricht = ""; this.nachricht = "";
// Das Steckbrett initialisieren // Das Steckbrett initialisieren
...@@ -107,21 +100,21 @@ public class Codierer { ...@@ -107,21 +100,21 @@ public class Codierer {
// Der Hardware das gesetzte Steckbrett zuweisen // Der Hardware das gesetzte Steckbrett zuweisen
this.hardware.setSteckbrett(sb); this.hardware.setSteckbrett(sb);
// Ein Reflektor Objekt erstellen und der Hardware bekannt geben // Ein Reflektor-Objekt erstellen und der Hardware bekanntgeben
this.hardware.setReflektor(new Reflektor()); this.hardware.setReflektor(new Reflektor());
} }
/** /**
* Setzt die Enigma auf die Einstellungen des aktuellen Tages, aus dem Codebuch zurück. * Setzt die Enigma auf die Einstellungen des aktuellen Tages, aus dem Codebuch zurueck.
*/ */
public void resetHardware() { public void resetHardware() {
this.initialisiereHardware(); this.initialisiereHardware();
} }
/** /**
* Leer das Nachrichten Objekt um eine neue Nachricht aufnehmen zu können * Leert das Nachrichten-Objekt um eine neue Nachricht aufnehmen zu koennen.
*/ */
public void resetNachricht() { private void resetNachricht() {
this.nachricht = ""; this.nachricht = "";
} }
//endregion //endregion
...@@ -129,48 +122,45 @@ public class Codierer { ...@@ -129,48 +122,45 @@ public class Codierer {
//region Nachrichten handler //region Nachrichten handler
/** /**
* Befehl die Nachricht an den Funker zu übergeben * Befehl, die Nachricht an den Funker zu uebergeben.
* *
* @throws IOException : Die Antwort konnte nicht gelesen werden * @throws IOException : Die Antwort konnte nicht gelesen werden.
* @throws HttpException : Die Nachricht konnte nicht abgesendet werden
*/ */
public void sendeNachricht() throws IOException, HttpException { public void sendeNachricht() throws IOException {
String kopf = this.generateKopf(); String kopf = this.generateKopf();
new Funkraum().sendeFunkspruch(new Morsecode().convertBuchstabeToMorsecode(kopf + this.nachricht), this.kenngruppe); new Funkraum().sendeFunkspruch(new Morsecode().convertBuchstabeToMorsecode(kopf + this.nachricht),
this.kenngruppe);
this.nachricht = ""; this.nachricht = "";
this.resetHardware(); this.resetHardware();
} }
/** /**
* Gibt die letzte empfangene Nachricht zurück * Gibt die letzte empfangene Nachricht zurueck.
* <br> * <br>
* String[0] Tag wann die Nachricht gesendet wurde * nachricht[0]: String[]: Tag, an dem die Nachricht gesendet wurde.
* String[1] = Die verschlüsselte Nachricht * nachricht[1]: String[]: Die verschluesselte Nachricht von Morsecode in Buchstaben konvertiert.
* String[2] = Nachricht im Klartext * nachricht[2]: String[]: Nachricht im Klartext. Die Enigma Nachricht (nachricht[1]) mittels der
* Tageseinstellungen (nachricht[0]) decodiert.
*/ */
public String[] empfangeNachricht() { public String[] empfangeNachricht() {
StringBuilder sb = new StringBuilder();
Morsecode mc = new Morsecode();
String[] nachricht = new String[3];
// Alte Nachrichten Variable erstmal leeren // Alte Nachrichten-Variable erstmal leeren
this.nachricht = ""; this.nachricht = "";
// Morsecode Objekt initialisieren
Morsecode mc = new Morsecode();
// Unser Nachrichten Array soll drei Einträge erhalten
String[] nachricht = new String[4];
// Abrufen der letzten Nachricht, für unsere Kenngruppe, aus dem Funkraum // Abrufen der letzten Nachricht, für unsere Kenngruppe, aus dem Funkraum
String[] codierteNachricht = new Funkraum().empfangeFunkspruch(this.kenngruppe); String[] codierteNachricht = new Funkraum().empfangeFunkspruch(this.kenngruppe);
// Prüfen ob Nachrichtenlänge > 1 und die codierte Nachricht mehr als drei Felder (" ") hat // Prüfen ob Nachrichtenlänge > 1 und die codierte Nachricht mehr als drei Felder (" ") hat
if (codierteNachricht[1] != null && codierteNachricht[1].split(" ").length > 3) { if ((codierteNachricht[1] != null) && (codierteNachricht[1].split(" ").length > 3)) {
// Den Tag der Nachricht speichern
nachricht[0] = codierteNachricht[0]; nachricht[0] = codierteNachricht[0];
// Die Nachricht von Morsecode in Buchstaben konvertieren
nachricht[1] = mc.convertMorsecodeToBuchstabe(codierteNachricht[1]); nachricht[1] = mc.convertMorsecodeToBuchstabe(codierteNachricht[1]);
// Die Enigma Nachricht (nachricht[1]) mittels der Tageseinstellungen (nachricht[0]) decodieren
nachricht[2] = this.decodiere(nachricht[1], Integer.parseInt(nachricht[0])); nachricht[2] = this.decodiere(nachricht[1], Integer.parseInt(nachricht[0]));
// StringBuilder initialisieren
StringBuilder sb = new StringBuilder();
sb.append(nachricht[1], 0, 16); 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()) { if ((i + 5) < nachricht[1].length()) {
sb.append(nachricht[1], i, i + 5).append(" "); sb.append(nachricht[1], i, i + 5).append(" ");
...@@ -190,19 +180,19 @@ public class Codierer { ...@@ -190,19 +180,19 @@ public class Codierer {
//region Generatoren //region Generatoren
/** /**
* Hier wird ein neuer Spruchschlüssel generiert. * Hier wird ein neuer Spruchschluessel generiert.
* <p> * <p>
* Mit diesem werden die Walzen auf eine neue Startposition gestellt und dem Kopf, mit dem * Mit diesem werden die Walzen auf eine neue Startposition gestellt und dem Kopf, mit dem
* Tagesschlüssel codiert, hinzugefügt. * Tagesschluessel codiert, hinzugefuegt.
* <br> * <br>
* Hierfür wird mittels der Funktion "randomBuchstabe" ein zufälliger Buchstabe generiert, * Hierfuer wird mittels der Funktion "randomBuchstabe" ein zufaelliger Buchstabe generiert,
* und geschaut ob dieser bereits in der globalen Variable (this.spruchschluessel) vorhanden ist. * und ueberprueft, ob dieser bereits in der globalen Variable (this.spruchschluessel) vorhanden ist.
* Wenn nicht, wird der Buchstabe dem Spruchschlüssel hinzugefügt. * Wenn nicht, wird der Buchstabe dem Spruchschluessel hinzugefügt.
* <br> * <br>
* Dies wir nun so lange gemacht bis der Spruchschlüssel eine länge von drei Zeichen hat. * Dies wir nun so lange gemacht bis der Spruchschluessel eine Laenge von drei Zeichen hat.
* Die Walzen werden anhand des Spruchschluessels automatisch gestellt.
*/ */
public void generateSpruchschluessel() { public void generateSpruchschluessel() {
String klartext = ""; String klartext = "";
while (klartext.length() < 3) { while (klartext.length() < 3) {
...@@ -225,52 +215,39 @@ public class Codierer { ...@@ -225,52 +215,39 @@ public class Codierer {
} }
/** /**
* Erstellen des Nachrichten Kopfes. * Erstellen des Nachrichten-Kopfes.
* Hierfür wird die aktuelle Uhrzeit ausgelesen, die Länge der Nachricht sowie der, mit den * Hierfuer wird die aktuelle Uhrzeit ausgelesen, die Laenge der Nachricht, sowie der, mit dem
* Tagescodes codierte, Spruchschlüssel. * Tagescode codierte, Spruchschluessel.
*
* @return String: Enthaelt die Uhrzeit, die Anzahl der Buchstaben der Nachricht und den Spruchschluessel.
*/ */
private String generateKopf() { private String generateKopf() {
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
// Uhrzeit an den Kopf hängen return String.format("%02d%02d", cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)) + " "
return String.format("%02d%02d", cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE)) + " " + + this.nachricht.length() + " " + this.spruchschluesselCodiert.substring(0, 3) + " "
// Zeichen Anzahl der Nachricht + this.spruchschluesselCodiert.substring(3, 6) + " ";
this.nachricht.length() + " " +
// Spruchschlüssel anhängen
this.spruchschluesselCodiert.substring(0, 3) + " " + this.spruchschluesselCodiert.substring(3, 6) + " ";
} }
/** /**
* Einen zufälligen Buchstaben aus dem Alphabet generieren. * Generiert einen zufaelligen Buchstaben aus dem Alphabet.
* In der Funktion gibt es den String Alphabet, in welchem alle zulässigen Zeichen eingetragen sind. * In der Funktion gibt es den String "Alphabet", in welchem alle zulaessigen Zeichen eingetragen sind.
* Aus diesem String wird nun zufällig ein Zeichen ausgewählt und zurück gegeben. * Aus diesem String wird nun zufaellig ein Zeichen ausgewaehlt und zurueckgegeben.
* *
* @return String : ein zufällig generierter Buchstabe * @return String : ein zufaellig generierter Buchstabe.
*/ */
private String randomBuchstabe() { private String randomBuchstabe() {
return String.valueOf((char) ('A' + new Random().nextInt(26))); return String.valueOf((char) ('A' + new Random().nextInt(26)));
} }
//endregion //endregion
//region setzte Funktionen //region setze Funktionen
/** /**
* Setzt den anzuzeigenden Buchstaben (buchstabe) auf der Walze (walzenPosition) und resetet anschließen das * Setzt den Ring auf der Walze auf einen neuen Umsprungwert.
* Nachrichten Objekt
* *
* @param walzenPosition : int : Nummer der Walze * @param walzenPosition : int : Walze auf die der Ring gesteckt wird.
* @param buchstabe : char : Buchstabe der zugewiesen soll * @param umsprungPunkt : int : Umspringpunkt (Signal an linke Walze zum Drehen).
*/
public void setzeWalze(int walzenPosition, char buchstabe) {
this.resetNachricht();
this.hardware.setzePosition(walzenPosition, buchstabe);
}
/**
* Setzt den Ring auf der Walze auf einen neuen Umstprungwert.
*
* @param walzenPosition : int : Walze auf die der Ring gesteckt wird
* @param umsprungPunkt : int : Buchstabe auf dem der Notch sitzt
*/ */
public void setzeRing(int walzenPosition, int umsprungPunkt) { public void setzeRing(int walzenPosition, int umsprungPunkt) {
this.hardware.setzeRing(walzenPosition, umsprungPunkt); this.hardware.setzeRing(walzenPosition, umsprungPunkt);
...@@ -278,61 +255,77 @@ public class Codierer { ...@@ -278,61 +255,77 @@ public class Codierer {
/** /**
* Setzt die Walze (walzeNr) in die Position (walzenPosition) der Enigma ein. * Setzt die Walze (walzeNr) in die Position (walzenPosition) der Enigma ein.
* Mit (ringstellung) gibt man die Position des Umsprungpunktes an. * Mit Ringstellung(ringstellung) gibt man die Position des Umsprungpunktes an.
* *
* @param walzenPosition : int : Position der Walze in der Enigma (1-2-3) * @param walzenPosition : int : Position der Walze in der Enigma (1-2-3).
* @param walzeNr : int : Nummer der Walze die eingesetzt wird * @param walzeNr : int : Nummer der Walze die eingesetzt wird.
* @param ringstellung : int : Stellung des Ringes * @param ringstellung : int : Stellung des Ringes.
*/ */
public void setzeWalzeNr(int walzenPosition, int walzeNr, int ringstellung) { public void setzeWalzeNr(int walzenPosition, int walzeNr, int ringstellung) {
this.hardware.setzeWalzenNr(walzenPosition, walzeNr, ringstellung); this.hardware.setzeWalzenNr(walzenPosition, walzeNr, ringstellung);
} }
/** /**
* Setzt das Kabel in beide Ports ein und fügt es dem Steckbrett Array hinzu. * Setzt den anzuzeigenden Buchstaben (buchstabe) auf der Walze (walzenPosition) und resetet das
* Nachrichten Objekt
* *
* @param port : int : Kabel Nummer welches am Steckbrett eingesteckt wird * @param walze : int : Nummer der Walze
* @param verbindung : String : Verbindung welche die vertauschten Buchstaben angibt * @param buchstabe : char : Buchstabe der zugewiesen soll
* @return boolean : Wenn true, darf das Kabel gesteckt werden, wenn nicht, steckt da bereits schon eines
*/ */
public boolean setzeSteckbrett(int port, String verbindung) { public void setzeWalzenPosition(int walze, char buchstabe) {
return this.hardware.getSteckbrett().setzeVertauschung(port, verbindung.charAt(0), verbindung.charAt(1)); this.resetNachricht();
this.hardware.setzePosition(walze, buchstabe);
}
/**
* Setzt das Kabel in beide Ports ein und fuegt es dem Steckbrett-Array hinzu.
*
* @param port : int : Kabel Nummer, welches am Steckbrett eingesteckt wird.
* @param verbindung : String : Verbindung, welche die vertauschten Buchstaben angibt.
*/
public void setzeSteckbrett(int port, String verbindung) {
if (verbindung.equals("")) {
verbindung = " ";
}
this.hardware.getSteckbrett().setzeVertauschung(port, verbindung.charAt(0), verbindung.charAt(1));
} }
//endregion //endregion
//region fetch Funktionen //region fetch Funktionen
/** /**
* Gibt die Ringstellungen aus dem Codebuch zurück * Gibt die Ringstellungen aus dem Codebuch zurueck.
* *
* @return int[] : Array mit den Ringstellungen der drei eingesetzten Walzen * @return int[] : Array mit den Ringstellungen der drei eingesetzten Walzen.
*/ */
public int[] fetchRingstellung() { public int[] fetchRingstellung() {
return this.codebuch.getRingstellung(); return this.codebuch.getRingstellung();
} }
/** /**
* Gibt die Walzennummer aus dem Codebuch zurück * Gibt die Walzennummer aus dem Codebuch zurueck.
* *
* @return int[] : Array mit den Nummern der drei eingesetzten Walzen * @return int[] : Array mit den Nummern der drei eingesetzten Walzen.
*/ */
public int[] fetchWalzenNr() { public int[] fetchWalzenNr() {
return this.codebuch.getWalzenlage(); return this.codebuch.getWalzenlage();
} }
/** /**
* Gibt die Steckverbindungen aus dem Codebuch zurück * Gibt die Steckverbindungen aus dem Codebuch zurueck.
* *
* @return char[][] : Array mit den gesteckten Verbindungen im Steckbrett * @return char[][] : Array mit den gesteckten Verbindungen im Steckbrett.
*/ */
public char[][] fetchSteckverbindungen() { public char[][] fetchSteckverbindungen() {
return this.codebuch.getSteckverbindung(); return this.codebuch.getSteckverbindung();
} }
/** /**
* Gibt die aktuellen Buchstaben auf den Walzen zurück * Gibt die aktuellen Buchstaben auf den Walzen zurueck.
* *
* @return char[] : Walzen Array mit der aktuellen Position * @return char[] : Walzen Array mit der aktuellen Positionen.
*/ */
public char[] fetchWalzen() { public char[] fetchWalzen() {
char[] walzen = new char[3]; char[] walzen = new char[3];
...@@ -344,29 +337,38 @@ public class Codierer { ...@@ -344,29 +337,38 @@ public class Codierer {
} }
/** /**
* TODO: Doku * Ueberprueft welche Buchstaben noch zur Vertauschung verfuegbar sind.
* *
* @param port * @param port: Zahl zwischen 0-9: entspricht der Kabelnummer.
* @return * @return String: liefert einen String mit den verfuegbaren Buchstaben zurueck.
*/ */
public String fetchVerfuegbareBuchstaben(int port) { public String fetchVerfuegbareBuchstaben(int port) {
return this.hardware.getSteckbrett().fetchVerfuegbareBuchstaben(port); return this.hardware.getSteckbrett().fetchVerfuegbareBuchstaben(port);
} }
/**
* Gibt die Walzennummer einer Walze auf Position (walzePos) zurück
*
* @param walzePos : int : Position der Walze
* @return int : Nummer der eingesetzten Walze
*/
public int fetchWalzenNr(int walzePos) {
return this.hardware.getWalzen()[walzePos].getWalzenNr();
}
//endregion //endregion
//region codierer //region codierer
/** /**
* Hier wird ein einzelner Buchstabe verschlüsselt. * Hier wird ein einzelner Buchstabe verschluesselt.
* Man muss hier ebenfalls mitgeben ob der codierte String in Codierer.nachricht gespeichert werden soll oder nicht. * Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht.
* In der Regel ist dies der Fall. * In der Regel ist dies der Fall.
* *
* @param buchstabe : char : Der zu codierende Buchstabe * @param buchstabe : char : Der zu codierende Buchstabe.
* @param save : boolean : Nachricht speichern oder nicht * @param save : boolean : Nachricht speichern oder nicht.
* @return char : Der codierte Buchstabe * @return char : Der codierte Buchstabe.
*/ */
public char codiere(char buchstabe, boolean save) { public char codiere(char buchstabe, boolean save) {
char codiert = this.hardware.codiere(buchstabe); char codiert = this.hardware.codiere(buchstabe);
if (save) { if (save) {
...@@ -377,16 +379,15 @@ public class Codierer { ...@@ -377,16 +379,15 @@ public class Codierer {
} }
/** /**
* Codiert den Übergebenen String. * Codiert den uebergebenen String.
* Man muss hier ebenfalls mitgeben ob der codierte String in Codierer.nachricht gespeichert werden soll oder nicht. * Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht.
* In der Regel ist dies der Fall. * In der Regel ist dies der Fall.
* *
* @param klartext : String : Der zu codierende Text * @param klartext : String : Der zu codierende Text.
* @param save : boolean : Nachricht speichern oder nicht * @param save : boolean : Nachricht speichern oder nicht.
* @return String : Der codierte Text zusätzlich als Rückgabe * @return String : Der codierte Text zusaetzlich als Rueckgabe.
*/ */
public String codiere(String klartext, boolean save) { public String codiere(String klartext, boolean save) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (char buchstabe : klartext.toCharArray()) { for (char buchstabe : klartext.toCharArray()) {
...@@ -397,13 +398,13 @@ public class Codierer { ...@@ -397,13 +398,13 @@ public class Codierer {
} }
/** /**
* Diese Funktion erwartet als (codierteNachricht) eine korrekte Enigma Nachricht. * Diese Funktion erwartet als (codierteNachricht) eine korrekte Enigma-Nachricht.
* Ihr muss auch der Tag der codierung mitgegeben werden. Dieser weiß dein Funker im Funkraum. * Ihr muss auch der Tag der Codierung mitgegeben werden. Dieser weiss dein Funker im Funkraum.
* In der Regel ist dies der Tag des Nachrichten empfangs. * In der Regel ist dies der Tag des Nachrichtenempfangs.
* *
* @param codierteNachricht : String : Enigma codierte Nachricht * @param codierteNachricht : String : Enigma-codierte Nachricht.
* @param tag : int : Tag der Nachricht * @param tag : int : Tag der Nachricht.
* @return String : decodierte Nachricht * @return String : decodierte Nachricht.
*/ */
private String decodiere(String codierteNachricht, int tag) { private String decodiere(String codierteNachricht, int tag) {
...@@ -415,19 +416,17 @@ public class Codierer { ...@@ -415,19 +416,17 @@ public class Codierer {
String[] nachricht = codierteNachricht.split(" "); String[] nachricht = codierteNachricht.split(" ");
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
// Uhrzeit // Uhrzeit und Zeichenanzahl der Nachricht
sb.append(nachricht[0]).append(" "); sb.append(nachricht[0]).append(" ");
// Zeichen Anzahl der Nachricht
sb.append(nachricht[1]).append(" "); sb.append(nachricht[1]).append(" ");
// Spruchschlüssel // Spruchschluessel
String spruchschluessel = this.decodiereString(nachricht[2]); String spruchschluessel = this.decodiereString(nachricht[2]);
sb.append(spruchschluessel).append(" "); sb.append(spruchschluessel).append(" ");
sb.append(this.decodiereString(nachricht[3])).append(" "); sb.append(this.decodiereString(nachricht[3])).append(" ");
// Walzen neu einstellen mit dem Spruchschlüssel // Walzen neu einstellen mit dem Spruchschluessel
this.hardware.setzePosition(0, spruchschluessel.charAt(0)); this.hardware.setzePosition(0, spruchschluessel.charAt(0));
this.hardware.setzePosition(1, spruchschluessel.charAt(1)); this.hardware.setzePosition(1, spruchschluessel.charAt(1));
this.hardware.setzePosition(2, spruchschluessel.charAt(2)); this.hardware.setzePosition(2, spruchschluessel.charAt(2));
...@@ -439,14 +438,13 @@ public class Codierer { ...@@ -439,14 +438,13 @@ public class Codierer {
} }
/** /**
* Zerlegt den übergebenen String in einen char Array und decodiert jedes Zeichen. * Zerlegt den uebergebenen String in einen char-Array und decodiert jedes Zeichen.
* Der String wird dann decodiert zurück gegeben. * Der String wird dann decodiert zurueckgegeben.
* *
* @param nachricht : String : Der zu decodierende Text * @param nachricht : String : Der zu decodierende Text.
* @return String : Der decodierte Text * @return String : Der decodierte Text.
*/ */
private String decodiereString(String nachricht) { private String decodiereString(String nachricht) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (char buchstabe : nachricht.toCharArray()) { for (char buchstabe : nachricht.toCharArray()) {
...@@ -462,22 +460,10 @@ public class Codierer { ...@@ -462,22 +460,10 @@ public class Codierer {
//region Sonstige //region Sonstige
/** /**
* Prüft ob der Port auf den das Kabel gesteckt werden soll, noch frei ist. * Liest aus der empfangenen Nachricht den Spruchschluessel aus und gibt ihn zurueck.
* <p>
* 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 this.hardware.getSteckbrett().ueberpruefeVertauschungen(buchstabe);
}
/**
* Ließt aus der empfangenen Nachricht den Spruchschlüssel aus und gibt ihn zurück.
* *
* @param empfangeneNachricht : String : Die empfangene Nachricht als String * @param empfangeneNachricht : String : Die empfangene Nachricht als String.
* @return String : Der Spruchschlüssel mit welcher die Nachricht codiert wurde. * @return String : Der Spruchschluessel, mit welcher die Nachricht codiert wurde.
*/ */
public String empfangenerSpruchschluessel(String empfangeneNachricht) { public String empfangenerSpruchschluessel(String empfangeneNachricht) {
String[] nachricht = empfangeneNachricht.split(" "); String[] nachricht = empfangeneNachricht.split(" ");
...@@ -486,33 +472,20 @@ public class Codierer { ...@@ -486,33 +472,20 @@ public class Codierer {
} }
/** /**
* Löscht das letzte Zeichen aus der Nachricht und dreht die Walzen eine Position zurück. * Loescht das letzte Zeichen aus der Nachricht und dreht die Walzen eine Position zurueck.
*/ */
public void letztesZeichenLoeschen() { public void letztesZeichenLoeschen() {
this.hardware.dreheWalzen(-1); this.hardware.dreheWalzen(-1);
this.nachricht = this.nachricht.substring(0, this.nachricht.length() - 1); this.nachricht = this.nachricht.substring(0, this.nachricht.length() - 1);
} }
//endregion //endregion
//endregion
//region Setter
/**
* 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;
this.initialisiereHardware();
}
//endregion //endregion
//region Getter //region Getter
/** /**
* Liest die Kenngruppe aus welche die Maschine gerade besitzt. Früher war dies eine eindeutige Nummer * Liest die Kenngruppe aus, welche die Maschine gerade besitzt. Frueher war dies eine eindeutige Nummer,
* die einer Einheit zugewiesen war. Wir hinterlegen hier einen Benutzernamen. * die einer Einheit zugewiesen war. Wir hinterlegen hier einen Benutzernamen.
* *
* @return String : Kenngruppe * @return String : Kenngruppe
...@@ -522,22 +495,13 @@ public class Codierer { ...@@ -522,22 +495,13 @@ public class Codierer {
} }
/** /**
* Der Spruchschlüssel wird, zur internen Verwendung, auch im Klartext gespeichert. * Der Spruchschluessel wird, zur internen Verwendung, auch im Klartext gespeichert.
* Wir brauchen diesen dann zum codieren der eigentlichen Nachricht. * Wir brauchen diesen dann zum Codieren der eigentlichen Nachricht.
* *
* @return String : Der klartext Spruchschlüssel * @return String : Der Klartext des Spruchschluessels
*/ */
public String getSpruchschluessel() { public String getSpruchschluessel() {
return this.spruchschluessel; return this.spruchschluessel;
} }
/**
* Gibt die bisher erstellte Nachricht zurück
*
* @return String : Erstellte Nachricht
*/
public String getNachricht() {
return nachricht;
}
//endregion //endregion
} }
...@@ -5,73 +5,90 @@ import javafx.scene.control.Alert.AlertType; ...@@ -5,73 +5,90 @@ import javafx.scene.control.Alert.AlertType;
import projekt.enigma.App; import projekt.enigma.App;
/** /**
* In dieser Klasse werden Fehler behandelt und an den User/Admin/Entwickler ausgegeben * In dieser Klasse werden Fehler behandelt und an den User/Admin/Entwickler ausgegeben.
*/ */
public class Fehler { public class Fehler {
/**
private String functionPrefix = "- "; * Konstanten die anzeigen ob es sich um eine Funktion oder um eine Nachricht handelt.
private String messagePrefix = "--> "; */
private static final String FUNCTION_PREFIX = "- ";
private static final String MESSAGE_PREFIX = "--> ";
/** /**
* Zeige Fehler Dialog * Zeige Fehler Dialog
* *
* @param type : String : Art der Meldung (warning/information/error) * @param type : String : Art der Meldung (warning/information/error)
* @param subject : Titel des Dialoges * @param subject : String : Titel des Dialoges
* @param message : Nachricht der Meldung * @param message : String : Nachricht der Meldung
*/ */
public void showErrorDialog(String type, String subject, String message) { public void showErrorDialog(String type, String subject, String message) {
new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true);
Alert alert; Alert alert;
/* Der Titel darf auch als leerer String übergeben werden, dann wird ein Default gesetzt */ new Fehler().debug(this.getClass().getName() + "."
+ new Throwable().getStackTrace()[0].getMethodName(), true);
/* Der Titel darf auch als leerer String uebergeben werden, dann wird ein Default gesetzt */
if (subject.equals("")) { if (subject.equals("")) {
subject = "Es ist ein Fehler aufgetreten"; subject = "Es ist ein Fehler aufgetreten";
} }
/* Welcher Fehler Typ wurde übergeben? */ /* Welcher Fehler Typ wurde uebergeben? */
switch (type) { switch (type) {
case "warning": case "warning":
alert = new Alert(AlertType.WARNING); alert = new Alert(AlertType.WARNING);
break; break;
case "info": case "info":
alert = new Alert(AlertType.INFORMATION); alert = new Alert(AlertType.INFORMATION);
break; break;
case "error": case "error":
alert = new Alert(AlertType.ERROR); alert = new Alert(AlertType.ERROR);
break; break;
default: default:
alert = new Alert(AlertType.NONE); alert = new Alert(AlertType.NONE);
} }
/* Setzt den Titel des Dialoges */
//Anzeige des Alerts definieren
alert.setTitle(subject); alert.setTitle(subject);
/* Setzt den Headertext des Dialoges */
alert.setHeaderText(null); alert.setHeaderText(null);
/* Setzt die Nachricht des Dialoges */
alert.setContentText(message); alert.setContentText(message);
/* Zeige den Dialog an */
alert.showAndWait(); alert.showAndWait();
} }
/**
* Unter zuhilfenahme dieser Funktion koennen Debug Meldungen auf der Konsole ausgegeben werden,
* wenn in der App.java der Getter getDebug einen int > 0 zurueck gibt.
* Ueber diesen Getter kann man steuern ob Meldungen in der Konsole angezeigt werden sollen oder nicht.
*
* @param message : String : Nachricht
* @param isFunction : boolean : Gibt an ob ein Funktionsname uebergeben wird oder eine Debug Meldung
*/
public void debug(String message, boolean isFunction) { public void debug(String message, boolean isFunction) {
if (App.getDebug() != 0) { if (App.getDebug() != 0) {
if (isFunction) { if (isFunction) {
System.out.println(functionPrefix + message); System.out.println(FUNCTION_PREFIX + message);
} else { } else {
System.out.println(messagePrefix + message); System.out.println(MESSAGE_PREFIX + message);
} }
} }
} }
/**
* Unter Zuhilfenahme dieser Funktion koennen Debug Meldungen auf der Konsole ausgegeben werden,
* wenn in der App.java der Getter getDebug einen int > 0 zurueck gibt.
* Ueber diesen Getter kann man steuern ob Meldungen in der Konsole angezeigt werden sollen oder nicht.
*
* @param message : String : Nachricht
* @param isFunction : boolean : Gibt an ob ein Funktionsname uebergeben wird oder eine Debug Meldung.
*/
public void debug(String message, boolean isFunction, int debugLevel) { public void debug(String message, boolean isFunction, int debugLevel) {
if (App.getDebug() != 0 && (App.getDebug() >= debugLevel || App.getDebug() == 3)) { if (App.getDebug() != 0 && (App.getDebug() >= debugLevel || App.getDebug() == 3)) {
if (isFunction) { if (isFunction) {
System.out.println(functionPrefix + message); System.out.println(FUNCTION_PREFIX + message);
} else { } else {
System.out.println(messagePrefix + message); System.out.println(MESSAGE_PREFIX + message);
} }
} }
} }
......
package projekt.enigma.model; package projekt.enigma.model;
import org.apache.http.HttpEntity; import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse; import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair; import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient; import org.apache.http.client.HttpClient;
...@@ -23,97 +22,98 @@ import java.util.List; ...@@ -23,97 +22,98 @@ import java.util.List;
* Der Funkraum kann Funksprueche empfangen und senden. * Der Funkraum kann Funksprueche empfangen und senden.
* Hierfuer wird eine Verbindung zu einem externen Service aufgebaut. * Hierfuer wird eine Verbindung zu einem externen Service aufgebaut.
* Dieser Servive erwartet die Nachrichten im JSON Format. Dazu wird ein k als Kenngruppe * Dieser Servive erwartet die Nachrichten im JSON Format. Dazu wird ein k als Kenngruppe
* (Benutzername) uebergeben und falls eine Nachricht gesendet werden soll, zusätzlich ein m mit der Nachricht. * (Benutzername) uebergeben und falls eine Nachricht gesendet werden soll, zusaetzlich ein m mit der Nachricht.
* Beides wird als String gesendet. * Beides wird als String gesendet.
*/ */
public class Funkraum { public class Funkraum {
/** /**
* Zum Empfangen liefert der Server, anstatt der Kenngruppe (k), den Empfangstag (t) der Nachricht mit, damit man * Zum Empfangen liefert der Server, anstatt der Kenngruppe (k), den Empfangstag (t) der Nachricht mit, damit man
* die Grundeinstellungen aus dem Codebuch, für diesen Tag, raussuchen kann. * die Grundeinstellungen aus dem Codebuch, für diesen Tag, raussuchen kann.
* {'m': 'Hello world', 't': '26'} * {'m': 'Hello world', 't': '26'}
* *
* @param kenngruppe : String : Kenngruppe dieser Enigma * @param kenngruppe : String : Kenngruppe dieser Enigma
* @return funkspruch : String[] : String Array wobei Index 0 dem Empfangstag entspricht und Index 1 * @return funkspruch : String[] : String Array wobei Index 0 dem Empfangstag entspricht und Index 1
* der empfangenen Nachricht * der empfangenen Nachricht.
*/ * @throws NullPointerException : Exception : Keine Nachricht vorhanden.
public String[] empfangeFunkspruch(String kenngruppe) { */
String[] funkspruch = new String[2]; public String[] empfangeFunkspruch(String kenngruppe) {
String[] funkspruch = new String[2];
HttpClient httpclient = HttpClients.createDefault(); HttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("https://enigma.itstall.de/"); HttpPost httppost = new HttpPost("https://enigma.itstall.de/");
try { try {
// Anfrage Parameter und Encoding setzen // Anfrage Parameter und Encoding setzen
List<NameValuePair> params = new ArrayList<>(2); List<NameValuePair> params = new ArrayList<>(2);
params.add(new BasicNameValuePair("k", kenngruppe)); params.add(new BasicNameValuePair("k", kenngruppe));
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
// POST Request ausführen und Rückgabe verarbeiten // POST Request ausfuehren und Rueckgabe verarbeiten
HttpResponse response = httpclient.execute(httppost); HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity(); HttpEntity entity = response.getEntity();
if (entity != null) { if (entity != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
JSONObject result = new JSONObject(reader.readLine()); JSONObject result = new JSONObject(reader.readLine());
if (!result.getString("m").isEmpty()) { if (!result.getString("m").isEmpty()) {
funkspruch[0] = result.getString("t"); funkspruch[0] = result.getString("t");
funkspruch[1] = result.getString("m"); funkspruch[1] = result.getString("m");
} }
} }
} catch (UnsupportedEncodingException e) { } catch (UnsupportedEncodingException e) {
new Fehler().showErrorDialog("error", "Encoding wird nicht unterstützt", new Fehler().showErrorDialog("error", "Encoding wird nicht unterstützt",
"Kommunikation mit dem Feind wird als Landesverrat bestraft"); "Kommunikation mit dem Feind wird als Landesverrat bestraft");
} catch (IOException e) { } catch (IOException e) {
new Fehler().showErrorDialog("error", "HTTP Post war nicht erfolgreich", new Fehler().showErrorDialog("error", "HTTP Post war nicht erfolgreich",
"Bitte wenden Sie sich an ihren Vorgesetzten."); "Bitte wenden Sie sich an ihren Vorgesetzten.");
} catch (NullPointerException e) { } catch (NullPointerException e) {
new Fehler().showErrorDialog("info", "Keiner schreibt dir...", new Fehler().showErrorDialog("info", "Keiner schreibt dir...",
"Es liegen keine neuen Nachrichten im Funkraum für Sie vor."); "Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
} }
return funkspruch; return funkspruch;
} }
/** /**
* Dem Service senden wir unsere Nachricht als POST Parameter (m) und unsere Kenngruppe (k). * Dem Service senden wir unsere Nachricht als POST Parameter (m) und unsere Kenngruppe (k).
* Dieser nimmt die Daten entgegen und hierlerlegt sie auf seinem Stapel (Datenbank) von dem die Nachrichten * Dieser nimmt die Daten entgegen und hierlerlegt sie auf seinem Stapel (Datenbank) von dem die Nachrichten
* irgendwann, auf Anfrage, wieder abgerufen werden koennen. * irgendwann, auf Anfrage, wieder abgerufen werden koennen.
* <p> * <br>
* Darauf antwortet der Server mit einem JSON Object in dem das Ergebnis der Anfrage zu sehen ist. * Darauf antwortet der Server mit einem JSON Object in dem das Ergebnis der Anfrage zu sehen ist.
* {'result': 200} * {'result': 200}
* <p> * <br>
* Die 200 heißt hier, dass alles erfolgreich durchgefuehrt werden konnte. Steht hier etwas anderes, ist ein Fehler * Die 200 heisst hier, dass alles erfolgreich durchgefuehrt werden konnte. Steht hier etwas anderes, ist ein Fehler
* aufgetreten und die Anfrage war nicht erfolgreich. * aufgetreten und die Anfrage war nicht erfolgreich.
* In letzterem Fall sollte eine Meldung an den Benutzer ausgegeben werden und ggf spaeter erneut versucht werden. * In letzterem Fall sollte eine Meldung an den Benutzer ausgegeben werden und ggf. spaeter erneut versucht werden.
* *
* @param funkspruch : String : Der zu sendende Funkspruch * @param funkspruch : String : Der zu sendende Funkspruch
* @param kenngruppe : String : Die Kenngruppe dieser Engima * @param kenngruppe : String : Die Kenngruppe dieser Engima
* @throws IOException : Exception : Funkspruch konnte nicht gesendet werden * @throws IOException : Exception : Funkspruch konnte nicht gesendet werden
*/ */
public void sendeFunkspruch(String funkspruch, String kenngruppe) throws HttpException, IOException { public void sendeFunkspruch(String funkspruch, String kenngruppe) throws IOException {
HttpClient httpclient = HttpClients.createDefault(); HttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("https://enigma.itstall.de/"); HttpPost httppost = new HttpPost("https://enigma.itstall.de/");
// Anfrage Parameter und Encoding setzen // Anfrage Parameter und Encoding setzen
List<NameValuePair> params = new ArrayList<>(2); List<NameValuePair> params = new ArrayList<>(2);
params.add(new BasicNameValuePair("k", kenngruppe)); params.add(new BasicNameValuePair("k", kenngruppe));
params.add(new BasicNameValuePair("m", funkspruch)); params.add(new BasicNameValuePair("m", funkspruch));
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
// POST Request ausführen und Rückgabe verarbeiten // POST Request ausfuehren und Rueckgabe verarbeiten
HttpResponse response = httpclient.execute(httppost); HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity(); HttpEntity entity = response.getEntity();
if (entity != null) { if (entity != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
JSONObject result = new JSONObject(reader.readLine()); JSONObject result = new JSONObject(reader.readLine());
if (result.getInt("result") != 200) { if (result.getInt("result") != 200) {
new Fehler().showErrorDialog("error", "HTTP Exception", new Fehler().showErrorDialog("error", "HTTP Exception",
"Der andere Funker mag deine Nachricht nicht. " + "Der andere Funker mag deine Nachricht nicht. "
"Rüge ihn wenn du ihn wieder siehst..."); + "Rüge ihn wenn du ihn wieder siehst...");
} }
} }
} }
} }
package projekt.enigma.model; package projekt.enigma.model;
/** /**
* In dieser Klasse wird die Hardware zusammen gefasst. * In dieser Klasse wird die Hardware zusammengefasst.
* Alle Komponenter der Enigma laufen hier zusammen. * Alle Komponenten der Enigma laufen hier zusammen.
* *
* <p> * <p>
* walzen : Walze[] : Ist ein Array der drei eingebauten Walzen Objekte * walzen : Walze[] : Ist ein Array der drei eingebauten Walzen Objekte
* steckbrett : Steckbrett : Das Steckbrett mit den Verbindungen aus dem Codebuch * steckbrett : Steckbrett : Das Steckbrett mit den Verbindungen aus dem Codebuch
* reflektor : Reflektor : Dies ist das Objekt der Reflektors * reflektor : Reflektor : Dies ist das Objekt der Reflektors
* nachricht : String : Die verschlüsselte Nachricht wird in diesem String zusammen gesetzt und gespeichert * nachricht : String : Die verschluesselte Nachricht wird in diesem String zusammengesetzt und gespeichert
* kenngruppe : String : Früher definierte die Kennzeichnung die Einheit welche diese Enigma benutzte. * kenngruppe : String : Frueher definierte die Kennzeichnung die Einheit welche diese Enigma benutzte.
* Wir missbrauchen die Kenngruppe für einen Benutzernamen * Wir missbrauchen die Kenngruppe für einen Benutzernamen
* </p> * </p>
*/ */
...@@ -17,197 +17,191 @@ public class Hardware { ...@@ -17,197 +17,191 @@ public class Hardware {
//region Variablen //region Variablen
/** /**
* TODO: Dokumentieren * walzen: Walze-Array: erzeugt ein privates Array mit der die Anzahl der Walzen festgelegt wird.
*/ */
private Walze[] walzen; 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. * steckbrett: Steckbrett: erzeugt ein privates Steckbrett-Objekt
* Die Enigma I welche hier nachgebildet werden soll, konnte drei Walzen aufnehmen.
*/ */
public Hardware() { private Steckbrett steckbrett;
this.walzen = new Walze[3];
}
//endregion
//region Funktionen & Methoden
/** /**
* Setzt eine Walze ein * reflektor: Reflektor: erzeugt ein privates Reflektor-Objekt.
*
* @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) { private Reflektor reflektor;
this.walzen[walze] = new Walze(walzenNr, ringstellung); //endregion
}
/** //region Konstruktor
* 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) * 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.
* @param walze : int : Nummer der Walze */
* @param buchstabe : char : Buchstabe der zugewiesen soll public Hardware() {
*/ this.walzen = new Walze[3];
public void setzePosition(int walze, char buchstabe) { }
this.walzen[walze].setPosition(buchstabe); //endregion
}
/** //region Funktionen & Methoden
* 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() + "." + /**
* Setzt eine Walze ein.
*
* @param walze : int : Setzt die Walze mit der angegebenen Nummer ein.
* @param walzenNr : int : Die Nummer der einzusetzenden Walze.
* @param ringstellung : int : Setzt den Ring der Walze auf die angegebene Nummer.
*/
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 werden soll.
*/
public void setzePosition(int walze, char buchstabe) {
this.walzen[walze].setPosition(buchstabe);
}
/**
* Verschluesselt den uebergebenen Buchstaben und fuegt ihn der Nachricht hinzu.
* Debug Ausgabe auf der Konsole wird zusaetzlich ausgegeben.
*
* @param buchstabe char : Der zu ver/entschluesselnde Buchstabe.
* @return char : Der ver/entschluesselte Buchstabe.
*/
public char codiere(char buchstabe) {
new Fehler().debug(this.getClass().getName() + "." +
new Throwable().getStackTrace()[0].getMethodName(), true); new Throwable().getStackTrace()[0].getMethodName(), true);
buchstabe = Character.toUpperCase(buchstabe);
String debug = String.format("Positionen: W1:%s W2:%s W3:%s", buchstabe = Character.toUpperCase(buchstabe);
this.walzen[0].getPosition(), String debug = String.format("Positionen: W1:%s W2:%s W3:%s",
this.walzen[1].getPosition(), this.walzen[0].getPosition(),
this.walzen[2].getPosition()); this.walzen[1].getPosition(),
debug += "\nI\tS\t3\t2\t1\tR\t1\t2\t3\tS\n" + buchstabe; this.walzen[2].getPosition());
debug += "\nI\tS\t3\t2\t1\tR\t1\t2\t3\tS\n" + buchstabe;
this.dreheWalzen(1); this.dreheWalzen(1);
buchstabe = this.steckbrett.codiere(Character.toUpperCase(buchstabe)); //Codiere Vorgang wird fuer jede Walze bis zum Reflektor mit der codiere Funktion durchgefuehrt.
debug += "\t" + buchstabe; //Auf dem Rueckweg wird mit der codiere2 Funktion codiert.
buchstabe = this.walzen[2].codiere(buchstabe); buchstabe = this.steckbrett.codiere(Character.toUpperCase(buchstabe));
debug += "\t" + buchstabe; debug += "\t" + buchstabe;
buchstabe = this.walzen[1].codiere(buchstabe); buchstabe = this.walzen[2].codiere(buchstabe);
debug += "\t" + buchstabe; debug += "\t" + buchstabe;
buchstabe = this.walzen[0].codiere(buchstabe); buchstabe = this.walzen[1].codiere(buchstabe);
debug += "\t" + buchstabe; debug += "\t" + buchstabe;
buchstabe = this.reflektor.codiere(buchstabe); buchstabe = this.walzen[0].codiere(buchstabe);
debug += "\t" + buchstabe; debug += "\t" + buchstabe;
buchstabe = this.walzen[0].codiere2(buchstabe); buchstabe = this.reflektor.codiere(buchstabe);
debug += "\t" + buchstabe; debug += "\t" + buchstabe;
buchstabe = this.walzen[1].codiere2(buchstabe); buchstabe = this.walzen[0].codiere2(buchstabe);
debug += "\t" + buchstabe; debug += "\t" + buchstabe;
buchstabe = this.walzen[2].codiere2(buchstabe); buchstabe = this.walzen[1].codiere2(buchstabe);
debug += "\t" + buchstabe; debug += "\t" + buchstabe;
buchstabe = this.steckbrett.codiere(buchstabe); buchstabe = this.walzen[2].codiere2(buchstabe);
debug += "\t" + buchstabe; debug += "\t" + buchstabe;
new Fehler().debug(debug, false); buchstabe = this.steckbrett.codiere(buchstabe);
debug += "\t" + buchstabe;
new Fehler().debug(debug, false);
return buchstabe; return buchstabe;
} }
/** /**
* Nach jeder codierung eines Buchstabens müssen die Walzen gedreht werden. * Nach jeder Codierung eines Buchstabens muessen die Walzen gedreht werden.
* Hier überprüfen wir welche der Walzen gedreht werden müssen und stoßen die Vorgang an. * Hier ueberpruefen wir, welche der Walzen gedreht werden muessen und stossen den Vorgang an.
*/ *
public void dreheWalzen(int richtung) { * @param richtung : int : +1 fuer eine Vorwaertsdrehung und -1 fuer eine Rueckwaertsdrehung.
if (richtung > 0) { */
for (int i = 0; i < richtung; i++) { public void dreheWalzen(int richtung) {
if (this.walzen[2].dreheWalze(1)) { if (richtung > 0) {
if (this.walzen[1].dreheWalze(1)) { for (int i = 0; i < richtung; i++) {
this.walzen[0].dreheWalze(1); 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)) { } else {
if (this.walzen[1].dreheWalze(-1)) { for (int i = 0; i > richtung; richtung++) {
this.walzen[0].dreheWalze(-1); 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. //endregion
* 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 //region Setter
/** /**
* Setzt eine Walze ein und speichert das Objekt im Walzen Array * Setzt eine Walze ein und speichert das Objekt im Walzen Array.
* *
* @param position : int : Position der Walze * @param position : int : Position der Walze.
* @param walze : int : Die Nummer der Walze * @param walze : int : Die Nummer der Walze.
* @param ringstellung : int : Umsprung Punkt der Walze * @param ringstellung : int : Umsprungpunkt der Walze.
*/ */
public void setWalzen(int position, int walze, int ringstellung) { public void setWalzen(int position, int walze, int ringstellung) {
this.walzen[position] = new Walze(walze, ringstellung); this.walzen[position] = new Walze(walze, ringstellung);
} }
/** /**
* Gibt das Objekt des Steckbretts zurück * Gibt das Objekt des Steckbretts zurueck.
* *
* @return Steckbrett : Das eingesetzte Steckbrett mit seinen Kabeln wenn eingesteckt * @return steckbrett : Steckbrett-Objekt: Das eingesetzte Steckbrett mit seinen Kabeln, wenn eingesteckt.
*/ */
public Steckbrett getSteckbrett() { public Steckbrett getSteckbrett() {
return steckbrett; return steckbrett;
} }
/** /**
* Setzt das übergebene Steckbrett Objekt in die Hardware ein * Setzt das uebergebene Steckbrett Objekt in die Hardware ein.
* *
* @param steckbrett : Steckbrett : Objekt des Steckbretts mit allen verbundenen Kabeln * @param steckbrett : Steckbrett : Objekt des Steckbretts mit allen verbundenen Kabeln.
*/ */
public void setSteckbrett(Steckbrett steckbrett) { public void setSteckbrett(Steckbrett steckbrett) {
this.steckbrett = steckbrett; this.steckbrett = steckbrett;
} }
//endregion //endregion
//region Getter //region Getter
/** /**
* Liest den Reflektor aus und gibt ihn zurück * Setzt den Reflektor ein.
* * In der Enigma I, welche hier nachgebaut wird, gab es nur einen Reflektor.
* @return Reflektor : Objekt des Reflektors * Spaetere Versionen hatten zwei oder mehr, deshalb haben wir hier auch schon ein Objekt dafuer erstellt,
*/ * welches ausgetauscht werden kann.
public Reflektor getReflektor() { *
return reflektor; * @param reflektor : Reflektor : Das Objekt des Reflektors.
} */
public void setReflektor(Reflektor reflektor) {
/** this.reflektor = 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. * Gibt die verbauten Walzen Objekte zurück.
* *
* @param reflektor : Reflektor : Das Obejtk des Reflektors * @return walzen : Walze[] : Array mit den Walzen Objekten.
*/ */
public void setReflektor(Reflektor reflektor) { public Walze[] getWalzen() {
this.reflektor = reflektor; return this.walzen;
} }
//endregion
/**
* Gibt die verbauten Walzen Objekte zurück
*
* @return Walze[] : Array mit den Walzen Objekten
*/
public Walze[] getWalzen() {
return this.walzen;
}
//endregion
} }
package projekt.enigma.model; package projekt.enigma.model;
import java.util.*;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.TreeMap;
/** /**
* Diese Klasse definiert die Zugehoerigkeit zwischen den Buchstaben A-Z und dem Morsecode. * Diese Klasse definiert die Zugehoerigkeit zwischen den Buchstaben A-Z und dem Morsecode.
...@@ -9,137 +9,137 @@ import java.util.Map.Entry; ...@@ -9,137 +9,137 @@ import java.util.Map.Entry;
*/ */
public class Morsecode { public class Morsecode {
/** /**
* Anlegen der codeMap als TreeMap * Anlegen der codeMap als TreeMap.
*/ */
private TreeMap<String, String> codeMap; private TreeMap<String, String> codeMap;
/** /**
* Im Konstruktor werden alle verfuegbaren Buchstaben (A-Z) und deren zugehoerigen * Im Konstruktor werden alle verfuegbaren Buchstaben (A-Z) und deren zugehoerigen
* Morsecodes, der codeMap hinzugefuegt. * Morsecodes, der codeMap hinzugefuegt.
*/ */
public Morsecode() { public Morsecode() {
codeMap = new TreeMap<>(); codeMap = new TreeMap<>();
this.codeMap.put("A", ".-"); this.codeMap.put("A", ".-");
this.codeMap.put("B", "-..."); this.codeMap.put("B", "-...");
this.codeMap.put("C", "-.-."); this.codeMap.put("C", "-.-.");
this.codeMap.put("D", "-.."); this.codeMap.put("D", "-..");
this.codeMap.put("E", "."); this.codeMap.put("E", ".");
this.codeMap.put("F", "..-."); this.codeMap.put("F", "..-.");
this.codeMap.put("G", "--."); this.codeMap.put("G", "--.");
this.codeMap.put("H", "...."); this.codeMap.put("H", "....");
this.codeMap.put("I", ".."); this.codeMap.put("I", "..");
this.codeMap.put("J", ".---"); this.codeMap.put("J", ".---");
this.codeMap.put("K", "-.-"); this.codeMap.put("K", "-.-");
this.codeMap.put("L", ".-.."); this.codeMap.put("L", ".-..");
this.codeMap.put("M", "--"); this.codeMap.put("M", "--");
this.codeMap.put("N", "-."); this.codeMap.put("N", "-.");
this.codeMap.put("O", "---"); this.codeMap.put("O", "---");
this.codeMap.put("P", ".--."); this.codeMap.put("P", ".--.");
this.codeMap.put("Q", "--.-"); this.codeMap.put("Q", "--.-");
this.codeMap.put("R", ".-."); this.codeMap.put("R", ".-.");
this.codeMap.put("S", "..."); this.codeMap.put("S", "...");
this.codeMap.put("T", "-"); this.codeMap.put("T", "-");
this.codeMap.put("U", "..-"); this.codeMap.put("U", "..-");
this.codeMap.put("V", "...-"); this.codeMap.put("V", "...-");
this.codeMap.put("W", ".--"); this.codeMap.put("W", ".--");
this.codeMap.put("X", "-..-"); this.codeMap.put("X", "-..-");
this.codeMap.put("Y", "-.--"); this.codeMap.put("Y", "-.--");
this.codeMap.put("Z", "--.."); this.codeMap.put("Z", "--..");
this.codeMap.put(" ", "-...-"); this.codeMap.put(" ", "-...-");
this.codeMap.put("1", ".----"); this.codeMap.put("1", ".----");
this.codeMap.put("2", "..---"); this.codeMap.put("2", "..---");
this.codeMap.put("3", "...--"); this.codeMap.put("3", "...--");
this.codeMap.put("4", "....-"); this.codeMap.put("4", "....-");
this.codeMap.put("5", "....."); this.codeMap.put("5", ".....");
this.codeMap.put("6", "-...."); this.codeMap.put("6", "-....");
this.codeMap.put("7", "--..."); this.codeMap.put("7", "--...");
this.codeMap.put("8", "---.."); this.codeMap.put("8", "---..");
this.codeMap.put("9", "----."); this.codeMap.put("9", "----.");
this.codeMap.put("0", "-----"); this.codeMap.put("0", "-----");
} }
/** /**
* Diese Funktion ueberprueft ob der uebergebene Buchstabe in der codeMap enthalten ist. * Diese Funktion ueberprueft ob der uebergebene Buchstabe in der codeMap enthalten ist.
* Wenn er enthalten ist, wird der zugehoerige Morsecode zurueck gegeben, ansonsten null. * Wenn er enthalten ist, wird der zugehoerige Morsecode zurueck gegeben, ansonsten null.
* *
* @param buchstabe : char : Zu uebersetzender Buchstabe * @param buchstabe : char : Zu uebersetzender Buchstabe.
* @return String : Der zugehoerige Morsecode aus der codeMap * @return String : Der zugehoerige Morsecode aus der codeMap.
*/ */
private String getMorsecode(char buchstabe) { private String getMorsecode(char buchstabe) {
return this.codeMap.getOrDefault(String.valueOf(buchstabe).toUpperCase(), null); return this.codeMap.getOrDefault(String.valueOf(buchstabe).toUpperCase(), null);
} }
/** /**
* Der uebergebene String wird in seine einzelnen Zeichen (char) zerlegt und an die Funktion getMorsecode * Der uebergebene String wird in seine einzelnen Zeichen (char) zerlegt und an die Funktion getMorsecode
* uebergeben und der zugehoerige Morsecode raus gesucht. * uebergeben und der zugehoerige Morsecode rausgesucht.
* Mittels eines StringBuilders werden die Ergebnisse zu einem Rückgabe String zusammen gesetzt. * Mittels eines StringBuilders werden die Ergebnisse zu einem Rueckgabe-String zusammengesetzt.
* Wenn kein zugehoeriger Code in der codeMap gefunden wurde, wird das Zeichen ignoriert da es bei der * Wenn kein zugehoeriger Code in der codeMap gefunden wurde, wird das Zeichen ignoriert da es bei der
* Enigma nicht vorhanden war. * Enigma nicht vorhanden war.
* *
* @param input : String : Zu konvertierender Text * @param input : String : Zu konvertierender Text.
* @return String : Der in Morsecode konvertierte Text * @return String : Der in Morsecode konvertierte Text.
*/ */
public String convertBuchstabeToMorsecode(String input) { public String convertBuchstabeToMorsecode(String input) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
String morsecode; String morsecode;
// Durch alle char im uebergebenen String loopen // Durch alle char im uebergebenen String loopen
for (int i = 0; i < input.length(); i++) { for (int i = 0; i < input.length(); i++) {
morsecode = this.getMorsecode(input.charAt(i)); morsecode = this.getMorsecode(input.charAt(i));
if (morsecode != null) { if (morsecode != null) {
sb.append(morsecode).append(' '); sb.append(morsecode).append(' ');
} }
} }
return sb.toString(); return sb.toString();
} }
/** /**
* Diese Funktion ueberprueft ob der uebergebene Morsecode in der codeMap enthalten ist. * Diese Funktion ueberprueft ob der uebergebene Morsecode in der codeMap enthalten ist.
* Wenn er enthalten ist, wird der zugehoerige Buchstabe zurueck gegeben, ansonsten null * Wenn er enthalten ist, wird der zugehoerige Buchstabe zurueckgegeben, ansonsten null.
* *
* @param morsecode : String : Der zu uebersetzende Morsecode * @param morsecode : String : Der zu uebersetzende Morsecode.
* @return : String : Der zugehoerige Buchstabe aus der codeMap * @return : String : Der zugehoerige Buchstabe aus der codeMap.
*/ */
private String getBuchstabe(String morsecode) { private String getBuchstabe(String morsecode) {
String result = null; String result = null;
// Loopt duch die codeMap und erstellt daraus ein Set // Loopt duch die codeMap und erstellt daraus ein Set
for (Entry<String, String> entry : this.codeMap.entrySet()) { for (Entry<String, String> entry : this.codeMap.entrySet()) {
if (entry.getValue().equals(morsecode)) { if (entry.getValue().equals(morsecode)) {
result = entry.getKey(); result = entry.getKey();
} }
} }
return result; return result;
} }
/** /**
* Der uebergebene String wird in ein String Array zerlegt. Als Trennzeichen wird das Leerzeichen genutzt. * Der uebergebene String wird in ein String-Array zerlegt. Als Trennzeichen wird das Leerzeichen genutzt.
* Anschließend wird das Array durchlaufen und die Elemente an die Funktion getBuchstabe uebergeben um den * Anschließend wird das Array durchlaufen und die Elemente an die Funktion getBuchstabe uebergeben um den
* zugehoerigen Buchstaben zu erhalten. * zugehoerigen Buchstaben zu erhalten.
* Mittels eines StringBuilders werden die Ergebnisse zu einem Rueckgabe String zusammengesetzt. * Mittels eines StringBuilders werden die Ergebnisse zu einem Rueckgabe String zusammengesetzt.
* Wenn kein zugehoeriger Buchstabe in der codeMap gefunden wurde, wird das Zeichen ignoriert da es bei der * Wenn kein zugehoeriger Buchstabe in der codeMap gefunden wurde, wird das Zeichen ignoriert, da es bei der
* Enigma nicht vorhanden war. * Enigma nicht vorhanden war.
* *
* @param input : String : Zu konvertierender Morsecode * @param input : String : Zu konvertierender Morsecode.
* @return String : Der in Text konvertierte Morsecode * @return String : Der in Text konvertierte Morsecode.
*/ */
public String convertMorsecodeToBuchstabe(String input) { public String convertMorsecodeToBuchstabe(String input) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
String buchstabe; String buchstabe;
String[] morsecodes = input.split(" "); String[] morsecodes = input.split(" ");
// Durch alle char im uebergebenen String loopen // Durch alle char im uebergebenen String loopen
for (String morsecode : morsecodes) { for (String morsecode : morsecodes) {
buchstabe = this.getBuchstabe(morsecode); buchstabe = this.getBuchstabe(morsecode);
if (buchstabe != null) { if (buchstabe != null) {
sb.append(buchstabe); sb.append(buchstabe);
} }
} }
return sb.toString(); return sb.toString();
} }
} }
...@@ -3,10 +3,10 @@ package projekt.enigma.model; ...@@ -3,10 +3,10 @@ package projekt.enigma.model;
/** /**
* Klasse Reflektor * Klasse Reflektor
* <br> * <br>
* Der Reflektor nimmt einen Buchstaben der Klasse Walze entgegen und und codiert diesen. * Der Reflektor nimmt einen Buchstaben der Klasse Walze entgegen und codiert diesen.
* Der codierte Buchstabe wird an die Klasse Walze wieder zurückgegeben. * Der codierte Buchstabe wird an die Klasse Walze wieder zurueckgegeben.
* <br> * <br>
* Prinzipiell verhaelt sich die Klasse Reflektor wie die Klasse Walze, außer das sie sich * Prinzipiell verhaelt sich die Klasse Reflektor wie die Klasse Walze, ausser das sie sich
* nach Betaetigung einer Taste nicht dreht (quasi starr montiert ist) und sie gibt keine Signale * nach Betaetigung einer Taste nicht dreht (quasi starr montiert ist) und sie gibt keine Signale
* an andere Walzen zum Drehen. * an andere Walzen zum Drehen.
*/ */
...@@ -18,14 +18,11 @@ public class Reflektor { ...@@ -18,14 +18,11 @@ public class Reflektor {
* Durchsucht den String alphabet nach der Position des mitgegebenen Buchstabens und * Durchsucht den String alphabet nach der Position des mitgegebenen Buchstabens und
* gibt den Character an der entsprechenden Position im String reflektor zurueck. * gibt den Character an der entsprechenden Position im String reflektor zurueck.
* *
* @return char : Der codierte Buchstabe aus dem Reflektor * @param buchstabe : Character : der zu codierende Buchstabe.
* @return char : Der codierte Buchstabe aus dem Reflektor.
*/ */
public char codiere(Character buchstabe) { public char codiere(Character buchstabe) {
// alphabet : String mit den Werten des Alphabeths (26 Werte)
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// reflektor : String mit den Werten des Reflektors (26 Werte)
String reflektor = "EJMZALYXVBWFCRQUONTSPIKHGD"; String reflektor = "EJMZALYXVBWFCRQUONTSPIKHGD";
return reflektor.charAt(alphabet.indexOf(buchstabe)); return reflektor.charAt(alphabet.indexOf(buchstabe));
......
package projekt.enigma.model; package projekt.enigma.model;
/** /**
* TODO: Dokumentation aktuallisieren
* <p> * <p>
* Klasse Steckbrett * Klasse Steckbrett
* <br> * <br>
* Das Steckbrett diente dazu Buchstaben paarweise zu vertauschen noch bevor diese durch die Walzen codiert werden. * Das Steckbrett diente dazu, Buchstaben paarweise zu vertauschen noch bevor diese durch die Walzen codiert werden.
* Die Klasse Steckbrett nimmt bis zu 10 paarweise zu vertauschende Buchstabenpaare entgegen, prueft diese auf * Die Klasse Steckbrett nimmt bis zu 10 paarweise zu vertauschende Buchstabenpaare entgegen, prueft diese auf
* Zulaessigkeit und tauscht diese dann paarweise aus. * Zulaessigkeit und tauscht diese dann paarweise aus.
*/ */
public class Steckbrett { public class Steckbrett {
/** /**
* orginalBuchstaben: Character-Array, der jeweils den ersten zu vertauschenden Buchstaben enthält * orginalBuchstaben: String : der jeweils den ersten zu vertauschenden Buchstaben enthaelt.
*/ */
private String originalBuchstaben; private String originalBuchstaben;
/** /**
* getauschteBuchstaben: Character-Array, der jeweils den zweiten zu vertauschenden Buchstaben enthält * getauschteBuchstaben: String : der jeweils den zweiten zu vertauschenden Buchstaben enthaelt.
*/ */
private String getauschteBuchstaben; private String getauschteBuchstaben;
/** /**
* Konstruktor Steckbrett * Konstruktor Steckbrett
* <br> * <br>
* Erzeugt zwei Charakter-Arrays (orginalBuchstaben und getauschteBuchstaben) der Länge 10. * Erzeugt zwei Strings und initialisiert diese.
*/ */
public Steckbrett() { public Steckbrett() {
originalBuchstaben = ""; originalBuchstaben = "";
getauschteBuchstaben = ""; getauschteBuchstaben = "";
} }
...@@ -36,25 +33,24 @@ public class Steckbrett { ...@@ -36,25 +33,24 @@ public class Steckbrett {
/** /**
* Funktion setzeVertauschung * Funktion setzeVertauschung
* <br> * <br>
* Der Funktion setzeVertauschung werden 2 Buchstaben (buchstabe1 und buchstabe2) übergeben. * Der Funktion setzeVertauschung werden 2 Buchstaben (buchstabe1 und buchstabe2) uebergeben.
* Zuerst wird überprüft ob einer der beiden Buchstaben bereits enthalten ist, was unzulässig wäre. * Zuerst wird ueberprueft ob einer der beiden Buchstaben bereits enthalten ist, was unzulaessig waere.
* <br> * <br>
* Anschließend wird: * Anschliessend wird:
* <p> * <p>
* buchstabe1 in das Array orginalBuchstaben auf den nächsten, freien Index geschrieben * buchstabe1 dem String orginalBuchstaben angehaengt.
* buchstabe2 in das Array getauschteBuchstaben auf den nächsten, freien Index geschrieben. * buchstabe2 dem String getauschteBuchstaben angehaengt.
* </p> * </p>
* *
* @param buchstabe1 : char: Gibt den ersten Buchstaben an, der getauscht werden soll. * @param buchstabe1 : char : Gibt den ersten Buchstaben an, der getauscht werden soll.
* @param buchstabe2 : char: gibt den zweiten Buchstaben an, mit dem der erste getauscht werden soll. * @param buchstabe2 : char : gibt den zweiten Buchstaben an, mit dem der erste getauscht werden soll.
* @return boolean : Wenn die Vertauschung zulässig ist, true, ansonsten false * @return boolean : Wenn die Vertauschung zulaessig ist, true, ansonsten false.
*/ */
public boolean setzeVertauschung(char buchstabe1, char buchstabe2) { public boolean setzeVertauschung(char buchstabe1, char buchstabe2) {
if ((!ueberpruefeVertauschungen(buchstabe1)) && (!ueberpruefeVertauschungen(buchstabe2))
if (!ueberpruefeVertauschungen(buchstabe1) && !ueberpruefeVertauschungen(buchstabe2) && originalBuchstaben.length() <= 20) { && (originalBuchstaben.length() <= 20)) {
originalBuchstaben += buchstabe1; originalBuchstaben += buchstabe1;
getauschteBuchstaben += buchstabe2; getauschteBuchstaben += buchstabe2;
return true; return true;
} else { } else {
return false; return false;
...@@ -62,47 +58,64 @@ public class Steckbrett { ...@@ -62,47 +58,64 @@ public class Steckbrett {
} }
/** /**
* Funktion setzeVertauschung mit angabe eines Ports von 1 - 10 * Funktion setzeVertauschung mit Angabe eines Ports von 1 - 10
* <br> * <br>
* Der Funktion setzeVertauschung werden 2 Buchstaben (buchstabe1 und buchstabe2) sowie der Port übergeben. * Der Funktion setzeVertauschung werden 2 Buchstaben (buchstabe1 und buchstabe2) sowie der Port uebergeben.
* Zuerst wird überprüft ob einer der beiden Buchstaben bereits enthalten ist, was unzulässig wäre. * Zuerst wird ueberprueft ob einer der beiden Buchstaben bereits enthalten ist, was unzulaessig waere.
* <br> * <br>
* Anschließend wird: * Anschliessend wird:
* <p> * <p>
* buchstabe1 in das Array orginalBuchstaben auf den Index (steckbrettPort) geschrieben * buchstabe1 in den String orginalBuchstaben auf die Position (steckbrettPort) geschrieben.
* buchstabe2 in das Array getauschteBuchstaben auf den Index (steckbrettPort) geschrieben. * buchstabe2 in den String getauschteBuchstaben auf die Position (steckbrettPort) geschrieben.
* </p> * </p>
* *
* @param buchstabe1 : char: Gibt den ersten Buchstaben an, der getauscht werden soll. * @param buchstabe1 : char: Gibt den ersten Buchstaben an, der getauscht werden soll.
* @param buchstabe2 : char: gibt den zweiten Buchstaben an, mit dem der erste getauscht werden soll. * @param buchstabe2 : char: gibt den zweiten Buchstaben an, mit dem der erste getauscht werden soll.
* @return boolean : Wenn die Vertauschung zulässig ist, true, ansonsten false * @return boolean : Wenn die Vertauschung zulaessig ist, true, ansonsten false.
*/ */
public boolean setzeVertauschung(int steckbrettPort, char buchstabe1, char buchstabe2) { public boolean setzeVertauschung(int steckbrettPort, char buchstabe1, char buchstabe2) {
char[] original;
char[] getauscht;
new Fehler().debug("setzeVertauschung(int " + steckbrettPort + ", char |" + buchstabe1 + "|, char |" + buchstabe2 + "|)", false);
if ((!ueberpruefeVertauschungen(buchstabe1) && !ueberpruefeVertauschungen(buchstabe2)) ||
(buchstabe1 == ' ' && buchstabe2 == ' ')) {
if (!ueberpruefeVertauschungen(buchstabe1) && !ueberpruefeVertauschungen(buchstabe2)) { new Fehler().debug("-> Original:\t" + originalBuchstaben, false);
originalBuchstaben.replace(originalBuchstaben.charAt(steckbrettPort), buchstabe1); new Fehler().debug("-> Getauscht:\t" + getauschteBuchstaben, false);
getauschteBuchstaben.replace(getauschteBuchstaben.charAt(steckbrettPort), buchstabe2); original = originalBuchstaben.toCharArray();
getauscht = getauschteBuchstaben.toCharArray();
original[steckbrettPort] = buchstabe1;
getauscht[steckbrettPort] = buchstabe2;
originalBuchstaben = String.valueOf(original);
getauschteBuchstaben = String.valueOf(getauscht);
new Fehler().debug("<- Original:\t" + originalBuchstaben, false);
new Fehler().debug("<- Getauscht:\t" + getauschteBuchstaben, false);
new Fehler().debug("true\tOS: |" + originalBuchstaben + "| GS: |" + getauschteBuchstaben + "|", false);
return true; return true;
} else { } else {
new Fehler().debug("false\tOS: |" + originalBuchstaben + "| GS: |" + getauschteBuchstaben + "|", false);
return false; return false;
} }
} }
/** /**
* Funktion ueberpruefeVertauschungen * Funktion ueberpruefeVertauschungen
* <br> * <br>
* Die Funktion ueberpruefeVertauschungen prueft ob der übergebene Buchstabe bereits in den beiden Arrays * Die Funktion ueberpruefeVertauschungen prueft, ob der uebergebene Buchstabe bereits in den beiden Strings
* (orginalBuchstaben) und (getauschteBuchstaben) vorhanden ist. * orginalBuchstaben und getauschteBuchstaben vorhanden ist.
* Eine Buchstabenvertauschung ist zulaessig, wenn keine Dopplungen der zu vertauschenden Buchstaben auftritt * Eine Buchstabenvertauschung ist zulaessig, wenn keine Dopplungen der zu vertauschenden Buchstaben auftritt
* (ein Buchstabe nicht mehrmals vertauscht wird). * (ein Buchstabe nicht mehrmals vertauscht wird).
* *
* @return boolean : Wenn false, dann darf der Buchstabe genutzt werden. * @param buchstabe : Character: zu pruefender Buchstabe.
* Wenn er schon vorhanden ist, wird true zurück gegeben * @return result : boolean : Wenn false, dann darf der Buchstabe genutzt werden. Wenn er schon vorhanden ist,
* wird true zurueckgegeben.
*/ */
public boolean ueberpruefeVertauschungen(Character buchstabe) { public boolean ueberpruefeVertauschungen(Character buchstabe) {
boolean result = false; boolean result = false;
if (originalBuchstaben.contains(String.valueOf(buchstabe)) || if (originalBuchstaben.contains(String.valueOf(buchstabe)) ||
...@@ -122,10 +135,9 @@ public class Steckbrett { ...@@ -122,10 +135,9 @@ public class Steckbrett {
* @return buchstabe : Character : Codierter Buchstabe. * @return buchstabe : Character : Codierter Buchstabe.
*/ */
public char codiere(Character buchstabe) { public char codiere(Character buchstabe) {
if (originalBuchstaben.contains(String.valueOf(buchstabe))) { if (originalBuchstaben.contains(String.valueOf(buchstabe))) {
return getauschteBuchstaben.charAt(originalBuchstaben.indexOf(buchstabe)); return getauschteBuchstaben.charAt(originalBuchstaben.indexOf(buchstabe));
} else if(getauschteBuchstaben.contains(String.valueOf(buchstabe))) { } else if (getauschteBuchstaben.contains(String.valueOf(buchstabe))) {
return originalBuchstaben.charAt(getauschteBuchstaben.indexOf(buchstabe)); return originalBuchstaben.charAt(getauschteBuchstaben.indexOf(buchstabe));
} else { } else {
return buchstabe; return buchstabe;
...@@ -133,12 +145,12 @@ public class Steckbrett { ...@@ -133,12 +145,12 @@ public class Steckbrett {
} }
/** /**
* TODO: Doku * Tauscht die Buchstaben im Alphabet aus und gibt ein modifiziertes Alphabet zurueck.
* @param port *
* @return * @param port : int : Platz der getauschten Buchstaben.
* @return alphabet : String : Alphabet mit getauschtem Buchstabenpaar.
*/ */
public String fetchVerfuegbareBuchstaben(int port) { public String fetchVerfuegbareBuchstaben(int port) {
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (char c : this.originalBuchstaben.toCharArray()) { for (char c : this.originalBuchstaben.toCharArray()) {
...@@ -154,5 +166,4 @@ public class Steckbrett { ...@@ -154,5 +166,4 @@ public class Steckbrett {
return alphabet; return alphabet;
} }
} }
\ No newline at end of file
...@@ -5,35 +5,38 @@ package projekt.enigma.model; ...@@ -5,35 +5,38 @@ package projekt.enigma.model;
* <br> * <br>
* Erzeugt ein Objekt des Typs Walze mit den Eigenschaften: * Erzeugt ein Objekt des Typs Walze mit den Eigenschaften:
* <br> * <br>
* 1. Walzennummer (Die Walze enthaelt die 26 Buchstaben des Alphabeths und codiert diese. * 1. Walzennummer (Die Walze enthaelt die 26 Buchstaben des Alphabets und codiert diese.
* fuenf verschiedene Walzen stehen zur Auswahl, die jeweils verschieden die Buchstaben des Alphabeths * Fuenf verschiedene Walzen stehen zur Auswahl, die jeweils verschieden die Buchstaben des Alphabets
* vertauschen) * vertauschen).
* <br> * <br>
* 2. Ringstellung (Umspringpunkt der Walze wird festgelegt. Der Umspringpunkt bestimmt * 2. Ringstellung (Umspringpunkt der Walze wird festgelegt. Der Umspringpunkt bestimmt
* den Drehzeitpunkt der linken Nachbarwalze.) * den Drehzeitpunkt der linken Nachbarwalze).
*/ */
public class Walze { public class Walze {
//region Variablen //region Variablen
/** /**
* Die Anzahl der getaetigten Walzen Drehungen * Die Anzahl der getaetigten Walzendrehungen.
* TODO: Wieder auf private setzen
*/ */
public int turns; private int turns;
/** /**
* Das String Array aller bekannter aktueller Walzen * Das String-Array aller bekannter aktueller Walzen.
*/ */
private String[] walzen; private String[] walzen;
/** /**
* alphabet : String : enthaelt die Buchstaben des Alphabets * alphabet : String : enthaelt die Buchstaben des Alphabets.
*/ */
private String alphabet; private String alphabet;
/** /**
* ringstellung : char : zeigt die Einstellung fuer den Umspringpunkt * ringstellung : char : zeigt die Einstellung fuer den Umspringpunkt.
*/ */
private char ringstellung; private char ringstellung;
/** /**
* walzenNr : int : Bestimmt, welche Walze genutzt wird * walzenNr : int : Bestimmt, welche Walze genutzt wird.
*/ */
private int walzenNr; private int walzenNr;
...@@ -41,10 +44,10 @@ public class Walze { ...@@ -41,10 +44,10 @@ public class Walze {
//region Konstruktor //region Konstruktor
/** /**
* Ueberschriebener Konstruktor, der die Eingangsparameter der Walze mit gibt * Ueberschriebener Konstruktor, der die Eingangsparameter der Walze mit gibt.
* *
* @param walzenNr : int : Nummer der gewaehlten Walze * @param walzenNr : int : Nummer der gewaehlten Walze.
* @param ringstellung : int : Einstellung des Umsprungpunktes * @param ringstellung : int : Einstellung des Umsprungpunktes.
*/ */
public Walze(int walzenNr, int ringstellung) { public Walze(int walzenNr, int ringstellung) {
this.walzen = new String[5]; this.walzen = new String[5];
...@@ -68,18 +71,17 @@ public class Walze { ...@@ -68,18 +71,17 @@ public class Walze {
* <p> * <p>
* Ueberprueft, ob der Umspringpunkt der Walze nach der Drehung erreicht wurde. * Ueberprueft, ob der Umspringpunkt der Walze nach der Drehung erreicht wurde.
* *
* @param richtung : int : 1 dreht die Walze weiter und -1 dreht sie einen Schritt zurueck * @param richtung : int : 1 dreht die Walze weiter und -1 dreht sie einen Schritt zurueck.
* @return checkRing : boolean : gibt true zurueck wenn der Umspringpunkt erreicht wurde * @return checkRing : boolean : gibt true zurueck, wenn der Umspringpunkt erreicht wurde.
* TODO: Doku
*/ */
public boolean dreheWalze(int richtung) { boolean dreheWalze(int richtung) {
boolean checkRing = false; boolean checkRing = false;
int korrekturFaktor = 0; int korrekturFaktor = 0;
if ((richtung == -1) || (richtung == 1)) { if ((richtung == -1) || (richtung == 1)) {
if (richtung == 1) { if (richtung == 1) {
this.turns++; this.turns++;
} else if (richtung == -1) { } else {
korrekturFaktor = 1; korrekturFaktor = 1;
this.turns--; this.turns--;
} }
...@@ -95,10 +97,10 @@ public class Walze { ...@@ -95,10 +97,10 @@ public class Walze {
} }
/** /**
* Codiert den mitgegebenen Buchstaben anhand er gewaehlten Walze. * Codiert den mitgegebenen Buchstaben anhand der gewaehlten Walze.
* *
* @param buchstabe : char : Buchstabe, der verschluesselt werden soll * @param buchstabe : char : Buchstabe, der verschluesselt werden soll.
* @return char : verschluesselter Buchstabe * @return char : verschluesselter Buchstabe.
*/ */
public char codiere(char buchstabe) { public char codiere(char buchstabe) {
return this.fetchWalze().charAt((this.alphabet.indexOf(buchstabe) + this.turns) % 26); return this.fetchWalze().charAt((this.alphabet.indexOf(buchstabe) + this.turns) % 26);
...@@ -107,15 +109,15 @@ public class Walze { ...@@ -107,15 +109,15 @@ public class Walze {
/** /**
* Decodiert den mitgegebenen Buchstaben anhand des Alphabets. * Decodiert den mitgegebenen Buchstaben anhand des Alphabets.
* *
* @param buchstabe : char : Buchstabe, der decodiert werden soll * @param buchstabe : char : Buchstabe, der decodiert werden soll.
* @return char : decodierter Buchstabe * @return char : decodierter Buchstabe.
*/ */
public char codiere2(char buchstabe) { char codiere2(char buchstabe) {
return this.alphabet.charAt((this.fetchWalze().indexOf(buchstabe) - this.turns + 260) % 26); return this.alphabet.charAt((this.fetchWalze().indexOf(buchstabe) - this.turns + 520) % 26);
} }
/** /**
* @return String : Gibt den Verschluesselunngsstring der ausgewaehlten Walze zurueck. * @return String : Gibt den Verschluesselungs-String der ausgewaehlten Walze zurueck.
*/ */
private String fetchWalze() { private String fetchWalze() {
return walzen[walzenNr]; return walzen[walzenNr];
...@@ -125,11 +127,11 @@ public class Walze { ...@@ -125,11 +127,11 @@ public class Walze {
//region Setter //region Setter
/** /**
* Setzt die Walzennummer. Es stehen fuenf Walze zur Auswahl. * Setzt die Walzennummer. Es stehen fuenf Walzen zur Auswahl.
* *
* @param walzenNr : int : Walzennummer * @param walzenNr : int : Walzennummer.
*/ */
public void setWalzenNr(int walzenNr) { private void setWalzenNr(int walzenNr) {
if ((walzenNr > 0) && (walzenNr < 6)) { if ((walzenNr > 0) && (walzenNr < 6)) {
this.walzenNr = walzenNr - 1; this.walzenNr = walzenNr - 1;
} else { } else {
...@@ -144,9 +146,9 @@ public class Walze { ...@@ -144,9 +146,9 @@ public class Walze {
* Die Ringstellung wird zum char umgewandelt. * Die Ringstellung wird zum char umgewandelt.
* Im Fehlerfall wird die Ringstellung standardmaessig auf 'Z' gesetzt. * Im Fehlerfall wird die Ringstellung standardmaessig auf 'Z' gesetzt.
* *
* @param ringstellung : int : Punkt an dem die Nachbarwalze umspringt * @param ringstellung : int : Punkt an dem die Nachbarwalze umspringt.
*/ */
public void setRingstellung(int ringstellung) { void setRingstellung(int ringstellung) {
if ((ringstellung > 0) && (ringstellung <= 26)) { if ((ringstellung > 0) && (ringstellung <= 26)) {
this.ringstellung = this.alphabet.charAt(ringstellung - 1); this.ringstellung = this.alphabet.charAt(ringstellung - 1);
} else { } else {
...@@ -155,25 +157,32 @@ public class Walze { ...@@ -155,25 +157,32 @@ public class Walze {
} }
/** /**
* * TODO: Funktionsname hat sich geändert
* Stellt die Grundeinstellung der Walze ein. * Stellt die Grundeinstellung der Walze ein.
* Ermittelt, wie oft die Walze gedreht werden muss, bis die Grundeinstellung erreicht ist. * Ermittelt, wie oft die Walze gedreht werden muss, bis die Grundeinstellung erreicht ist.
* *
* @param buchstabe : Character : Einstellung der Walze * @param buchstabe : Character : Einstellung der Walze.
*/ */
public void setPosition(Character buchstabe) { void setPosition(Character buchstabe) {
this.turns = alphabet.indexOf(buchstabe); this.turns = alphabet.indexOf(buchstabe);
} }
//endregion //endregion
//region Getter //region Getter
/** /**
* Gibt den Buchstabe zurueck, der aktuell in der Walze eingestellt ist. * Gibt den Buchstaben zurueck, der aktuell in der Walze eingestellt ist.
* *
* @return char : Ermittelte stelle im Alphabet, anhand der aktuellen Anzahl der Drehungen * @return char : Ermittelte Stelle im Alphabet, anhand der aktuellen Anzahl der Drehungen.
*/ */
public Character getPosition() { Character getPosition() {
return this.alphabet.charAt(turns % 26); return this.alphabet.charAt(turns % 26);
} }
/**
* Getter der Walzennummer.
* @return walzenNr : int : gibt Walzennummer zurueck.
*/
int getWalzenNr() {
return this.walzenNr;
}
//endregion //endregion
} }
\ No newline at end of file
package projekt.enigma.threads;
import projekt.enigma.App;
/**
* Thread fuer die Benutzeroberflaeche, wird durch das Interface Runnable erweitert
*/
public class ThreadApp implements Runnable {
private String[] args;
/**
* Ueberschriebene Funktion - fuehrt die Klasse App aus
*/
@Override
public void run() {
System.out.println("ThreadApp " + Thread.currentThread());
App app = new App();
app.main(args);
}
}
package projekt.enigma.threads;
import projekt.enigma.model.Codierer;
import projekt.enigma.model.Funkraum;
/**
* Thread fuer den Funkraum, wird durch das Interface Runnable erweitert
*/
public class ThreadFunkraum implements Runnable {
String kenngruppe;
public ThreadFunkraum(String kenngruppe) {
this.kenngruppe = kenngruppe;
}
/**
* Ueberschriebene Funktion - fuehrt die Klasse Funkraum aus und startet die Methode empfangeFunkspruch
*/
@Override
public void run() {
Funkraum funkraum = new Funkraum();
System.out.println("Threadfunkraum" + Thread.currentThread());
funkraum.empfangeFunkspruch(this.kenngruppe);
}
}