diff --git a/README.md b/README.md
index 4686787..3408ee1 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,19 @@
# firewall-dashboard-simplified
+@author Aaron Moser
+@date 02.12.2023
+@lastCHange 25.01.2024
+
+Im Rahmen eines Hand on Seminar an der Hochschule Offenburg entwickelte Software zur Remote-ueberwachung und -veraenderung einer Firewall.
+
+## Client
+Der Client wird in Java programmiert. Als UI Framework wird Java Swing verwendet.
+
+## Server
+Der Server (Agent) wird in Python programmiert.
+
+## Simplified
+
Project containing the Hands On Seminar code.
Since last approach was to cluttered, decided to simplify the design.
diff --git a/cacerts b/cacerts
new file mode 100644
index 0000000..4eba2fa
Binary files /dev/null and b/cacerts differ
diff --git a/firewall-dashboard-simplified/pom.xml b/firewall-dashboard-simplified/pom.xml
deleted file mode 100644
index b025e98..0000000
--- a/firewall-dashboard-simplified/pom.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
- 4.0.0
-
- src.java
- firewall-dashboard-simplified
- 1.0-SNAPSHOT
-
-
- 1.8
- 1.8
-
-
-
\ No newline at end of file
diff --git a/mvn.cmd b/mvn.cmd
new file mode 100644
index 0000000..e69de29
diff --git a/my-cacerts b/my-cacerts
new file mode 100644
index 0000000..8a8265c
Binary files /dev/null and b/my-cacerts differ
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..0060ff1
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,96 @@
+
+
+ 4.0.0
+
+ src.java
+ src
+ 1.0-SNAPSHOT
+
+
+ 21
+ 21
+
+
+
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+ org.jfree
+ jfreechart
+ 1.5.3
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ 2.16.0
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.16.0
+
+
+
+
+
+
+
+ maven-release-plugin
+ 3.3.3
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+
+
+
diff --git a/server.crt b/server.crt
new file mode 100644
index 0000000..3f16705
--- /dev/null
+++ b/server.crt
@@ -0,0 +1,35 @@
+-----BEGIN CERTIFICATE-----
+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
+49fGV0I4AFMm8mcpmKCO3CQ/arX6khFSkQ==
+-----END CERTIFICATE-----
diff --git a/server.key b/server.key
new file mode 100644
index 0000000..42e2993
--- /dev/null
+++ b/server.key
@@ -0,0 +1,54 @@
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+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
+RJkD/R0JAl/7yp5XNB0KmA==
+-----END ENCRYPTED PRIVATE KEY-----
diff --git a/src/main/java/src/java/connect/Receiver.java b/src/main/java/src/java/connect/Receiver.java
new file mode 100644
index 0000000..251371c
--- /dev/null
+++ b/src/main/java/src/java/connect/Receiver.java
@@ -0,0 +1,61 @@
+/**
+ * @author Aaron Moser
+ * @date 26.12.2023
+ * @lastChange 25.01.2024
+ */
+package src.java.connect;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import src.java.connect.client.TLSClient;
+import src.java.queues.ReceivingQueue;
+
+public class Receiver extends Thread {
+ private static Receiver instance = null;
+
+ private boolean receiverRunning = false;
+
+ BufferedReader reader = null;
+
+ private Receiver() {}
+
+ public static Receiver getInstance() {
+ if (instance == null) {
+ instance = new Receiver();
+ }
+ return instance;
+ }
+
+ @Override
+ public void run() {
+ receiverRunning = true;
+ while (receiverRunning) {
+ receiveData();
+ }
+ }
+
+ public void receiveData() {
+ try {
+ if (TLSClient.getSSLSocket().isConnected()) {
+ if (reader == null) {
+ reader = new BufferedReader(new InputStreamReader(TLSClient.getSSLSocket().getInputStream()));
+ }
+ if (reader != null) {
+ String response;
+ while ((response = reader.readLine()) != null) {
+ //System.out.println(response);
+ ReceivingQueue.getInstance().add(response);
+ }
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void stopThread() {
+ this.receiverRunning = false;
+ }
+}
diff --git a/src/main/java/src/java/connect/Sender.java b/src/main/java/src/java/connect/Sender.java
new file mode 100644
index 0000000..90dd2df
--- /dev/null
+++ b/src/main/java/src/java/connect/Sender.java
@@ -0,0 +1,73 @@
+/**
+ * @author Aaron Moser
+ * @date 26.12.2023
+ * @lastChange 25.01.2024
+ */
+package src.java.connect;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import src.java.connect.client.TLSClient;
+import src.java.queues.SendingQueue;
+
+/**
+ * TODO change pattern from singleton to dependency injection.
+ */
+public class Sender extends Thread {
+ private static Sender instance = null;
+
+ private boolean senderRunning = false;
+
+ private PrintWriter writer = null;
+
+ private Sender() {}
+
+ public static Sender getInstance() {
+ if (instance == null) {
+ instance = new Sender();
+ }
+ return instance;
+ }
+
+ @Override
+ public void run() {
+ senderRunning = true;
+ while (senderRunning) {
+ try {
+ // Wait until controller puts requests into sending queue.
+ String item = SendingQueue.getInstance().take();
+ System.out.println("Sender sends: " + item);
+ sendData(item);
+ } catch (InterruptedException e) {
+ System.out.println("Sender thread was interrupted.");
+ Thread.currentThread().interrupt();
+ return;
+ }
+ }
+ }
+
+ private void sendData(String data) {
+ try {
+ if (TLSClient.getSSLSocket().isConnected()) {
+ if (writer == null) {
+ writer = new PrintWriter(TLSClient.getSSLSocket().getOutputStream());
+ }
+ if (writer != null && data != null) {
+ writer.println(data);
+ writer.flush();
+ } else {
+ System.out.println("Connection is not established.");
+ }
+ } else {
+ System.out.println("SSLSocket is null.");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void stopThread() {
+ this.senderRunning = false;
+ }
+}
diff --git a/src/main/java/src/java/connect/client/Client.java b/src/main/java/src/java/connect/client/Client.java
new file mode 100644
index 0000000..82557fe
--- /dev/null
+++ b/src/main/java/src/java/connect/client/Client.java
@@ -0,0 +1,13 @@
+/**
+ * @author Aaron Moser
+ */
+package src.java.connect.client;
+
+import src.java.data.ConnectionData;
+
+public interface Client {
+ public boolean createConnection(ConnectionData connectionData);
+ public void startSender();
+ public void startReceiver();
+ public void closeConnection();
+}
diff --git a/src/main/java/src/java/connect/client/TLSClient.java b/src/main/java/src/java/connect/client/TLSClient.java
new file mode 100644
index 0000000..0280366
--- /dev/null
+++ b/src/main/java/src/java/connect/client/TLSClient.java
@@ -0,0 +1,97 @@
+/**
+ * @author Aaron Moser
+ * @lastChange 25.01.2024
+ */
+package src.java.connect.client;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import java.net.UnknownHostException;
+
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManagerFactory;
+
+import src.java.connect.Receiver;
+import src.java.connect.Sender;
+import src.java.data.ConnectionData;
+
+public final class TLSClient implements Client {
+
+ private static SSLSocket sslSocket;
+
+ public static synchronized SSLSocket getSSLSocket() {
+ return sslSocket;
+ }
+
+ @Override
+ public boolean createConnection(ConnectionData connectionData) {
+ try {
+ String ipAddress = connectionData.ipAddress();
+ int port = connectionData.port();
+ String keyStorePath = connectionData.keyStorePath();
+ String keyStprePassPhrase = connectionData.keyStorePassphrase();
+
+ KeyStore truststore = KeyStore.getInstance("JKS");
+ truststore.load(new FileInputStream(keyStorePath), keyStprePassPhrase.toCharArray());
+
+ // Create a TrustManager that trusts the certificates in the truststore
+ TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+ trustManagerFactory.init(truststore);
+
+ // Create an SSL context with the trust manager
+ SSLContext sslContext = SSLContext.getInstance("TLS");
+ sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
+
+ // Set the SSL context on the SSLSocketFactory
+ SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
+
+ sslSocket = (SSLSocket) sslSocketFactory.createSocket(ipAddress, port);
+ return true;
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ return false;
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ return false;
+ } catch (CertificateException e) {
+ e.printStackTrace();
+ return false;
+ } catch (KeyStoreException e) {
+ e.printStackTrace();
+ return false;
+ } catch (KeyManagementException e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ public void startSender() {
+ Sender.getInstance().start();
+ }
+
+ public void startReceiver() {
+ Receiver.getInstance().start();
+ }
+
+ public void closeConnection() {
+ try {
+ if (sslSocket != null) {
+ sslSocket.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/src/java/controller/ControllerThread.java b/src/main/java/src/java/controller/ControllerThread.java
new file mode 100644
index 0000000..b526e6d
--- /dev/null
+++ b/src/main/java/src/java/controller/ControllerThread.java
@@ -0,0 +1,97 @@
+package src.java.controller;
+
+import src.java.connect.client.Client;
+import src.java.connect.client.TLSClient;
+import src.java.controller.interfaces.Controller;
+import src.java.controller.validate.Validate;
+import src.java.data.ConnectionData;
+import src.java.queues.SendingQueue;
+
+/**
+ * @author Aaron Moser
+ * @date 01.12.2023
+ * @lastChange 25.01.2024
+ */
+
+public class ControllerThread extends Thread implements Controller {
+
+ private final static boolean SUCCESSFUL = true;
+
+ private Client client = null;
+
+ public ControllerThread() {
+
+ }
+
+ public void run() {
+
+ //startThreads();
+
+ //this.model.getConnectionModel().setConnectionStatus(ConnectionStatus.Connected);
+ //this.model.getConnectionModel().setIPAddress(ipAddress);
+ //this.model.getConnectionModel().setPort(port);
+ //this.model.incrementVersion();
+
+ //SendingQueue.getInstance().add("getSysInf");
+ //SendingQueue.getInstance().add("getCon");
+ //SendingQueue.getInstance().add("getNFTConf");
+
+ }
+
+ private boolean createConnectionStartThreadsAndGetInitialData(ConnectionData connectionData) {
+ boolean connectToServerSuccess = createConnectionToServer(connectionData);
+
+ if (connectToServerSuccess) {
+ startThreads();
+
+ //this.model.getConnectionModel().setConnectionStatus(ConnectionStatus.Connected);
+ //this.model.getConnectionModel().setIPAddress(ipAddress);
+ //this.model.getConnectionModel().setPort(port);
+ //this.model.incrementVersion();
+
+ sendInitialRequests();
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Is called if controller received event from view, which indicates,
+ * that the connect to server button was pressed. The function takes
+ * a parameter of type ViewToControllerData which contains the information
+ * necessary to establish a connection to a server.
+ * @param viewToControllerData
+ */
+ private boolean createConnectionToServer(ConnectionData connectionData) {
+ //this.model.getConnectionModel().setConnectionStatus(ConnectionStatus.Pending);
+
+ boolean validIP = Validate.isValidIPv4Address(connectionData.ipAddress());
+ boolean validPort = Validate.isValidPort(connectionData.port(), 1, 60000);
+ System.out.println("IP: " + validIP + ", Port: " + validPort);
+
+ if (validIP) {
+ if (validPort) {
+ this.client = new TLSClient();
+ if (this.client.createConnection(connectionData) == SUCCESSFUL) {
+ return true;
+ }
+ } else {
+ //TODO send event to view that port is not valid.
+ }
+ } else {
+ //TODO send event to view that ip is not valid.
+ }
+ return false;
+ }
+
+ private void startThreads() {
+ this.client.startReceiver();
+ this.client.startSender();
+ }
+
+ private void sendInitialRequests() {
+ SendingQueue.getInstance().add("getSysInf");
+ SendingQueue.getInstance().add("getCon");
+ SendingQueue.getInstance().add("getNFTConf");
+ }
+}
diff --git a/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.java b/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.java
new file mode 100644
index 0000000..b48aab0
--- /dev/null
+++ b/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.java
@@ -0,0 +1,36 @@
+/**
+ * @author Aaron Moser
+ * @date 28.12.2023
+ */
+package src.java.controller.DataProcessing.ConnectionsProcessing;
+
+/**
+ * Record displays packed information about one connection at the agent side.
+ */
+public final record ConnectionInformation(
+ int fileDescriptor,
+ String addressFamily,
+ String socketKind,
+ String localAddress,
+ int localPort,
+ String remoteAddress,
+ int remotePort,
+ String status,
+ int pid) {
+
+ public boolean equals(ConnectionInformation other) {
+ return this.fileDescriptor == other.fileDescriptor && this.pid == other.pid;
+ }
+
+ public String toString() {
+ return fileDescriptor + " | " +
+ addressFamily + " | " +
+ socketKind + " | " +
+ localAddress + " | " +
+ localPort + " | " +
+ remoteAddress + " | " +
+ remotePort + " | " +
+ status + " | " +
+ pid;
+ }
+}
diff --git a/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.java b/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.java
new file mode 100644
index 0000000..4698ccd
--- /dev/null
+++ b/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.java
@@ -0,0 +1,191 @@
+/**
+ * @author Aaron Moser
+ * @date 28.12.2023
+ */
+package src.java.controller.DataProcessing.ConnectionsProcessing;
+
+/**
+ * Provides a function to retrieve information from a connection string.
+ * sconn(fd=9, family=, type=, laddr='', raddr='', status='NONE', pid=1789)
+ * fd stands for file descriptor
+ * laddr: local address
+ * raddr: remote address
+ * pid stands for process id
+ */
+public final class ConnectionsProcessor {
+ private static final int HEAD_LENGTH = 6;
+ private static final int TAIL_LENGTH = 1;
+
+ private static final String[] ADDRESS_FAMILIES = {
+ "AF_UNIX", // Unix domain sockets
+ "AF_LOCAL", // Unix domain sockets
+ "AF_INET", // IPv4 communication
+ "AF_INET6", // IPv6 communication
+ "AF_NETLINK", // Used for communication with the Linux kernel using the Netlink protocol
+ "AF_PACKET", // Low-level packet manipulation
+ "AF_BLUETOOTH", // Bluetooth communication
+ "AF_CAN", // Controller Area Network (CAN) communication
+ "AF_RDS", // Reliable Datagram Sockets (RDS) communication
+ "AF_ALG", // Cryptographic socket support
+ "AF_VSOCK", // Virtual Socket (vsock) communication for hypervisor-based applications
+ "AF_XDP" // eXpress Data Path (XDP) socket family for high-performance packet processing
+ };
+
+ private static final String[] SOCKET_KINDS = {
+ "SOCK_STREAM", // provides a reliable, stream-oriented connection, typically used for TCP sockets
+ "SOCK_DGRAM", // provides a connectionless, unreliable communication method, typically used for UDP sockets
+ "SOCK_RAW", // allows low-level access to network protocols, often used for custom packet manipulation
+ "SOCK_SEQPACKET", // similar to SOCK_STREAM but provides a record-oriented, connection-based socket
+ "SOCK_RDM", // reliable datagram sockets
+ "SOCK_PACKET" // used for low-level packet capture and injection
+ };
+
+ private static final String[] CONNECTION_STATUSES = {
+ "NONE",
+ "ESTABLISHED", // socket connection is established and data can be exchanged
+ "LISTEN", // socket is listening for incoming connections
+ "CLOSE_WAIT", // socket is waiting for the remote end to close the connection
+ "TIME_WAIT", // socket is waiting for any remaining packets to arrive after the connection is closed
+ "CLOSED", // socket is closed and no longer in use
+ "SYN_SENT", // socket has sent a SYN packet to initiate a connection
+ "SYN_RECEIVED", // socket has received a SYN packet and is waiting for an ACK to complete the connection establishment
+ "FIN_WAIT1", // socket is in the process of closing the connection
+ "FIN_WAIT2" // socket is in the process of closing the connection
+ };
+
+ /**
+ * Processes a data string which contains the information about one connection at the agents side.
+ * @param dataString the string which contains the information.
+ * @return an object of type ConnectionInformation.
+ */
+ public static ConnectionInformation processDataString(String dataString) {
+ String[] dataStringParts = removeHeadAndTail(dataString).split(" ");
+
+ int fileDescriptor = -1;
+ String addressFamily = "";
+ String socketKind = "";
+ String localAddress = "";
+ int localPort = -1;
+ String remoteAddress = "";
+ int remotePort = -1;
+ String status = "";
+ int pid = -1;
+
+ for (int i = 0; i < dataStringParts.length; i++) {
+ String part = dataStringParts[i];
+
+ if (part.startsWith("fd")) {
+ fileDescriptor = processFileDescriptor(part);
+
+ } else if (part.startsWith("family")) {
+ addressFamily = processAddressFamily(part);
+
+ } else if (part.startsWith("type")) {
+ socketKind = processSocketKind(part);
+
+ } else if (part.startsWith("laddr")) {
+ localAddress = processAddress(part);
+ // Check if entry after is of type port
+ if (dataStringParts[i+1].startsWith("port")) {
+ localPort = processPort(dataStringParts[i+1]);
+ i++;
+ }
+ } else if (part.startsWith("raddr")) {
+ remoteAddress = processAddress(part);
+ // CHeck if entry after is of type port
+ if (dataStringParts[i+1].startsWith("port")) {
+ remotePort = processPort(dataStringParts[i+1]);
+ i++;
+ }
+ } else if (part.startsWith("status")) {
+ status = processStatus(part);
+
+ } else if (part.startsWith("pid")) {
+ pid = processPID(part);
+
+ } else {
+ // Do nothing
+ }
+ }
+
+ return new ConnectionInformation(fileDescriptor, addressFamily, socketKind, localAddress, localPort, remoteAddress, remotePort, status, pid);
+ }
+
+ private static String removeHeadAndTail(String input) {
+ return input.substring(HEAD_LENGTH, input.length()-TAIL_LENGTH);
+ }
+
+ private static int processFileDescriptor(String fileDescriptorString) {
+ int fileDescriptor = 0;
+ try {
+ fileDescriptor = Integer.valueOf(fileDescriptorString.substring(3, fileDescriptorString.length()-1));
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ return fileDescriptor;
+ }
+
+ private static String processAddressFamily(String addressFamilyString) {
+ for (String addressFamily : ADDRESS_FAMILIES) {
+ if (addressFamilyString.contains(addressFamily)) {
+ return addressFamily;
+ }
+ }
+ return "";
+ }
+
+ private static String processSocketKind(String socketKindString) {
+ for (String socketKind : SOCKET_KINDS) {
+ if (socketKindString.contains(socketKind)) {
+ return socketKind;
+ }
+ }
+ return "";
+ }
+
+ private static String processAddress(String addressString) {
+ if (addressString.contains("''")) {
+ // If it's an empty address, it contains ''
+ return "";
+
+ } else if (addressString.contains("ip") && addressString.contains("[")) {
+ String ipv6Head = "xaddr=addr(ip='[";
+ // If it's an ipv6 address, since format is xaddr=addr(ip='[ipv6 address]',
+ return addressString.substring(ipv6Head.length(), addressString.length()-3);
+
+ } else if (addressString.contains("ip")) {
+ String ipv4Head = "xaddr=addr(ip='";
+ // If it's an ipv4 address, since format is xaddr=addr(ip='ipv4 address',
+ return addressString.substring(ipv4Head.length(), addressString.length()-2);
+
+ } else {
+ String head = "xaddr='";
+ // If it's not an empty or ip address, it is xaddr='path'
+ return addressString.substring(head.length(), addressString.length()-1);
+ }
+ }
+
+ private static int processPort(String portString) {
+ int port = 0;
+ try {
+ port = Integer.valueOf(portString.substring(5, portString.length()-2));
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ return port;
+ }
+
+ private static String processStatus(String statusString) {
+ return statusString.substring(8, statusString.length()-2);
+ }
+
+ private static int processPID(String pidString) {
+ int processID = -1;
+ try {
+ processID = Integer.valueOf(pidString.substring(4));
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ return processID;
+ }
+}
diff --git a/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.java b/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.java
new file mode 100644
index 0000000..b239b4d
--- /dev/null
+++ b/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.java
@@ -0,0 +1,54 @@
+/**
+ * @author Aaron Moser
+ * @date 29.12.2023
+ */
+package src.java.controller.DataProcessing.nftablesProcessing;
+
+import java.util.LinkedList;
+
+public class NFTableInformation {
+ // Outer list: tables
+ // Middle lists: chains
+ // Inner lists: rules
+ private LinkedList>> tables;
+
+ public NFTableInformation() {}
+
+ public NFTableInformation(NFTableInformation nftInf) {
+ this.tables = new LinkedList>>(nftInf.tables);
+ }
+
+// list of list of list
+// -> table1
+// -> chain1
+// -> tablename
+// -> chainname
+// -> rule1
+// -> rule2
+
+// -> table2
+
+/*
+for (LinkedList> table : tables) {
+ for (LinkedList chain : table) {
+ for (String rule : chain) {
+ if (rule.startsWith("{\"table")) {
+ System.out.println(rule);
+ } else if (rule.startsWith("{\"chain")) {
+ System.out.println("\t" + rule);
+ } else {
+ System.out.println("\t\t" + rule);
+ }
+ }
+ }
+}
+*/
+
+ public LinkedList>>getTables() {
+ return tables;
+ }
+
+ public void setTables(LinkedList>> tables) {
+ this.tables = tables;
+ }
+}
diff --git a/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor.java b/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor.java
new file mode 100644
index 0000000..1c1c370
--- /dev/null
+++ b/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor.java
@@ -0,0 +1,159 @@
+/**
+ * @author Aaron Moser
+ * @date 29.12.2023
+ * @lastChange 30.12.2023
+ */
+package src.java.controller.DataProcessing.nftablesProcessing;
+
+import java.util.LinkedList;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeType;
+import com.fasterxml.jackson.databind.node.NullNode;
+
+public final class NFTablesProcessor {
+ private static final String NFT_MAIN_FIELD = "nftables";
+ private static final String TABLE_FIELD = "table";
+ private static final String CHAIN_FIELD = "chain";
+ private static final String RULE_FIELD = "rule";
+ private static final String NAME_FIELD = "name";
+
+ private enum FieldType {
+ TABLE,
+ CHAIN,
+ RULE,
+ NONE
+ }
+
+ public static NFTableInformation processDataString(String data) {
+ NFTableInformation nfTableInformation = new NFTableInformation();
+
+ ObjectMapper objectMapper = new ObjectMapper();
+
+ LinkedList>> tables = new LinkedList>>();
+ LinkedList> tableChains = null;
+ LinkedList tableChainRules = null;
+
+ try {
+ JsonNode nfttree = objectMapper.readTree(data);
+ JsonNode mainRoot = getField(nfttree, NFT_MAIN_FIELD);
+
+ String lastTable = null;
+ FieldType lastNodeType = FieldType.NONE;
+ for (JsonNode nftObject : mainRoot) {
+ // If next node is of type table
+ if (isTableEntry(nftObject)) {
+ switch (lastNodeType) {
+ // Last node was of type table. Normally chain cares
+ // about storing the table entry at the beginning of
+ // the chains rules list but since table is empty,
+ // the next iteration has to care about storing the
+ // table at the list.
+ case FieldType.TABLE: {
+ tableChainRules = new LinkedList();
+ tableChainRules.add(lastTable);
+ tableChains = new LinkedList>();
+ tableChains.add(new LinkedList(tableChainRules));
+ tables.add(new LinkedList>(tableChains));
+ } // Intended fall through
+ case FieldType.CHAIN: // Intended fall through
+ case FieldType.RULE: // Intended fall through
+ case FieldType.NONE: // Intended fall through
+ default: {
+ // Reset all lists except tables list
+ tableChainRules = new LinkedList();
+ tableChains = new LinkedList>();
+ }
+ }
+ lastNodeType = FieldType.TABLE;
+ // Store current table description entry
+ lastTable = nftObject.toString();
+
+ // If next node is chain, the node before must have been of type table, chain or rule
+ } else if (isChainEntry(nftObject)) {
+ switch (lastNodeType) {
+ case FieldType.TABLE: {
+ // Add table and chain to new table chain rules list
+ tableChainRules.add(lastTable);
+ tableChainRules.add(nftObject.toString());
+ }break;
+ case FieldType.CHAIN: // Intended fall through
+ case FieldType.RULE: {
+ // Add rules of last chain to chain and reset list
+ tableChains.add(new LinkedList(tableChainRules));
+ tableChainRules = new LinkedList();
+ // Then add this chains description to list
+ tableChainRules.add(nftObject.toString());
+ }break;
+ case FieldType.NONE: // Intended fall through
+ default: {
+ System.out.println("Error, missing table before chain.");
+ }break;
+ }
+ lastNodeType = FieldType.CHAIN;
+
+ } else if (isRuleEntry(nftObject)) {
+ switch (lastNodeType) {
+ case FieldType.CHAIN: // Intended fall through
+ case FieldType.RULE: {
+ tableChainRules.add(nftObject.toString());
+ }break;
+ case FieldType.TABLE:// Intended fall through
+ case FieldType.NONE: // Intended fall through
+ default: {
+ System.out.println("Error, missing chain before rule.");
+ }break;
+ }
+ lastNodeType = FieldType.RULE;
+
+ } else {
+ // Do nothing
+ }
+ }
+ if (tableChains != null && !tableChains.isEmpty()) {
+ tables.add(new LinkedList>(tableChains));
+ }
+ } catch (JsonMappingException e) {
+ e.printStackTrace();
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+ nfTableInformation.setTables(tables);
+ return nfTableInformation;
+ }
+
+ private static boolean isTableEntry(JsonNode node) {
+ return isSpecifiedEntry(node, TABLE_FIELD);
+
+ }
+
+ private static boolean isChainEntry(JsonNode node) {
+ return isSpecifiedEntry(node, CHAIN_FIELD);
+ }
+
+ private static boolean isRuleEntry(JsonNode node) {
+ return isSpecifiedEntry(node, RULE_FIELD);
+ }
+
+ private static boolean isSpecifiedEntry(JsonNode node, String type) {
+ if (node.getNodeType() != JsonNodeType.NULL) {
+ JsonNode maybeNode = node.get(type);
+ if (maybeNode != null && maybeNode.toString() != "null") {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static JsonNode getField(JsonNode node, String fieldName) {
+ if (node.getNodeType() != JsonNodeType.NULL) {
+ if (node.get(fieldName) != null) {
+ return node.get(fieldName);
+ }
+ }
+ return NullNode.getInstance();
+ }
+}
diff --git a/src/main/java/src/java/controller/interfaces/Controller.java b/src/main/java/src/java/controller/interfaces/Controller.java
new file mode 100644
index 0000000..f649897
--- /dev/null
+++ b/src/main/java/src/java/controller/interfaces/Controller.java
@@ -0,0 +1,5 @@
+package src.java.controller.interfaces;
+
+public interface Controller {
+ public void start();
+}
diff --git a/src/main/java/src/java/controller/validate/Validate.java b/src/main/java/src/java/controller/validate/Validate.java
new file mode 100644
index 0000000..9b3061a
--- /dev/null
+++ b/src/main/java/src/java/controller/validate/Validate.java
@@ -0,0 +1,70 @@
+/**
+ * @author Aaron Moser
+ * @date 05.12.2023
+ * @lastChange 25.01.2024
+ */
+
+ package src.java.controller.validate;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class Validate {
+
+ /**
+ * Checks if overhanded string is valid ip address, by checking if its length is 13 or less,
+ * it contains exactly 4 numbers and if the numbers are in valid range.
+ * @param ipv4Address
+ * @return
+ */
+ public static boolean isValidIPv4Address(String ipv4Address) {
+ boolean isValidIPv4Address = false;
+ // Maximum length of ipv4 address is 13 characters, only evaluate if
+ // length of string is less or equal to 13.
+ if (ipv4Address.length() <= 13) {
+ String[] numbersAsString = ipv4Address.split("\\.");
+ // If ip address contains exactly 4 parts splitted by dots:
+ if (numbersAsString.length == 4) {
+ // Transform each part to integer and check if in valid range.
+ for (String numberAsString : numbersAsString) {
+ int number = Integer.valueOf(numberAsString);
+ if (number < 0 || number > 255) {
+ isValidIPv4Address = false;
+ break;
+ }
+ }
+ isValidIPv4Address = true;
+ } else {
+ isValidIPv4Address = false;
+ }
+ }
+ return isValidIPv4Address;
+ }
+
+ /**
+ * Checks if overhanded ipv6 address is valid by applying a regex to it.
+ * @param ipv6Address
+ * @return
+ */
+ public static boolean isValidIPv6Address(String ipv6Address) {
+ Pattern pattern = Pattern.compile("^([0-9a-f]{4}:){7}[0-9a-f]{4}$", Pattern.CASE_INSENSITIVE);
+ Matcher matcher = pattern.matcher(ipv6Address);
+ boolean matchFound = matcher.find();
+ if(matchFound) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Port is validated by checking if in bounds of overhanded values.
+ * @param port
+ * @param startOfRange
+ * @param endOfRange
+ * @return
+ */
+ public static boolean isValidPort(int port, int startOfRange, int endOfRange) {
+ return (port >= startOfRange && port <= endOfRange);
+ }
+}
diff --git a/src/main/java/src/java/data/ConnectionData.java b/src/main/java/src/java/data/ConnectionData.java
new file mode 100644
index 0000000..1a16653
--- /dev/null
+++ b/src/main/java/src/java/data/ConnectionData.java
@@ -0,0 +1,5 @@
+package src.java.data;
+
+public final record ConnectionData(String ipAddress, int port, String keyStorePath, String keyStorePassphrase) {
+
+}
diff --git a/firewall-dashboard-simplified/src/main/java/src/java/Main.java b/src/main/java/src/java/main/Main.java
similarity index 83%
rename from firewall-dashboard-simplified/src/main/java/src/java/Main.java
rename to src/main/java/src/java/main/Main.java
index 33229c3..0e4bf04 100644
--- a/firewall-dashboard-simplified/src/main/java/src/java/Main.java
+++ b/src/main/java/src/java/main/Main.java
@@ -1,4 +1,4 @@
-package src.java;
+package src.java.main;
public class Main {
public static void main(String[] args) {
diff --git a/src/main/java/src/java/queues/ReceivingQueue.java b/src/main/java/src/java/queues/ReceivingQueue.java
new file mode 100644
index 0000000..099f62c
--- /dev/null
+++ b/src/main/java/src/java/queues/ReceivingQueue.java
@@ -0,0 +1,20 @@
+/**
+ * @author Aaron Moser
+ * @date 26.12.2023
+ */
+package src.java.queues;
+
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class ReceivingQueue extends LinkedBlockingQueue {
+ private static ReceivingQueue instance;
+
+ private ReceivingQueue() {}
+
+ public static ReceivingQueue getInstance() {
+ if (instance == null) {
+ instance = new ReceivingQueue();
+ }
+ return instance;
+ }
+}
diff --git a/src/main/java/src/java/queues/SendingQueue.java b/src/main/java/src/java/queues/SendingQueue.java
new file mode 100644
index 0000000..f37badf
--- /dev/null
+++ b/src/main/java/src/java/queues/SendingQueue.java
@@ -0,0 +1,20 @@
+/**
+ * @author Aaron Moser
+ * @date 26.12.2023
+ */
+package src.java.queues;
+
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class SendingQueue extends LinkedBlockingQueue {
+ private static SendingQueue instance;
+
+ private SendingQueue() {}
+
+ public static SendingQueue getInstance() {
+ if (instance == null) {
+ instance = new SendingQueue();
+ }
+ return instance;
+ }
+}
diff --git a/src/main/java/src/java/view/constants/GUIConstants.java b/src/main/java/src/java/view/constants/GUIConstants.java
new file mode 100644
index 0000000..f987dcb
--- /dev/null
+++ b/src/main/java/src/java/view/constants/GUIConstants.java
@@ -0,0 +1,63 @@
+/**
+ * @author Aaron Moser
+ * @date 31.10.2023
+ * @lastChange 04.01.2024
+ */
+
+package src.java.view.constants;
+
+public final class GUIConstants {
+ /**
+ * Represents kinds of frames.
+ */
+ public static enum Frame {
+ MainFrame,
+ }
+
+ /**
+ * Represents kinds of panels that can be put in main frame.
+ */
+ public static enum Panel {
+ MonitoringPanel,
+ ControllingPanel,
+ NFTableChainPanel,
+ NFTableRulePanel,
+ ConnectToServerPanel,
+ ConnectionsTablePanel
+ }
+
+ public static enum E_ControllingSubPanel {
+ BasePanel,
+ NFTableFamilyPanel,
+ NFTableTablePanel,
+ NFTableChainPanel,
+ NFTableRulePanel,
+ None
+ }
+
+ public static enum NFTablePanel {
+ NFTableTablesPanel,
+ NFTableChainsPanel,
+ NFTableRulesPanel
+ }
+
+ public static enum Status {
+ Connected,
+ Connecting,
+ Disconnected,
+
+ }
+
+ /**
+ * Represents kinds of themes.
+ */
+ public static enum Theme {
+ Dark,
+ Light
+ }
+
+ public static enum Languages {
+ German,
+ English
+ }
+}
diff --git a/src/main/java/src/java/view/frames/MainFrame.java b/src/main/java/src/java/view/frames/MainFrame.java
new file mode 100644
index 0000000..1c54801
--- /dev/null
+++ b/src/main/java/src/java/view/frames/MainFrame.java
@@ -0,0 +1,24 @@
+/**
+ * @author Aaron Moser
+ * @date 31.10.2023
+ * @lastChange 22.01.2024
+ */
+package src.java.view.frames;
+
+import javax.swing.*;
+
+public final class MainFrame extends JFrame {
+
+ public MainFrame() {
+
+ //this.contentPanel = new JPanel();
+ //this.getContentPane().add(this.contentPanel);
+
+ //this.setJMenuBar(MenuBar.getMenuBar());
+
+ //this.setTitle(this.viewModel.get_MainFrame_ViewModel().getTitle());
+ //this.setPanel(this.viewModel.get_MainFrame_ViewModel().getMainFrameActivePanel());
+ //this.setLocation(this.viewModel.get_MainFrame_ViewModel().getXPosition(), this.viewModel.get_MainFrame_ViewModel().getYPosition());
+ //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ }
+}
diff --git a/src/main/java/src/java/view/menubar/Menu.java b/src/main/java/src/java/view/menubar/Menu.java
new file mode 100644
index 0000000..df03a8b
--- /dev/null
+++ b/src/main/java/src/java/view/menubar/Menu.java
@@ -0,0 +1,65 @@
+/**
+ * @author Aaron Moser
+ * @date 01.11.2023
+ * @lastChange 07.01.2024
+ */
+
+package src.java.view.menubar;
+
+import javax.swing.JMenu;
+
+import src.java.view.constants.GUIConstants.Languages;
+
+import java.awt.event.ActionListener;
+
+/**
+ * Menu at menu bar.
+ */
+public final class Menu extends JMenu {
+ private String[] translations = null;
+
+ /**
+ * @param translations of this menus text.
+ * @param actionListener belonging to this menu. Events that occur by clicking on menu depending on this.
+ */
+ public Menu(final String[] translations, ActionListener actionListener) {
+ this.setTranslations(translations);
+ this.changeLanguage(Languages.German);
+ if (actionListenerValid("constructor of Menu", actionListener)) {
+ this.addActionListener(actionListener);
+ }
+ }
+
+ public void setTranslations(final String[] translations) {
+ if (null != translations) {
+ this.translations = translations;
+ }
+ }
+
+ public void changeLanguage(Languages language) {
+ if (translationsSet("changeLanguage")) {
+ this.setText(translations[language.ordinal()]);
+ for (int index = 0; index < this.getItemCount(); index++) {
+ ((MenuItem)this.getItem(index)).changeLanguage(language);
+ }
+ }
+ }
+
+ private boolean translationsSet(String callingMethod) {
+ boolean translationsSet = true;
+ if (null == translations) {
+ translationsSet = false;
+ System.err.println("Error at " + callingMethod + " of menu item. translations are null");
+ }
+ return translationsSet;
+ }
+
+ private boolean actionListenerValid(String callingMethod, ActionListener actionListener) {
+ boolean actionListenerSet = true;
+ if (null == actionListener) {
+ actionListenerSet = false;
+ System.err.println("Error at " + callingMethod + " of menu item. action listener is null");
+ }
+ return actionListenerSet;
+ }
+}
diff --git a/src/main/java/src/java/view/menubar/MenuBar.java b/src/main/java/src/java/view/menubar/MenuBar.java
new file mode 100644
index 0000000..84cfa22
--- /dev/null
+++ b/src/main/java/src/java/view/menubar/MenuBar.java
@@ -0,0 +1,39 @@
+/**
+ * @author Aaron Moser
+ * @date 01.11.2023
+ * @lastChange 07.01.2024
+ */
+
+package src.java.view.menubar;
+
+import javax.swing.JMenuBar;
+
+import src.java.view.constants.GUIConstants.Languages;
+import src.java.view.menubar.menus.HelpMenuFactory;
+import src.java.view.menubar.menus.LanguageMenuFactory;
+
+public final class MenuBar extends JMenuBar {
+
+ private MenuBarLanguageController languageController = null;
+
+ private MenuBar() {
+ languageController = new MenuBarLanguageController(this);
+
+ this.add(HelpMenuFactory.createHelpMenu());
+ this.add(LanguageMenuFactory.createLanguageMenu(languageController));
+ }
+
+ public static MenuBar getMenuBar() {
+ return new MenuBar();
+ }
+
+ public void changeLanguage(Languages language) {
+ changeLanguageOfMenus(language);
+ }
+
+ private void changeLanguageOfMenus(Languages language) {
+ for (int index = 0; index < this.getMenuCount(); index++) {
+ ((Menu)this.getMenu(index)).changeLanguage(language);
+ }
+ }
+}
diff --git a/src/main/java/src/java/view/menubar/MenuBarLanguageController.java b/src/main/java/src/java/view/menubar/MenuBarLanguageController.java
new file mode 100644
index 0000000..c40ed89
--- /dev/null
+++ b/src/main/java/src/java/view/menubar/MenuBarLanguageController.java
@@ -0,0 +1,22 @@
+/**
+ * @author Aaron Moser
+ * @date 01.11.2023
+ */
+
+package src.java.view.menubar;
+
+public final class MenuBarLanguageController {
+ private MenuBar menuBar = null;
+
+ public MenuBarLanguageController(MenuBar menuBar) {
+ this.menuBar = menuBar;
+ }
+
+ public Menu getMenu(int index) {
+ return (Menu)this.menuBar.getMenu(index);
+ }
+
+ public int getMenuCount() {
+ return this.menuBar.getMenuCount();
+ }
+}
diff --git a/src/main/java/src/java/view/menubar/MenuBarSeparator.java b/src/main/java/src/java/view/menubar/MenuBarSeparator.java
new file mode 100644
index 0000000..0446aeb
--- /dev/null
+++ b/src/main/java/src/java/view/menubar/MenuBarSeparator.java
@@ -0,0 +1,27 @@
+/**
+ * @author Aaron Moser
+ * @date 31.10.2023
+ */
+
+package src.java.view.menubar;
+
+import java.awt.Color;
+import java.awt.Dimension;
+
+import javax.swing.BorderFactory;
+import javax.swing.JMenuItem;
+
+/**
+ * Horizontal line separator for menu bar.
+ */
+public final class MenuBarSeparator extends JMenuItem {
+
+ static final Color color = new Color(47, 47, 47);
+
+ public MenuBarSeparator() {
+ this.setEnabled(false);
+ this.setPreferredSize(new Dimension(0, 1));
+ this.setBackground(color);
+ this.setBorder(BorderFactory.createLineBorder(color, 2));
+ }
+}
diff --git a/src/main/java/src/java/view/menubar/MenuItem.java b/src/main/java/src/java/view/menubar/MenuItem.java
new file mode 100644
index 0000000..271147b
--- /dev/null
+++ b/src/main/java/src/java/view/menubar/MenuItem.java
@@ -0,0 +1,62 @@
+/**
+ * @author Aaron Moser
+ * @date 01.11.2023
+ * @lastChange 07.01.2024
+ */
+
+package src.java.view.menubar;
+
+import java.awt.event.ActionListener;
+
+import javax.swing.JMenuItem;
+
+import src.java.view.constants.GUIConstants.Languages;
+
+/**
+ * Menu item at menu at menu bar.
+ */
+public final class MenuItem extends JMenuItem {
+ private String[] translations = null;
+
+ /**
+ * @param translations of this menu items text.
+ * @param actionListener belonging to this menu item. Events that occur by clicking on menu item depending on this.
+ */
+ public MenuItem(final String[] translations, ActionListener actionListener) {
+ this.setTranslations(translations);
+ this.changeLanguage(Languages.German);
+ if (actionListenerValid("constructor of Menu", actionListener)) {
+ this.addActionListener(actionListener);
+ }
+ }
+
+ public void setTranslations(final String[] translations) {
+ if (null != translations) {
+ this.translations = translations;
+ }
+ }
+
+ public void changeLanguage(Languages language) {
+ if (translationsSet("changeLanguage")) {
+ this.setText(translations[language.ordinal()]);
+ }
+ }
+
+ private boolean translationsSet(String callingMethod) {
+ boolean translationsSet = true;
+ if (null == translations) {
+ translationsSet = false;
+ System.err.println("Error at " + callingMethod + " of menu item. translations of are null");
+ }
+ return translationsSet;
+ }
+
+ private boolean actionListenerValid(String callingMethod, ActionListener actionListener) {
+ boolean actionListenerSet = true;
+ if (null == actionListener) {
+ actionListenerSet = false;
+ System.err.println("Error at " + callingMethod + " of menu item. action listener is null");
+ }
+ return actionListenerSet;
+ }
+}
diff --git a/src/main/java/src/java/view/menubar/menuItems/HelpMenuItemFactory.java b/src/main/java/src/java/view/menubar/menuItems/HelpMenuItemFactory.java
new file mode 100644
index 0000000..22f0302
--- /dev/null
+++ b/src/main/java/src/java/view/menubar/menuItems/HelpMenuItemFactory.java
@@ -0,0 +1,42 @@
+/**
+ * @author Aaron Moser
+ * @date 01.11.2023
+ */
+
+package src.java.view.menubar.menuItems;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import src.java.view.menubar.MenuItem;
+
+public final class HelpMenuItemFactory {
+
+ public static MenuItem createManualMenuItem() {
+ final String[] translations = {"Anleitung", "Manual"};
+ ActionListener actionListener = new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ // TODO Auto-generated method stub
+ }
+ };
+
+ MenuItem manualMenuItem = new MenuItem(translations, actionListener);
+
+ return manualMenuItem;
+ }
+
+ public static MenuItem createAboutMenuItem() {
+ final String[] translations = {"Über", "About"};
+ ActionListener actionListener = new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ // TODO Auto-generated method stub
+ }
+ };
+
+ MenuItem aboutMenuItem = new MenuItem(translations, actionListener);
+
+ return aboutMenuItem;
+ }
+}
diff --git a/src/main/java/src/java/view/menubar/menuItems/LanguageMenuItemFactory.java b/src/main/java/src/java/view/menubar/menuItems/LanguageMenuItemFactory.java
new file mode 100644
index 0000000..3a16c8f
--- /dev/null
+++ b/src/main/java/src/java/view/menubar/menuItems/LanguageMenuItemFactory.java
@@ -0,0 +1,48 @@
+/**
+ * @author Aaron Moser
+ * @date 01.11.2023
+ */
+
+package src.java.view.menubar.menuItems;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import src.java.view.constants.GUIConstants.Languages;
+import src.java.view.menubar.MenuBarLanguageController;
+import src.java.view.menubar.MenuItem;
+
+public final class LanguageMenuItemFactory {
+
+ public static MenuItem createGermanMenuItem(final MenuBarLanguageController languageController) {
+ final String[] translations = {"Deutsch", "German"};
+ ActionListener actionListener = new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ for (int index = 0; index < languageController.getMenuCount(); index++) {
+ languageController.getMenu(index).changeLanguage(Languages.German);
+ }
+ }
+ };
+
+ MenuItem germanMenuItem = new MenuItem(translations, actionListener);
+
+ return germanMenuItem;
+ }
+
+ public static MenuItem createEnglishMenuItem(final MenuBarLanguageController languageController) {
+ final String[] translations = {"Englisch", "English"};
+ ActionListener actionListener = new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ for (int index = 0; index < languageController.getMenuCount(); index++) {
+ languageController.getMenu(index).changeLanguage(Languages.English);
+ }
+ }
+ };
+
+ MenuItem englishMenuItem = new MenuItem(translations, actionListener);
+
+ return englishMenuItem;
+ }
+}
diff --git a/src/main/java/src/java/view/menubar/menus/HelpMenuFactory.java b/src/main/java/src/java/view/menubar/menus/HelpMenuFactory.java
new file mode 100644
index 0000000..c820f61
--- /dev/null
+++ b/src/main/java/src/java/view/menubar/menus/HelpMenuFactory.java
@@ -0,0 +1,30 @@
+/**
+ * @author Aaron Moser
+ * @date 01.11.2023
+ */
+
+package src.java.view.menubar.menus;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import src.java.view.menubar.Menu;
+import src.java.view.menubar.menuItems.HelpMenuItemFactory;
+
+public final class HelpMenuFactory {
+
+
+ public static Menu createHelpMenu() {
+ final String[] translations = {"Hilfe", "Help"};
+ ActionListener actionListener = new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ // TODO Auto-generated method stub
+ }
+ };
+ Menu helpMenu = new Menu(translations, actionListener);
+ helpMenu.add(HelpMenuItemFactory.createManualMenuItem());
+ helpMenu.add(HelpMenuItemFactory.createAboutMenuItem());
+ return helpMenu;
+ }
+}
diff --git a/src/main/java/src/java/view/menubar/menus/LanguageMenuFactory.java b/src/main/java/src/java/view/menubar/menus/LanguageMenuFactory.java
new file mode 100644
index 0000000..40cd3b0
--- /dev/null
+++ b/src/main/java/src/java/view/menubar/menus/LanguageMenuFactory.java
@@ -0,0 +1,30 @@
+/**
+ * @author Aaron Moser
+ * @date 01.11.2023
+ */
+
+package src.java.view.menubar.menus;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import src.java.view.menubar.Menu;
+import src.java.view.menubar.MenuBarLanguageController;
+import src.java.view.menubar.menuItems.LanguageMenuItemFactory;
+
+public final class LanguageMenuFactory {
+
+ public static Menu createLanguageMenu(MenuBarLanguageController languageController) {
+ final String[] translations = {"Sprache", "Language"};
+ ActionListener actionListener = new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+
+ }
+ };
+ Menu languageMenu = new Menu(translations, actionListener);
+ languageMenu.add(LanguageMenuItemFactory.createGermanMenuItem(languageController));
+ languageMenu.add(LanguageMenuItemFactory.createEnglishMenuItem(languageController));
+ return languageMenu;
+ }
+}
diff --git a/src/main/java/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.java b/src/main/java/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.java
new file mode 100644
index 0000000..47b41de
--- /dev/null
+++ b/src/main/java/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.java
@@ -0,0 +1,300 @@
+/**
+ * @author Aaron Moser
+ * @date 02.12.2023
+ * @lastChange 08.01.2024
+ */
+package src.java.view.panels.ConnectToServerPanel;
+
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.*;
+import javax.swing.filechooser.FileSystemView;
+
+/**
+ * The panel to enter data to connect to the server.
+ */
+public final class ConnectToServerPanel extends JPanel {
+
+ private static ConnectToServerPanel instance = null;
+
+ private String serverCertStoreFilePath = "";
+
+ private JLabel mainMessageLabel = null;
+ private JLabel ipAddressLabel = null;
+ private JLabel portLabel = null;
+ private JLabel serverCertStoreLabel = null;
+ private JLabel serverCertStorePasswordLabel = null;
+
+ private JRadioButton[] ipVersionRadioButtons = null;
+
+ private JTextField ipAddressTextField = null;
+ private JTextField portTextField = null;
+ private JTextField trustStorePasswordTextField = null;
+
+ private JButton connectButton = null;
+ private JButton trustStoreFileChooserButton = null;
+
+ private ConnectToServerPanel() {
+ this.createComponents();
+ this.addComponents();
+ }
+
+ public static ConnectToServerPanel getInstance() {
+ if (instance == null) {
+ instance = new ConnectToServerPanel();
+ }
+ return instance;
+ }
+
+ /**
+ * Creates interactable components.
+ */
+ private void createComponents() {
+ this.createMainMessageLabel();
+
+ this.createIPVersionRadioButtons();
+ this.createIPAddressLabel();
+ this.createIPAddressTextField();
+
+ this.createPortLabel();
+ this.createPortTextField();
+
+ this.createServerCertStoreLabel();
+ this.createServerCertStoreFileChooserButton();
+ this.createTrustStorePasswordLabel();
+ this.createTrustStorePasswordTextField();
+
+ this.createConnectButton();
+ }
+
+ private void addComponents() {
+ this.setLayout(new GridBagLayout());
+
+ this.addMainMessageLabel();
+
+ this.addIPVersionRadioButtons();
+ this.addIPAddressLabel();
+ this.addIPAddressTextField();
+
+ this.addPortLabel();
+ this.addPortTextField();
+
+ this.addServerCertStoreLabel();
+ this.addServerCertStoreFileChooserButton();
+ this.addTrustStorePasswordLabel();
+ this.addTrustStorePasswordTextField();
+
+ this.addConnectButton();
+ }
+
+ private void createMainMessageLabel() {
+ this.mainMessageLabel = new JLabel();
+ }
+
+ private void addMainMessageLabel() {
+ GridBagConstraints gridBagConstraints = new GridBagConstraints();
+ gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.weightx = 1;
+ gridBagConstraints.weighty = 1;
+ gridBagConstraints.insets = new Insets(0, 0, 10, 0);
+ this.add(this.mainMessageLabel, gridBagConstraints);
+ }
+
+ private void createIPVersionRadioButtons() {
+ ButtonGroup ipVersionRadioButtonsGroup = new ButtonGroup();
+
+ this.ipVersionRadioButtons = new JRadioButton[2];
+
+ this.ipVersionRadioButtons[0] = new JRadioButton();
+ this.ipVersionRadioButtons[1] = new JRadioButton();
+
+ ipVersionRadioButtonsGroup.add(this.ipVersionRadioButtons[0]);
+ ipVersionRadioButtonsGroup.add(this.ipVersionRadioButtons[1]);
+
+ this.ipVersionRadioButtons[0].setSelected(true);
+ }
+
+ private void addIPVersionRadioButtons() {
+ GridBagConstraints gridBagConstraints = new GridBagConstraints();
+ gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.weightx = 1;
+ gridBagConstraints.weighty = 1;
+ gridBagConstraints.insets = new Insets(0, 0, 0, 0);
+ this.add(this.ipVersionRadioButtons[0], gridBagConstraints);
+ gridBagConstraints.gridy = 2;
+ this.add(this.ipVersionRadioButtons[1], gridBagConstraints);
+ }
+
+ private void createIPAddressLabel() {
+ this.ipAddressLabel = new JLabel();
+ }
+
+ private void addIPAddressLabel() {
+ GridBagConstraints gridBagConstraints = new GridBagConstraints();
+ gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 3;
+ gridBagConstraints.weightx = 1;
+ gridBagConstraints.weighty = 1;
+ gridBagConstraints.insets = new Insets(10, 0, 0, 0);
+ this.add(this.ipAddressLabel, gridBagConstraints);
+ }
+
+ private void createIPAddressTextField() {
+ this.ipAddressTextField = new JTextField(24);
+ }
+
+ private void addIPAddressTextField() {
+ GridBagConstraints gridBagConstraints = new GridBagConstraints();
+ gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 4;
+ gridBagConstraints.weightx = 1;
+ gridBagConstraints.weighty = 1;
+ gridBagConstraints.insets = new Insets(0, 0, 0, 0);
+ this.add(this.ipAddressTextField, gridBagConstraints);
+ }
+
+ private void createPortLabel() {
+ this.portLabel = new JLabel();
+ }
+
+ private void addPortLabel() {
+ GridBagConstraints gridBagConstraints = new GridBagConstraints();
+ gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 5;
+ gridBagConstraints.weightx = 1;
+ gridBagConstraints.weighty = 1;
+ gridBagConstraints.insets = new Insets(0, 0, 0, 0);
+ this.add(this.portLabel, gridBagConstraints);
+ }
+
+ private void createPortTextField() {
+ this.portTextField = new JTextField(24);
+ }
+
+ private void addPortTextField() {
+ GridBagConstraints gridBagConstraints = new GridBagConstraints();
+ gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 6;
+ gridBagConstraints.weightx = 1;
+ gridBagConstraints.weighty = 1;
+ gridBagConstraints.insets = new Insets(0, 0, 0, 0);
+ this.add(this.portTextField, gridBagConstraints);
+ }
+
+ private void createServerCertStoreLabel() {
+ this.serverCertStoreLabel = new JLabel();
+ }
+
+ private void addServerCertStoreLabel() {
+ GridBagConstraints gridBagConstraints = new GridBagConstraints();
+ gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 7;
+ gridBagConstraints.weightx = 1;
+ gridBagConstraints.weighty = 1;
+ gridBagConstraints.insets = new Insets(10, 0, 0, 0);
+ this.add(this.serverCertStoreLabel, gridBagConstraints);
+ }
+
+ private void createServerCertStoreFileChooserButton() {
+
+ this.trustStoreFileChooserButton = new JButton();
+
+ this.trustStoreFileChooserButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+
+ JFileChooser fileChooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
+
+ int fileChooserOption = fileChooser.showSaveDialog(null);
+
+ // if the user selects a file
+ if (fileChooserOption == JFileChooser.APPROVE_OPTION) {
+ serverCertStoreFilePath = fileChooser.getSelectedFile().getAbsolutePath();
+ }
+ }
+ });
+ }
+
+ private void addServerCertStoreFileChooserButton() {
+ GridBagConstraints gridBagConstraints = new GridBagConstraints();
+ gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 8;
+ gridBagConstraints.weightx = 1;
+ gridBagConstraints.weighty = 1;
+ gridBagConstraints.insets = new Insets(10, 0, 0, 0);
+ this.add(this.trustStoreFileChooserButton, gridBagConstraints);
+ }
+
+ private void createTrustStorePasswordLabel() {
+ this.serverCertStorePasswordLabel = new JLabel();
+ }
+
+ private void addTrustStorePasswordLabel() {
+ GridBagConstraints gridBagConstraints = new GridBagConstraints();
+ gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 9;
+ gridBagConstraints.weightx = 1;
+ gridBagConstraints.weighty = 1;
+ gridBagConstraints.insets = new Insets(10, 0, 0, 0);
+ this.add(this.serverCertStorePasswordLabel, gridBagConstraints);
+ }
+
+ private void createTrustStorePasswordTextField() {
+ this.trustStorePasswordTextField = new JPasswordField(24);
+ }
+
+ private void addTrustStorePasswordTextField() {
+ GridBagConstraints gridBagConstraints = new GridBagConstraints();
+ gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 10;
+ gridBagConstraints.weightx = 1;
+ gridBagConstraints.weighty = 1;
+ gridBagConstraints.insets = new Insets(0, 0, 0, 0);
+ this.add(this.trustStorePasswordTextField, gridBagConstraints);
+ }
+
+ private void createConnectButton() {
+
+ this.connectButton = new JButton();
+
+ this.connectButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+
+ // I_ViewEvent data = new AA_ConnectToServerButtonGotPressed(
+ // new AA_ConnectToServerData(
+ // ipAddressTextField.getText(),
+ // Integer.valueOf(portTextField.getText()),
+ // serverCertStoreFilePath,
+ // trustStorePasswordTextField.getText()));
+ // // Pass the data to the event manager
+ // view_To_ViewEventManager_Queue.add(data);
+ }
+ });
+ }
+
+ private void addConnectButton() {
+ GridBagConstraints gridBagConstraints = new GridBagConstraints();
+ gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 11;
+ gridBagConstraints.weightx = 1;
+ gridBagConstraints.weighty = 1;
+ gridBagConstraints.insets = new Insets(10, 0, 0, 0);
+ this.add(this.connectButton, gridBagConstraints);
+ }
+}
diff --git a/src/main/java/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.java b/src/main/java/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.java
new file mode 100644
index 0000000..287b251
--- /dev/null
+++ b/src/main/java/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.java
@@ -0,0 +1,65 @@
+/**
+ * @author Aaron Moser
+ * @date
+ * @lastChange 07.01.2024
+ */
+package src.java.view.panels.ConnectionsTablePanel;
+
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+
+import javax.swing.BoxLayout;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+public class ConnectionsTablePanel extends JPanel {
+
+ private static ConnectionsTablePanel instance = null;
+
+ private JPanel connectionsPanel;
+ private JScrollPane scrollPane;
+
+ private ConnectionsTablePanel() {
+ buildPanel();
+ }
+
+ private void buildPanel() {
+ this.connectionsPanel = new JPanel();
+ this.connectionsPanel.setLayout(new BoxLayout(connectionsPanel, BoxLayout.Y_AXIS));
+
+ //for (ConnectionInformation connection : viewModel.get_ConnectionsPanel_ViewModel().getConnections()) {
+ // System.out.println(connection);
+ // JLabel connectionLabel = new JLabel(
+ // connection.toString());
+ // this.connectionsPanel.add(connectionLabel);
+ //}
+
+ JLabel label = new JLabel("Verbindungen");
+
+ // Fills the whole rest panel (this) with scroll pane.
+ this.scrollPane = new JScrollPane(connectionsPanel);
+ this.scrollPane.setPreferredSize(new Dimension(300,200));
+
+ this.setLayout(new GridBagLayout());
+ GridBagConstraints labelConstraints = new GridBagConstraints();
+ labelConstraints.anchor = GridBagConstraints.NORTHWEST;
+ labelConstraints.gridx = 0;
+ labelConstraints.gridy = 0;
+ this.add(label, labelConstraints);
+
+ GridBagConstraints scrollPaneConstraints = new GridBagConstraints();
+ scrollPaneConstraints.anchor = GridBagConstraints.NORTHWEST;
+ scrollPaneConstraints.gridx = 0;
+ scrollPaneConstraints.gridy = 1;
+ this.add(scrollPane, scrollPaneConstraints);
+ }
+
+ public static ConnectionsTablePanel getInstance() {
+ if (instance == null) {
+ instance = new ConnectionsTablePanel();
+ }
+ return instance;
+ }
+}
diff --git a/src/main/java/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.java b/src/main/java/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.java
new file mode 100644
index 0000000..3b6effa
--- /dev/null
+++ b/src/main/java/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.java
@@ -0,0 +1,39 @@
+package src.java.view.panels.ControllingPanel.BasePanel;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+import javax.swing.JPanel;
+
+public class ControllingBasePanel extends JPanel {
+
+ private static ControllingBasePanel instance = null;
+
+ private final JButton nftConfigButton;
+
+ private ControllingBasePanel() {
+ nftConfigButton = new JButton("NFT Config");
+ nftConfigButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ // TODO
+ }
+ });
+
+ this.setLayout(new GridBagLayout());
+
+ GridBagConstraints nftConfButtonConstraints = new GridBagConstraints();
+
+ this.add(nftConfigButton, nftConfButtonConstraints);
+ }
+
+ public static ControllingBasePanel getInstance() {
+ if (instance == null) {
+ instance = new ControllingBasePanel();
+ }
+ return instance;
+ }
+}
diff --git a/src/main/java/src/java/view/panels/ControllingPanel/ControllingPanel.java b/src/main/java/src/java/view/panels/ControllingPanel/ControllingPanel.java
new file mode 100644
index 0000000..7a512ec
--- /dev/null
+++ b/src/main/java/src/java/view/panels/ControllingPanel/ControllingPanel.java
@@ -0,0 +1,120 @@
+/**
+ * @author Aaron Moser
+ * @date 31.10.2023
+ */
+
+package src.java.view.panels.ControllingPanel;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+
+import javax.swing.JPanel;
+
+public final class ControllingPanel extends JPanel {
+
+ private static ControllingPanel instance = null;
+
+ // private E_ControllingSubPanel activePanelType = E_ControllingSubPanel.None;
+ // private Deque previousPanelStack = new ArrayDeque();
+ // private Deque nextPanelStack = new ArrayDeque();
+
+ private ControllingPanel() {
+ // this.setPanel(E_ControllingSubPanel.BasePanel);
+ }
+
+ public static ControllingPanel getInstance() {
+ if (instance == null) {
+ instance = new ControllingPanel();
+ }
+ return instance;
+ }
+
+ // public void setPanel(E_ControllingSubPanel panelType) {
+ // this.removeAll();
+
+ // switch (panelType) {
+ // case E_ControllingSubPanel.BasePanel: {
+ // if (activePanelType != E_ControllingSubPanel.BasePanel) {
+ // previousPanelStack.push(activePanelType);
+ // this.activePanelType = E_ControllingSubPanel.BasePanel;
+ // this.add(ControllingBasePanel.getInstance(this));
+ // }
+ // }break;
+ // case E_ControllingSubPanel.NFTableFamilyPanel: {
+ // if (activePanelType != E_ControllingSubPanel.NFTableFamilyPanel) {
+ // previousPanelStack.push(activePanelType);
+ // this.activePanelType = E_ControllingSubPanel.NFTableFamilyPanel;
+ // this.add(NFTFamilyPanel.getInstance());
+ // }
+ // }break;
+ // case E_ControllingSubPanel.NFTableTablePanel: {
+ // if (activePanelType != E_ControllingSubPanel.NFTableTablePanel) {
+ // previousPanelStack.push(activePanelType);
+ // this.activePanelType = E_ControllingSubPanel.NFTableTablePanel;
+ // this.add(NFTablesTablePanel.getInstance());
+ // }
+ // }break;
+ // case E_ControllingSubPanel.NFTableChainPanel: {
+ // if (activePanelType != E_ControllingSubPanel.NFTableChainPanel) {
+ // previousPanelStack.push(activePanelType);
+ // this.activePanelType = E_ControllingSubPanel.NFTableChainPanel;
+ // this.add(NFTablesChainPanel.getInstance());
+ // }
+ // }break;
+ // case E_ControllingSubPanel.NFTableRulePanel: {
+ // if (activePanelType != E_ControllingSubPanel.NFTableRulePanel) {
+ // previousPanelStack.push(activePanelType);
+ // this.activePanelType = E_ControllingSubPanel.NFTableRulePanel;
+ // this.add(NFTablesRulePanel.getInstance());
+ // }
+ // }break;
+ // default: {
+
+ // }break;
+ // }
+ // MainFrame.getInstance(null,null).setVisible(true);
+ // }
+
+ // public void switchToPreviousPanel() {
+ // if (!previousPanelStack.isEmpty()) {
+ // nextPanelStack.push(activePanelType);
+ // setPanel(previousPanelStack.pop());
+ // }
+ // }
+
+ // public void switchToNextPanel() {
+ // if(!nextPanelStack.isEmpty()) {
+ // previousPanelStack.push(activePanelType);
+ // setPanel(nextPanelStack.pop());
+ // }
+ // }
+
+ /*public void setNFTInformation(NFTablesConfigurationReceived nftConfig) {
+ LinkedList>> nftInformation = nftConfig.getNFTableInformation().getTables();
+
+ LinkedList tables = new LinkedList();
+
+ HashMap chains = new HashMap();
+
+ HashMap rules = new HashMap();
+
+ for (int tableIndex = 0; tableIndex < nftInformation.size(); tableIndex++) {
+ for (int chainIndex = 0; chainIndex < nftInformation.get(tableIndex).size(); chainIndex++) {
+ for (int ruleIndex = 0; ruleIndex < nftInformation.get(tableIndex).get(chainIndex).size(); ruleIndex++) {
+ switch (ruleIndex) {
+ case 0: {
+ tables.add(nftInformation.get(tableIndex).get(chainIndex).get(0));
+ }break;
+ case 1: {
+ chains.put(nftInformation.get(tableIndex).get(chainIndex).get(0), nftInformation.get(tableIndex).get(chainIndex).get(1));
+ }break;
+ default: {
+
+ }break;
+ }
+ }
+ }
+ }
+ NFTablesTablePanel.getInstance().setTables(tables);
+ } */
+}
diff --git a/src/main/java/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.java b/src/main/java/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.java
new file mode 100644
index 0000000..76c9be8
--- /dev/null
+++ b/src/main/java/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.java
@@ -0,0 +1,9 @@
+package src.java.view.panels.ControllingPanel;
+
+import src.java.view.constants.GUIConstants.E_ControllingSubPanel;
+
+public interface I_ControllingPanel_SwitchPanel {
+ public void switchToPreviousPanel();
+ public void switchToNextPanel();
+ public void setPanel(E_ControllingSubPanel controllingSubPanel);
+}
diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.java
new file mode 100644
index 0000000..03581ec
--- /dev/null
+++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.java
@@ -0,0 +1,35 @@
+/**
+ * @author Aaron Moser
+ * @date 04.01.2024
+ * @lastChange 04.01.2024
+ */
+package src.java.view.panels.ControllingPanel.NFTable.NFTFamilyPanel;
+
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+
+public class IPv4FamilyButton extends JButton implements ActionListener {
+ private static IPv4FamilyButton instance = null;
+
+ private IPv4FamilyButton() {
+ this.setText("IPv4");
+ this.addActionListener(this);
+ this.setPreferredSize(new Dimension(100,100));
+ }
+
+ public static IPv4FamilyButton getInstance() {
+ if (instance == null) {
+ instance = new IPv4FamilyButton();
+ }
+ return instance;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException("Unimplemented method 'actionPerformed'");
+ }
+}
diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv6FamilyButton.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv6FamilyButton.java
new file mode 100644
index 0000000..335fc5f
--- /dev/null
+++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv6FamilyButton.java
@@ -0,0 +1,35 @@
+/**
+ * @author Aaron Moser
+ * @date 04.01.2024
+ * @lastChange 04.01.2024
+ */
+package src.java.view.panels.ControllingPanel.NFTable.NFTFamilyPanel;
+
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+
+public class IPv6FamilyButton extends JButton implements ActionListener {
+ private static IPv6FamilyButton instance = null;
+
+ private IPv6FamilyButton() {
+ this.setText("IPv6");
+ this.addActionListener(this);
+ this.setPreferredSize(new Dimension(100,100));
+ }
+
+ public static IPv6FamilyButton getInstance() {
+ if (instance == null) {
+ instance = new IPv6FamilyButton();
+ }
+ return instance;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException("Unimplemented method 'actionPerformed'");
+ }
+}
diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.java
new file mode 100644
index 0000000..59b1fe5
--- /dev/null
+++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.java
@@ -0,0 +1,35 @@
+/**
+ * @author Aaron Moser
+ * @date 04.01.2024
+ * @lastChange 04.01.2024
+ */
+package src.java.view.panels.ControllingPanel.NFTable.NFTFamilyPanel;
+
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+
+public class InetFamilyButton extends JButton implements ActionListener {
+ private static InetFamilyButton instance = null;
+
+ private InetFamilyButton() {
+ this.setText("Inet");
+ this.addActionListener(this);
+ this.setPreferredSize(new Dimension(100,100));
+ }
+
+ public static InetFamilyButton getInstance() {
+ if (instance == null) {
+ instance = new InetFamilyButton();
+ }
+ return instance;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ // TODO Auto-generated method stub
+ throw new UnsupportedOperationException("Unimplemented method 'actionPerformed'");
+ }
+}
diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.java
new file mode 100644
index 0000000..736c7f6
--- /dev/null
+++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.java
@@ -0,0 +1,71 @@
+/**
+ * @author Aaron Moser
+ * @date 31.12.2023
+ * @lastChange 04.01.2024
+ */
+package src.java.view.panels.ControllingPanel.NFTable.NFTFamilyPanel;
+
+import javax.swing.*;
+
+import java.awt.*;
+
+public final class NFTFamilyPanel extends JPanel {
+ private static NFTFamilyPanel instance = null;
+
+ private final JLabel instruction;
+
+ private final JButton inetFamilyButton;
+ private final JButton ipv4FamilyButton;
+ private final JButton ipv6FamilyButton;
+
+ private NFTFamilyPanel() {
+ instruction = new JLabel("Waehlen Sie die Familie aus, deren Tabellen / Ketten / Regeln Sie anschauen / veraendern moechten.");
+
+ this.setLayout(new GridBagLayout());
+
+ this.addInstructions();
+
+ inetFamilyButton = InetFamilyButton.getInstance();
+ ipv4FamilyButton = IPv4FamilyButton.getInstance();
+ ipv6FamilyButton = IPv6FamilyButton.getInstance();
+
+ this.addFamilyButtons();
+ }
+
+ private void addInstructions() {
+ GridBagConstraints instructionConstraints = new GridBagConstraints();
+ instructionConstraints.gridx = 0;
+ instructionConstraints.gridy = 0;
+ instructionConstraints.anchor = GridBagConstraints.NORTHWEST;
+ instructionConstraints.fill = GridBagConstraints.HORIZONTAL;
+ instructionConstraints.weightx = 1;
+ instructionConstraints.insets = new Insets(0,0,0,0);
+ this.add(instruction, instructionConstraints);
+ }
+
+ private void addFamilyButtons() {
+ GridBagConstraints buttonPanelConstraints = new GridBagConstraints();
+ buttonPanelConstraints.gridx = 0;
+ buttonPanelConstraints.gridy = 1;
+ buttonPanelConstraints.anchor = GridBagConstraints.NORTHWEST;
+ buttonPanelConstraints.fill = GridBagConstraints.HORIZONTAL;
+ buttonPanelConstraints.weightx = 1;
+ buttonPanelConstraints.insets = new Insets(0,0,0,0);
+
+ JPanel familyButtonPanel = new JPanel();
+ familyButtonPanel.setLayout(new FlowLayout());
+
+ familyButtonPanel.add(inetFamilyButton);
+ familyButtonPanel.add(ipv4FamilyButton);
+ familyButtonPanel.add(ipv6FamilyButton);
+
+ this.add(familyButtonPanel, buttonPanelConstraints);
+ }
+
+ public static NFTFamilyPanel getInstance() {
+ if (instance == null) {
+ instance = new NFTFamilyPanel();
+ }
+ return instance;
+ }
+}
diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesChainPanel/NFTablesChainPanel.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesChainPanel/NFTablesChainPanel.java
new file mode 100644
index 0000000..b35587c
--- /dev/null
+++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesChainPanel/NFTablesChainPanel.java
@@ -0,0 +1,26 @@
+/**
+ * @author Aaron Moser
+ * @date 30.12.2023
+ * @lastChange 04.01.2024
+ */
+package src.java.view.panels.ControllingPanel.NFTable.NFTablesChainPanel;
+
+import javax.swing.BoxLayout;
+import javax.swing.JPanel;
+
+public final class NFTablesChainPanel extends JPanel {
+ private static NFTablesChainPanel instance = null;
+
+ private NFTablesChainPanel() {
+ this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+
+
+ }
+
+ public static NFTablesChainPanel getInstance() {
+ if (instance == null) {
+ instance = new NFTablesChainPanel();
+ }
+ return instance;
+ }
+}
diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.java
new file mode 100644
index 0000000..756069b
--- /dev/null
+++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.java
@@ -0,0 +1,26 @@
+/**
+ * @author Aaron Moser
+ * @date 04.01.2024
+ * @lastChange 04.01.2024
+ */
+package src.java.view.panels.ControllingPanel.NFTable.NFTablesRulePanel;
+
+import javax.swing.BoxLayout;
+import javax.swing.JPanel;
+
+public final class NFTablesRulePanel extends JPanel {
+ private static NFTablesRulePanel instance = null;
+
+ private NFTablesRulePanel() {
+ this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+
+
+ }
+
+ public static NFTablesRulePanel getInstance() {
+ if (instance == null) {
+ instance = new NFTablesRulePanel();
+ }
+ return instance;
+ }
+}
diff --git a/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.java b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.java
new file mode 100644
index 0000000..cdf7abb
--- /dev/null
+++ b/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.java
@@ -0,0 +1,50 @@
+/**
+ * @author Aaron Moser
+ * @date 30.12.2023
+ * @lastChange 30.12.2023
+ */
+package src.java.view.panels.ControllingPanel.NFTable.NFTablesTablePanel;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.util.List;
+
+import javax.swing.BoxLayout;
+import javax.swing.JPanel;
+
+public final class NFTablesTablePanel extends JPanel {
+ private static NFTablesTablePanel instance = null;
+
+ private JPanel tableListPanel = null;
+
+ private NFTablesTablePanel() {
+ setTables(null);
+ this.setLayout(new GridBagLayout());
+
+ GridBagConstraints tablesPanelConstraints = new GridBagConstraints();
+
+ this.add(tableListPanel, tablesPanelConstraints);
+ }
+
+ public static NFTablesTablePanel getInstance() {
+ if (instance == null) {
+ instance = new NFTablesTablePanel();
+ }
+ return instance;
+ }
+
+ public void setTables(List tables) {
+ tableListPanel = new JPanel();
+ tableListPanel.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+
+ if (tables != null) {
+
+ for (String table : tables) {
+ //tableListPanel.add();
+ }
+ } else {
+ //tableListPanel.add();
+ }
+
+ }
+}
diff --git a/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/Alarm.java b/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/Alarm.java
new file mode 100644
index 0000000..48c7778
--- /dev/null
+++ b/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/Alarm.java
@@ -0,0 +1,21 @@
+package src.java.view.panels.MonitoringPanel.AlarmPanel;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JButton;
+import javax.swing.JPanel;
+
+public class Alarm extends JPanel {
+ private JButton button;
+
+ public Alarm(String message) {
+ this.button = new JButton(message);
+
+ this.setLayout(new BorderLayout());
+ this.add(button);
+ }
+
+ public JButton getButton() {
+ return button;
+ }
+}
diff --git a/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/AlarmPanel.java b/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/AlarmPanel.java
new file mode 100644
index 0000000..abba4c1
--- /dev/null
+++ b/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/AlarmPanel.java
@@ -0,0 +1,56 @@
+package src.java.view.panels.MonitoringPanel.AlarmPanel;
+
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+
+import java.util.LinkedList;
+
+import javax.swing.BoxLayout;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+public class AlarmPanel extends JPanel {
+ private static AlarmPanel instance;
+
+ private JPanel alarmsPanel;
+ private LinkedList alarms;
+ private JScrollPane scrollPane;
+
+ private AlarmPanel() {
+ this.alarmsPanel = new JPanel();
+ this.alarmsPanel.setLayout(new BoxLayout(alarmsPanel, BoxLayout.Y_AXIS));
+
+ for (int i = 0; i < 41; i++) {
+ Alarm alarm = new Alarm("Test " + i);
+ this.alarmsPanel.add(alarm);
+ }
+
+ JLabel label = new JLabel("Alarme");
+
+ // Fills the whole rest panel (this) with scroll pane.
+ this.scrollPane = new JScrollPane(alarmsPanel);
+ this.scrollPane.setPreferredSize(new Dimension(300,200));
+
+ this.setLayout(new GridBagLayout());
+ GridBagConstraints labelConstraints = new GridBagConstraints();
+ labelConstraints.anchor = GridBagConstraints.NORTHWEST;
+ labelConstraints.gridx = 0;
+ labelConstraints.gridy = 0;
+ this.add(label, labelConstraints);
+
+ GridBagConstraints scrollPaneConstraints = new GridBagConstraints();
+ scrollPaneConstraints.anchor = GridBagConstraints.NORTHWEST;
+ scrollPaneConstraints.gridx = 0;
+ scrollPaneConstraints.gridy = 1;
+ this.add(scrollPane, scrollPaneConstraints);
+ }
+
+ public static AlarmPanel getInstance() {
+ if (null == instance) {
+ instance = new AlarmPanel();
+ }
+ return instance;
+ }
+}
diff --git a/src/main/java/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.java b/src/main/java/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.java
new file mode 100644
index 0000000..8db684b
--- /dev/null
+++ b/src/main/java/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.java
@@ -0,0 +1,106 @@
+package src.java.view.panels.MonitoringPanel.ConnectionsLineChart;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+
+import java.awt.event.MouseAdapter;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+
+import org.jfree.chart.ChartFactory;
+import org.jfree.chart.ChartPanel;
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.block.BlockBorder;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.chart.plot.XYPlot;
+import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
+import org.jfree.chart.title.TextTitle;
+
+import org.jfree.data.xy.XYDataset;
+import org.jfree.data.xy.XYSeries;
+import org.jfree.data.xy.XYSeriesCollection;
+
+import org.w3c.dom.events.MouseEvent;
+
+public class ConnectionsLineChartPanel extends JPanel {
+ private static ConnectionsLineChartPanel instance;
+
+ private ConnectionsLineChartPanel() {
+ XYDataset dataset = createDataset();
+ JFreeChart chart = createChart(dataset);
+
+ ChartPanel chartPanel = new ChartPanel(chart);
+ chartPanel.setBackground(Color.white);
+ chartPanel.setPreferredSize(new Dimension(400,200));
+ add(chartPanel);
+
+ addMouseListener(new MouseAdapter() {
+ public void mouseClicked(MouseEvent e) {
+ // MainFrame.getInstance().setPanel(null);
+ }
+ });
+ }
+
+ public static ConnectionsLineChartPanel getInstance() {
+ if (null == instance) {
+ instance = new ConnectionsLineChartPanel();
+ }
+ return instance;
+ }
+
+ private XYDataset createDataset() {
+
+ var series = new XYSeries("TCP");
+ series.add(1, 2);
+ series.add(2, 4);
+ series.add(3, 2);
+ series.add(4, 5);
+ series.add(5, 7);
+
+ var dataset = new XYSeriesCollection();
+ dataset.addSeries(series);
+
+ return dataset;
+ }
+
+ private JFreeChart createChart(XYDataset dataset) {
+
+ JFreeChart chart = ChartFactory.createXYLineChart(
+ "Zugriffe in Abh. zur Zeit",
+ "Zeit",
+ "Zugriffe",
+ dataset,
+ PlotOrientation.VERTICAL,
+ true,
+ true,
+ false
+ );
+
+ XYPlot plot = chart.getXYPlot();
+
+ var renderer = new XYLineAndShapeRenderer();
+ renderer.setSeriesPaint(0, Color.RED);
+ renderer.setSeriesStroke(0, new BasicStroke(2.0f));
+
+ plot.setRenderer(renderer);
+ plot.setBackgroundPaint(Color.white);
+
+ plot.setRangeGridlinesVisible(true);
+ plot.setRangeGridlinePaint(Color.BLACK);
+
+ plot.setDomainGridlinesVisible(true);
+ plot.setDomainGridlinePaint(Color.BLACK);
+
+ chart.getLegend().setFrame(BlockBorder.NONE);
+
+ chart.setTitle(new TextTitle("Zugriffe",
+ new Font("Serif", java.awt.Font.BOLD, 18)
+ )
+ );
+
+ return chart;
+ }
+}
diff --git a/src/main/java/src/java/view/panels/MonitoringPanel/MonitoringPanel.java b/src/main/java/src/java/view/panels/MonitoringPanel/MonitoringPanel.java
new file mode 100644
index 0000000..51e81ea
--- /dev/null
+++ b/src/main/java/src/java/view/panels/MonitoringPanel/MonitoringPanel.java
@@ -0,0 +1,52 @@
+/**
+ * @author Aaron Moser
+ * @date 31.10.2023
+ */
+
+package src.java.view.panels.MonitoringPanel;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+
+import javax.swing.JPanel;
+
+import src.java.view.panels.ConnectionsTablePanel.ConnectionsTablePanel;
+import src.java.view.panels.MonitoringPanel.AlarmPanel.AlarmPanel;
+import src.java.view.panels.MonitoringPanel.ConnectionsLineChart.ConnectionsLineChartPanel;
+import src.java.view.panels.MonitoringPanel.SystemInformationPanel.SystemInformationPanel;
+
+public final class MonitoringPanel extends JPanel {
+
+ private static MonitoringPanel instance = null;
+
+ private MonitoringPanel() {
+ this.setLayout(new GridBagLayout());
+
+ GridBagConstraints alarmConstraints = new GridBagConstraints();
+ alarmConstraints.gridx = 0;
+ alarmConstraints.gridy = 0;
+ this.add(AlarmPanel.getInstance(), alarmConstraints);
+
+ GridBagConstraints connectionsLineCartConstraints = new GridBagConstraints();
+ connectionsLineCartConstraints.gridx = 1;
+ connectionsLineCartConstraints.gridy = 0;
+ this.add(ConnectionsLineChartPanel.getInstance(), connectionsLineCartConstraints);
+
+ GridBagConstraints systemInformationConstraints = new GridBagConstraints();
+ systemInformationConstraints.gridx = 0;
+ systemInformationConstraints.gridy = 1;
+ this.add(SystemInformationPanel.getInstance(), systemInformationConstraints);
+
+ GridBagConstraints connectionsPanelConstraints = new GridBagConstraints();
+ connectionsPanelConstraints.gridx = 1;
+ connectionsPanelConstraints.gridy = 1;
+ this.add(ConnectionsTablePanel.getInstance(), connectionsPanelConstraints);
+ }
+
+ public static MonitoringPanel getInstance() {
+ if (instance == null) {
+ instance = new MonitoringPanel();
+ }
+ return instance;
+ }
+}
diff --git a/src/main/java/src/java/view/panels/MonitoringPanel/SystemInformationPanel/SystemInformationPanel.java b/src/main/java/src/java/view/panels/MonitoringPanel/SystemInformationPanel/SystemInformationPanel.java
new file mode 100644
index 0000000..76d215b
--- /dev/null
+++ b/src/main/java/src/java/view/panels/MonitoringPanel/SystemInformationPanel/SystemInformationPanel.java
@@ -0,0 +1,32 @@
+package src.java.view.panels.MonitoringPanel.SystemInformationPanel;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+public class SystemInformationPanel extends JPanel {
+ private static SystemInformationPanel instance;
+
+ private SystemInformationPanel() {
+ this.setBackground(Color.red);
+ this.setPreferredSize(new Dimension(300,200));
+
+ this.setLayout(new GridBagLayout());
+ GridBagConstraints labelConstraints = new GridBagConstraints();
+ labelConstraints.anchor = GridBagConstraints.NORTHWEST;
+ labelConstraints.gridx = 0;
+ labelConstraints.gridy = 0;
+ this.add(new JLabel("System Information"), labelConstraints);
+ }
+
+ public static SystemInformationPanel getInstance() {
+ if (null == instance) {
+ instance = new SystemInformationPanel();
+ }
+ return instance;
+ }
+}
diff --git a/src/main/java/src/java/view/panels/StatusPanel/StatusPanel.java b/src/main/java/src/java/view/panels/StatusPanel/StatusPanel.java
new file mode 100644
index 0000000..932279c
--- /dev/null
+++ b/src/main/java/src/java/view/panels/StatusPanel/StatusPanel.java
@@ -0,0 +1,113 @@
+/**
+ * @author Aaron Moser
+ * @date 09.12.2023
+ * @lastChange 30.12.2023
+ */
+package src.java.view.panels.StatusPanel;
+
+import javax.swing.*;
+
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+public class StatusPanel extends JPanel {
+
+ // private static StatusPanel instance = null;
+
+ // private final JPanel flowPanelWest;
+ // private final JPanel flowPanelEast;
+
+ // private final JLabel statusLabel;
+ // private final JButton monitoringButton;
+ // private final JButton controllingButton;
+
+ // private final JButton nextControllingButton;
+ // private final JButton previousControllingButton;
+
+ //private StatusPanel() {
+
+ // this.statusLabel = new JLabel(viewModel.get_StatusPanel_ViewModel().get_StatusLabel_Text() + ": " + viewModel.get_StatusPanel_ViewModel().get_ConnectionStatusLabel_Text());
+
+ // this.monitoringButton = new JButton();
+ // this.monitoringButton.addActionListener(new ActionListener() {
+ // @Override
+ // public void actionPerformed(ActionEvent e) {
+ // view_To_ViewEventManager_Queue.add(new AB_GoToMonitoringPanelButtonGotPressed());
+
+ // //monitoringButton.setEnabled(false);
+ // //controllingButton.setEnabled(true);
+ // //mainFrame.setPanel(E_MainFrameActivePanel.MonitoringPanel);
+ // }
+ // });
+
+ // this.controllingButton = new JButton();
+ // this.controllingButton.addActionListener(new ActionListener() {
+ // @Override
+ // public void actionPerformed(ActionEvent e) {
+ // view_To_ViewEventManager_Queue.add(new AB_GoToControllingPanelButtonGotPressed());
+ // //controllingButton.setEnabled(false);
+ // //monitoringButton.setEnabled(true);
+ // //mainFrame.setPanel(E_MainFrameActivePanel.ControllingPanel);
+ // }
+ // });
+
+ // this.nextControllingButton = new JButton();
+ // this.nextControllingButton.addActionListener(new ActionListener() {
+ // @Override
+ // public void actionPerformed(ActionEvent e) {
+ // ControllingPanel.getInstance().switchToNextPanel();
+ // }
+ // });
+
+ // this.previousControllingButton = new JButton();
+ // this.previousControllingButton.addActionListener(new ActionListener() {
+ // @Override
+ // public void actionPerformed(ActionEvent e) {
+ // ControllingPanel.getInstance().switchToPreviousPanel();
+ // }
+ // });
+
+ // this.monitoringButton.setVisible(viewModel.get_StatusPanel_ViewModel().get_MonitoringButtonVisibility());
+ // this.controllingButton.setVisible(viewModel.get_StatusPanel_ViewModel().get_ControllingButtonVisibility());
+
+ // this.nextControllingButton.setVisible(viewModel.get_StatusPanel_ViewModel().get_NextControllingButtonVisibility());
+ // this.previousControllingButton.setVisible(viewModel.get_StatusPanel_ViewModel().get_PreviousControllingButtonVisibility());
+
+ // this.flowPanelWest = new JPanel();
+ // this.flowPanelWest.setLayout(new FlowLayout());
+ // this.flowPanelWest.add(this.statusLabel);
+ // this.flowPanelWest.add(this.monitoringButton);
+ // this.flowPanelWest.add(this.controllingButton);
+
+ // GridBagConstraints flowPanelConstraints = new GridBagConstraints();
+ // flowPanelConstraints.anchor = GridBagConstraints.WEST;
+ // flowPanelConstraints.gridx = 0;
+ // flowPanelConstraints.weightx = 0.5;
+ // flowPanelConstraints.weighty = 1;
+ // flowPanelConstraints.insets = new Insets(0, 0, 0, 0);
+ // this.setLayout(new GridBagLayout());
+ // this.add(this.flowPanelWest, flowPanelConstraints);
+
+ // this.flowPanelEast = new JPanel();
+ // this.flowPanelEast.setLayout(new FlowLayout());
+ // this.flowPanelEast.add(this.previousControllingButton);
+ // this.flowPanelEast.add(this.nextControllingButton);
+
+ // GridBagConstraints flowPanelConstraintsEast = new GridBagConstraints();
+ // flowPanelConstraintsEast.anchor = GridBagConstraints.EAST;
+ // flowPanelConstraintsEast.gridx = 1;
+ // flowPanelConstraintsEast.weightx = 0.5;
+ // flowPanelConstraintsEast.weighty = 1;
+ // flowPanelConstraintsEast.insets = new Insets(0, 0, 0, 0);
+ // this.setLayout(new GridBagLayout());
+ // this.add(this.flowPanelEast, flowPanelConstraintsEast);
+ // }
+
+ // public static StatusPanel getInstance(I_ReadableViewModel viewModel, View_To_ViewEventManager_Queue view_To_ViewEventManager_Queue) {
+ // if (instance == null) {
+ // instance = new StatusPanel(viewModel, view_To_ViewEventManager_Queue);
+ // }
+ // return instance;
+ // }
+}
diff --git a/target/classes/src/java/connect/Receiver.class b/target/classes/src/java/connect/Receiver.class
new file mode 100644
index 0000000..e96f4b7
Binary files /dev/null and b/target/classes/src/java/connect/Receiver.class differ
diff --git a/target/classes/src/java/connect/Sender.class b/target/classes/src/java/connect/Sender.class
new file mode 100644
index 0000000..46f73f8
Binary files /dev/null and b/target/classes/src/java/connect/Sender.class differ
diff --git a/target/classes/src/java/connect/client/Client.class b/target/classes/src/java/connect/client/Client.class
new file mode 100644
index 0000000..e93e2c2
Binary files /dev/null and b/target/classes/src/java/connect/client/Client.class differ
diff --git a/target/classes/src/java/connect/client/TLSClient.class b/target/classes/src/java/connect/client/TLSClient.class
new file mode 100644
index 0000000..5ac8629
Binary files /dev/null and b/target/classes/src/java/connect/client/TLSClient.class differ
diff --git a/target/classes/src/java/controller/ControllerThread.class b/target/classes/src/java/controller/ControllerThread.class
new file mode 100644
index 0000000..0a85e80
Binary files /dev/null and b/target/classes/src/java/controller/ControllerThread.class differ
diff --git a/target/classes/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.class b/target/classes/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.class
new file mode 100644
index 0000000..83a899f
Binary files /dev/null and b/target/classes/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.class differ
diff --git a/target/classes/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.class b/target/classes/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.class
new file mode 100644
index 0000000..6a89df5
Binary files /dev/null and b/target/classes/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.class differ
diff --git a/target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.class b/target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.class
new file mode 100644
index 0000000..dffd286
Binary files /dev/null and b/target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.class differ
diff --git a/target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor$FieldType.class b/target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor$FieldType.class
new file mode 100644
index 0000000..9d78e2f
Binary files /dev/null and b/target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor$FieldType.class differ
diff --git a/target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor.class b/target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor.class
new file mode 100644
index 0000000..bac5d71
Binary files /dev/null and b/target/classes/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor.class differ
diff --git a/target/classes/src/java/controller/interfaces/Controller.class b/target/classes/src/java/controller/interfaces/Controller.class
new file mode 100644
index 0000000..ef1a147
Binary files /dev/null and b/target/classes/src/java/controller/interfaces/Controller.class differ
diff --git a/target/classes/src/java/controller/validate/Validate.class b/target/classes/src/java/controller/validate/Validate.class
new file mode 100644
index 0000000..d68a3a4
Binary files /dev/null and b/target/classes/src/java/controller/validate/Validate.class differ
diff --git a/target/classes/src/java/data/ConnectionData.class b/target/classes/src/java/data/ConnectionData.class
new file mode 100644
index 0000000..13bba6d
Binary files /dev/null and b/target/classes/src/java/data/ConnectionData.class differ
diff --git a/target/classes/src/java/main/Main.class b/target/classes/src/java/main/Main.class
new file mode 100644
index 0000000..f7527ca
Binary files /dev/null and b/target/classes/src/java/main/Main.class differ
diff --git a/target/classes/src/java/queues/ReceivingQueue.class b/target/classes/src/java/queues/ReceivingQueue.class
new file mode 100644
index 0000000..e4119b3
Binary files /dev/null and b/target/classes/src/java/queues/ReceivingQueue.class differ
diff --git a/target/classes/src/java/queues/SendingQueue.class b/target/classes/src/java/queues/SendingQueue.class
new file mode 100644
index 0000000..a8bd839
Binary files /dev/null and b/target/classes/src/java/queues/SendingQueue.class differ
diff --git a/target/classes/src/java/view/constants/GUIConstants$E_ControllingSubPanel.class b/target/classes/src/java/view/constants/GUIConstants$E_ControllingSubPanel.class
new file mode 100644
index 0000000..135e1f6
Binary files /dev/null and b/target/classes/src/java/view/constants/GUIConstants$E_ControllingSubPanel.class differ
diff --git a/target/classes/src/java/view/constants/GUIConstants$Frame.class b/target/classes/src/java/view/constants/GUIConstants$Frame.class
new file mode 100644
index 0000000..c482204
Binary files /dev/null and b/target/classes/src/java/view/constants/GUIConstants$Frame.class differ
diff --git a/target/classes/src/java/view/constants/GUIConstants$Languages.class b/target/classes/src/java/view/constants/GUIConstants$Languages.class
new file mode 100644
index 0000000..af0645c
Binary files /dev/null and b/target/classes/src/java/view/constants/GUIConstants$Languages.class differ
diff --git a/target/classes/src/java/view/constants/GUIConstants$NFTablePanel.class b/target/classes/src/java/view/constants/GUIConstants$NFTablePanel.class
new file mode 100644
index 0000000..7736bd1
Binary files /dev/null and b/target/classes/src/java/view/constants/GUIConstants$NFTablePanel.class differ
diff --git a/target/classes/src/java/view/constants/GUIConstants$Panel.class b/target/classes/src/java/view/constants/GUIConstants$Panel.class
new file mode 100644
index 0000000..027e547
Binary files /dev/null and b/target/classes/src/java/view/constants/GUIConstants$Panel.class differ
diff --git a/target/classes/src/java/view/constants/GUIConstants$Status.class b/target/classes/src/java/view/constants/GUIConstants$Status.class
new file mode 100644
index 0000000..35d3bab
Binary files /dev/null and b/target/classes/src/java/view/constants/GUIConstants$Status.class differ
diff --git a/target/classes/src/java/view/constants/GUIConstants$Theme.class b/target/classes/src/java/view/constants/GUIConstants$Theme.class
new file mode 100644
index 0000000..edec539
Binary files /dev/null and b/target/classes/src/java/view/constants/GUIConstants$Theme.class differ
diff --git a/target/classes/src/java/view/constants/GUIConstants.class b/target/classes/src/java/view/constants/GUIConstants.class
new file mode 100644
index 0000000..7f38a64
Binary files /dev/null and b/target/classes/src/java/view/constants/GUIConstants.class differ
diff --git a/target/classes/src/java/view/frames/MainFrame.class b/target/classes/src/java/view/frames/MainFrame.class
new file mode 100644
index 0000000..4930f71
Binary files /dev/null and b/target/classes/src/java/view/frames/MainFrame.class differ
diff --git a/target/classes/src/java/view/menubar/Menu.class b/target/classes/src/java/view/menubar/Menu.class
new file mode 100644
index 0000000..0464b8f
Binary files /dev/null and b/target/classes/src/java/view/menubar/Menu.class differ
diff --git a/target/classes/src/java/view/menubar/MenuBar.class b/target/classes/src/java/view/menubar/MenuBar.class
new file mode 100644
index 0000000..47bdf38
Binary files /dev/null and b/target/classes/src/java/view/menubar/MenuBar.class differ
diff --git a/target/classes/src/java/view/menubar/MenuBarLanguageController.class b/target/classes/src/java/view/menubar/MenuBarLanguageController.class
new file mode 100644
index 0000000..ed56367
Binary files /dev/null and b/target/classes/src/java/view/menubar/MenuBarLanguageController.class differ
diff --git a/target/classes/src/java/view/menubar/MenuBarSeparator.class b/target/classes/src/java/view/menubar/MenuBarSeparator.class
new file mode 100644
index 0000000..80428d4
Binary files /dev/null and b/target/classes/src/java/view/menubar/MenuBarSeparator.class differ
diff --git a/target/classes/src/java/view/menubar/MenuItem.class b/target/classes/src/java/view/menubar/MenuItem.class
new file mode 100644
index 0000000..ecbbe5a
Binary files /dev/null and b/target/classes/src/java/view/menubar/MenuItem.class differ
diff --git a/target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory$1.class b/target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory$1.class
new file mode 100644
index 0000000..0c90940
Binary files /dev/null and b/target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory$1.class differ
diff --git a/target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory$2.class b/target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory$2.class
new file mode 100644
index 0000000..4804844
Binary files /dev/null and b/target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory$2.class differ
diff --git a/target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory.class b/target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory.class
new file mode 100644
index 0000000..ccfe7d2
Binary files /dev/null and b/target/classes/src/java/view/menubar/menuItems/HelpMenuItemFactory.class differ
diff --git a/target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory$1.class b/target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory$1.class
new file mode 100644
index 0000000..56de567
Binary files /dev/null and b/target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory$1.class differ
diff --git a/target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory$2.class b/target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory$2.class
new file mode 100644
index 0000000..3831544
Binary files /dev/null and b/target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory$2.class differ
diff --git a/target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory.class b/target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory.class
new file mode 100644
index 0000000..43e17fa
Binary files /dev/null and b/target/classes/src/java/view/menubar/menuItems/LanguageMenuItemFactory.class differ
diff --git a/target/classes/src/java/view/menubar/menus/HelpMenuFactory$1.class b/target/classes/src/java/view/menubar/menus/HelpMenuFactory$1.class
new file mode 100644
index 0000000..aa30a74
Binary files /dev/null and b/target/classes/src/java/view/menubar/menus/HelpMenuFactory$1.class differ
diff --git a/target/classes/src/java/view/menubar/menus/HelpMenuFactory.class b/target/classes/src/java/view/menubar/menus/HelpMenuFactory.class
new file mode 100644
index 0000000..035786b
Binary files /dev/null and b/target/classes/src/java/view/menubar/menus/HelpMenuFactory.class differ
diff --git a/target/classes/src/java/view/menubar/menus/LanguageMenuFactory$1.class b/target/classes/src/java/view/menubar/menus/LanguageMenuFactory$1.class
new file mode 100644
index 0000000..a423341
Binary files /dev/null and b/target/classes/src/java/view/menubar/menus/LanguageMenuFactory$1.class differ
diff --git a/target/classes/src/java/view/menubar/menus/LanguageMenuFactory.class b/target/classes/src/java/view/menubar/menus/LanguageMenuFactory.class
new file mode 100644
index 0000000..cae01ef
Binary files /dev/null and b/target/classes/src/java/view/menubar/menus/LanguageMenuFactory.class differ
diff --git a/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel$1.class b/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel$1.class
new file mode 100644
index 0000000..76ccac4
Binary files /dev/null and b/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel$1.class differ
diff --git a/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel$2.class b/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel$2.class
new file mode 100644
index 0000000..64d614d
Binary files /dev/null and b/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel$2.class differ
diff --git a/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.class b/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.class
new file mode 100644
index 0000000..0a809f0
Binary files /dev/null and b/target/classes/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.class differ
diff --git a/target/classes/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.class b/target/classes/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.class
new file mode 100644
index 0000000..e6db61c
Binary files /dev/null and b/target/classes/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.class differ
diff --git a/target/classes/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel$1.class b/target/classes/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel$1.class
new file mode 100644
index 0000000..94b2760
Binary files /dev/null and b/target/classes/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel$1.class differ
diff --git a/target/classes/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.class b/target/classes/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.class
new file mode 100644
index 0000000..f529e1b
Binary files /dev/null and b/target/classes/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.class differ
diff --git a/target/classes/src/java/view/panels/ControllingPanel/ControllingPanel.class b/target/classes/src/java/view/panels/ControllingPanel/ControllingPanel.class
new file mode 100644
index 0000000..d113276
Binary files /dev/null and b/target/classes/src/java/view/panels/ControllingPanel/ControllingPanel.class differ
diff --git a/target/classes/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.class b/target/classes/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.class
new file mode 100644
index 0000000..7af58d5
Binary files /dev/null and b/target/classes/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.class differ
diff --git a/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.class b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.class
new file mode 100644
index 0000000..467c94c
Binary files /dev/null and b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.class differ
diff --git a/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv6FamilyButton.class b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv6FamilyButton.class
new file mode 100644
index 0000000..b2b5b29
Binary files /dev/null and b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv6FamilyButton.class differ
diff --git a/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.class b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.class
new file mode 100644
index 0000000..692b52b
Binary files /dev/null and b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.class differ
diff --git a/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.class b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.class
new file mode 100644
index 0000000..a05529b
Binary files /dev/null and b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.class differ
diff --git a/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesChainPanel/NFTablesChainPanel.class b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesChainPanel/NFTablesChainPanel.class
new file mode 100644
index 0000000..38ae5f5
Binary files /dev/null and b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesChainPanel/NFTablesChainPanel.class differ
diff --git a/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.class b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.class
new file mode 100644
index 0000000..453a864
Binary files /dev/null and b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.class differ
diff --git a/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.class b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.class
new file mode 100644
index 0000000..3bdc190
Binary files /dev/null and b/target/classes/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.class differ
diff --git a/target/classes/src/java/view/panels/MonitoringPanel/AlarmPanel/Alarm.class b/target/classes/src/java/view/panels/MonitoringPanel/AlarmPanel/Alarm.class
new file mode 100644
index 0000000..f36b54a
Binary files /dev/null and b/target/classes/src/java/view/panels/MonitoringPanel/AlarmPanel/Alarm.class differ
diff --git a/target/classes/src/java/view/panels/MonitoringPanel/AlarmPanel/AlarmPanel.class b/target/classes/src/java/view/panels/MonitoringPanel/AlarmPanel/AlarmPanel.class
new file mode 100644
index 0000000..cb28be1
Binary files /dev/null and b/target/classes/src/java/view/panels/MonitoringPanel/AlarmPanel/AlarmPanel.class differ
diff --git a/target/classes/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel$1.class b/target/classes/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel$1.class
new file mode 100644
index 0000000..4cbed74
Binary files /dev/null and b/target/classes/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel$1.class differ
diff --git a/target/classes/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.class b/target/classes/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.class
new file mode 100644
index 0000000..84c8925
Binary files /dev/null and b/target/classes/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.class differ
diff --git a/target/classes/src/java/view/panels/MonitoringPanel/MonitoringPanel.class b/target/classes/src/java/view/panels/MonitoringPanel/MonitoringPanel.class
new file mode 100644
index 0000000..c974876
Binary files /dev/null and b/target/classes/src/java/view/panels/MonitoringPanel/MonitoringPanel.class differ
diff --git a/target/classes/src/java/view/panels/MonitoringPanel/SystemInformationPanel/SystemInformationPanel.class b/target/classes/src/java/view/panels/MonitoringPanel/SystemInformationPanel/SystemInformationPanel.class
new file mode 100644
index 0000000..450bfee
Binary files /dev/null and b/target/classes/src/java/view/panels/MonitoringPanel/SystemInformationPanel/SystemInformationPanel.class differ
diff --git a/target/classes/src/java/view/panels/StatusPanel/StatusPanel.class b/target/classes/src/java/view/panels/StatusPanel/StatusPanel.class
new file mode 100644
index 0000000..eae61bb
Binary files /dev/null and b/target/classes/src/java/view/panels/StatusPanel/StatusPanel.class differ
diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 0000000..e69de29
diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 0000000..4a8b3ee
--- /dev/null
+++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1,47 @@
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/ControllingPanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionInformation.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/StatusPanel/StatusPanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/MenuBarSeparator.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/MonitoringPanel/MonitoringPanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/connect/client/TLSClient.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/Alarm.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/interfaces/Controller.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/MenuItem.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesTablePanel/NFTablesTablePanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesChainPanel/NFTablesChainPanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ConnectionsTablePanel/ConnectionsTablePanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTablesProcessor.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/ControllerThread.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/InetFamilyButton.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/menuItems/HelpMenuItemFactory.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/MonitoringPanel/SystemInformationPanel/SystemInformationPanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/validate/Validate.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/MonitoringPanel/ConnectionsLineChart/ConnectionsLineChartPanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/connect/Sender.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/Menu.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/connect/Receiver.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/menus/LanguageMenuFactory.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/interfaces/I_Themeable.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv4FamilyButton.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/main/Main.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/DataProcessing/ConnectionsProcessing/ConnectionsProcessor.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/I_ControllingPanel_SwitchPanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/queues/ReceivingQueue.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/frames/MainFrame.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/menuItems/LanguageMenuItemFactory.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/constants/GUIConstants.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/MonitoringPanel/AlarmPanel/AlarmPanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/MenuBarLanguageController.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTablesRulePanel/NFTablesRulePanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ConnectToServerPanel/ConnectToServerPanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/MenuBar.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/NFTFamilyPanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/controller/DataProcessing/nftablesProcessing/NFTableInformation.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/interfaces/I_PanelChangeable.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/connect/client/Client.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/data/ConnectionData.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/queues/SendingQueue.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/menubar/menus/HelpMenuFactory.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/NFTable/NFTFamilyPanel/IPv6FamilyButton.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/panels/ControllingPanel/BasePanel/ControllingBasePanel.java
+/home/student/Repositories/firewall-dashboard-simplified/firewall-dashboard-simplified/src/main/java/src/java/view/interfaces/I_Translateable.java