diff --git a/pom.xml b/pom.xml
index ec71f5f..e8604b5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -91,6 +91,27 @@
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.6.3
+
+ /usr/lib/jvm/java-21-openjdk-amd64/bin/javadoc
+
+
+
+ attach-javadocs
+
+ javadoc
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-site-plugin
+ 3.12.1
+
diff --git a/src/main/java/de/antco/projekt/ConsoleUi.java b/src/main/java/de/antco/projekt/ConsoleUi.java
index 00f9bf7..095608f 100644
--- a/src/main/java/de/antco/projekt/ConsoleUi.java
+++ b/src/main/java/de/antco/projekt/ConsoleUi.java
@@ -7,25 +7,16 @@ import de.antco.projekt.model.WorkOrderDetails;
import de.antco.projekt.model.WorkOrderItem;
import de.antco.projekt.service.WorkshopService;
-import java.io.InputStream;
-import java.io.PrintStream;
import java.sql.SQLException;
import java.util.*;
public class ConsoleUi {
private final WorkshopService service;
- private final Scanner scanner;
- private final PrintStream out;
+ private final Scanner scanner = new Scanner(System.in);
public ConsoleUi(WorkshopService service) {
- this(service, System.in, System.out);
- }
-
- public ConsoleUi(WorkshopService service, InputStream in, PrintStream out) {
this.service = service;
- this.scanner = new Scanner(in);
- this.out = out;
}
public void start() {
@@ -33,7 +24,6 @@ public class ConsoleUi {
while (running) {
showMenu();
- if (!scanner.hasNextLine()) break;
String choice = scanner.nextLine().trim();
try {
@@ -45,176 +35,276 @@ public class ConsoleUi {
case "5" -> createWorkOrder();
case "6" -> showWorkOrders();
case "0" -> running = false;
- default -> out.println("Ungültige Eingabe.");
+ default -> System.out.println("Ungültige Eingabe.");
}
} catch (SQLException e) {
- out.println("Ein Fehler ist aufgetreten: " + e.getMessage());
+ System.out.println("Ein Fehler ist aufgetreten: " + e.getMessage());
}
}
- out.println("Programm beendet.");
+ System.out.println("Programm beendet.");
}
private void showMenu() {
- out.println("\n=== Werkstatt Menü ===");
- out.println("1) Kunde anlegen");
- out.println("2) Kunden anzeigen");
- out.println("3) Fahrzeug anlegen");
- out.println("4) Fahrzeuge einer Person anzeigen");
- out.println("5) Werkstattvorgang anlegen");
- out.println("6) Vorgänge anzeigen");
- out.println("0) Beenden");
- out.print("Auswahl: ");
+ System.out.println("\n=== Werkstatt Menü ===");
+ System.out.println("1) Kunde anlegen");
+ System.out.println("2) Kunden anzeigen");
+ System.out.println("3) Fahrzeug anlegen");
+ System.out.println("4) Fahrzeuge einer Person anzeigen");
+ System.out.println("5) Werkstattvorgang anlegen");
+ System.out.println("6) Vorgänge anzeigen");
+ System.out.println("0) Beenden");
+ System.out.print("Auswahl: ");
}
- // ---------------- Eingabe-Hilfen ----------------
+ // ---------------- INPUT HELPERS ----------------
- private int readInt(String text) {
+ private int readPositiveInt(String text) {
while (true) {
- out.print(text);
- if (!scanner.hasNextLine()) return 0;
- String input = scanner.nextLine();
+ System.out.print(text);
+ String input = scanner.nextLine().trim();
try {
- return Integer.parseInt(input.trim());
+ int value = Integer.parseInt(input);
+ if (value > 0) {
+ return value;
+ }
+ System.out.println("Bitte eine Zahl größer 0 eingeben.");
} catch (NumberFormatException e) {
- out.println("Bitte eine gültige Zahl eingeben.");
+ System.out.println("Bitte eine gültige Zahl eingeben.");
+ }
+ }
+ }
+ private String readEmail(String text) {
+ while (true) {
+ System.out.print(text);
+ String input = scanner.nextLine().trim();
+
+ // einfache Validierung: enthält '@' und mindestens einen Punkt nach dem '@'
+ if (input.matches("^[\\w._%+-]+@[\\w.-]+\\.[a-zA-Z]{2,}$")) {
+ return input;
+ } else {
+ System.out.println("Bitte eine gültige Email-Adresse eingeben.");
+ }
+ }
+ }
+
+ private String readAddress(String text) {
+ while (true) {
+ System.out.print(text);
+ String input = scanner.nextLine().trim();
+
+ // einfache Validierung: mindestens 5 Zeichen, darf Buchstaben, Zahlen, Leerzeichen und Komma enthalten
+ if (input.length() >= 5 && input.matches("[\\w\\d\\s,.-]+")) {
+ return input;
+ } else {
+ System.out.println("Bitte eine gültige Adresse eingeben (mindestens 5 Zeichen).");
}
}
}
private String readNonEmpty(String text) {
while (true) {
- out.print(text);
- if (!scanner.hasNextLine()) return "";
+ System.out.print(text);
String value = scanner.nextLine().trim();
if (!value.isEmpty()) {
return value;
}
- out.println("Eingabe darf nicht leer sein.");
+ System.out.println("Eingabe darf nicht leer sein.");
}
}
- private String readValidName(String text) {
+ private String readValidName(String label) {
while (true) {
- String name = readNonEmpty(text);
- if (name.isEmpty()) return "";
+ String name = readNonEmpty(label);
- if (name.matches("[a-zA-ZäöüÄÖÜß ]+")) {
- return name;
+ if (name.length() < 2) {
+ System.out.println("Der Name muss mindestens 2 Zeichen haben.");
+ continue;
}
- out.println("Der Name darf nur Buchstaben enthalten.");
+ if (!name.matches("[a-zA-ZäöüÄÖÜß ]+")) {
+ System.out.println("Der Name darf nur Buchstaben enthalten.");
+ continue;
+ }
+
+ return name.trim();
}
}
private String readPhoneNumber(String text) {
while (true) {
- out.print(text);
- if (!scanner.hasNextLine()) return "";
+ System.out.print(text);
String phone = scanner.nextLine().trim();
- if (phone.matches("\\d+")) {
- return phone;
+ if (!phone.matches("\\d+")) {
+ System.out.println("Telefonnummer darf nur Zahlen enthalten.");
+ continue;
}
- out.println("Telefonnummer darf nur Zahlen enthalten.");
+ if (phone.length() < 8) {
+ System.out.println("Telefonnummer muss mindestens 8 Stellen haben.");
+ continue;
+ }
+
+ if (phone.length() > 15) {
+ System.out.println("Telefonnummer darf maximal 15 Stellen haben.");
+ continue;
+ }
+
+ return phone;
+ }
+ }
+
+ private String readValidCarText(String label) {
+ while (true) {
+ System.out.print(label);
+ String value = scanner.nextLine().trim();
+
+ if (value.length() < 2) {
+ System.out.println("Eingabe muss mindestens 2 Zeichen haben.");
+ continue;
+ }
+
+ if (!value.matches("[a-zA-Z0-9äöüÄÖÜß ]+")) {
+ System.out.println("Nur Buchstaben, Zahlen und Leerzeichen erlaubt.");
+ continue;
+ }
+
+ return value;
+ }
+ }
+
+ private String readLicensePlate(String text) {
+ while (true) {
+ System.out.print(text);
+ String plate = scanner.nextLine().trim().toUpperCase();
+
+ if (plate.length() < 5) {
+ System.out.println("Kennzeichen muss mindestens 5 Zeichen haben.");
+ continue;
+ }
+
+ if (!plate.matches("[A-Z0-9\\-]+")) {
+ System.out.println("Nur Großbuchstaben, Zahlen und Bindestriche erlaubt.");
+ continue;
+ }
+
+ return plate;
+ }
+ }
+
+ private String readNote() {
+ while (true) {
+ System.out.print("Notiz: ");
+ String note = scanner.nextLine().trim();
+
+ if (note.length() > 200) {
+ System.out.println("Notiz darf maximal 200 Zeichen haben.");
+ continue;
+ }
+
+ return note;
+ }
+ }
+
+ private int readQuantity(String text) {
+ while (true) {
+ System.out.print(text);
+ String input = scanner.nextLine().trim();
+
+ try {
+ int qty = Integer.parseInt(input);
+ if (qty > 0 && qty <= 99) {
+ return qty;
+ }
+ System.out.println("Menge muss zwischen 1 und 99 liegen.");
+ } catch (NumberFormatException e) {
+ System.out.println("Bitte eine gültige Zahl eingeben.");
+ }
}
}
- // ---------------- Personen ----------------
private void addPerson() throws SQLException {
String name = readValidName("Name: ");
String phone = readPhoneNumber("Telefonnummer: ");
- String email = readNonEmpty("Email: ");
- String address = readNonEmpty("Adresse: ");
+ String email = readEmail("Email: ");
+ String address = readAddress("Adresse: ");
- if (name.isEmpty() || phone.isEmpty() || email.isEmpty() || address.isEmpty()) return;
-
- Person person = service.createPerson(name, phone, email, address);
- out.println("Kunde gespeichert (ID: " + person.getId() + ")");
+ Person person = service.createPerson(name, phone,email,address);
+ System.out.println("Kunde gespeichert (ID: " + person.getId() + ")");
}
private void showPersons() throws SQLException {
List persons = service.listPersons();
if (persons.isEmpty()) {
- out.println("Keine Kunden vorhanden.");
+ System.out.println("Keine Kunden vorhanden.");
return;
}
- out.println("\n--- Kundenliste ---");
- persons.forEach(p -> out.println(p));
+ System.out.println("\n--- Kundenliste ---");
+ persons.forEach(System.out::println);
}
- // ---------------- Fahrzeuge ----------------
-
private void addVehicle() throws SQLException {
- int personId = readInt("Personen-ID: ");
- if (personId == 0) return;
+ int personId = readPositiveInt("Personen-ID: ");
Person person = service.findPerson(personId);
if (person == null) {
- out.println("Person wurde nicht gefunden.");
+ System.out.println("Person wurde nicht gefunden.");
return;
}
- String brand = readNonEmpty("Hersteller: ");
- String model = readNonEmpty("Modell: ");
- String plate = readNonEmpty("Kennzeichen: ");
-
- if (brand.isEmpty() || model.isEmpty() || plate.isEmpty()) return;
+ String brand = readValidCarText("Hersteller: ");
+ String model = readValidCarText("Modell: ");
+ String plate = readLicensePlate("Kennzeichen: ");
Vehicle vehicle = service.createVehicle(personId, brand, model, plate);
- out.println("Fahrzeug angelegt (ID: " + vehicle.getId() + ")");
+ System.out.println("Fahrzeug gespeichert (ID: " + vehicle.getId() + ")");
}
private void showVehiclesOfPerson() throws SQLException {
- int personId = readInt("Personen-ID: ");
- if (personId == 0) return;
+ int personId = readPositiveInt("Personen-ID: ");
Person person = service.findPerson(personId);
if (person == null) {
- out.println("Person nicht gefunden.");
+ System.out.println("Person nicht gefunden.");
return;
}
List vehicles = service.listVehicles(personId);
- out.println("Fahrzeuge von " + person.getName() + ":");
+ System.out.println("Fahrzeuge von " + person.getName() + ":");
if (vehicles.isEmpty()) {
- out.println("Keine Fahrzeuge vorhanden.");
+ System.out.println("Keine Fahrzeuge vorhanden.");
} else {
- vehicles.forEach(v -> out.println(v));
+ vehicles.forEach(System.out::println);
}
}
- // ---------------- Werkstattvorgänge ----------------
-
private void createWorkOrder() throws SQLException {
- int vehicleId = readInt("Fahrzeug-ID: ");
- if (vehicleId == 0) return;
+ int vehicleId = readPositiveInt("Fahrzeug-ID: ");
Vehicle vehicle = service.findVehicle(vehicleId);
if (vehicle == null) {
- out.println("Fahrzeug nicht gefunden.");
+ System.out.println("Fahrzeug nicht gefunden.");
return;
}
- String note = readNonEmpty("Notiz: ");
+ String note = readNote();
List catalog = service.listServiceItems();
Map selectedItems = new LinkedHashMap<>();
while (true) {
- out.println("\n--- Service-Katalog ---");
- catalog.forEach(item -> out.println(item));
+ System.out.println("\n--- Service-Katalog ---");
+ catalog.forEach(System.out::println);
- out.print("Service-ID (leer = fertig): ");
- if (!scanner.hasNextLine()) break;
+ System.out.print("Service-ID (leer = fertig): ");
String input = scanner.nextLine().trim();
if (input.isEmpty()) {
@@ -225,64 +315,54 @@ public class ConsoleUi {
try {
serviceId = Integer.parseInt(input);
} catch (NumberFormatException e) {
- out.println("Bitte eine gültige ID eingeben.");
+ System.out.println("Bitte eine gültige ID eingeben.");
continue;
}
- int finalServiceId = serviceId;
- ServiceItem item = catalog.stream()
- .filter(s -> s.getId() == finalServiceId)
- .findFirst()
- .orElse(null);
-
- if (item == null) {
- out.println("Service nicht gefunden.");
- continue;
- }
-
- int qty = readInt("Menge: ");
- if (qty <= 0) {
- out.println("Menge muss größer als 0 sein.");
+ boolean exists = catalog.stream().anyMatch(s -> s.getId() == serviceId);
+ if (!exists) {
+ System.out.println("Service nicht gefunden.");
continue;
}
+ int qty = readQuantity("Menge: ");
selectedItems.merge(serviceId, qty, Integer::sum);
}
if (selectedItems.isEmpty()) {
- out.println("Keine Positionen ausgewählt.");
+ System.out.println("Keine Positionen ausgewählt.");
return;
}
int orderId = service.createWorkOrder(vehicleId, note, selectedItems);
- out.println("Vorgang wurde angelegt (ID: " + orderId + ")");
+ System.out.println("Vorgang wurde angelegt (ID: " + orderId + ")");
}
private void showWorkOrders() throws SQLException {
List orders = service.listWorkOrders();
if (orders.isEmpty()) {
- out.println("Keine Vorgänge vorhanden.");
+ System.out.println("Keine Vorgänge vorhanden.");
return;
}
for (WorkOrderDetails order : orders) {
- out.println("\n--- Vorgang " + order.getOrderId() + " ---");
- out.println("Kunde: " + order.getPersonName());
- out.println("Fahrzeug: " + order.getVehicleText());
- out.println("Datum: " + order.getCreatedAt());
+ System.out.println("\n--- Vorgang " + order.getOrderId() + " ---");
+ System.out.println("Kunde: " + order.getPersonName());
+ System.out.println("Fahrzeug: " + order.getVehicleText());
+ System.out.println("Datum: " + order.getCreatedAt());
if (order.getNote() != null && !order.getNote().isBlank()) {
- out.println("Notiz: " + order.getNote());
+ System.out.println("Notiz: " + order.getNote());
}
for (WorkOrderItem item : order.getItems()) {
- out.println(" - " + item.getServiceItem().getTitle() +
+ System.out.println(" - " + item.getServiceItem().getTitle() +
" x" + item.getQuantity() +
" = " + item.getTotalPrice() + " €");
}
- out.println("Gesamtsumme: " + order.getTotal() + " €");
+ System.out.println("Gesamtsumme: " + order.getTotal() + " €");
}
}
-}
\ No newline at end of file
+}