From e9478289c5d10fdca905d5f42ac6dd60abb5474a Mon Sep 17 00:00:00 2001 From: danai Date: Fri, 14 Jun 2024 12:05:46 +0200 Subject: [PATCH 01/10] Registrierung und Einlpggen Methoden --- TravelBuddyApp/src/main/java/domain/User.java | 95 ++++++++++++++++++- 1 file changed, 91 insertions(+), 4 deletions(-) diff --git a/TravelBuddyApp/src/main/java/domain/User.java b/TravelBuddyApp/src/main/java/domain/User.java index d705e9f..5950bba 100644 --- a/TravelBuddyApp/src/main/java/domain/User.java +++ b/TravelBuddyApp/src/main/java/domain/User.java @@ -1,5 +1,11 @@ package domain; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; + public class User { private String username; @@ -19,16 +25,97 @@ public class User { this.durchschnittsgeschwindigkeitFahrrad = durchschnittsgeschwindigkeitFahrrad; } + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Ort getHeimatstandort() { + return heimatstandort; + } + + public void setHeimatstandort(Ort heimatstandort) { + this.heimatstandort = heimatstandort; + } + + public Auto getAuto() { + return auto; + } + + public void setAuto(Auto auto) { + this.auto = auto; + } + + public double getDurchschnittsgeschwindigkeitPKW() { + return durchschnittsgeschwindigkeitPKW; + } + + public void setDurchschnittsgeschwindigkeitPKW(double durchschnittsgeschwindigkeitPKW) { + this.durchschnittsgeschwindigkeitPKW = durchschnittsgeschwindigkeitPKW; + } + + public double getDurchschnittsgeschwindigkeitFahrrad() { + return durchschnittsgeschwindigkeitFahrrad; + } + + public void setDurchschnittsgeschwindigkeitFahrrad(double durchschnittsgeschwindigkeitFahrrad) { + this.durchschnittsgeschwindigkeitFahrrad = durchschnittsgeschwindigkeitFahrrad; + } + + + public void registrieren() { - // Implementierung der Registrierung + + try (PrintWriter writer = new PrintWriter(new FileWriter("users.txt", true))) { + writer.println(username + "," + password + "," + heimatstandort.getPLZ() + "," + heimatstandort.getOrtName() + "," + + auto.getName() + "," + auto.getCO2AusstossProKm() + "," + durchschnittsgeschwindigkeitPKW + "," + + durchschnittsgeschwindigkeitFahrrad); + } catch (IOException e) { + e.printStackTrace(); + } + } - public void einloggen() { - // Implementierung des Logins + public boolean einloggen() { + + try (BufferedReader reader = new BufferedReader(new FileReader("users.txt"))) { + String line; + while ((line = reader.readLine()) != null) { + String[] parts = line.split(","); + if (parts[0].equals(username) && parts[1].equals(password)) { + // Benutzerdaten laden + this.heimatstandort = new Ort(parts[2], parts[3]); + this.auto = new Auto(parts[4], Double.parseDouble(parts[5])); + this.durchschnittsgeschwindigkeitPKW = Double.parseDouble(parts[6]); + this.durchschnittsgeschwindigkeitFahrrad = Double.parseDouble(parts[7]); + return true; + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return false; } + + public void zeigeWetterHeimatstandort() { - // Implementierung der Wetteranzeige + + + } + + } From 09a7b543a5690e00578f6977cff374980af09b9c Mon Sep 17 00:00:00 2001 From: danai Date: Fri, 14 Jun 2024 13:07:42 +0200 Subject: [PATCH 02/10] =?UTF-8?q?Die=20Funktionalit=C3=A4t=20des=20WetterS?= =?UTF-8?q?ervice=20wurde=20erf=C3=BCllt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/domain/WetterService.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/TravelBuddyApp/src/main/java/domain/WetterService.java b/TravelBuddyApp/src/main/java/domain/WetterService.java index e5db229..235575b 100644 --- a/TravelBuddyApp/src/main/java/domain/WetterService.java +++ b/TravelBuddyApp/src/main/java/domain/WetterService.java @@ -1,6 +1,78 @@ package domain; +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; +import org.json.JSONArray; +import org.json.JSONObject; public class WetterService { + private static final String API_KEY = "fc01dfd47f80659f12512c295e80b201"; + private static final HttpClient client = HttpClient.newHttpClient(); + + public static String getAktuellesWetter(String location) throws IOException, InterruptedException { + + String url = "http://api.openweathermap.org/data/2.5/weather?q=" + location + "&appid=" + API_KEY + + "&units=metric"; + HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + if (response.statusCode() != 200) { + throw new IOException("Unerwarteter Code " + response.statusCode()); + } + + JSONObject json = new JSONObject(response.body()); + double temp = json.getJSONObject("main").getDouble("temp"); + String weather = json.getJSONArray("weather").getJSONObject(0).getString("description"); + + return "Aktuelle Temperatur: " + temp + "°C, Wetter: " + weather; + } + public static String getWettervorhersage(String location) throws IOException, InterruptedException { + + String url = "http://api.openweathermap.org/data/2.5/forecast?q=" + location + "&appid=" + API_KEY + + "&units=metric"; + HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + if (response.statusCode() != 200) { + throw new IOException("Unerwarteter Code " + response.statusCode()); + } + + JSONObject json = new JSONObject(response.body()); + Map tempByDay = new HashMap<>(); + Map weatherByDay = new HashMap<>(); + LocalDate today = LocalDate.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + JSONArray forecastList = json.getJSONArray("list"); + for (int i = 0; i < forecastList.length(); i++) { + JSONObject forecastEntry = forecastList.getJSONObject(i); + String dateTime = forecastEntry.getString("dt_txt"); + String date = dateTime.split(" ")[0]; + LocalDate forecastDate = LocalDate.parse(date, formatter); + + if (forecastDate.isAfter(today) && !tempByDay.containsKey(date)) { + double temp = forecastEntry.getJSONObject("main").getDouble("temp"); + String weather = forecastEntry.getJSONArray("weather").getJSONObject(0).getString("description"); + + tempByDay.put(date, temp); + weatherByDay.put(date, weather); + } + } + + StringBuilder forecast = new StringBuilder("3-Tage-Wettervorhersage:\n"); + tempByDay.keySet().stream().sorted().limit(3).forEach(date -> { + forecast.append(String.format("%s - Temperatur: %.2f°C, Wetter: %s\n", date, tempByDay.get(date), + weatherByDay.get(date))); + }); + + return forecast.toString(); + } } From 829e875409db55b6eb363688eab1d06b40c71e79 Mon Sep 17 00:00:00 2001 From: danai Date: Fri, 14 Jun 2024 15:29:25 +0200 Subject: [PATCH 03/10] =?UTF-8?q?Vollst=C3=A4ndige=20User=20Klasse=20und?= =?UTF-8?q?=20UserFacade?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TravelBuddyApp/src/main/java/domain/User.java | 163 +++++++++++------- .../src/main/java/fassade/UserFassade.java | 41 +++++ 2 files changed, 138 insertions(+), 66 deletions(-) diff --git a/TravelBuddyApp/src/main/java/domain/User.java b/TravelBuddyApp/src/main/java/domain/User.java index 5950bba..6e60c4e 100644 --- a/TravelBuddyApp/src/main/java/domain/User.java +++ b/TravelBuddyApp/src/main/java/domain/User.java @@ -1,12 +1,19 @@ package domain; import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.io.PrintWriter; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; -public class User { +public class User implements Serializable{ private String username; private String password; @@ -28,94 +35,118 @@ public class User { public String getUsername() { return username; } - + public void setUsername(String username) { this.username = username; } - + public String getPassword() { - return password; - } + return password; + } - public void setPassword(String password) { - this.password = password; - } + public void setPassword(String password) { + this.password = password; + } - public Ort getHeimatstandort() { - return heimatstandort; - } + public Ort getHeimatstandort() { + return heimatstandort; + } - public void setHeimatstandort(Ort heimatstandort) { - this.heimatstandort = heimatstandort; - } + public void setHeimatstandort(Ort heimatstandort) { + this.heimatstandort = heimatstandort; + } - public Auto getAuto() { - return auto; - } + public Auto getAuto() { + return auto; + } - public void setAuto(Auto auto) { - this.auto = auto; - } + public void setAuto(Auto auto) { + this.auto = auto; + } - public double getDurchschnittsgeschwindigkeitPKW() { - return durchschnittsgeschwindigkeitPKW; - } + public double getDurchschnittsgeschwindigkeitPKW() { + return durchschnittsgeschwindigkeitPKW; + } - public void setDurchschnittsgeschwindigkeitPKW(double durchschnittsgeschwindigkeitPKW) { - this.durchschnittsgeschwindigkeitPKW = durchschnittsgeschwindigkeitPKW; - } + public void setDurchschnittsgeschwindigkeitPKW(double durchschnittsgeschwindigkeitPKW) { + this.durchschnittsgeschwindigkeitPKW = durchschnittsgeschwindigkeitPKW; + } - public double getDurchschnittsgeschwindigkeitFahrrad() { - return durchschnittsgeschwindigkeitFahrrad; - } + public double getDurchschnittsgeschwindigkeitFahrrad() { + return durchschnittsgeschwindigkeitFahrrad; + } + + public void setDurchschnittsgeschwindigkeitFahrrad(double durchschnittsgeschwindigkeitFahrrad) { + this.durchschnittsgeschwindigkeitFahrrad = durchschnittsgeschwindigkeitFahrrad; + } - public void setDurchschnittsgeschwindigkeitFahrrad(double durchschnittsgeschwindigkeitFahrrad) { - this.durchschnittsgeschwindigkeitFahrrad = durchschnittsgeschwindigkeitFahrrad; - } - - - public void registrieren() { - + try (PrintWriter writer = new PrintWriter(new FileWriter("users.txt", true))) { - writer.println(username + "," + password + "," + heimatstandort.getPLZ() + "," + heimatstandort.getOrtName() + "," - + auto.getName() + "," + auto.getCO2AusstossProKm() + "," + durchschnittsgeschwindigkeitPKW + "," - + durchschnittsgeschwindigkeitFahrrad); - } catch (IOException e) { - e.printStackTrace(); - } + writer.println(username + "," + password + "," + heimatstandort.getPLZ() + "," + heimatstandort.getOrtName() + + "," + auto.getName() + "," + auto.getCO2AusstossProKm() + "," + durchschnittsgeschwindigkeitPKW + + "," + durchschnittsgeschwindigkeitFahrrad); + } catch (IOException e) { + e.printStackTrace(); + } } public boolean einloggen() { - + try (BufferedReader reader = new BufferedReader(new FileReader("users.txt"))) { - String line; - while ((line = reader.readLine()) != null) { - String[] parts = line.split(","); - if (parts[0].equals(username) && parts[1].equals(password)) { - // Benutzerdaten laden - this.heimatstandort = new Ort(parts[2], parts[3]); - this.auto = new Auto(parts[4], Double.parseDouble(parts[5])); - this.durchschnittsgeschwindigkeitPKW = Double.parseDouble(parts[6]); - this.durchschnittsgeschwindigkeitFahrrad = Double.parseDouble(parts[7]); - return true; - } - } + String line; + while ((line = reader.readLine()) != null) { + String[] parts = line.split(","); + if (parts[0].equals(username) && parts[1].equals(password)) { + // Benutzerdaten laden + this.heimatstandort = new Ort(parts[2], parts[3]); + this.auto = new Auto(parts[4], Double.parseDouble(parts[5])); + this.durchschnittsgeschwindigkeitPKW = Double.parseDouble(parts[6]); + this.durchschnittsgeschwindigkeitFahrrad = Double.parseDouble(parts[7]); + return true; + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } + + + public String zeigeWetterHeimatstandort() { + try { + return WetterService.getAktuellesWetter(heimatstandort.getOrtName()); + } catch (IOException | InterruptedException e) { + return "Fehler beim Abrufen des Wetters: " + e.getMessage(); + } + } + + + public String zeigeWettervorhersageHeimatstandort() { + try { + return WetterService.getWettervorhersage(heimatstandort.getOrtName()); + } catch (IOException | InterruptedException e) { + return "Fehler beim Abrufen der Wettervorhersage: " + e.getMessage(); + } + } + + + private void saveUsers(List users) { + try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("users.ser"))) { + oos.writeObject(users); } catch (IOException e) { e.printStackTrace(); } - return false; - } + } - - - public void zeigeWetterHeimatstandort() { - - - - } + + private List loadUsers() { + try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("users.ser"))) { + return (List) ois.readObject(); + } catch (IOException | ClassNotFoundException e) { + return new ArrayList<>(); + } + } - - } diff --git a/TravelBuddyApp/src/main/java/fassade/UserFassade.java b/TravelBuddyApp/src/main/java/fassade/UserFassade.java index 1e6ccba..a7f5058 100644 --- a/TravelBuddyApp/src/main/java/fassade/UserFassade.java +++ b/TravelBuddyApp/src/main/java/fassade/UserFassade.java @@ -1,5 +1,46 @@ package fassade; +import domain.User; +import domain.Ort; +import domain.Auto; + public class UserFassade { + public User registrieren(String username, String password, String plz, String ortName, String autoName, + double co2AusstossProKm, double durchschnittsgeschwindigkeitPKW, + double durchschnittsgeschwindigkeitFahrrad) { + Ort heimatstandort = new Ort(plz, ortName); + Auto auto = new Auto(autoName, co2AusstossProKm); + User user = new User(username, password, heimatstandort, auto, durchschnittsgeschwindigkeitPKW, + durchschnittsgeschwindigkeitFahrrad); + user.registrieren(); + return user; + } + + public User einloggen(String username, String password) { + User user = new User(username, password, null, null, 0, 0); + if (user.einloggen()) { + return user; + } + return null; + } + + public void zeigeWetterHeimatstandort(User user) { + try { + String aktuellesWetter = user.zeigeWetterHeimatstandort(); + System.out.println(aktuellesWetter); + } catch (Exception e) { + System.err.println("Fehler beim Abrufen des aktuellen Wetters: " + e.getMessage()); + } + } + + public void zeigeWettervorhersageHeimatstandort(User user) { + try { + String wettervorhersage = user.zeigeWettervorhersageHeimatstandort(); + System.out.println(wettervorhersage); + } catch (Exception e) { + System.err.println("Fehler beim Abrufen der Wettervorhersage: " + e.getMessage()); + } + } + } From fc6228ca3edf7faf8d288df4869ebf1f8e729cab Mon Sep 17 00:00:00 2001 From: danai Date: Sat, 15 Jun 2024 17:08:03 +0200 Subject: [PATCH 04/10] =?UTF-8?q?Passw=C3=B6rter=20mit=20Hash=20wurge=20er?= =?UTF-8?q?zeugt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TravelBuddyApp/pom.xml | 13 ++++- TravelBuddyApp/src/main/java/domain/User.java | 54 ++++++------------- 2 files changed, 28 insertions(+), 39 deletions(-) diff --git a/TravelBuddyApp/pom.xml b/TravelBuddyApp/pom.xml index 07fc4aa..ea06a2e 100644 --- a/TravelBuddyApp/pom.xml +++ b/TravelBuddyApp/pom.xml @@ -5,7 +5,7 @@ hs-mannheim.de TravelBuddyApp 0.0.1-SNAPSHOT - + UTF-8 21 @@ -24,6 +24,16 @@ 5.8.1 test + + org.json + json + 20210307 + + + commons-codec + commons-codec + 1.15 + @@ -84,6 +94,7 @@ org.apache.maven.plugins maven-pmd-plugin 3.22.0 + verify diff --git a/TravelBuddyApp/src/main/java/domain/User.java b/TravelBuddyApp/src/main/java/domain/User.java index 6e60c4e..fc3daef 100644 --- a/TravelBuddyApp/src/main/java/domain/User.java +++ b/TravelBuddyApp/src/main/java/domain/User.java @@ -1,22 +1,16 @@ package domain; import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; import java.io.PrintWriter; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; +import org.apache.commons.codec.digest.DigestUtils; -public class User implements Serializable{ +public class User { private String username; - private String password; + private String hashedPassword; private Ort heimatstandort; private Auto auto; private double durchschnittsgeschwindigkeitPKW; @@ -24,14 +18,19 @@ public class User implements Serializable{ public User(String username, String password, Ort heimatstandort, Auto auto, double durchschnittsgeschwindigkeitPKW, double durchschnittsgeschwindigkeitFahrrad) { + this.username = username; - this.password = password; + this.hashedPassword = hashPassword(password); this.heimatstandort = heimatstandort; this.auto = auto; this.durchschnittsgeschwindigkeitPKW = durchschnittsgeschwindigkeitPKW; this.durchschnittsgeschwindigkeitFahrrad = durchschnittsgeschwindigkeitFahrrad; } + private String hashPassword(String password) { + return DigestUtils.sha256Hex(password); // Hash-Funktion verwenden + } + public String getUsername() { return username; } @@ -40,12 +39,12 @@ public class User implements Serializable{ this.username = username; } - public String getPassword() { - return password; + public String getHashedPassword() { + return hashedPassword; } public void setPassword(String password) { - this.password = password; + this.hashedPassword = hashPassword(password); // Passwort hashen beim Setzen } public Ort getHeimatstandort() { @@ -83,9 +82,9 @@ public class User implements Serializable{ public void registrieren() { try (PrintWriter writer = new PrintWriter(new FileWriter("users.txt", true))) { - writer.println(username + "," + password + "," + heimatstandort.getPLZ() + "," + heimatstandort.getOrtName() - + "," + auto.getName() + "," + auto.getCO2AusstossProKm() + "," + durchschnittsgeschwindigkeitPKW - + "," + durchschnittsgeschwindigkeitFahrrad); + writer.println(username + "," + hashedPassword + "," + heimatstandort.getPLZ() + "," + + heimatstandort.getOrtName() + "," + auto.getName() + "," + auto.getCO2AusstossProKm() + "," + + durchschnittsgeschwindigkeitPKW + "," + durchschnittsgeschwindigkeitFahrrad); } catch (IOException e) { e.printStackTrace(); } @@ -98,8 +97,7 @@ public class User implements Serializable{ String line; while ((line = reader.readLine()) != null) { String[] parts = line.split(","); - if (parts[0].equals(username) && parts[1].equals(password)) { - // Benutzerdaten laden + if (parts[0].equals(username) && parts[1].equals(hashedPassword)) { this.heimatstandort = new Ort(parts[2], parts[3]); this.auto = new Auto(parts[4], Double.parseDouble(parts[5])); this.durchschnittsgeschwindigkeitPKW = Double.parseDouble(parts[6]); @@ -113,7 +111,6 @@ public class User implements Serializable{ return false; } - public String zeigeWetterHeimatstandort() { try { return WetterService.getAktuellesWetter(heimatstandort.getOrtName()); @@ -122,7 +119,6 @@ public class User implements Serializable{ } } - public String zeigeWettervorhersageHeimatstandort() { try { return WetterService.getWettervorhersage(heimatstandort.getOrtName()); @@ -130,23 +126,5 @@ public class User implements Serializable{ return "Fehler beim Abrufen der Wettervorhersage: " + e.getMessage(); } } - - - private void saveUsers(List users) { - try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("users.ser"))) { - oos.writeObject(users); - } catch (IOException e) { - e.printStackTrace(); - } - } - - - private List loadUsers() { - try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("users.ser"))) { - return (List) ois.readObject(); - } catch (IOException | ClassNotFoundException e) { - return new ArrayList<>(); - } - } } From cb15352cf301f0756d5bc4b68431dce745b5d9fc Mon Sep 17 00:00:00 2001 From: danai Date: Sat, 15 Jun 2024 17:18:34 +0200 Subject: [PATCH 05/10] Erste Teil der UI Interface --- .../src/main/java/ui/UserInterface.java | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/TravelBuddyApp/src/main/java/ui/UserInterface.java b/TravelBuddyApp/src/main/java/ui/UserInterface.java index cbf4c3a..1b0e921 100644 --- a/TravelBuddyApp/src/main/java/ui/UserInterface.java +++ b/TravelBuddyApp/src/main/java/ui/UserInterface.java @@ -1,5 +1,145 @@ package ui; +import java.util.Scanner; + +import domain.User; +import fassade.UserFassade; + public class UserInterface { + private UserFassade userFacade; + private Scanner scanner; + + public UserInterface() { + + this.userFacade = new UserFassade(); + this.scanner = new Scanner(System.in); + start(); + } + + public void start() { + + boolean exit = false; + System.out.println("\t\t\t Willkommen zur Travel-Buddy-App!"); + System.out.println("\t\t\t --------------------------------"); + while (!exit) { + System.out.println("1. Registrieren"); + System.out.println("2. Einloggen"); + System.out.println("3. Suche Ort"); + System.out.println("4. Plane Reise"); + System.out.println("5. Kurztrip empfehlen"); + System.out.println("6. Beenden"); + System.out.print("Wählen Sie eine Option: "); + + int option = Integer.parseInt(scanner.nextLine()); + System.out.println("\n================================================================================"); + + switch (option) { + case 1: + registrieren(); + System.out.println("\n================================================================================"); + break; + case 2: + einloggen(); + System.out.println("\n================================================================================"); + break; + case 3: + sucheOrt(); + break; + case 4: + planeReise(); + break; + case 5: + kurztripEmpfehlen(); + break; + case 6: + System.out.println("Auf Wiedersehen!"); + return; + default: + System.out.println("Ungültige Option. Bitte wählen Sie eine gültige Option."); + } + } + + } + + private void registrieren() { + System.out.print("Geben Sie einen Benutzernamen ein: "); + String username = scanner.nextLine(); + System.out.print("Geben Sie ein Passwort ein: "); + String password = scanner.nextLine(); + System.out.print("Geben Sie Ihre Heimat-PLZ ein: "); + String plz = scanner.nextLine(); + System.out.print("Geben Sie Ihren Heimatort ein: "); + String ortName = scanner.nextLine(); + System.out.print("Geben Sie den Namen Ihres Autos ein: "); + String autoName = scanner.nextLine(); + System.out.print("Geben Sie den CO2-Ausstoß Ihres Autos (g/km) ein: "); + double co2Ausstoss = Double.parseDouble(scanner.nextLine()); + System.out.print("Geben Sie die Durchschnittsgeschwindigkeit Ihres Autos (km/h) ein: "); + double durchschnittsgeschwindigkeitPKW = Double.parseDouble(scanner.nextLine()); + System.out.print("Geben Sie die Durchschnittsgeschwindigkeit Ihres Fahrrads (km/h) ein: "); + double durchschnittsgeschwindigkeitFahrrad = Double.parseDouble(scanner.nextLine()); + + userFacade.registrieren(username, password, plz, ortName, autoName, co2Ausstoss, + durchschnittsgeschwindigkeitPKW, durchschnittsgeschwindigkeitFahrrad); + System.out.println("\nRegistrierung erfolgreich! Willkommen, " + username + "!"); + } + + private void einloggen() { + System.out.print("Geben Sie Ihren Benutzernamen ein: "); + String username = scanner.nextLine(); + System.out.print("Geben Sie Ihr Passwort ein: "); + String password = scanner.nextLine(); + + User user = userFacade.einloggen(username, password); + if (user != null) { + System.out.println("\nLogin erfolgreich! Willkommen zurück, " + user.getUsername() + "!"); + String wetter = user.zeigeWetterHeimatstandort(); + System.out.println("Aktuelles Wetter in " + user.getHeimatstandort().getOrtName() + ": " + wetter); + + + } else { + System.out.println("\nBenutzername oder Passwort ist falsch:("); + } + } + + private void sucheOrt() { + System.out.print("Geben Sie den Namen des Ortes ein: "); + + // die Ortssuche und Wetteranzeige für die nächsten drei Tage + } + + + + + + private void planeReise() { + System.out.print("Geben Sie Ihre Start-PLZ ein: "); + String startPLZ = scanner.nextLine(); + System.out.print("Geben Sie Ihren Startort ein: "); + String startOrtName = scanner.nextLine(); + System.out.print("Geben Sie Ihre Ziel-PLZ ein: "); + String zielPLZ = scanner.nextLine(); + System.out.print("Geben Sie Ihren Zielort ein: "); + String zielOrtName = scanner.nextLine(); + // die Reiseplanung basierend auf den Eingaben + } + + + + + + private void kurztripEmpfehlen() { + System.out.println("Empfohlener Kurztrip:"); + // die Empfehlung eines Kurztrips + } + + + + + public static void main(String[] args) { + new UserInterface(); + + } + } From 8540dc08e8e5b8134077431c88bef88e374de6e5 Mon Sep 17 00:00:00 2001 From: danai Date: Sat, 15 Jun 2024 17:34:22 +0200 Subject: [PATCH 06/10] Nicht ganze Implementierung --- TravelBuddyApp/dependency-reduced-pom.xml | 124 ++++++++++++++++++ TravelBuddyApp/src/main/java/domain/Auto.java | 30 +++-- TravelBuddyApp/src/main/java/domain/Ort.java | 53 ++++++-- TravelBuddyApp/users.txt | 0 4 files changed, 189 insertions(+), 18 deletions(-) create mode 100644 TravelBuddyApp/dependency-reduced-pom.xml create mode 100644 TravelBuddyApp/users.txt diff --git a/TravelBuddyApp/dependency-reduced-pom.xml b/TravelBuddyApp/dependency-reduced-pom.xml new file mode 100644 index 0000000..75cd7d4 --- /dev/null +++ b/TravelBuddyApp/dependency-reduced-pom.xml @@ -0,0 +1,124 @@ + + + 4.0.0 + hs-mannheim.de + TravelBuddyApp + 0.0.1-SNAPSHOT + + + + maven-compiler-plugin + 3.8.1 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + de.hs_mannheim.informatik.mvn.Main + + + + + + + + org.jacoco + jacoco-maven-plugin + 0.8.12 + + + + prepare-agent + + + + report + test + + report + + + + + + maven-pmd-plugin + 3.22.0 + + + verify + + check + + + + + + org.owasp + dependency-check-maven + 9.2.0 + + + + check + + + + + + + + + org.junit.jupiter + junit-jupiter-api + 5.8.1 + test + + + opentest4j + org.opentest4j + + + junit-platform-commons + org.junit.platform + + + apiguardian-api + org.apiguardian + + + + + org.junit.jupiter + junit-jupiter-engine + 5.8.1 + test + + + junit-platform-engine + org.junit.platform + + + apiguardian-api + org.apiguardian + + + + + + 21 + 21 + UTF-8 + + diff --git a/TravelBuddyApp/src/main/java/domain/Auto.java b/TravelBuddyApp/src/main/java/domain/Auto.java index df73876..819ef57 100644 --- a/TravelBuddyApp/src/main/java/domain/Auto.java +++ b/TravelBuddyApp/src/main/java/domain/Auto.java @@ -3,13 +3,27 @@ package domain; public class Auto { private String name; - private double co2AusstossProKm; + private double co2AusstossProKm; + + public Auto(String name, double co2AusstossProKm) { + this.name = name; + this.co2AusstossProKm = co2AusstossProKm; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getCO2AusstossProKm() { + return co2AusstossProKm; + } + + public void setCO2AusstossProKm(double co2AusstossProKm) { + this.co2AusstossProKm = co2AusstossProKm; + } - - public Auto(String name, double co2AusstossProKm) { - this.name = name; - this.co2AusstossProKm = co2AusstossProKm; - } - - } diff --git a/TravelBuddyApp/src/main/java/domain/Ort.java b/TravelBuddyApp/src/main/java/domain/Ort.java index f04877a..75b13a1 100644 --- a/TravelBuddyApp/src/main/java/domain/Ort.java +++ b/TravelBuddyApp/src/main/java/domain/Ort.java @@ -1,20 +1,53 @@ package domain; +import java.io.IOException; + public class Ort { private String plz; - private String name; - - + private String OrtName; + public Ort(String plz, String name) { - this.plz = plz; - this.name = name; - } - + this.plz = plz; + this.OrtName = name; + } + + public String getPLZ() { + return plz; + } + + public void setPLZ(String plz) { + this.plz = plz; + } + + public String getOrtName() { + return OrtName; + } + + public void setName(String name) { + this.OrtName = name; + } + + @Override + public String toString() { + return OrtName + " (" + plz + ")"; + } + + public String getAktuellesWetter() { + try { + return WetterService.getAktuellesWetter(OrtName); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + return "Fehler beim Abrufen des aktuellen Wetters"; + } + } public String getWettervorhersage() { - - - return "Wettervorhersage"; + try { + return WetterService.getWettervorhersage(OrtName); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + return "Fehler beim Abrufen der Wettervorhersage"; + } } } diff --git a/TravelBuddyApp/users.txt b/TravelBuddyApp/users.txt new file mode 100644 index 0000000..e69de29 From 04669ca0084f81ec453d6366128d41f190a165d2 Mon Sep 17 00:00:00 2001 From: danai Date: Sun, 16 Jun 2024 20:15:21 +0200 Subject: [PATCH 07/10] =?UTF-8?q?Test=20f=C3=BCr=20User=20und=20WetterServ?= =?UTF-8?q?ice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TravelBuddyApp/pom.xml | 31 +++++-- .../src/test/java/domainTest/UserTest.java | 92 +++++++++++++++++++ .../java/domainTest/WetterServiceTest.java | 34 +++++++ 3 files changed, 148 insertions(+), 9 deletions(-) create mode 100644 TravelBuddyApp/src/test/java/domainTest/UserTest.java create mode 100644 TravelBuddyApp/src/test/java/domainTest/WetterServiceTest.java diff --git a/TravelBuddyApp/pom.xml b/TravelBuddyApp/pom.xml index ea06a2e..d0c2d02 100644 --- a/TravelBuddyApp/pom.xml +++ b/TravelBuddyApp/pom.xml @@ -13,15 +13,9 @@ - org.junit.jupiter - junit-jupiter-api - 5.8.1 - test - - - org.junit.jupiter - junit-jupiter-engine - 5.8.1 + junit + junit + 4.13.1 test @@ -34,6 +28,25 @@ commons-codec 1.15 + + org.junit.jupiter + junit-jupiter-engine + 5.9.3 + test + + + org.junit.jupiter + junit-jupiter-api + 5.9.3 + test + + + + org.junit.platform + junit-platform-commons + 1.9.3 + test + diff --git a/TravelBuddyApp/src/test/java/domainTest/UserTest.java b/TravelBuddyApp/src/test/java/domainTest/UserTest.java new file mode 100644 index 0000000..0ce4dcf --- /dev/null +++ b/TravelBuddyApp/src/test/java/domainTest/UserTest.java @@ -0,0 +1,92 @@ +package domainTest; + +import domain.Auto; +import domain.Ort; +import domain.User; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.PrintWriter; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class UserTest { + + private User testUser; + private final String testFilename = "users.txt"; + + @Before + public void setUp() { + Ort ort = new Ort(12345, "Teststadt"); + Auto auto = new Auto("Testauto", 0.12); + testUser = new User("testuser", "password", ort, auto, 80.0, 15.0); + } + + @After + public void tearDown() { + // Löschen der temporären Testdatei nach jedem Test + File file = new File(testFilename); + if (file.exists()) { + file.delete(); + } + } + + @Test + public void testRegistrieren() throws IOException { + // Führe die Registrierung durch + testUser.registrieren(); + + // Überprüfe, ob die Daten korrekt in die Datei geschrieben wurden + try (BufferedReader reader = new BufferedReader(new FileReader(testFilename))) { + String line = reader.readLine(); + assertEquals("testuser," + testUser.getHashedPassword() + ",12345,Teststadt,Testauto,0.12,80.0,15.0", line); + } + } + + + + @Test + public void testEinloggen() throws IOException { + // Vorbereitung der Testdaten in einer temporären Datei + try (PrintWriter writer = new PrintWriter(testFilename)) { + writer.println("testuser," + testUser.getHashedPassword() + ",12345,Teststadt,Testauto,0.12,80.0,15.0"); + } + + // Einloggen des Users + assertTrue(testUser.einloggen()); + + // Überprüfe, ob die Userdaten korrekt gesetzt wurden + assertEquals("Teststadt", testUser.getHeimatstandort().getOrtName()); + assertEquals("Testauto", testUser.getAuto().getName()); + assertEquals(0.12, testUser.getAuto().getCO2AusstossProKm(), 0.001); // Delta für Genauigkeit + assertEquals(80.0, testUser.getDurchschnittsgeschwindigkeitPKW(), 0.001); // Delta für Genauigkeit + assertEquals(15.0, testUser.getDurchschnittsgeschwindigkeitFahrrad(), 0.001); // Delta für Genauigkeit + } + + + + @Test + public void testEinloggen_FalscheDaten() throws IOException { + // Vorbereitung der Testdaten in einer temporären Datei + try (PrintWriter writer = new PrintWriter(testFilename)) { + writer.println("testuser," + testUser.getHashedPassword() + ",12345,Teststadt,Testauto,0.12,80.0,15.0"); + } + + // Ändere Passwort, um ein falsches Einloggen zu erzwingen + testUser.setPassword("wrongpassword"); + + // Einloggen des Users mit falschen Daten + assertFalse(testUser.einloggen()); + } + + + +} diff --git a/TravelBuddyApp/src/test/java/domainTest/WetterServiceTest.java b/TravelBuddyApp/src/test/java/domainTest/WetterServiceTest.java new file mode 100644 index 0000000..3a68113 --- /dev/null +++ b/TravelBuddyApp/src/test/java/domainTest/WetterServiceTest.java @@ -0,0 +1,34 @@ +package domainTest; + +import static org.junit.Assert.assertTrue; +import java.io.IOException; +import org.junit.Test; +import domain.WetterService; + + +public class WetterServiceTest { + + @Test + public void testGetAktuellesWetter() throws IOException, InterruptedException { + String location = "Berlin"; + String expectedWeatherRegex = "Aktuelle Temperatur: \\d+\\.\\d+°C, Wetter: .*"; + + String result = WetterService.getAktuellesWetter(location); + + assertTrue("Expected weather format not found in result", result.matches(expectedWeatherRegex)); + } + + @Test + public void testGetWettervorhersage() throws IOException, InterruptedException { + String location = "Berlin"; + String expectedForecastStart = "3-Tage-Wettervorhersage:"; + + String result = WetterService.getWettervorhersage(location); + + assertTrue("Expected forecast start not found in result", result.startsWith(expectedForecastStart)); + } + + +} + + From a17d823f7ba18d2572cb2489b32e14942b283749 Mon Sep 17 00:00:00 2001 From: danai Date: Mon, 17 Jun 2024 11:29:33 +0200 Subject: [PATCH 08/10] =?UTF-8?q?Nicht=20ganz=20richtige=20Implementierung?= =?UTF-8?q?=20f=C3=BCr=20KurztripEmpfehlung=20Klasse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/domain/Reiseplanung.java | 54 ++++++++ .../src/main/java/fassade/ReiseFassade.java | 60 +++++++++ .../src/main/java/ui/UserInterface.java | 120 ++++++++++++++---- 3 files changed, 208 insertions(+), 26 deletions(-) diff --git a/TravelBuddyApp/src/main/java/domain/Reiseplanung.java b/TravelBuddyApp/src/main/java/domain/Reiseplanung.java index 24a95b9..256cff9 100644 --- a/TravelBuddyApp/src/main/java/domain/Reiseplanung.java +++ b/TravelBuddyApp/src/main/java/domain/Reiseplanung.java @@ -2,4 +2,58 @@ package domain; public class Reiseplanung { + private Ort standort; + private Ort zielort; + private double entfernung; + private double dauerPKW; + private double dauerFahrrad; + private double co2AusstoßPKW; + + public Reiseplanung(Ort standort, Ort zielort, double durchschnittsgeschwindigkeitPKW, + double durchschnittsgeschwindigkeitFahrrad, double co2AusstossProKmPKW) { + this.standort = standort; + this.zielort = zielort; + this.entfernung = berechneEntfernung(standort, zielort); + this.dauerPKW = entfernung / durchschnittsgeschwindigkeitPKW; + this.dauerFahrrad = entfernung / durchschnittsgeschwindigkeitFahrrad; + this.co2AusstoßPKW = entfernung * co2AusstossProKmPKW; + } + + public double berechneEntfernung(Ort standort, Ort zielort) { + double b1 = Math.toRadians(standort.getBreitengrad()); + double b2 = Math.toRadians(zielort.getBreitengrad()); + double l1 = Math.toRadians(standort.getLängengrad()); + double l2 = Math.toRadians(zielort.getLängengrad()); + + return 6378.388 * Math.acos(Math.sin(b1) * Math.sin(b2) + Math.cos(b1) * Math.cos(b2) * Math.cos(l2 - l1)); + } + + + + public double getEntfernung() { + return entfernung; + } + + + + public String berechneReiseDauer(double durchschnittsgeschwindigkeit) { + double dauer = entfernung / durchschnittsgeschwindigkeit; + return String.format("Die Reise dauert ca. %.2f Stunden.", dauer); + } + + public double berechneCO2Ausstoss() { + return co2AusstoßPKW; + } + + public double getDauerPKW() { + return dauerPKW; + } + + public double getDauerFahrrad() { + return dauerFahrrad; + } + + + + } diff --git a/TravelBuddyApp/src/main/java/fassade/ReiseFassade.java b/TravelBuddyApp/src/main/java/fassade/ReiseFassade.java index 3b00e6e..6850cdb 100644 --- a/TravelBuddyApp/src/main/java/fassade/ReiseFassade.java +++ b/TravelBuddyApp/src/main/java/fassade/ReiseFassade.java @@ -1,5 +1,65 @@ package fassade; + +import java.util.List; + +import domain.KurztripEmpfehlung; +import domain.Ort; +import domain.Reiseplanung; +import domain.User; + + public class ReiseFassade { + private Reiseplanung reiseplanung; + private KurztripEmpfehlung kurztripEmpfehlung; + + public ReiseFassade() { + + this.kurztripEmpfehlung = new KurztripEmpfehlung(); + } + + + /*public Reiseplanung planeReise(Ort startort, Ort zielort) { + Reiseplanung reiseplanung = new Reiseplanung(startort, zielort); + reiseplanung.berechneEntfernung(); + reiseplanung.berechneReisedauerPKW(); + reiseplanung.berechneReisedauerFahrrad(); + reiseplanung.berechneCo2Ausstoss(); + return reiseplanung; + }*/ + + + public void setHeimatortFromUser(User user) { + kurztripEmpfehlung.setHeimatort(user.getHeimatstandort()); + } + + + public double berechneEntfernung() { + return reiseplanung.getEntfernung(); + } + + public String berechneReiseDauerPKW() { + return reiseplanung.berechneReiseDauer(reiseplanung.getDauerPKW()); + } + + public String berechneReiseDauerFahrrad() { + return reiseplanung.berechneReiseDauer(reiseplanung.getDauerFahrrad()); + } + + public double berechneCO2AusstossPKW() { + return reiseplanung.berechneCO2Ausstoss(); + } + + + + public List zufallsorteFahrrad(int maxEntfernung) { + return kurztripEmpfehlung.zufallsorteFahrrad(maxEntfernung); + } + + public List zufallsortePKW(int minEntfernung) { + return kurztripEmpfehlung.zufallsortePKW(minEntfernung); + } + + } diff --git a/TravelBuddyApp/src/main/java/ui/UserInterface.java b/TravelBuddyApp/src/main/java/ui/UserInterface.java index 1b0e921..768b759 100644 --- a/TravelBuddyApp/src/main/java/ui/UserInterface.java +++ b/TravelBuddyApp/src/main/java/ui/UserInterface.java @@ -1,17 +1,24 @@ package ui; +import java.util.List; import java.util.Scanner; +import domain.Ort; +import domain.Reiseplanung; import domain.User; +import fassade.ReiseFassade; import fassade.UserFassade; public class UserInterface { private UserFassade userFacade; + private ReiseFassade reiseFacade; + private User user; private Scanner scanner; public UserInterface() { + this.reiseFacade = new ReiseFassade(); this.userFacade = new UserFassade(); this.scanner = new Scanner(System.in); start(); @@ -37,20 +44,28 @@ public class UserInterface { switch (option) { case 1: registrieren(); - System.out.println("\n================================================================================"); + System.out + .println("\n================================================================================"); break; case 2: einloggen(); - System.out.println("\n================================================================================"); + System.out + .println("\n================================================================================"); break; case 3: sucheOrt(); + System.out + .println("\n================================================================================"); break; case 4: planeReise(); + System.out + .println("\n================================================================================"); break; case 5: kurztripEmpfehlen(); + System.out + .println("\n================================================================================"); break; case 6: System.out.println("Auf Wiedersehen!"); @@ -68,7 +83,7 @@ public class UserInterface { System.out.print("Geben Sie ein Passwort ein: "); String password = scanner.nextLine(); System.out.print("Geben Sie Ihre Heimat-PLZ ein: "); - String plz = scanner.nextLine(); + int plz = Integer.parseInt(scanner.nextLine()); System.out.print("Geben Sie Ihren Heimatort ein: "); String ortName = scanner.nextLine(); System.out.print("Geben Sie den Namen Ihres Autos ein: "); @@ -82,7 +97,17 @@ public class UserInterface { userFacade.registrieren(username, password, plz, ortName, autoName, co2Ausstoss, durchschnittsgeschwindigkeitPKW, durchschnittsgeschwindigkeitFahrrad); - System.out.println("\nRegistrierung erfolgreich! Willkommen, " + username + "!"); + + User user = userFacade.einloggen(username, password); // Fügen Sie dies hinzu, um den Benutzer nach der + // Registrierung automatisch einzuloggen + if (user != null) { + this.user = user; + reiseFacade.setHeimatortFromUser(user); + System.out.println("\nRegistrierung und automatischer Login erfolgreich! Willkommen, " + username + "!"); + } else { + System.out.println("\nRegistrierung erfolgreich, aber automatischer Login fehlgeschlagen."); + } + } private void einloggen() { @@ -93,11 +118,11 @@ public class UserInterface { User user = userFacade.einloggen(username, password); if (user != null) { + this.user = user; + reiseFacade.setHeimatortFromUser(user); System.out.println("\nLogin erfolgreich! Willkommen zurück, " + user.getUsername() + "!"); String wetter = user.zeigeWetterHeimatstandort(); System.out.println("Aktuelles Wetter in " + user.getHeimatstandort().getOrtName() + ": " + wetter); - - } else { System.out.println("\nBenutzername oder Passwort ist falsch:("); } @@ -105,38 +130,81 @@ public class UserInterface { private void sucheOrt() { System.out.print("Geben Sie den Namen des Ortes ein: "); - - // die Ortssuche und Wetteranzeige für die nächsten drei Tage + String ortName = scanner.nextLine(); + /* + * List treffer = reiseFacade.sucheOrt(ortName); if (treffer.isEmpty()) { + * System.out.println("Keine Treffer gefunden."); } else { + * System.out.println("Trefferliste:"); for (Ort ort : treffer) { + * System.out.println(ort.getOrtName() + " (PLZ: " + ort.getPLZ() + ")"); String + * wetter = user.zeigeWettervorhersageHeimatstandort(); + * System.out.println("Aktuelles Wetter in " + + * user.getHeimatstandort().getOrtName() + ": " + wetter); } } + */ } - - - - private void planeReise() { System.out.print("Geben Sie Ihre Start-PLZ ein: "); - String startPLZ = scanner.nextLine(); + int startPlz = Integer.parseInt(scanner.nextLine()); System.out.print("Geben Sie Ihren Startort ein: "); String startOrtName = scanner.nextLine(); - System.out.print("Geben Sie Ihre Ziel-PLZ ein: "); - String zielPLZ = scanner.nextLine(); - System.out.print("Geben Sie Ihren Zielort ein: "); + Ort startort = new Ort(startPlz, startOrtName); + System.out.print("Geben Sie die Ziel-PLZ ein: "); + int zielPlz = Integer.parseInt(scanner.nextLine()); + System.out.print("Geben Sie den Zielort ein: "); String zielOrtName = scanner.nextLine(); - // die Reiseplanung basierend auf den Eingaben + Ort zielort = new Ort(zielPlz, zielOrtName); + + /* + * Reiseplanung reise = reiseFacade.planeReise(startort, zielort); + * System.out.println("Reiseplanung:"); System.out.println("Entfernung: " + + * reise.getEntfernung() + " km"); System.out.println("Reisedauer PKW: " + + * reise.getDauerPKW() + " Stunden"); System.out.println("Reisedauer Fahrrad: " + * + reise.getDauerFahrrad() + " Stunden"); + * System.out.println("CO2-Ausstoß PKW: " + reise.berechneCO2Ausstoss() + " g"); + */ } - - - - private void kurztripEmpfehlen() { - System.out.println("Empfohlener Kurztrip:"); - // die Empfehlung eines Kurztrips + if (user != null && user.getHeimatstandort() != null) { + System.out.println("Empfehlung basiert auf Heimatort: " + user.getHeimatstandort().getOrtName()); + + reiseFacade.setHeimatortFromUser(user); + + System.out.print("Wählen Sie ein Transportmittel (Fahrrad/Auto): "); + String transportmittel = scanner.nextLine().trim().toLowerCase(); + + switch (transportmittel) { + case "fahrrad": + List fahrradOrte = reiseFacade.zufallsorteFahrrad(100); + if (fahrradOrte.isEmpty()) { + System.out.println("Keine Orte innerhalb von 100 km gefunden."); + } else { + System.out.println("Folgende Orte wurden für einen Fahrrad-Kurztrip empfohlen:"); + for (Ort ort : fahrradOrte) { + System.out.println("- " + ort.getOrtName() + " (PLZ: " + ort.getPLZ() + ")"); + } + } + break; + case "auto": + List autoOrte = reiseFacade.zufallsortePKW(150); + if (autoOrte.isEmpty()) { + System.out.println("Keine Orte mindestens 150 km entfernt gefunden."); + } else { + System.out.println("Folgende Orte wurden für einen Auto-Kurztrip empfohlen:"); + for (Ort ort : autoOrte) { + System.out.println("- " + ort.getOrtName() + " (PLZ: " + ort.getPLZ() + ")"); + } + } + break; + default: + System.out.println("Ungültige Option. Bitte wählen Sie entweder 'Fahrrad' oder 'Auto'."); + break; + } + } else { + System.out.println("Bitte zuerst einloggen und Heimatort angeben!"); + } } - - - public static void main(String[] args) { new UserInterface(); From 1746ad7bb1abee511a3f720bbf880f2acb8a7790 Mon Sep 17 00:00:00 2001 From: danai Date: Mon, 17 Jun 2024 12:48:17 +0200 Subject: [PATCH 09/10] =?UTF-8?q?Tests=20f=C3=BCr=20KurztripEmpfehlung=20K?= =?UTF-8?q?lasse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/domain/KurztripEmpfehlung.java | 140 ++++++++++++++++++ .../domainTest/KurztripEmpfehlungTest.java | 55 +++++++ 2 files changed, 195 insertions(+) create mode 100644 TravelBuddyApp/src/test/java/domainTest/KurztripEmpfehlungTest.java diff --git a/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java b/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java index 6dc8f7f..a741bb7 100644 --- a/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java +++ b/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java @@ -1,5 +1,145 @@ package domain; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + public class KurztripEmpfehlung { + private List alleOrte; + private Ort heimatort; + + public KurztripEmpfehlung() { + this.alleOrte = ladeAlleOrte(); + this.heimatort = null; + } + + public void setHeimatort(Ort heimatort) { + this.heimatort = heimatort; + } + + + + public List zufallsorteFahrrad(int maxEntfernung) { + List gefilterteOrte = new ArrayList<>(); + + if (heimatort == null) { + System.out.println("Heimatort ist nicht gesetzt."); + return gefilterteOrte; + } + + for (Ort ort : alleOrte) { + double entfernung = berechneEntfernung(heimatort, ort); + if (entfernung <= maxEntfernung) { + gefilterteOrte.add(ort); + } + } + + if (gefilterteOrte.isEmpty()) { + System.out.println("Keine Orte innerhalb der Entfernung von " + maxEntfernung + " km gefunden."); + return gefilterteOrte; + } + + return zufallsorteAuswaehlen(gefilterteOrte, Math.min(3, gefilterteOrte.size())); + } + + + + public List zufallsortePKW(int minEntfernung) { + List gefilterteOrte = new ArrayList<>(); + + if (heimatort == null) { + System.out.println("Heimatort ist nicht gesetzt."); + return gefilterteOrte; + } + + for (Ort ort : alleOrte) { + double entfernung = berechneEntfernung(heimatort, ort); + if (entfernung >= minEntfernung) { + gefilterteOrte.add(ort); + } + } + + if (gefilterteOrte.isEmpty()) { + System.out.println("Keine Orte mindestens " + minEntfernung + " km entfernt gefunden."); + return gefilterteOrte; + } + + return zufallsorteAuswaehlen(gefilterteOrte, Math.min(3, gefilterteOrte.size())); + } + + private List zufallsorteAuswaehlen(List orte, int anzahl) { + List zufallsorte = new ArrayList<>(); + Random random = new Random(); + + int size = orte.size(); + if (size <= 0) { + throw new IllegalArgumentException("Die Liste der Orte ist leer oder hat eine ungültige Größe."); + } + + for (int i = 0; i < anzahl; i++) { + int index = random.nextInt(size); + zufallsorte.add(orte.get(index)); + orte.remove(index); // Sicherstellen, dass Orte nicht doppelt empfohlen werden + size--; // Reduzieren der Größe der Liste nach Entfernen eines Elements + } + + return zufallsorte; + } + + public double berechneEntfernung(Ort standort, Ort zielort) { + double b1 = Math.toRadians(standort.getBreitengrad()); + double b2 = Math.toRadians(zielort.getBreitengrad()); + double l1 = Math.toRadians(standort.getLängengrad()); + double l2 = Math.toRadians(zielort.getLängengrad()); + + double deltaL = l2 - l1; + double cosDeltaL = Math.cos(deltaL); + double acosArgument = Math.sin(b1) * Math.sin(b2) + Math.cos(b1) * Math.cos(b2) * cosDeltaL; + + acosArgument = Math.max(-1.0, Math.min(1.0, acosArgument)); + + double entfernung = 6378.388 * Math.acos(acosArgument); + + return entfernung; + } + + + + + + + private List ladeAlleOrte() { + List alleOrte = new ArrayList<>(); + + String csvFile = "src/main/resources/PLZ.csv"; + String line; + try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) { + while ((line = br.readLine()) != null) { + line = line.replaceAll("\\s+", ""); + String[] data = line.split(";"); + int plz = Integer.parseInt(data[0].replaceAll("\"", "")); + String ortName = data[1].replaceAll("\"", ""); + double breitengrad = Double.parseDouble(data[2].replaceAll("\"", "")); + double laengengrad = Double.parseDouble(data[3].replaceAll("\"", "")); + Ort ort = new Ort(plz, ortName, breitengrad, laengengrad); + alleOrte.add(ort); + } + } catch (IOException e) { + System.err.println("Fehler beim Lesen der Datei: " + e.getMessage()); + e.printStackTrace(); + } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) { + System.err.println("Fehlerhaftes Datenformat in der CSV-Datei: " + e.getMessage()); + e.printStackTrace(); + } + + return alleOrte; + } + + public Object getHeimatort() { + return heimatort; + } } diff --git a/TravelBuddyApp/src/test/java/domainTest/KurztripEmpfehlungTest.java b/TravelBuddyApp/src/test/java/domainTest/KurztripEmpfehlungTest.java new file mode 100644 index 0000000..80701c9 --- /dev/null +++ b/TravelBuddyApp/src/test/java/domainTest/KurztripEmpfehlungTest.java @@ -0,0 +1,55 @@ +package domainTest; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import domain.KurztripEmpfehlung; +import domain.Ort; + +public class KurztripEmpfehlungTest { + + private KurztripEmpfehlung empfehlung; + private Ort berlin; + private Ort dresden; + + @Before + public void setUp() { + empfehlung = new KurztripEmpfehlung(); + berlin = new Ort(10115, "Berlin", 52.5200, 13.4050); + dresden = new Ort(1067, "Dresden", 51.0600336463379, 13.7210676148814); + } + + @Test + public void testSetHeimatort() { + empfehlung.setHeimatort(berlin); + assertEquals(berlin, empfehlung.getHeimatort()); + } + + @Test + public void testZufallsorteFahrrad() { + empfehlung.setHeimatort(berlin); + List orte = empfehlung.zufallsorteFahrrad(100); + assertFalse(orte.isEmpty()); + assertTrue(orte.size() <= 3); + for (Ort ort : orte) { + assertTrue(empfehlung.berechneEntfernung(berlin, ort) <= 100); + } + } + + @Test + public void testZufallsortePKW() { + empfehlung.setHeimatort(berlin); + List orte = empfehlung.zufallsortePKW(150); + assertFalse(orte.isEmpty()); + assertTrue(orte.size() <= 3); + for (Ort ort : orte) { + assertTrue(empfehlung.berechneEntfernung(berlin, ort) >= 150); + } + } +} From 91dcafc607012e5077010e3897a6f27e22085b7d Mon Sep 17 00:00:00 2001 From: danai Date: Mon, 17 Jun 2024 13:09:35 +0200 Subject: [PATCH 10/10] Zwischenstand --- TravelBuddyApp/.classpath | 1 + TravelBuddyApp/dependency-reduced-pom.xml | 40 +++++++++++++----- .../main/java/domain/KurztripEmpfehlung.java | 3 -- TravelBuddyApp/src/main/java/domain/Ort.java | 42 +++++++++++-------- TravelBuddyApp/src/main/java/domain/User.java | 35 ++++++++-------- .../src/main/java/fassade/ReiseFassade.java | 1 + .../src/main/java/fassade/UserFassade.java | 2 +- .../src/main/java/ui/UserInterface.java | 4 +- TravelBuddyApp/src/test/java/UserTest.java | 4 -- TravelBuddyApp/users.txt | 3 ++ 10 files changed, 82 insertions(+), 53 deletions(-) delete mode 100644 TravelBuddyApp/src/test/java/UserTest.java diff --git a/TravelBuddyApp/.classpath b/TravelBuddyApp/.classpath index d2a08eb..373e075 100644 --- a/TravelBuddyApp/.classpath +++ b/TravelBuddyApp/.classpath @@ -36,5 +36,6 @@ + diff --git a/TravelBuddyApp/dependency-reduced-pom.xml b/TravelBuddyApp/dependency-reduced-pom.xml index 75cd7d4..67b2bb9 100644 --- a/TravelBuddyApp/dependency-reduced-pom.xml +++ b/TravelBuddyApp/dependency-reduced-pom.xml @@ -80,17 +80,25 @@ - org.junit.jupiter - junit-jupiter-api - 5.8.1 + junit + junit + 4.13.1 test - opentest4j - org.opentest4j + hamcrest-core + org.hamcrest + + + + org.junit.jupiter + junit-jupiter-engine + 5.9.3 + test + - junit-platform-commons + junit-platform-engine org.junit.platform @@ -101,13 +109,13 @@ org.junit.jupiter - junit-jupiter-engine - 5.8.1 + junit-jupiter-api + 5.9.3 test - junit-platform-engine - org.junit.platform + opentest4j + org.opentest4j apiguardian-api @@ -115,6 +123,18 @@ + + org.junit.platform + junit-platform-commons + 1.9.3 + test + + + apiguardian-api + org.apiguardian + + + 21 diff --git a/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java b/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java index a741bb7..9c2ce76 100644 --- a/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java +++ b/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java @@ -109,9 +109,6 @@ public class KurztripEmpfehlung { - - - private List ladeAlleOrte() { List alleOrte = new ArrayList<>(); diff --git a/TravelBuddyApp/src/main/java/domain/Ort.java b/TravelBuddyApp/src/main/java/domain/Ort.java index 75b13a1..a6ba049 100644 --- a/TravelBuddyApp/src/main/java/domain/Ort.java +++ b/TravelBuddyApp/src/main/java/domain/Ort.java @@ -4,38 +4,46 @@ import java.io.IOException; public class Ort { - private String plz; - private String OrtName; + private int plz; + private String ortName; + private double breitengrad; + private double längengrad; - public Ort(String plz, String name) { + + public Ort(int plz, String name) { this.plz = plz; - this.OrtName = name; + this.ortName = name; } - public String getPLZ() { + + public Ort(int plz, String name, double breitengrad, double längengrad) { + this.plz = plz; + this.ortName = name; + this.breitengrad = breitengrad; + this.längengrad = längengrad; + } + + public int getPLZ() { return plz; } - public void setPLZ(String plz) { - this.plz = plz; - } - public String getOrtName() { - return OrtName; + return ortName; } - public void setName(String name) { - this.OrtName = name; + + + public double getBreitengrad() { + return breitengrad; } - @Override - public String toString() { - return OrtName + " (" + plz + ")"; + public double getLängengrad() { + return längengrad; } public String getAktuellesWetter() { try { - return WetterService.getAktuellesWetter(OrtName); + return WetterService.getAktuellesWetter(ortName); } catch (IOException | InterruptedException e) { e.printStackTrace(); return "Fehler beim Abrufen des aktuellen Wetters"; @@ -44,7 +52,7 @@ public class Ort { public String getWettervorhersage() { try { - return WetterService.getWettervorhersage(OrtName); + return WetterService.getWettervorhersage(ortName); } catch (IOException | InterruptedException e) { e.printStackTrace(); return "Fehler beim Abrufen der Wettervorhersage"; diff --git a/TravelBuddyApp/src/main/java/domain/User.java b/TravelBuddyApp/src/main/java/domain/User.java index fc3daef..b999eff 100644 --- a/TravelBuddyApp/src/main/java/domain/User.java +++ b/TravelBuddyApp/src/main/java/domain/User.java @@ -92,24 +92,25 @@ public class User { } public boolean einloggen() { - - try (BufferedReader reader = new BufferedReader(new FileReader("users.txt"))) { - String line; - while ((line = reader.readLine()) != null) { - String[] parts = line.split(","); - if (parts[0].equals(username) && parts[1].equals(hashedPassword)) { - this.heimatstandort = new Ort(parts[2], parts[3]); - this.auto = new Auto(parts[4], Double.parseDouble(parts[5])); - this.durchschnittsgeschwindigkeitPKW = Double.parseDouble(parts[6]); - this.durchschnittsgeschwindigkeitFahrrad = Double.parseDouble(parts[7]); - return true; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - return false; + try (BufferedReader reader = new BufferedReader(new FileReader("users.txt"))) { + String line; + while ((line = reader.readLine()) != null) { + String[] parts = line.split(","); + if (parts[0].equals(username) && parts[1].equals(hashedPassword)) { + int plz = Integer.parseInt(parts[2]); + this.heimatstandort = new Ort(plz, parts[3]); + this.auto = new Auto(parts[4], Double.parseDouble(parts[5])); + this.durchschnittsgeschwindigkeitPKW = Double.parseDouble(parts[6]); + this.durchschnittsgeschwindigkeitFahrrad = Double.parseDouble(parts[7]); + return true; + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return false; } + public String zeigeWetterHeimatstandort() { try { diff --git a/TravelBuddyApp/src/main/java/fassade/ReiseFassade.java b/TravelBuddyApp/src/main/java/fassade/ReiseFassade.java index 6850cdb..12877de 100644 --- a/TravelBuddyApp/src/main/java/fassade/ReiseFassade.java +++ b/TravelBuddyApp/src/main/java/fassade/ReiseFassade.java @@ -34,6 +34,7 @@ public class ReiseFassade { kurztripEmpfehlung.setHeimatort(user.getHeimatstandort()); } + public double berechneEntfernung() { return reiseplanung.getEntfernung(); diff --git a/TravelBuddyApp/src/main/java/fassade/UserFassade.java b/TravelBuddyApp/src/main/java/fassade/UserFassade.java index a7f5058..043d48f 100644 --- a/TravelBuddyApp/src/main/java/fassade/UserFassade.java +++ b/TravelBuddyApp/src/main/java/fassade/UserFassade.java @@ -6,7 +6,7 @@ import domain.Auto; public class UserFassade { - public User registrieren(String username, String password, String plz, String ortName, String autoName, + public User registrieren(String username, String password, int plz, String ortName, String autoName, double co2AusstossProKm, double durchschnittsgeschwindigkeitPKW, double durchschnittsgeschwindigkeitFahrrad) { Ort heimatstandort = new Ort(plz, ortName); diff --git a/TravelBuddyApp/src/main/java/ui/UserInterface.java b/TravelBuddyApp/src/main/java/ui/UserInterface.java index 768b759..cedd9b3 100644 --- a/TravelBuddyApp/src/main/java/ui/UserInterface.java +++ b/TravelBuddyApp/src/main/java/ui/UserInterface.java @@ -175,7 +175,7 @@ public class UserInterface { switch (transportmittel) { case "fahrrad": - List fahrradOrte = reiseFacade.zufallsorteFahrrad(100); + List fahrradOrte = reiseFacade.zufallsorteFahrrad(10000); if (fahrradOrte.isEmpty()) { System.out.println("Keine Orte innerhalb von 100 km gefunden."); } else { @@ -205,6 +205,8 @@ public class UserInterface { } } + + public static void main(String[] args) { new UserInterface(); diff --git a/TravelBuddyApp/src/test/java/UserTest.java b/TravelBuddyApp/src/test/java/UserTest.java deleted file mode 100644 index 644f0fb..0000000 --- a/TravelBuddyApp/src/test/java/UserTest.java +++ /dev/null @@ -1,4 +0,0 @@ - -public class UserTest { - -} diff --git a/TravelBuddyApp/users.txt b/TravelBuddyApp/users.txt index e69de29..4d31b76 100644 --- a/TravelBuddyApp/users.txt +++ b/TravelBuddyApp/users.txt @@ -0,0 +1,3 @@ +dana,a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3,67105,Schifferstadt,audi,123.0,60.0,30.0 +max,a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3,555,berlin,audi,12.0,23.0,34.0 +tina,a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3,1328,Dresden,audi,12.0,34.0,56.0