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
Showing
with 2876 additions and 2547 deletions
package projekt.enigma;
import projekt.enigma.model.Codierer;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import projekt.enigma.model.Fehler;
import java.io.IOException;
/**
* JavaFX App
* Startklasse fuer JavaFX Application, durch die Erweiterung um die Klasse Application.
* Baut die Benutzeroberflaeche in ihren Grundstrukturen auf.
*/
public class App extends Application {
/**
* TODO Dokumentieren
*/
private static Scene scene;
private Codierer c;
/**
* Deklariert den GuiController.
*/
private static GuiController gc;
/**
* debug : int : fuer die Funktion debug der Klasse Fehler notwendig.
*/
private static int debug;
/**
* Startet die Klasse App und setzt den debug-Wert 1.
*
* @param args : String[] : Standard-Kommandozeilen-Argument.
*/
public static void main(String[] args) {
debug = 0;
launch(args);
}
/**
* Gibt der Getter einen int > 0 zurueck, wird eine Meldung auf der Konsole ausgegeben.
*
* @return debug : int : bestimmt die Eingabe der debung-Methode in der Klasse Fehler.
*/
public static int getDebug() {
return debug;
}
/**
* Initialisierung der Variablen fuer die JavaFX Scene Kenngruppe.
* Abfrage der Kenngruppe und Reaktion auf die Eingabe.
*
* @param primaryStage : Stage : Fenster zur Eingabe der Kenngruppe.
* @throws IOException : wird bei fehlerhafter Eingabe geworfen.
*/
@Override
public void start(Stage primaryStage) throws IOException {
primaryStage.setTitle("Enigma");
primaryStage.setResizable(false);
Label lblEingbae = new Label("Bitte Kenngruppe eingeben!");
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));
btnKenngruppe.setMaxWidth(Double.MAX_VALUE);
// baut die Scene fuer die Kenngruppenabfrage auf
layout.getChildren().addAll(lblEingbae, tfEingabe, btnKenngruppe);
Scene sceKenngruppe = new Scene(layout);
/**
* TODO Dokumentieren
*
* @param fxml
* @throws IOException
*/
static void setRoot(String fxml) throws IOException {
scene.setRoot(loadFXML(fxml));
}
// laden der FXML und der Enigma-Ansicht, um Ladezeiten zu verringern
FXMLLoader guiLoader = new FXMLLoader(App.class.getResource("gui.fxml"));
Scene sceApp = new Scene(guiLoader.load(), 962, 677);
/**
* TODO Dokumentieren
*
* @param fxml
* @return
* @throws IOException
*/
private static Parent loadFXML(String fxml) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
return fxmlLoader.load();
}
/*Bestaetigen der Kenngruppe, Ausgabe einer Fehlermeldung im Fall einer falschen Eingabe und starten
des Enigma-Fensters */
tfEingabe.setOnKeyPressed(e -> {
if (e.getCode() == KeyCode.ENTER) {
if (enter(tfEingabe.getText())) {
gc = guiLoader.getController();
gc.setKenngruppe(tfEingabe.getText());
primaryStage.setScene(sceApp);
} else {
tfEingabe.setText("");
new Fehler().showErrorDialog("error", "Kenngruppe falsch",
"Regeln für die Kenngruppe: 4-8 Zeichen sowie nur Buchstaben von A-Z.");
}
}
});
btnKenngruppe.setOnAction(e -> {
if (enter(tfEingabe.getText())) {
gc = guiLoader.getController();
gc.setKenngruppe(tfEingabe.getText());
primaryStage.setScene(sceApp);
} else {
tfEingabe.setText("");
new Fehler().showErrorDialog("error", "Kenngruppe falsch",
"Regeln für die Kenngruppe: 4-8 Zeichen sowie Buchstaben von A-Z.");
}
});
primaryStage.setScene(sceKenngruppe);
primaryStage.show();
}
/**
* TODO Dokumentieren
*
* @param args
*/
public static void main(String[] args) {
Application.launch();
}
/**
* Ueberprueft die Gueltigkeit der Kenngruppeneingabe.
* Nur Zeichen von A-Z sind zugelassen und die Kenngruppe muss aus mind. 4 und max. 8 Zeichen bestehen.
*
* @param kenngruppe : String : Eingabewert aus dem Fenster.
* @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
*
* @param stage
* @throws IOException
*/
@Override
public void start(Stage stage) throws IOException {
scene = new Scene(loadFXML("gui"));
stage.setScene(scene);
stage.setResizable(true);
stage.show();
}
for (char c : kenngruppe.toUpperCase().toCharArray()) {
if (!alphabet.contains(String.valueOf(c))) {
result = false;
break;
}
}
if ((kenngruppe.length() > 8) || (kenngruppe.length() < 4)) {
result = false;
}
return result;
}
}
package projekt.enigma;
import java.io.IOException;
import javafx.fxml.FXML;
public class KenngruppeController {
@FXML
private void switchToPrimary() throws IOException {
App.setRoot("gui");
}
}
\ No newline at end of file
package projekt.enigma;
import java.sql.SQLException;
/**
* Startpunkt des Programms. Startet die Klasse App und damit die GUI.
*/
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);
}
}
......@@ -3,25 +3,24 @@ package projekt.enigma.database;
import java.sql.*;
/**
* Dies ist die SQLite Datenbank Klasse
* In der SQLite Datei im Resources Ordner liegt das Codebuch welches benötigt wird um die
* Nachrichten mit der Enigma zu ver/entschlüsseln.
* Dies ist die SQLite Datenbank Klasse.
* In der SQLite Datei im Resources Ordner liegt das Codebuch welches benoetigt wird um die
* Nachrichten mit der Enigma zu ver/entschluesseln.
* 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.
* 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 {
/**
* 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.
*
* @return conn : Connection
* @return conn : Connection: statische Datenbankverbindung.
*/
private Connection connect() {
String url = "jdbc:sqlite::resource:projekt/enigma/codebuch.sqlite";
Connection conn = null;
......@@ -35,15 +34,15 @@ public class DatenbankSqlite {
}
/**
* Liest das Codebuch aus der SQLite Datenbank aus
* Dieser Funktion muss ein tag als int Wert übergeben werden.
* Anschließend wir eine Verbindung zur SQLite Datenbank aufgebaut und das Codebuch angefragt.
* Dieses wird in ein Object vom Type Codebuch gepackt und zurück gegeben.
* Liest das Codebuch aus der SQLite Datenbank aus.
* Dieser Funktion muss ein tag als int Wert uebergeben werden.
* Anschließend wird eine Verbindung zur SQLite Datenbank aufgebaut und das Codebuch angefragt.
* 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.
* @return String : Die Einstellungen des angefragten Tages
* @param tag : int : Tag fuer welchen ein Codebuch benoetigt wird.
* @return String : Die Einstellungen des angefragten Tages.
* <p>
* String[0] : Tag
* String[1] : Walzenlage
......@@ -52,12 +51,11 @@ public class DatenbankSqlite {
* </p>
*/
public String[] getCodebuch(int tag) {
String[] codebuch = new String[4];
try {
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);
ResultSet rs = pstm.executeQuery();
......@@ -67,101 +65,8 @@ public class DatenbankSqlite {
codebuch[2] = rs.getString("Ringstellung");
codebuch[3] = rs.getString("Steckverbindung");
}
} catch (SQLException ignored) {
}
} catch (SQLException ignored) {}
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,51 +6,54 @@ import java.time.LocalDate;
import java.time.ZoneId;
/**
* Das Codebuch war eines der essentiel wichtigen Sachen bei der Enigma.
* Jeder Enigma gehörte auch ein Codebuch bei, welches notwendig war um die Nachrichten zu ver/entschlüsseln.
* 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.
* Im Codebuch standen für jeden Tag des Monats die notwendigen Einstellungen welche vorgenommen werden
* mussten um die Texte zu ver/entschlüsseln.
* Hiernach wurden die Walzen eingesetzt, die Ringe für den Rücksprung der Walze gesetzt und deren Grundeinstellung
* mussten, um die Texte zu ver/entschluesseln.
* Hiernach wurden die Walzen eingesetzt, die Ringe für den Ruecksprung der Walze gesetzt und deren Grundeinstellung
* vorgenommen.
* Bei der Enigma um welche es hier geht (Enigma I) gab es zusätzlich ein Steckbrett, welches ebenfalls im Codebuch
* Bei der Enigma I, um welche es hier geht, gab es zusaetzlich ein Steckbrett, welches ebenfalls im Codebuch
* festgelegt war.
* <p>
* Dieses Codebuch Objekt enthält die Einstellungen eines Tages, welche mittels Getter und Setter
* verarbeitet werden können.
* Dieses Codebuch enthaelt die Einstellungen eines Tages, welche mittels Getter und Setter
* verarbeitet werden koennen.
* <p>
* Zusätzlich gibt es zu Debug Zwecken eine überschriebene toString Funktion welche das Objekt als String zurück
* geben kann.
* Zusaetzlich gibt es zu Debug-Zwecken eine ueberschriebene toString Funktion, welche das Objekt als String
* zurueckgeben kann.
*/
public class Codebuch {
//region Variablen
/**
* TODO: Dokumentieren tag
* tag : int : gibt den Tag an
* tag : int : gibt den Tag eines Monats an.
*/
private int tag;
/**
* walzenlage : int[] : legt die Positionen der Walzen fest
* walzenlage : int[] : legt die Positionen der drei Walzen fest.
*/
private int[] walzenlage;
/**
* ringstellung : int[] : TODO ringstellung: char || int ?
* ringstellung : int[] : legt die Ringstellungen der drei Walzen fest.
*/
private int[] ringstellung;
/**
* steckverbindung : char[][] : stellt die Steckverbindungen im Steckbrett dar
* steckverbindung : char[][] : legt die Steckverbindungen im Steckbrett fest.
*/
private char[][] steckverbindung;
//endregion
//region Konstruktor
/**
* Im Konstruktor werden die Standardwerte gesetzt
* Im Konstruktor werden die Standardwerte gesetzt.
* <p>
* walzenlage : int[3] : Hier wird die Position der drei Walzen festgelegt.
* ringstellung : char[3] : Jede Walze hat einen Ring. Der Index steht für die Walze und der Value für
* die Position des Ringes.
* steckverbindung : char[10][] : Zehn Kabel können in das Steckbrett gesteckt werden. In diesem Array werden
* ringstellung : char[3] : Jede Walze hat einen Ring. Der Index steht fuer die Walze und der Value fuer
* die Position des Ringes.
* steckverbindung : char[10][] : Zehn Kabel koennen in das Steckbrett gesteckt werden. In diesem Array werden
* die Kabel mit ihren jeweiligen Buchsen hinterlegt.
*/
public Codebuch() {
......@@ -65,13 +68,15 @@ public class Codebuch {
}
}
//endregion
//region Funktionen & Methoden
/**
* TODO: Dokumentieren
* Holt den Tagesschluessel aus dem Codebuch ab. Ist kein Tag angegeben, wird der aktuelle Tag genutzt.
* Aus dem Tagesschluessel werden die Werte fuer die Walzenlage, Ringstellung und Steckverbindung
* gesetzt.
*
* @param tag : int[] : gibt einen Tag oder mehrere Tage mit
* @param tag : int[] : gibt keinen, einen Tag oder mehrere Tage mit.
*/
public void fetchTagesschluessel(int... tag) {
String[] walzenlage, ringstellung, db;
......@@ -84,6 +89,7 @@ public class Codebuch {
this.setTag(Integer.parseInt(db[0]));
// setzen der Walzenlage, Ringstellung, Steckverbindung
walzenlage = db[1].split(",");
for (int i = 0; i < 3; i++) {
this.setWalzenlage(i, Integer.parseInt(walzenlage[i]));
......@@ -95,14 +101,13 @@ public class Codebuch {
}
this.setSteckverbindung(db[3].split(","));
}
/**
* Gibt die aktuelle Instanz des Codebuches als String zurück.
* Hierbei werden der Tag die Walzenlagen, Ring-/Grundstellung sowie die Steckverbindungen zurück gegeben.
* Gibt die aktuelle Instanz des Codebuches als String zurueck.
* 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
public String toString() {
......@@ -144,86 +149,93 @@ public class Codebuch {
return sb.toString();
}
//endregion
//region Setter
/**
* Gibt den Tag dieser Instanz zurück
* Setzt die Steckverbindung dieser Instanz.
*
* @return int : Tag
* @param kabel : String[] : Die Steckverbindungen die gesteckt werden sollen.
* Jeder Eintrag im Array ist ein String mit zwei Zeichen.
* Diese werden in zwei chars zerlegt und anschließend im globalen Array gespeichert.
*/
public int getTag() {
return tag;
private void setSteckverbindung(String[] kabel) {
int counter = 0;
for (String stecker : kabel) {
char[] verbindung = new char[2];
verbindung[0] = stecker.charAt(0);
verbindung[1] = stecker.charAt(1);
this.steckverbindung[counter++] = verbindung;
}
}
/**
* Setzt den Tag dieser Instanz
* Setzt die Walzenlage dieser Instanz.
*
* @param tag : int : Tag
* @param position : int : Position der Walze.
* @param walzenlage : int : Welche Walze wurde eingesetzt.
*/
void setTag(int tag) { this.tag = tag; }
private void setWalzenlage(int position, int walzenlage) {
this.walzenlage[position] = walzenlage;
}
/**
* Gibt die Walzenlage dieser Instanz zurück
* Setzt die Ringstellung dieser Instanz.
*
* @return String[] : Walzenlage TODO: String[] || int[]?
* @param position : int : Auf welche Walze wird der Ring aufgesetzt?
* @param ringstellung : int : An dieser Position soll die nächste Walze weiter gedreht werden.
*/
public int[] getWalzenlage() {
return walzenlage;
private void setRingstellung(int position, int ringstellung) {
this.ringstellung[position] = ringstellung;
}
/**
* Gibt die Ringstellung dieser Instanz zurück
* Setzt den Tag dieser Instanz.
*
* @return String[] : Ringstellung TODO: String[] || int[]?
* @param tag : int : Tag.
*/
public int[] getRingstellung() {
return ringstellung;
void setTag(int tag) {
this.tag = tag;
}
//endregion
//region Getter
/**
* Gibt die Steckverbindung dieser Instanz zurück
* Gibt den Tag dieser Instanz zurueck.
*
* @return String[] : Steckverbindung
* @return int : Tag.
*/
// TODO
public char[][] getSteckverbindung() {
return this.steckverbindung;
public int getTag() {
return tag;
}
/**
* Setzt die Steckverbindung dieser Instanz
* Gibt die Walzenlage dieser Instanz zurueck.
*
* @param kabel : String[] : Die Steckverbindungen die gesteckt werden sollen.
* Jeder Eintrag im Array ist ein String mit zwei Zeichen.
* Diese werden in zwei chars zerlegt und anschließend im globalen
* Array gespeichert.
* @return walzenlage : int[] : Walzenlage.
*/
private void setSteckverbindung(String[] kabel) {
int counter = 0;
for (String stecker : kabel) {
char[] verbindung = new char[2];
verbindung[0] = stecker.charAt(0);
verbindung[1] = stecker.charAt(1);
this.steckverbindung[counter++] = verbindung;
}
public int[] getWalzenlage() {
return walzenlage;
}
/**
* Setzt die Walzenlage dieser Instanz
* Gibt die Ringstellung dieser Instanz zurueck.
*
* @param position : int : Position der Walze
* @param walzenlage : int : Welche Walze wurde eingesetzt
* @return ringstellung : int : Ringstellung.
*/
private void setWalzenlage(int position, int walzenlage) {
this.walzenlage[position] = walzenlage;
public int[] getRingstellung() {
return ringstellung;
}
/**
* Setzt die Ringstellung dieser Instanz
* Gibt die Steckverbindungen dieser Instanz zurueck.
*
* @param position : int : Auf welche Walze wird der Ring aufgesetzt?
* @param ringstellung : char : An dieser Position soll die nächste Walze weiter gedreht werden.TODO: String[] || int[]?
* @return steckerverbindung : char[][] : Steckverbindung.
*/
private void setRingstellung(int position, int ringstellung) {
this.ringstellung[position] = ringstellung;
public char[][] getSteckverbindung() {
return this.steckverbindung;
}
//endregion
}
package projekt.enigma.model;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import projekt.enigma.App;
/**
* In dieser Klasse werden Fehler behandelt und an den User/Admin/Entwickler ausgegeben.
*/
public class Fehler {
/**
* Konstanten die anzeigen ob es sich um eine Funktion oder um eine Nachricht handelt.
*/
private static final String FUNCTION_PREFIX = "- ";
private static final String MESSAGE_PREFIX = "--> ";
/**
* Zeige Fehler Dialog
*
* @param type : String : Art der Meldung (warning/information/error)
* @param subject : String : Titel des Dialoges
* @param message : String : Nachricht der Meldung
*/
public void showErrorDialog(String type, String subject, String message) {
Alert alert;
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("")) {
subject = "Es ist ein Fehler aufgetreten";
}
/* Welcher Fehler Typ wurde uebergeben? */
switch (type) {
case "warning":
alert = new Alert(AlertType.WARNING);
break;
case "info":
alert = new Alert(AlertType.INFORMATION);
break;
case "error":
alert = new Alert(AlertType.ERROR);
break;
default:
alert = new Alert(AlertType.NONE);
}
//Anzeige des Alerts definieren
alert.setTitle(subject);
alert.setHeaderText(null);
alert.setContentText(message);
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) {
if (App.getDebug() != 0) {
if (isFunction) {
System.out.println(FUNCTION_PREFIX + message);
} else {
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) {
if (App.getDebug() != 0 && (App.getDebug() >= debugLevel || App.getDebug() == 3)) {
if (isFunction) {
System.out.println(FUNCTION_PREFIX + message);
} else {
System.out.println(MESSAGE_PREFIX + message);
}
}
}
}
\ No newline at end of file
package projekt.enigma.model;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
......@@ -19,96 +18,102 @@ import java.util.ArrayList;
import java.util.List;
/**
* Hier sitzt der Funker
* Der Funkraum kann Funksprüche empfangen und senden.
* Hierfür wird eine Verbindung zu einem externen Service aufgebaut.
* Hier sitzt der Funker.
* Der Funkraum kann Funksprueche empfangen und senden.
* Hierfuer wird eine Verbindung zu einem externen Service aufgebaut.
* Dieser Servive erwartet die Nachrichten im JSON Format. Dazu wird ein k als Kenngruppe
* (Benutzername) übergeben 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.
*/
class Funkraum {
/**
* Zum Empfangen liefert der Server, anstatt der Kenngruppe (k) den Empfangstag der Nachricht mit damit man
* die Grundeinstellungen aus dem Codebuch, für diesen Tag, raussuchen kann.
* {'m': 'Hello world', 't': '26'}
*
* @param kenngruppe : String : Kenngruppe dieser Engiam
* @return String[] : String Array wobei Index 0 dem Empfangstag entspricht und index 1 der empfangenen Nachricht
*/
String[] empfangeFunkspruch(String kenngruppe) {
String[] funkspruch = new String[2];
HttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("https://enigma.itstall.de/");
try {
// Anfrage Parameter und Encoding setzen
List<NameValuePair> params = new ArrayList<>(2);
params.add(new BasicNameValuePair("k", kenngruppe));
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
// POST Request ausführen und Rückgabe verarbeiten
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (entity != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
JSONObject result = new JSONObject(reader.readLine());
if (!result.getString("m").isEmpty()) {
funkspruch[0] = result.getString("t");
funkspruch[1] = result.getString("m");
}
}
} catch (UnsupportedEncodingException e) {
System.out.println("Encoding wird nicht unterstützt.");
} catch (IOException e) {
System.out.println("HTTP Post war nicht erfolgreich.\nBitte wenden Sie sich an ihren Vorgesetzten.");
e.printStackTrace();
}
return funkspruch;
}
/**
* Dem Service senden wir unsere Nachricht als POST Parameter (m) und unsere Kenngruppe (k).
* Dieser nimmt die Daten entgegeb und hierlerlegt sie auf seinem Stapel (Datenbank) von dem die Nachrichten
* irgendwann, auf Anfrage, wieder abgerufen werden können.
* <p>
* Darauf antworter der Server dann mit einem JSON Object in dem das Ergebnis der Anfrage zu sehen ist.
* {'result': 200}
* <p>
* Die 200 heißt hier das alles erfolgreich durchgeführt werden konnte. Steht hier etwas anderes, ist ein Fehler
* aufgetreten und die Anfrage war nicht erfolgreich.
* In letzterem Fall sollte eine Meldung an den Benutzer ausgegeben werden und ggF später erneut versucht.
*
* @param funkspruch : String : Der zu sendede Funkspruch
* @param kenngruppe : String : Die Kenngruppe dieser Engima
* @throws IOException : Exception : Funkspruch konnte nicht gesendet werden
*/
void sendeFunkspruch(String funkspruch, String kenngruppe) throws HttpException, IOException {
HttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("https://enigma.itstall.de/");
// Anfrage Parameter und Encoding setzen
List<NameValuePair> params = new ArrayList<>(2);
params.add(new BasicNameValuePair("k", kenngruppe));
params.add(new BasicNameValuePair("m", funkspruch));
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
// POST Request ausführen und Rückgabe verarbeiten
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (entity != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
JSONObject result = new JSONObject(reader.readLine());
if (result.getInt("result") != 200) {
throw new HttpException("Der andere Funker mag deine Nachricht nicht. Rüge ihn wenn du ihn wieder siehst...");
}
}
}
public class Funkraum {
/**
* 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.
* {'m': 'Hello world', 't': '26'}
*
* @param kenngruppe : String : Kenngruppe dieser Enigma
* @return funkspruch : String[] : String Array wobei Index 0 dem Empfangstag entspricht und Index 1
* der empfangenen Nachricht.
* @throws NullPointerException : Exception : Keine Nachricht vorhanden.
*/
public String[] empfangeFunkspruch(String kenngruppe) {
String[] funkspruch = new String[2];
HttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("https://enigma.itstall.de/");
try {
// Anfrage Parameter und Encoding setzen
List<NameValuePair> params = new ArrayList<>(2);
params.add(new BasicNameValuePair("k", kenngruppe));
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
// POST Request ausfuehren und Rueckgabe verarbeiten
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (entity != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
JSONObject result = new JSONObject(reader.readLine());
if (!result.getString("m").isEmpty()) {
funkspruch[0] = result.getString("t");
funkspruch[1] = result.getString("m");
}
}
} catch (UnsupportedEncodingException e) {
new Fehler().showErrorDialog("error", "Encoding wird nicht unterstützt",
"Kommunikation mit dem Feind wird als Landesverrat bestraft");
} catch (IOException e) {
new Fehler().showErrorDialog("error", "HTTP Post war nicht erfolgreich",
"Bitte wenden Sie sich an ihren Vorgesetzten.");
} catch (NullPointerException e) {
new Fehler().showErrorDialog("info", "Keiner schreibt dir...",
"Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
}
return funkspruch;
}
/**
* 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
* irgendwann, auf Anfrage, wieder abgerufen werden koennen.
* <br>
* Darauf antwortet der Server mit einem JSON Object in dem das Ergebnis der Anfrage zu sehen ist.
* {'result': 200}
* <br>
* Die 200 heisst hier, dass alles erfolgreich durchgefuehrt werden konnte. Steht hier etwas anderes, ist ein Fehler
* aufgetreten und die Anfrage war nicht erfolgreich.
* 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 kenngruppe : String : Die Kenngruppe dieser Engima
* @throws IOException : Exception : Funkspruch konnte nicht gesendet werden
*/
public void sendeFunkspruch(String funkspruch, String kenngruppe) throws IOException {
HttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("https://enigma.itstall.de/");
// Anfrage Parameter und Encoding setzen
List<NameValuePair> params = new ArrayList<>(2);
params.add(new BasicNameValuePair("k", kenngruppe));
params.add(new BasicNameValuePair("m", funkspruch));
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
// POST Request ausfuehren und Rueckgabe verarbeiten
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (entity != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
JSONObject result = new JSONObject(reader.readLine());
if (result.getInt("result") != 200) {
new Fehler().showErrorDialog("error", "HTTP Exception",
"Der andere Funker mag deine Nachricht nicht. "
+ "Rüge ihn wenn du ihn wieder siehst...");
}
}
}
}
package projekt.enigma.model;
/**
* In dieser Klasse wird die Hardware zusammen gefasst.
* Alle Komponenter der Enigma laufen hier zusammen.
* In dieser Klasse wird die Hardware zusammengefasst.
* Alle Komponenten der Enigma laufen hier zusammen.
*
* <p>
* walzen : Walze[] : Ist ein Array der drei eingebauten Walzen Objekte
* steckbrett : Steckbrett : Das Steckbrett mit den Verbindungen aus dem Codebuch
* reflektor : Reflektor : Dies ist das Objekt der Reflektors
* nachricht : String : Die verschlüsselte Nachricht wird in diesem String zusammen gesetzt und gespeichert
* kenngruppe : String : Früher definierte die Kennzeichnung die Einheit welche diese Enigma benutzte.
* nachricht : String : Die verschluesselte Nachricht wird in diesem String zusammengesetzt und gespeichert
* kenngruppe : String : Frueher definierte die Kennzeichnung die Einheit welche diese Enigma benutzte.
* Wir missbrauchen die Kenngruppe für einen Benutzernamen
* </p>
*/
public class Hardware {
//region Variablen
/**
* TODO: Dokumentieren
* walzen: Walze-Array: erzeugt ein privates Array mit der die Anzahl der Walzen festgelegt wird.
*/
private Walze[] walzen;
private Steckbrett steckbrett;
private Reflektor reflektor;
/**
* Im Konstruktor legen wir die Anzahl der Walzen fest welche die Hardware aufnehmen kann.
* Die Enigma I welche hier nachgebildet werden soll, konnte drei Walzen aufnehmen.
*/
public Hardware() {
this.walzen = new Walze[3];
}
/**
* Setzt eine Walze ein
*
* @param walze : int : Setzt die Walze mit der angegebenen Nummer ein
* @param walzenNr : int : Die Nummer der einzusetzenden Walze
*/
public void setzeWalzenNr(int walze, int walzenNr, int ringstellung) {
this.walzen[walze] = new Walze(walzenNr, ringstellung);
}
/**
* Setzt den Notch der Walze
*
* @param walze : int : Position der Walze
* @param position : int : Umspringpunkt auf der Walze
*/
public void setzeRing(int walze, int position) {
this.walzen[walze].setRingstellung(position);
}
/**
* Setzt den Startwert (position) der Walze (walze)
*
* @param walze : int : Nummer der Walze
* @param buchstabe : char : Buchstabe der zugewiesen soll
* steckbrett: Steckbrett: erzeugt ein privates Steckbrett-Objekt
*/
public void setzePosition(int walze, char buchstabe) {
this.walzen[walze].setPosition(buchstabe);
}
private Steckbrett steckbrett;
/**
* 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
* reflektor: Reflektor: erzeugt ein privates Reflektor-Objekt.
*/
public char codiere(char buchstabe) {
this.dreheWalzen();
buchstabe = this.steckbrett.codiere(Character.toUpperCase(buchstabe));
buchstabe = this.walzen[2].codiere(buchstabe);
buchstabe = this.walzen[1].codiere(buchstabe);
buchstabe = this.walzen[0].codiere(buchstabe);
buchstabe = this.reflektor.codiere(buchstabe);
buchstabe = this.walzen[0].codiere2(buchstabe);
buchstabe = this.walzen[1].codiere2(buchstabe);
buchstabe = this.walzen[2].codiere2(buchstabe);
buchstabe = this.steckbrett.codiere(buchstabe);
private Reflektor reflektor;
//endregion
//region Konstruktor
/**
* Im Konstruktor legen wir die Anzahl der Walzen fest, welche die Hardware aufnehmen kann.
* Die Enigma I, welche hier nachgebildet werden soll, konnte drei Walzen aufnehmen.
*/
public Hardware() {
this.walzen = new Walze[3];
}
//endregion
//region Funktionen & Methoden
/**
* Setzt eine Walze ein.
*
* @param walze : int : Setzt die Walze mit der angegebenen Nummer ein.
* @param walzenNr : int : Die Nummer der einzusetzenden Walze.
* @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);
buchstabe = Character.toUpperCase(buchstabe);
String debug = String.format("Positionen: W1:%s W2:%s W3:%s",
this.walzen[0].getPosition(),
this.walzen[1].getPosition(),
this.walzen[2].getPosition());
debug += "\nI\tS\t3\t2\t1\tR\t1\t2\t3\tS\n" + buchstabe;
this.dreheWalzen(1);
//Codiere Vorgang wird fuer jede Walze bis zum Reflektor mit der codiere Funktion durchgefuehrt.
//Auf dem Rueckweg wird mit der codiere2 Funktion codiert.
buchstabe = this.steckbrett.codiere(Character.toUpperCase(buchstabe));
debug += "\t" + buchstabe;
buchstabe = this.walzen[2].codiere(buchstabe);
debug += "\t" + buchstabe;
buchstabe = this.walzen[1].codiere(buchstabe);
debug += "\t" + buchstabe;
buchstabe = this.walzen[0].codiere(buchstabe);
debug += "\t" + buchstabe;
buchstabe = this.reflektor.codiere(buchstabe);
debug += "\t" + buchstabe;
buchstabe = this.walzen[0].codiere2(buchstabe);
debug += "\t" + buchstabe;
buchstabe = this.walzen[1].codiere2(buchstabe);
debug += "\t" + buchstabe;
buchstabe = this.walzen[2].codiere2(buchstabe);
debug += "\t" + buchstabe;
buchstabe = this.steckbrett.codiere(buchstabe);
debug += "\t" + buchstabe;
new Fehler().debug(debug, false);
return buchstabe;
}
/**
* Nach jeder codierung eines Buchstabens müssen die Walzen gedreht werden.
* Hier überprüfen wir welche der Walzen gedreht werden müssen und stoßen die Vorgang an.
*/
private void dreheWalzen() {
if (this.walzen[2].dreheWalze()) {
if (this.walzen[1].dreheWalze()) {
this.walzen[0].dreheWalze();
}
}
}
/**
* Gibt die verbauten Walzen Objekte zurück
*
* @return Walze[] : Array mit den Walzen Objekten
*/
public Walze[] getWalzen() {
return this.walzen;
}
/**
* Setzt eine Walze ein und speichert das Objekt im Walzen Array
*
* @param position : int : Position der Walze
* @param walze : int : Die Nummer der Walze
* @param ringstellung : int : Umsprung Punkt der Walze
*/
public void setWalzen(int position, int walze, int ringstellung) {
this.walzen[position] = new Walze(walze, ringstellung);
}
/**
* Gibt das Objekt des Steckbretts zurück
*
* @return Steckbrett : Das eingesetzte Steckbrett mit seinen Kabeln wenn eingesteckt
*/
public Steckbrett getSteckbrett() {
return steckbrett;
}
/**
* Setzt das übergebene Steckbrett Objekt in die Hardware ein
*
* @param steckbrett : Steckbrett : Objekt des Steckbretts mit allen verbundenen Kabeln
*/
public void setSteckbrett(Steckbrett steckbrett) {
this.steckbrett = steckbrett;
}
/**
* Liest den Reflektor aus und gibt ihn zurück
*
* @return Reflektor : Objekt des Reflektors
*/
public Reflektor getReflektor() {
return reflektor;
}
/**
* Setzt den Reflektor ein.
* In der Enigma I welche hier nachgebaut wird, gab es nur einen Reflektor.
* Spätere Versionen haten zwei oder mehr, deshalb haben wir hier auch schon ein Objekt dafür erstellt,
* welches ausgetauscht werden kann.
*
* @param reflektor : Reflektor : Das Obejtk des Reflektors
*/
public void setReflektor(Reflektor reflektor) {
this.reflektor = reflektor;
}
/**
* Diese Funktion setzt die Walzen auf ihren Anfangswert zurück.
* Hierfür ist der Buchstabe "A" festgelegt.
* Dies wird benötigt um zB einen neuen Spruchschlüssel einzustellen oder eine neue Nachricht zu verfassen.
*/
public void resetWalzen() {
this.getWalzen()[0].setPosition('A');
this.getWalzen()[1].setPosition('A');
this.getWalzen()[2].setPosition('A');
}
/**
* Nach jeder Codierung eines Buchstabens muessen die Walzen gedreht werden.
* Hier ueberpruefen wir, welche der Walzen gedreht werden muessen und stossen den Vorgang an.
*
* @param richtung : int : +1 fuer eine Vorwaertsdrehung und -1 fuer eine Rueckwaertsdrehung.
*/
public void dreheWalzen(int richtung) {
if (richtung > 0) {
for (int i = 0; i < richtung; i++) {
if (this.walzen[2].dreheWalze(1)) {
if (this.walzen[1].dreheWalze(1)) {
this.walzen[0].dreheWalze(1);
}
}
}
} else {
for (int i = 0; i > richtung; richtung++) {
if (this.walzen[2].dreheWalze(-1)) {
if (this.walzen[1].dreheWalze(-1)) {
this.walzen[0].dreheWalze(-1);
}
}
}
}
}
//endregion
//region Setter
/**
* Setzt eine Walze ein und speichert das Objekt im Walzen Array.
*
* @param position : int : Position der Walze.
* @param walze : int : Die Nummer der Walze.
* @param ringstellung : int : Umsprungpunkt der Walze.
*/
public void setWalzen(int position, int walze, int ringstellung) {
this.walzen[position] = new Walze(walze, ringstellung);
}
/**
* Gibt das Objekt des Steckbretts zurueck.
*
* @return steckbrett : Steckbrett-Objekt: Das eingesetzte Steckbrett mit seinen Kabeln, wenn eingesteckt.
*/
public Steckbrett getSteckbrett() {
return steckbrett;
}
/**
* Setzt das uebergebene Steckbrett Objekt in die Hardware ein.
*
* @param steckbrett : Steckbrett : Objekt des Steckbretts mit allen verbundenen Kabeln.
*/
public void setSteckbrett(Steckbrett steckbrett) {
this.steckbrett = steckbrett;
}
//endregion
//region Getter
/**
* Setzt den Reflektor ein.
* In der Enigma I, welche hier nachgebaut wird, gab es nur einen Reflektor.
* Spaetere Versionen hatten zwei oder mehr, deshalb haben wir hier auch schon ein Objekt dafuer erstellt,
* welches ausgetauscht werden kann.
*
* @param reflektor : Reflektor : Das Objekt des Reflektors.
*/
public void setReflektor(Reflektor reflektor) {
this.reflektor = reflektor;
}
/**
* Gibt die verbauten Walzen Objekte zurück.
*
* @return walzen : Walze[] : Array mit den Walzen Objekten.
*/
public Walze[] getWalzen() {
return this.walzen;
}
//endregion
}
package projekt.enigma.model;
import java.util.*;
import java.util.Map.Entry;
import java.util.TreeMap;
/**
* Diese Klasse definiert die Zugehörigkeit zwischen den Buchstaben A-Z und dem zugehörigen Morsecode.
* Diese Klasse definiert die Zugehoerigkeit zwischen den Buchstaben A-Z und dem Morsecode.
* Die Funktionen sollen Texte von und zu Morsecode konvertieren.
*/
public class Morsecode {
// Anlegen der codeMap als TreeMap
private TreeMap<String, String> codeMap = new TreeMap<>();
/**
* Im Konstruktor werden alle verfügbaren Buchstaben (A-Z) und deren zugehörigen
* Morsecodes, der codeMap hinzugefügt.
*/
public Morsecode() {
this.codeMap.put("A", ".-");
this.codeMap.put("B", "-...");
this.codeMap.put("C", "-.-.");
this.codeMap.put("D", "-..");
this.codeMap.put("E", ".");
this.codeMap.put("F", "..-.");
this.codeMap.put("G", "--.");
this.codeMap.put("H", "....");
this.codeMap.put("I", "..");
this.codeMap.put("J", ".---");
this.codeMap.put("K", "-.-");
this.codeMap.put("L", ".-..");
this.codeMap.put("M", "--");
this.codeMap.put("N", "-.");
this.codeMap.put("O", "---");
this.codeMap.put("P", ".--.");
this.codeMap.put("Q", "--.-");
this.codeMap.put("R", ".-.");
this.codeMap.put("S", "...");
this.codeMap.put("T", "-");
this.codeMap.put("U", "..-");
this.codeMap.put("V", "...-");
this.codeMap.put("W", ".--");
this.codeMap.put("X", "-..-");
this.codeMap.put("Y", "-.--");
this.codeMap.put("Z", "--..");
this.codeMap.put(" ", "-...-");
this.codeMap.put("1", ".----");
this.codeMap.put("2", ".----");
this.codeMap.put("3", "...--");
this.codeMap.put("4", "....-");
this.codeMap.put("5", ".....");
this.codeMap.put("6", "-....");
this.codeMap.put("7", "--...");
this.codeMap.put("8", "---..");
this.codeMap.put("9", "----.");
this.codeMap.put("0", "-----");
}
/**
* Diese Funktion überprüft ob das übergebene Buchstabe in der codeMap enthalten ist.
* Wenn es enthalten ist, wird der zugehörige Morsecode zurück gegeben, ansonsten null
*
* @param buchstabe : char : Zu übersetzender Buchstabe
* @return : String : Das zugehöriger Morsecode aus der codeMap
*/
private String getMorsecode(char buchstabe) {
// Testen ob das Char in der codeMap enthalten ist. Wenn ja, raussuchen und zurück geben
return this.codeMap.getOrDefault(String.valueOf(buchstabe).toUpperCase(), null);
}
/**
* Der übergebene String wird in seine einzelnen Zeichen (char) zerlegt und an die Funktion getMorsecode
* übergeben und der zugehörige Morsecode raus gesucht.
* Mittels eines StringBuilders werden die Ergebnisse zu einem Rückgabe String zusammen gesetzt.
* Wenn kein zugehöriger Code in der codeMap gefunden wurde, wird das Zeichen ignoriert da es bei der
* Enigma nicht vorhanden war.
*
* @param input : String : Zu konventierender Text
* @return String : Die in Morsecode konvertierte Text
*/
public String convertBuchstabeToMorsecode(String input) {
StringBuilder sb = new StringBuilder();
String morsecode;
// Durch alle char im übergebenen String loopen
for(int i = 0; i < input.length(); i++) {
// Wenn der char in der codeMap enthalten ist, an den Rückgabe String anheften, ansonsten nichts ignorieren.
morsecode = this.getMorsecode(input.charAt(i));
if(morsecode != null) {
sb.append(morsecode).append(' ');
}
}
// Gibt den konvertierten String zurück
return sb.toString();
}
/**
* Diese Funktion überprüft ob der übergebene Morsecode in der codeMap enthalten ist.
* Wenn er enthalten ist, wird der zugehörige Buchstabe zurück gegeben, ansonsten null
*
* @param morsecode : String : Der zu übersetzende Morsecode
* @return : String : Das zugehöriger Buchstaben aus der this.codeMap
*/
private String getBuchstabe(String morsecode) {
// Initialisieren des Rückgabe Strings
String result = null;
// Loopt duch die Codemap und erstellt daraus ein Set
for(Entry<String, String> entry : this.codeMap.entrySet()) {
// Wenn Value dem Morsecode entspricht, haben wir unseren Buchstaben gefunden und setzen ihn als Result
if(entry.getValue().equals(morsecode)) {
result = entry.getKey();
}
}
return result;
}
/**
* Der übergebene String wird in einen String Array zerlegt. Als Trennzeichen wird das Leerzeichen genutzt.
* Anschließend wird der Array durchlaufen und die Elemente an die Funktion getBuchstabe übergeben um den
* zugehörigen Buchstaben zu erhalten.
* Mittels eines StringBuilders werden die Ergebnisse zu einem Rückgabe String zusammen gesetzt.
* Wenn kein zugehöriger Buchstabe in der codeMap gefunden wurde, wird das Zeichen ignoriert da es bei der
* Enigma nicht vorhanden war.
*
* @param input : String : Zu konventierender Morsecode
* @return String : Der in Text konvertierte Morsecode
*/
public String convertMorsecodeToBuchstabe(String input) {
StringBuilder sb = new StringBuilder();
String buchstabe;
String[] morsecodes = input.split(" ");
// Durch alle char im übergebenen String loopen
for(String morsecode : morsecodes) {
// Wenn der char in der codeMap enthalten ist, an den Rückgabe String anheften, ansonsten nichts ignorieren.
buchstabe = this.getBuchstabe(morsecode);
if(buchstabe != null) {
sb.append(buchstabe);
}
}
// Gibt den konvertierten String zurück
return sb.toString();
}
/**
* Anlegen der codeMap als TreeMap.
*/
private TreeMap<String, String> codeMap;
/**
* Im Konstruktor werden alle verfuegbaren Buchstaben (A-Z) und deren zugehoerigen
* Morsecodes, der codeMap hinzugefuegt.
*/
public Morsecode() {
codeMap = new TreeMap<>();
this.codeMap.put("A", ".-");
this.codeMap.put("B", "-...");
this.codeMap.put("C", "-.-.");
this.codeMap.put("D", "-..");
this.codeMap.put("E", ".");
this.codeMap.put("F", "..-.");
this.codeMap.put("G", "--.");
this.codeMap.put("H", "....");
this.codeMap.put("I", "..");
this.codeMap.put("J", ".---");
this.codeMap.put("K", "-.-");
this.codeMap.put("L", ".-..");
this.codeMap.put("M", "--");
this.codeMap.put("N", "-.");
this.codeMap.put("O", "---");
this.codeMap.put("P", ".--.");
this.codeMap.put("Q", "--.-");
this.codeMap.put("R", ".-.");
this.codeMap.put("S", "...");
this.codeMap.put("T", "-");
this.codeMap.put("U", "..-");
this.codeMap.put("V", "...-");
this.codeMap.put("W", ".--");
this.codeMap.put("X", "-..-");
this.codeMap.put("Y", "-.--");
this.codeMap.put("Z", "--..");
this.codeMap.put(" ", "-...-");
this.codeMap.put("1", ".----");
this.codeMap.put("2", "..---");
this.codeMap.put("3", "...--");
this.codeMap.put("4", "....-");
this.codeMap.put("5", ".....");
this.codeMap.put("6", "-....");
this.codeMap.put("7", "--...");
this.codeMap.put("8", "---..");
this.codeMap.put("9", "----.");
this.codeMap.put("0", "-----");
}
/**
* Diese Funktion ueberprueft ob der uebergebene Buchstabe in der codeMap enthalten ist.
* Wenn er enthalten ist, wird der zugehoerige Morsecode zurueck gegeben, ansonsten null.
*
* @param buchstabe : char : Zu uebersetzender Buchstabe.
* @return String : Der zugehoerige Morsecode aus der codeMap.
*/
private String getMorsecode(char buchstabe) {
return this.codeMap.getOrDefault(String.valueOf(buchstabe).toUpperCase(), null);
}
/**
* Der uebergebene String wird in seine einzelnen Zeichen (char) zerlegt und an die Funktion getMorsecode
* uebergeben und der zugehoerige Morsecode rausgesucht.
* 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
* Enigma nicht vorhanden war.
*
* @param input : String : Zu konvertierender Text.
* @return String : Der in Morsecode konvertierte Text.
*/
public String convertBuchstabeToMorsecode(String input) {
StringBuilder sb = new StringBuilder();
String morsecode;
// Durch alle char im uebergebenen String loopen
for (int i = 0; i < input.length(); i++) {
morsecode = this.getMorsecode(input.charAt(i));
if (morsecode != null) {
sb.append(morsecode).append(' ');
}
}
return sb.toString();
}
/**
* Diese Funktion ueberprueft ob der uebergebene Morsecode in der codeMap enthalten ist.
* Wenn er enthalten ist, wird der zugehoerige Buchstabe zurueckgegeben, ansonsten null.
*
* @param morsecode : String : Der zu uebersetzende Morsecode.
* @return : String : Der zugehoerige Buchstabe aus der codeMap.
*/
private String getBuchstabe(String morsecode) {
String result = null;
// Loopt duch die codeMap und erstellt daraus ein Set
for (Entry<String, String> entry : this.codeMap.entrySet()) {
if (entry.getValue().equals(morsecode)) {
result = entry.getKey();
}
}
return result;
}
/**
* 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
* zugehoerigen Buchstaben zu erhalten.
* 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
* Enigma nicht vorhanden war.
*
* @param input : String : Zu konvertierender Morsecode.
* @return String : Der in Text konvertierte Morsecode.
*/
public String convertMorsecodeToBuchstabe(String input) {
StringBuilder sb = new StringBuilder();
String buchstabe;
String[] morsecodes = input.split(" ");
// Durch alle char im uebergebenen String loopen
for (String morsecode : morsecodes) {
buchstabe = this.getBuchstabe(morsecode);
if (buchstabe != null) {
sb.append(buchstabe);
}
}
return sb.toString();
}
}
......@@ -3,46 +3,28 @@ package projekt.enigma.model;
/**
* Klasse Reflektor
* <br>
* Der Reflektor nimmt einen Buchstaben der Klasse Walze entgegen und und kodiert diesen.
* Der kodierte Buchstabe wird an die Klasse Walze wieder zurückgegeben.
* Der Reflektor nimmt einen Buchstaben der Klasse Walze entgegen und codiert diesen.
* Der codierte Buchstabe wird an die Klasse Walze wieder zurueckgegeben.
* <br>
* Prinzipiell verhält sich die Klasse Reflektor wie die Klasse Walze, außer das sie sich
* nach Betätigung einer Taste nicht dreht (quasi starr montiert ist) und sie gibt keine Signale
* an andere Walzen zum drehen.
* 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
* an andere Walzen zum Drehen.
*/
public class Reflektor {
/**
* WALZE_ALPHABET : konstanter Char-Array mit den Werten des Alphabeths (26 Werte)
*/
private final Character[] WALZE_ALPHABET = {'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'};
/**
* WALZE_REFLEKTOR : konstanter Char-Array mit den Werten des Reflektors (26 Werte)
*/
private final Character[] WALZE_REFLEKTOR = {'E', 'J', 'M', 'Z', 'A', 'L', 'Y', 'X', 'V', 'B', 'W', 'F', 'C', 'R', 'Q', 'U', 'O', 'N', 'T', 'S', 'P', 'I', 'K', 'H', 'G', 'D'};
/**
* Funktion codiere
* <br>
* Durchsucht das konstante Char-Array WALZE_ALPHABET nach der Position eines bestimmten
* Buchstabens und gibt den Character an der entsprechenden Position im konstanten
* Char-Array WALZE_REFLEKTOR zurück.
* Durchsucht den String alphabet nach der Position des mitgegebenen Buchstabens und
* gibt den Character an der entsprechenden Position im String reflektor zurueck.
*
* @return WALZE_REFLEKTOR[iPositionReflektor]: Character: Der kodierte Buchstabe aus dem Reflektor
* @param buchstabe : Character : der zu codierende Buchstabe.
* @return char : Der codierte Buchstabe aus dem Reflektor.
*/
public char codiere(Character buchstabe) {
int iPositionReflektor = 0;
//Ermittelt die Position des Buchstaben "buchstabe" auf der Alphabetswalze
for (int index = 0; index < WALZE_ALPHABET.length; index++) {
if (buchstabe.equals(WALZE_ALPHABET[index])) {
iPositionReflektor = index;
break;
}
}
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String reflektor = "EJMZALYXVBWFCRQUONTSPIKHGD";
return WALZE_REFLEKTOR[iPositionReflektor];
return reflektor.charAt(alphabet.indexOf(buchstabe));
}
}
package projekt.enigma.model;
/**
* <p>
* Klasse Steckbrett
* <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
* Zulaessigkeit und tauscht diese dann paarweise aus.
*/
public class Steckbrett {
/**
* zaehler: Int, der als Laufvariable genutzt wird
* orginalBuchstaben: String : der jeweils den ersten zu vertauschenden Buchstaben enthaelt.
*/
private int zaehler;
private String originalBuchstaben;
/**
* orginalBuchstaben: Character-Array, der jeweils den ersten zu vertauschenden Buchstaben enthält
* getauschteBuchstaben: String : der jeweils den zweiten zu vertauschenden Buchstaben enthaelt.
*/
private Character[] orginalBuchstaben;
/**
* getauschteBuchstaben: Character-Array, der jeweils den zweiten zu vertauschenden Buchstaben enthält
*/
private Character[] getauschteBuchstaben;
private String getauschteBuchstaben;
/**
* Konstruktor Steckbrett
* <br>
* Erzeugt zwei Charakter-Arrays (orginalBuchstaben und getauschteBuchstaben) der Länge 10.
* Erzeugt zwei Strings und initialisiert diese.
*/
public Steckbrett() {
orginalBuchstaben = new Character[10];
getauschteBuchstaben = new Character[10];
originalBuchstaben = "";
getauschteBuchstaben = "";
}
/**
* TODO: Fehlerfall kommentieren, bzw. Exceptions werfen ?????
* TODO: Überprüfe Vertauschungen für jeden Buchstaben aufrufen
* Funktion setzeVertauschung
* <br>
* Der Funktion setzeVertauschung werden 2 Buchstaben (buchstabe1 und buchstabe2) übergeben.
* buchstabe1 wird in das Character-Array orginalBuchstaben geschrieben.
* buchstabe2 wird in das Character-Array getauschteBuchstaben geschrieben.
* Anschließend wird die Funktion ueberpruefeVertauschungen aufgerufen.
* Der Funktion setzeVertauschung werden 2 Buchstaben (buchstabe1 und buchstabe2) uebergeben.
* Zuerst wird ueberprueft ob einer der beiden Buchstaben bereits enthalten ist, was unzulaessig waere.
* <br>
* Anschliessend wird:
* <p>
* buchstabe1 dem String orginalBuchstaben angehaengt.
* buchstabe2 dem String getauschteBuchstaben angehaengt.
* </p>
*
* @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.
* @return ueberpruefeVertauschungen(): Ueberprueft ob die Vertauschungen zulaessig sind.
* @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.
* @return boolean : Wenn die Vertauschung zulaessig ist, true, ansonsten false.
*/
public boolean setzeVertauschung(char buchstabe1, char buchstabe2) {
if (zaehler < orginalBuchstaben.length) {
orginalBuchstaben[zaehler] = buchstabe1;
getauschteBuchstaben[zaehler++] = buchstabe2;
if ((!ueberpruefeVertauschungen(buchstabe1)) && (!ueberpruefeVertauschungen(buchstabe2))
&& (originalBuchstaben.length() <= 20)) {
originalBuchstaben += buchstabe1;
getauschteBuchstaben += buchstabe2;
return true;
} else {
System.err.println("Zu viele Vertauschungen angegeben!");
return false;
}
}
/**
* Funktion setzeVertauschung mit Angabe eines Ports von 1 - 10
* <br>
* Der Funktion setzeVertauschung werden 2 Buchstaben (buchstabe1 und buchstabe2) sowie der Port uebergeben.
* Zuerst wird ueberprueft ob einer der beiden Buchstaben bereits enthalten ist, was unzulaessig waere.
* <br>
* Anschliessend wird:
* <p>
* buchstabe1 in den String orginalBuchstaben auf die Position (steckbrettPort) geschrieben.
* buchstabe2 in den String getauschteBuchstaben auf die Position (steckbrettPort) geschrieben.
* </p>
*
* @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.
* @return boolean : Wenn die Vertauschung zulaessig ist, true, ansonsten false.
*/
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 == ' ')) {
return ueberpruefeVertauschungen();
new Fehler().debug("-> Original:\t" + originalBuchstaben, false);
new Fehler().debug("-> Getauscht:\t" + getauschteBuchstaben, false);
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;
} else {
new Fehler().debug("false\tOS: |" + originalBuchstaben + "| GS: |" + getauschteBuchstaben + "|", false);
return false;
}
}
/**
* TODO: Fehlerfall kommentieren, bzw. Exceptions werfen ?????
* TODO: Buchstabe zum überpüfen übergeben
* Funktion ueberpruefeVertauschungen
* <br>
* Die Funktion ueberpruefeVertauschungen prueft ob die Buchstabenvertauschung zulaessig ist.
* Die Funktion ueberpruefeVertauschungen prueft, ob der uebergebene Buchstabe bereits in den beiden Strings
* orginalBuchstaben und getauschteBuchstaben vorhanden ist.
* Eine Buchstabenvertauschung ist zulaessig, wenn keine Dopplungen der zu vertauschenden Buchstaben auftritt
* (ein Buchstabe nicht mehrmals vertauscht wird).
*
* @return boolean : result : Flag, der die Zulassigkeit der Vertauschungen zurueckgibt.
* @param buchstabe : Character: zu pruefender Buchstabe.
* @return result : boolean : Wenn false, dann darf der Buchstabe genutzt werden. Wenn er schon vorhanden ist,
* wird true zurueckgegeben.
*/
public boolean ueberpruefeVertauschungen() {
boolean result = true;
/*Es wird geprüft:
1. Ob im Array originalBuchstaben Dopplungen enthalten sind.
2. Ob im Array originalBuchstaben Buchstaben im Array getauschteBuchstaben enthalten sind.
3. Ob im Array getauschteBuchstaben Dopplungen enthalten sind.
Tritt einer der Fälle ein, erfolgt eine Konsolenausgabe und der Flag wird auf false gesetzt.
*/
for (int n = 0; n < orginalBuchstaben.length; n++) {
if (orginalBuchstaben.equals(orginalBuchstaben[n]) ||
getauschteBuchstaben.equals(orginalBuchstaben[n]) ||
getauschteBuchstaben.equals(getauschteBuchstaben[n])) {
System.err.println("Vertauschungen enthalten unzulässige Dopplungen");
result = false;
}
public boolean ueberpruefeVertauschungen(Character buchstabe) {
boolean result = false;
if (originalBuchstaben.contains(String.valueOf(buchstabe)) ||
getauschteBuchstaben.contains(String.valueOf(buchstabe))) {
result = true;
}
return result;
......@@ -102,15 +135,35 @@ public class Steckbrett {
* @return buchstabe : Character : Codierter Buchstabe.
*/
public char codiere(Character buchstabe) {
for (int index = 0; index < getauschteBuchstaben.length; index++) {
if (buchstabe.equals(getauschteBuchstaben[index])) {
buchstabe = orginalBuchstaben[index];
} else if (buchstabe.equals(orginalBuchstaben[index])) {
buchstabe = getauschteBuchstaben[index];
}
if (originalBuchstaben.contains(String.valueOf(buchstabe))) {
return getauschteBuchstaben.charAt(originalBuchstaben.indexOf(buchstabe));
} else if (getauschteBuchstaben.contains(String.valueOf(buchstabe))) {
return originalBuchstaben.charAt(getauschteBuchstaben.indexOf(buchstabe));
} else {
return buchstabe;
}
return buchstabe;
}
}
/**
* Tauscht die Buchstaben im Alphabet aus und gibt ein modifiziertes Alphabet zurueck.
*
* @param port : int : Platz der getauschten Buchstaben.
* @return alphabet : String : Alphabet mit getauschtem Buchstabenpaar.
*/
public String fetchVerfuegbareBuchstaben(int port) {
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (char c : this.originalBuchstaben.toCharArray()) {
alphabet = alphabet.replace(String.valueOf(c), "");
}
for (char c : this.getauschteBuchstaben.toCharArray()) {
alphabet = alphabet.replace(String.valueOf(c), "");
}
alphabet += originalBuchstaben.charAt(port);
alphabet += getauschteBuchstaben.charAt(port);
return alphabet;
}
}
\ No newline at end of file
......@@ -5,264 +5,184 @@ package projekt.enigma.model;
* <br>
* Erzeugt ein Objekt des Typs Walze mit den Eigenschaften:
* <br>
* 1. Walzennummer (Die Walze enthält die 26 Buchstaben des Alphabeths und codiert diese.
* 5 verschiedene Walzen stehen zur Auswahl, die jeweils verschieden die Buchstaben des Alphabeths
* paarweise vertauschen)
* 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 Alphabets
* vertauschen).
* <br>
* 2. Ringstellung (Umspringpunkt der Walze wird festgelegt. Der Umspringpunkt bestimmt
* den Drehzeitpunkt der linken Nachbarwalze)
* den Drehzeitpunkt der linken Nachbarwalze).
*/
public class Walze {
/**
* walzeAlpha : Character[] : Array, dass die Buchstaben des Alphabets enthaelt
*/
private Character[] alphabet;
//region Variablen
/**
* ringstellung : char : zeigt die Einstellung fuer den Umspringpunkt
* Die Anzahl der getaetigten Walzendrehungen.
*/
private char ringstellung;
private int turns;
/**
* walzennr : int : Bestimmt, welche Walze genutzt wird
* Das String-Array aller bekannter aktueller Walzen.
*/
private int walzennr;
private String[] walzen;
/**
* alphabet : Character[] : Enthaelt die Buchstaben des Alphabets. Wird im Laufe des Programmes
* aber immer wieder ueberschrieben.
* alphabet : String : enthaelt die Buchstaben des Alphabets.
*/
private Character[] walzeAlpha;
/**
* Ueberschriebener Konstruktor, der die Eingangsparameter der Walze mitgibt
*
* @param walzennr : int : Nummer der gewaehlten Walze
* @param ringstellung : int : Einstellung des Umsprungpunktes
*/
public Walze(int walzennr, int ringstellung) {
this.alphabet = new Character[]{'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'};
this.walzeAlpha = new Character[]{'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'};
this.setWalzennr(walzennr);
this.setRingstellung(ringstellung);
}
/**
* Sortiert der Walzennummer das passende Character-Array mittels switch zu.
*
* @return walze : Character[] : gibt die gewaehlte Walze zurueck
*/
private Character[] walzenNummer() {
Character[] walze = new Character[26];
// Character-Arrays fuer die Codierung jeder Walze
Character[] walzeEins = {'E', 'K', 'M', 'F', 'L', 'G', 'D', 'Q', 'V', 'Z', 'N', 'T', 'O', 'W', 'Y',
'H', 'X', 'U', 'S', 'P', 'A', 'I', 'B', 'R', 'C', 'J'};
Character[] walzeZwei = {'A', 'J', 'D', 'K', 'S', 'I', 'R', 'U', 'X', 'B', 'L', 'H', 'W', 'T', 'M',
'C', 'Q', 'G', 'Z', 'N', 'P', 'Y', 'F', 'V', 'O', 'E'};
Character[] walzeDrei = {'B', 'D', 'F', 'H', 'J', 'L', 'C', 'P', 'R', 'T', 'X', 'V', 'Z', 'N', 'Y',
'E', 'I', 'W', 'G', 'A', 'K', 'M', 'U', 'S', 'Q', 'O'};
Character[] walzeVier = {'E', 'S', 'O', 'V', 'P', 'Z', 'J', 'A', 'Y', 'Q', 'U', 'I', 'R', 'H', 'X',
'L', 'N', 'F', 'T', 'G', 'K', 'D', 'C', 'M', 'W', 'B'};
Character[] walzeFuenf = {'V', 'Z', 'B', 'R', 'G', 'I', 'T', 'Y', 'U', 'P', 'S', 'D', 'N', 'H', 'L',
'X', 'A', 'W', 'M', 'J', 'Q', 'O', 'F', 'E', 'C', 'K'};
private String alphabet;
switch (this.walzennr) {
case 1:
walze = walzeEins;
break;
case 2:
walze = walzeZwei;
break;
case 3:
walze = walzeDrei;
break;
case 4:
walze = walzeVier;
break;
case 5:
walze = walzeFuenf;
break;
}
return walze;
}
/**
* ringstellung : char : zeigt die Einstellung fuer den Umspringpunkt.
*/
private char ringstellung;
/**
* TODO: Dokumentieren
*
* @return ringstellung : char : gibt die neue Ringstellung als char zurueck
*/
public char getRingstellung() {
return ringstellung;
}
/**
* walzenNr : int : Bestimmt, welche Walze genutzt wird.
*/
private int walzenNr;
/**
* Setzt die Initiale Ringstellung der Walze.
* Es sind nur Zahlen von 1 - 26 zugelassen.
*
* Die Ringstellung wird zum char umgewandelt.
* Im Fehlerfall wird die Ringstellung standardmaessig auf 'Z' gesetzt.
*
* @param ringstellung : int : Punkt an dem die Walze umspringt
*/
//TODO ??? Setter Ringstellung
public void setRingstellung(int ringstellung) {
if ((ringstellung > 0) && (ringstellung <= 26)) {
this.ringstellung = this.alphabet[ringstellung - 1];
} else {
this.ringstellung = 'Z';
}
}
//endregion
/**
* Dreht die Walze: verschiebt das Alphabet um keine, eine oder mehrere Stellen und ueberschreibt
* das Array alphabet mit der neuen Anordnung.
//region Konstruktor
/**
* Ueberschriebener Konstruktor, der die Eingangsparameter der Walze mit gibt.
*
* @param walzenNr : int : Nummer der gewaehlten Walze.
* @param ringstellung : int : Einstellung des Umsprungpunktes.
*/
public Walze(int walzenNr, int ringstellung) {
this.walzen = new String[5];
this.walzen[0] = "EKMFLGDQVZNTOWYHXUSPAIBRCJ";
this.walzen[1] = "AJDKSIRUXBLHWTMCQGZNPYFVOE";
this.walzen[2] = "BDFHJLCPRTXVZNYEIWGAKMUSQO";
this.walzen[3] = "ESOVPZJAYQUIRHXLNFTGKDCMWB";
this.walzen[4] = "VZBRGITYUPSDNHLXAWMJQOFECK";
this.alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
this.turns = 0;
this.setWalzenNr(walzenNr);
this.setRingstellung(ringstellung);
}
//endregion
//region Funktionen & Methoden
/**
* Dreht die Walze: Zaehlt die Umdrehungen (turns) um eins hoch oder runter, je nach Drehrichtung.
* <p>
* Ueberprueft, ob der Umspringpunkt der Walze nach der Drehung erreicht wurde.
*
* @param drehung : int[] : Anzahl der Drehungen
* @return checkRing : boolean : gibt true zurueck wenn der Umspringpunkt erreicht wurde
* TODO: Doku
*/
public boolean dreheWalze(int... drehung) {
boolean checkRing = false;
// fuehrt die Verschiebung des Alphabets um eine Stelle durch
verschiebung();
// fuehrt die Verschiebung mehrfach aus, wenn mehrere Drehungen ausgefuehrt werden sollen
if (drehung.length > 0) {
for (int i = 1; i < drehung[0]; i++) {
verschiebung();
}
}
// gleicht die Ringstellung mit der aktuellen Position ab
if (this.getPosition().equals(this.ringstellung)) {
checkRing = true;
}
return checkRing;
}
/**
* Ueberschreibt die Alphabetswalze mit dem, durch die Drehung, verschobenen Alphabet.
* TODO: Dokumentieren
*/
private void verschiebung() {
Character[] neueWalze = new Character[26];
for (int index = 0; index < neueWalze.length; index++) {
neueWalze[(index + 1) % neueWalze.length] = this.walzeAlpha[index];
}
this.walzeAlpha = neueWalze;
}
* @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.
*/
boolean dreheWalze(int richtung) {
boolean checkRing = false;
int korrekturFaktor = 0;
if ((richtung == -1) || (richtung == 1)) {
if (richtung == 1) {
this.turns++;
} else {
korrekturFaktor = 1;
this.turns--;
}
// gleicht die Ringstellung mit der aktuellen Position ab
if ((this.alphabet.indexOf(this.getPosition()) + korrekturFaktor) % 26
== this.alphabet.indexOf(this.ringstellung)) {
checkRing = true;
}
}
return checkRing;
}
/**
* TODO: Dokumentieren // dass selbe wie getPosition
* Gibt den Buchstaben zurueck der in der Walze aktuell eingestellt ist.
/**
* Codiert den mitgegebenen Buchstaben anhand der gewaehlten Walze.
*
* @return char an der Stelle temp des Alphabets
*/
public char getAnzeige() {
int temp = this.fetchArrayIndex('A', this.walzeAlpha);
return this.alphabet[temp];
}
/**
* Codiert den mitgegebenen Buchstaben anhand der gewaehlten Walze.
*
* @param buchstabe : char : Buchstabe, der verschluesselt werden soll
* @return buchstabe : char : verschluesselter Buchstabe
*/
public char codiere(char buchstabe) {
/* durchsucht die (verschobene) Alphabetswalze nach dem aktuellen Buchstaben und
uebertraegt den Index auf die gewaehlte Codierwalze*/
buchstabe = walzenNummer()[fetchArrayIndex(buchstabe, walzeAlpha)];
* @param buchstabe : char : Buchstabe, der verschluesselt werden soll.
* @return char : verschluesselter Buchstabe.
*/
public char codiere(char buchstabe) {
return this.fetchWalze().charAt((this.alphabet.indexOf(buchstabe) + this.turns) % 26);
}
return buchstabe;
}
/**
* Decodiert den mitgegebenen Buchstaben anhand des Alphabets.
*
* @param buchstabe : char : Buchstabe, der decodiert werden soll.
* @return char : decodierter Buchstabe.
*/
char codiere2(char buchstabe) {
return this.alphabet.charAt((this.fetchWalze().indexOf(buchstabe) - this.turns + 520) % 26);
}
/**
* Decodiert den mitgegebenen Buchstaben mit Hilfe der (verschobenen) Alphabetswalze
*
* @param buchstabe : char : Buchstabe, der decodiert werden soll
* @return buchstabe : char : decodierter Buchstabe
*/
public char codiere2(char buchstabe) {
/* durchsucht die gewaehlte Walze nach dem aktuellen Buchstaben und
uebertraegt den Index auf die (verschobene) Alphabetswalze*/
buchstabe = walzeAlpha[fetchArrayIndex(buchstabe, walzenNummer())];
/**
* @return String : Gibt den Verschluesselungs-String der ausgewaehlten Walze zurueck.
*/
private String fetchWalze() {
return walzen[walzenNr];
}
return buchstabe;
}
//endregion
/**
* TODO: Dokumentieren
* Ermittelt den Index eines Characters in einem Array ueber eine for-Schleife
//region Setter
/**
* Setzt die Walzennummer. Es stehen fuenf Walzen zur Auswahl.
*
* @param buchstabe : Character : Buchstabe, dessen Index benoetigt wird
* @param array : Character[] : Array, in dem der Buchstabe vorkommen soll
* @return result : int : index des Buchstaben
*/
private int fetchArrayIndex(Character buchstabe, Character[] array) {
// wird mit ungueltigem Wert initialisiert
int result = -1;
for (int i = 0; i < array.length; i++) {
if (array[i].equals(buchstabe)) {
result = i;
break;
}
}
* @param walzenNr : int : Walzennummer.
*/
private void setWalzenNr(int walzenNr) {
if ((walzenNr > 0) && (walzenNr < 6)) {
this.walzenNr = walzenNr - 1;
} else {
System.err.println("Keine gültige Walzennummer");
}
}
return result;
}
/**
* Setzt die Initiale Ringstellung der Walze.
* Es sind nur Zahlen von 1 - 26 zugelassen.
* <br>
* Die Ringstellung wird zum char umgewandelt.
* Im Fehlerfall wird die Ringstellung standardmaessig auf 'Z' gesetzt.
*
* @param ringstellung : int : Punkt an dem die Nachbarwalze umspringt.
*/
void setRingstellung(int ringstellung) {
if ((ringstellung > 0) && (ringstellung <= 26)) {
this.ringstellung = this.alphabet.charAt(ringstellung - 1);
} else {
this.ringstellung = 'Z';
}
}
/**
* Setzt die Walzennummer. Es stehen fuenf Walze zur Auswahl.
*
* @param walzennr : int : Walzennummer
*/
public void setWalzennr(int walzennr) {
if ((walzennr > 0) && (walzennr < 6)) {
this.walzennr = walzennr;
} else {
System.err.println("Keine gültige Walzennummer");
}
}
/**
* Stellt die Grundeinstellung der Walze ein.
* Ermittelt, wie oft die Walze gedreht werden muss, bis die Grundeinstellung erreicht ist.
*
* @param buchstabe : Character : Einstellung der Walze.
*/
void setPosition(Character buchstabe) {
this.turns = alphabet.indexOf(buchstabe);
}
//endregion
/**
* TODO: Dokumentieren // das selbe wie getAnzeig?
* Gibt den Character zurueck, der aktuell in der Walze eingestellt ist
*
* @return Character am Index 0 des (verschobenen) Alphabets zurueck
*/
public Character getPosition() {
return walzeAlpha[0];
}
//region Getter
/**
* Gibt den Buchstaben zurueck, der aktuell in der Walze eingestellt ist.
*
* @return char : Ermittelte Stelle im Alphabet, anhand der aktuellen Anzahl der Drehungen.
*/
Character getPosition() {
return this.alphabet.charAt(turns % 26);
}
/**
* * TODO: Funktionsname hat sich geändert
* Gibt die Grundeinstellung der Walze ein. Nur Buchstaben von A - Z sind zugelassen.
* Buchstaben werden automatisch in Grossbuchstaben umgewandelt.
* Ist die Grundeinstellung nicht 'A', wird die Methode dreheWalze() aufgerufen.
*
* @param buchstabe : Character : Einstellung der Walze
*/
public void setPosition(Character buchstabe) {
if (Character.isLetter(buchstabe)) {
buchstabe = Character.toUpperCase(buchstabe);
System.arraycopy(this.alphabet, 0, this.walzeAlpha, 0, this.alphabet.length);
if (buchstabe > 'A') {
dreheWalze(this.fetchArrayIndex(buchstabe, this.walzeAlpha));
}
}
}
}
/**
* Getter der Walzennummer.
* @return walzenNr : int : gibt Walzennummer zurueck.
*/
int getWalzenNr() {
return this.walzenNr;
}
//endregion
}
\ No newline at end of file
package projekt.enigma.view;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.GridPane;
import projekt.enigma.model.Codierer;
import java.util.Arrays;
/**
* Die Klasse ChkBoxGripPane erweitert das GridPane Objekt.
* Wir erstellen ein GridPane in welches Checkboxen gelegt werden.
* Die Anzahl der Checkboxen wird durch die verfuegbarenBuchstaben festgelegt.
* Für jeden Buchstaben in diesem char Array, wird eine Checkbox erstellt und auf das Gridpane gelegt.
*/
public class ChkBoxGridPane extends GridPane {
// Der globale Checkbox Array
private CheckBox[] checkbox;
// Die Buchstaben die für das jeweilige Pane selectiert werden sollen
private String checkedBuchstaben;
// Die Anzahl der möglichen Checkboxen
private int charSize;
// Das Codierer Objekt. Dieses wird benötigt um auf die Funktionen für das Steckbrett zuzugreifen
private Codierer codierer;
// Der Steckbrett Port für welchen das Pane und die Checkboxen erstellt werden sollen
private int port;
// Die verfügbaren Buchstaben für den jeweiligen Port
private char[] verfuegbareBuchstaben;
// Das Button Objekt des Ports über den dieses Pane gesteuert wird
private ToggleButton tBtnPort;
/**
* Hier werfen wir die Checkboxen auf das Gridpane und weißen ihnen die Propertys zu.
* Außerdem wird hier auch der Listener generiert womit wir prüfen ob die maximale Auswahlmöglichkeit
* erreicht ist.
* Es können maximal zwei Checkboxen ausgewählt werden. Wenn zwei erreicht sind, werden die restlichen Checkboxen
* deaktiviert. Wenn nur noch eine oder keine Box ausgewählt ist, werden die restlichen wieder aktiviert.
* Bei null und zwei Boxen, werden die Buchstaben in das Steckbrett geschrieben.
* Andere Auswahlmöglchkeiten stehen nicht zur Verfügung, da ein Kabel nur zwei Enden hat in der Regel.
*
* @param codierer : Codierer Objekt
* @param port : int
* @param tBtnPort : ToogleButton
*/
public ChkBoxGridPane(Codierer codierer, int port, ToggleButton tBtnPort) {
this.codierer = codierer;
this.port = port;
this.tBtnPort = tBtnPort;
this.verfuegbareBuchstaben = this.codierer.fetchVerfuegbareBuchstaben(this.port).toCharArray();
Arrays.sort(this.verfuegbareBuchstaben);
charSize = this.verfuegbareBuchstaben.length;
this.checkedBuchstaben = tBtnPort.getText();
initializeComponents();
}
/**
* Es wird ein GridPane erzeugt, das zwei Spalten und abhängig von der Länge des
* Arrays (Character[] alphabet) Reihen hat. Das Label der CheckBoxen soll
* abhängig von deren Index links bzw. recht erzeugt werden
*/
private void initializeComponents() {
checkbox = new CheckBox[charSize];
this.setAlignment(Pos.CENTER);
// Für jeden verfügbaren Buchstaben einen Durchlauf
for (int i = 0; i < this.verfuegbareBuchstaben.length; i++) {
if (this.verfuegbareBuchstaben[i] != 20 && this.verfuegbareBuchstaben[i] != ' ') {
checkbox[i] = new CheckBox(this.verfuegbareBuchstaben[i] + "");
checkbox[i].setPadding(new Insets(1, 1, 1, 1));
if (!checkedBuchstaben.equals("")) {
if (!checkedBuchstaben.contains(String.valueOf(this.verfuegbareBuchstaben[i]))) {
checkbox[i].setDisable(true);
} else {
checkbox[i].setSelected(true);
}
} else {
checkbox[i].setSelected(false);
checkbox[i].setDisable(false);
}
// Der Listener für die jeweilige Checkbox
checkbox[i].selectedProperty().addListener((observable, oldValue, newValue) -> {
String portSelection = "";
int zaehler = 0;
// Die selektierten Chechkboxen zählen
for (CheckBox cb : checkbox) {
if (cb != null && cb.isSelected()) {
zaehler++;
}
}
// Wenn nur eine oder keine Checkbox ausgewählt ist
if (zaehler == 1 || zaehler == 0) {
for (CheckBox cb : checkbox) {
if (cb != null && cb.isDisabled()) {
cb.setDisable(false);
}
}
}
// Es ist keine Checkbox ausgewählt
if (zaehler == 0) {
// Daten ins Steckbrett schreiben
this.codierer.setzeSteckbrett(this.port, "");
// Und den Button neu beschreiben
tBtnPort.setText(portSelection);
}
// Das Maximum an selektierten Checkboxen (2) ist erreicht
if (zaehler == 2) {
for (CheckBox cb : checkbox) {
if (cb != null && !cb.isSelected()) {
cb.setDisable(true);
} else {
if (cb != null) {
portSelection += cb.getText();
}
}
}
// Daten ins Steckbrett schreiben
this.codierer.setzeSteckbrett(this.port, "");
this.codierer.setzeSteckbrett(this.port, portSelection);
// Und den Button neu beschreiben
tBtnPort.setText(portSelection);
}
});
// Eine neue Row im Gridpane anlegen für den nächsten Button
this.addRow(i + 1);
this.add(checkbox[i], 2, i + 1, 1, 1);
}
}
// Das Pane anzeigen
this.setVisible(true);
}
/**
* Gibt den Anzahl der zur Verfügung stehenden Buchstaben zurück.
* Anhang dieses Wertes, wird die Anzahl der Checkboxen festgelegt.
*
* @return int : Anzahl der möglcihen chars
*/
public int getCharSize() {
return charSize;
}
}
No preview for this file type
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.shape.Circle?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="411.0" prefWidth="512.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="projekt.enigma.KenngruppeController">
<children>
<Label layoutX="81.0" layoutY="29.0" text="Bitte Kenngruppe eingeben!" AnchorPane.leftAnchor="81.0" AnchorPane.rightAnchor="70.0" AnchorPane.topAnchor="29.0" />
<HBox layoutX="107.0" layoutY="141.0" prefHeight="26.0" prefWidth="276.0" AnchorPane.leftAnchor="107.0" AnchorPane.rightAnchor="129.0" AnchorPane.topAnchor="141.0">
<children>
<Button fx:id="secondaryButton" onAction="#switchToPrimary" prefHeight="25.0" prefWidth="142.0" text="Kenngruppe bestätigen!" />
<Label prefHeight="17.0" prefWidth="159.0" text="Label" />
<Button mnemonicParsing="false" prefHeight="25.0" prefWidth="150.0" text="Button" />
</children>
</HBox>
<Circle fill="DODGERBLUE" layoutX="226.0" layoutY="267.0" radius="100.0" stroke="BLACK" strokeType="INSIDE" AnchorPane.leftAnchor="126.0" AnchorPane.rightAnchor="186.0" AnchorPane.topAnchor="167.0" />
<Button fx:id="secondaryButton" layoutX="40.0" layoutY="85.0" onAction="#switchToPrimary" prefHeight="25.0" prefWidth="241.0" text="Kenngruppe bestätigen!" />
</children>
</AnchorPane>
......@@ -11,54 +11,72 @@ public class HardwareTest {
Hardware h = new Hardware();
h.setReflektor(new Reflektor());
h.setSteckbrett(new Steckbrett());
h.setWalzen(0, 1, 1);
h.setWalzen(1, 2, 1);
h.setWalzen(2, 3, 1);
/*
Walze nach der Chiffrierung
Alphabet {'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'};
Steckbrett {'B', 'G', 'D', 'F'}
Steckbrett {'G', 'B', 'F', 'F'}
Walze 3 {'B', 'D', 'F', 'H', 'J', 'L', 'C', 'P', 'R', 'T', 'X', 'V', 'Z', 'N', 'Y', 'E', 'I', 'W', 'G', 'A', 'K', 'M', 'U', 'S', 'Q', 'O'};
Walze 2 {'A', 'J', 'D', 'K', 'S', 'I', 'R', 'U', 'X', 'B', 'L', 'H', 'W', 'T', 'M', 'C', 'Q', 'G', 'Z', 'N', 'P', 'Y', 'F', 'V', 'O', 'E'};
Walze 1 {'E', 'K', 'M', 'F', 'L', 'G', 'D', 'Q', 'V', 'Z', 'N', 'T', 'O', 'W', 'Y', 'H', 'X', 'U', 'S', 'P', 'A', 'I', 'B', 'R', 'C', 'J'};
Reflektor {'E', 'J', 'M', 'Z', 'A', 'L', 'Y', 'X', 'V', 'B', 'W', 'F', 'C', 'R', 'Q', 'U', 'O', 'N', 'T', 'S', 'P', 'I', 'K', 'H', 'G', 'D'};
Alphabet "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"
Steckbrett "W S L V H Y G I X A"
Steckbrett "J E F B K P M Q U C"
Walze 3 "E K M F L G D Q V Z N T O W Y H X U S P A I B R C J"
Walze 2 "V Z B R G I T Y U P S D N H L X A W M J Q O F E C K"
Walze 1 "A J D K S I R U X B L H W T M C Q G Z N P Y F V O E"
Reflektor "E J M Z A L Y X V B W F C R Q U O N T S P I K H G D"
*/
char result;
h.resetWalzen();
h.setWalzen(0, 2, 25);
h.setWalzen(1, 5, 25);
h.setWalzen(2, 1, 25);
result = h.codiere('A');
Assert.assertEquals("Codiere: A Erwartet P, erhalten " + result, 'P', result);
Assert.assertEquals("Codiere: A Erwartet N, erhalten " + result, 'N', result);
result = h.codiere('B');
Assert.assertEquals("Codiere: B Erwartet R, erhalten " + result, 'R', result);
Assert.assertEquals("Codiere: B Erwartet K, erhalten " + result, 'K', result);
result = h.codiere('I');
Assert.assertEquals("Codiere: I Erwartet E, erhalten " + result, 'E', result);
Assert.assertEquals("Codiere: I Erwartet V, erhalten " + result, 'V', result);
result = h.codiere('F');
Assert.assertEquals("Codiere: F Erwartet A, erhalten " + result, 'A', result);
Assert.assertEquals("Codiere: F Erwartet T, erhalten " + result, 'T', result);
h.resetWalzen();
result = h.codiere('P');
Assert.assertEquals("Decodiere: P Erwartet A, erhalten " + result, 'A', result);
result = h.codiere('R');
Assert.assertEquals("Decodiere: R Erwartet B, erhalten " + result, 'B', result);
result = h.codiere('E');
Assert.assertEquals("Decodiere: E Erwartet I, erhalten " + result, 'I', result);
result = h.codiere('A');
Assert.assertEquals("Decodiere: A Erwartet F, erhalten " + result, 'F', result);
h.setWalzen(0, 2, 25);
h.setWalzen(1, 5, 25);
h.setWalzen(2, 1, 25);
result = h.codiere('N');
Assert.assertEquals("Decodiere: N Erwartet A, erhalten " + result, 'A', result);
result = h.codiere('K');
Assert.assertEquals("Decodiere: K Erwartet B, erhalten " + result, 'B', result);
result = h.codiere('V');
Assert.assertEquals("Decodiere: V Erwartet I, erhalten " + result, 'I', result);
result = h.codiere('T');
Assert.assertEquals("Decodiere: T Erwartet F, erhalten " + result, 'F', result);
h.resetWalzen();
h.setWalzen(0, 2, 25);
h.setWalzen(1, 5, 25);
h.setWalzen(2, 1, 25);
h.getSteckbrett().setzeVertauschung('B', 'G');
h.getSteckbrett().setzeVertauschung('D', 'F');
h.getSteckbrett().setzeVertauschung('I', 'L');
h.getSteckbrett().setzeVertauschung('M', 'Q');
h.getSteckbrett().setzeVertauschung('T', 'X');
h.getSteckbrett().setzeVertauschung('N', 'X');
h.getSteckbrett().setzeVertauschung('K', 'Y');
h.getSteckbrett().setzeVertauschung('U', 'Z');
h.getSteckbrett().setzeVertauschung('A', 'O');
h.getSteckbrett().setzeVertauschung('E', 'S');
result = h.codiere('I');
Assert.assertEquals("Codiere: Erwartet F, erhalten " + result, 'D', result);
Assert.assertEquals("Codiere: I Erwartet C, erhalten " + result, 'C', result);
h.resetWalzen();
result = h.codiere('D');
Assert.assertEquals("Codiere: Erwartet I, erhalten " + result, 'I', result);
h.setWalzen(0, 2, 25);
h.setWalzen(1, 5, 25);
h.setWalzen(2, 1, 25);
result = h.codiere('C');
Assert.assertEquals("Codiere: C Erwartet I, erhalten " + result, 'I', result);
h.setWalzen(0, 2, 25);
h.setWalzen(1, 5, 25);
h.setWalzen(2, 1, 25);
h.getSteckbrett().setzeVertauschung('A', 'B');
h.getSteckbrett().setzeVertauschung('C', 'D');
result = h.codiere('A');
Assert.assertEquals("Codiere: A Erwartet M, erhalten " + result, 'M', result);
}
}
\ No newline at end of file
......@@ -10,22 +10,22 @@ public class WalzeTest {
@Test
public void setRingstellung() {
Walze w = new Walze(1, 1);
char temp = w.getAnzeige();
char temp = w.getPosition();
Assert.assertEquals('A', temp);
}
@Test
public void dreheWalze() {
Walze w = new Walze(1, 3);
assertFalse("false erwartet, true geliefert", w.dreheWalze(2));
char temp = w.getAnzeige();
Assert.assertEquals("C erwartet, " + temp + " zurück gegeben", 'C', temp);
Walze w = new Walze(1, 4);
assertFalse("false erwartet, true geliefert", w.dreheWalze(1));
char temp = w.getPosition();
Assert.assertEquals("B erwartet, " + temp + " zurück gegeben", 'B', temp);
}
@Test
public void getAnzeige() {
public void getPosition() {
Walze w = new Walze(1, 1);
char temp = w.getAnzeige();
char temp = w.getPosition();
Assert.assertEquals('A', temp);
}
......