diff --git a/TravelBuddyApp/dependency-reduced-pom.xml b/TravelBuddyApp/dependency-reduced-pom.xml
new file mode 100644
index 0000000..67b2bb9
--- /dev/null
+++ b/TravelBuddyApp/dependency-reduced-pom.xml
@@ -0,0 +1,144 @@
+
+
+ 4.0.0
+ hs-mannheim.de
+ TravelBuddyApp
+ 0.0.1-SNAPSHOT
+
+
+
+ maven-compiler-plugin
+ 3.8.1
+
+
+ ${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
+
+
+
+
+
+
+
+
+ junit
+ junit
+ 4.13.1
+ test
+
+
+ hamcrest-core
+ org.hamcrest
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ 5.9.3
+ test
+
+
+ junit-platform-engine
+ org.junit.platform
+
+
+ apiguardian-api
+ org.apiguardian
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.9.3
+ test
+
+
+ opentest4j
+ org.opentest4j
+
+
+ apiguardian-api
+ org.apiguardian
+
+
+
+
+ org.junit.platform
+ junit-platform-commons
+ 1.9.3
+ test
+
+
+ apiguardian-api
+ org.apiguardian
+
+
+
+
+
+ 21
+ 21
+ UTF-8
+
+
diff --git a/TravelBuddyApp/pom.xml b/TravelBuddyApp/pom.xml
index 07fc4aa..d0c2d02 100644
--- a/TravelBuddyApp/pom.xml
+++ b/TravelBuddyApp/pom.xml
@@ -5,7 +5,7 @@
hs-mannheim.de
TravelBuddyApp
0.0.1-SNAPSHOT
-
+
UTF-8
21
@@ -13,15 +13,38 @@
- org.junit.jupiter
- junit-jupiter-api
- 5.8.1
+ junit
+ junit
+ 4.13.1
test
+
+ org.json
+ json
+ 20210307
+
+
+ commons-codec
+ commons-codec
+ 1.15
+
org.junit.jupiter
junit-jupiter-engine
- 5.8.1
+ 5.9.3
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.9.3
+ test
+
+
+
+ org.junit.platform
+ junit-platform-commons
+ 1.9.3
test
@@ -84,6 +107,7 @@
org.apache.maven.plugins
maven-pmd-plugin
3.22.0
+
verify
diff --git a/TravelBuddyApp/src/main/java/domain/Auto.java b/TravelBuddyApp/src/main/java/domain/Auto.java
index ce988ce..cb034b2 100644
--- a/TravelBuddyApp/src/main/java/domain/Auto.java
+++ b/TravelBuddyApp/src/main/java/domain/Auto.java
@@ -3,17 +3,28 @@ 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 double getCO2AusstoßProKm() {
- return 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;
+ }
+
}
diff --git a/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java b/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java
index 6dc8f7f..549e725 100644
--- a/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java
+++ b/TravelBuddyApp/src/main/java/domain/KurztripEmpfehlung.java
@@ -1,5 +1,147 @@
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 {
+ User user;
+ private List alleOrte;
+ private Ort heimatort;
+
+ public KurztripEmpfehlung(User user) {
+ 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) {
+ Reiseplanung reise = new Reiseplanung(user, ort);
+ double entfernung = reise.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) {
+ Reiseplanung reise = new Reiseplanung(user, ort);
+ double entfernung = reise.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);
+ ort.breitengrad = breitengrad;
+ ort.längengrad = 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 Ort getHeimatort() {
+ return heimatort;
+ }
}
diff --git a/TravelBuddyApp/src/main/java/domain/Ort.java b/TravelBuddyApp/src/main/java/domain/Ort.java
index 8938ea8..392215f 100644
--- a/TravelBuddyApp/src/main/java/domain/Ort.java
+++ b/TravelBuddyApp/src/main/java/domain/Ort.java
@@ -1,26 +1,39 @@
package domain;
-
-import java.util.Set;
+
+import java.io.IOException;
+
public class Ort {
- private int plz;
+ private int plz;
private String name;
- private double breitengrad;
- private double längengrad;
+ double breitengrad;
+ double längengrad;
-
- public Ort(int plz, String name, double breitengrad, double längengrad) {
+ public Ort(int plz, String name) {
this.plz = plz;
this.name = name;
this.breitengrad = breitengrad;
this.längengrad = längengrad;
- }
+ }
+ public String getAktuellesWetter() {
+ try {
+ return WetterService.getAktuellesWetter(name);
+ } catch (IOException | InterruptedException e) {
+ e.printStackTrace();
+ return "Fehler beim Abrufen des aktuellen Wetters";
+ }
+ }
public String getWettervorhersage() {
-
- return "Wettervorhersage";
+
+ try {
+ return WetterService.getWettervorhersage(name);
+ } catch (IOException | InterruptedException e) {
+ e.printStackTrace();
+ return "Fehler beim Abrufen der Wettervorhersage";
+ }
}
diff --git a/TravelBuddyApp/src/main/java/domain/Reiseplanung.java b/TravelBuddyApp/src/main/java/domain/Reiseplanung.java
index 9354cf1..af540e0 100644
--- a/TravelBuddyApp/src/main/java/domain/Reiseplanung.java
+++ b/TravelBuddyApp/src/main/java/domain/Reiseplanung.java
@@ -8,7 +8,7 @@ public class Reiseplanung {
private double entfernung;
private double dauerPKW;
private double dauerFahrrad;
- private double co2AusstoßPKW;
+ private double co2AusstoßPKW;
public Reiseplanung(User user, Ort zielort) {
@@ -17,8 +17,8 @@ public class Reiseplanung {
Auto auto = user.getAuto();
standort = user.getHeimatstandort();
berechneEntfernung(this.standort, this.zielort);
- dauerPKW = berechneDauer(entfernung, user.getDurchschnittsgeschwindigkeitPKW());
- dauerFahrrad = berechneDauer(entfernung, user.getDurchschnittsgeschwindigkeitFahrrad());
+ dauerPKW = berechneDauer(user.getDurchschnittsgeschwindigkeitPKW());
+ dauerFahrrad = berechneDauer(user.getDurchschnittsgeschwindigkeitFahrrad());
berechneCO2Ausstoß(this.entfernung, auto);
}
@@ -35,23 +35,50 @@ public class Reiseplanung {
}
//berechnet die ungefähre Dauer zum gewählten Ort
- public double berechneDauer(double entfernung, double geschwindigkeit) {
+ public double berechneDauer(double geschwindigkeit) {
return entfernung/geschwindigkeit;
}
//berechnet ungefähren CO2 Ausstoß des Autos für eine Strecke
public double berechneCO2Ausstoß(double entfernung, Auto auto) {
- co2AusstoßPKW = entfernung * auto.getCO2AusstoßProKm();
+ co2AusstoßPKW = entfernung * auto.getCO2AusstossProKm();
return co2AusstoßPKW;
}
- public double getEntferung() {
+ public double getEntfernung() {
return entfernung;
}
public String toString() {
return "Von " + standort + " Nach " + zielort + "\nEntfernung: " + entfernung + "\nReisedauer mit dem PKW: " + dauerPKW + "\nReiserdauer mit dem Fahrrad: " + dauerFahrrad + "\nCO2-Ausstoß durch PKW: " + 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 String berechneReiseDauer(double durchschnittsgeschwindigkeit) {
+// double dauer = entfernung / durchschnittsgeschwindigkeit;
+// return String.format("Die Reise dauert ca. %.2f Stunden.", dauer);
+// }
+
+ public double getDauerPKW() {
+ return dauerPKW;
}
+
+ public double getDauerFahrrad() {
+ return dauerFahrrad;
+ }
+
+ public double getCO2Ausstoß() {
+ return co2AusstoßPKW;
+ }
}
diff --git a/TravelBuddyApp/src/main/java/domain/User.java b/TravelBuddyApp/src/main/java/domain/User.java
index 8f0e4ff..e995b6a 100644
--- a/TravelBuddyApp/src/main/java/domain/User.java
+++ b/TravelBuddyApp/src/main/java/domain/User.java
@@ -1,9 +1,16 @@
package domain;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import org.apache.commons.codec.digest.DigestUtils;
+
public class User {
private String username;
- private String password;
+ private String hashedPassword;
private Ort heimatstandort;
public Auto auto;
private double durchschnittsgeschwindigkeitPKW;
@@ -13,38 +20,112 @@ public class User {
double durchschnittsgeschwindigkeitFahrrad) {
this.username = username;
- this.password = password;
+ this.hashedPassword = hashPassword(password);
this.heimatstandort = heimatstandort;
this.auto = auto;
this.durchschnittsgeschwindigkeitPKW = durchschnittsgeschwindigkeitPKW;
this.durchschnittsgeschwindigkeitFahrrad = durchschnittsgeschwindigkeitFahrrad;
}
- public void registrieren() {
- // Implementierung der Registrierung
+ private String hashPassword(String password) {
+ return DigestUtils.sha256Hex(password); // Hash-Funktion verwenden
}
- public void einloggen() {
- // Implementierung des Logins
+ public String getUsername() {
+ return username;
}
- public void zeigeWetterHeimatstandort() {
- // Implementierung der Wetteranzeige
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getHashedPassword() {
+ return hashedPassword;
+ }
+
+ public void setPassword(String password) {
+ this.hashedPassword = hashPassword(password); // Passwort hashen beim Setzen
+ }
+
+ 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 Ort getHeimatstandort() {
- return heimatstandort;
+
+ public void setDurchschnittsgeschwindigkeitFahrrad(double durchschnittsgeschwindigkeitFahrrad) {
+ this.durchschnittsgeschwindigkeitFahrrad = durchschnittsgeschwindigkeitFahrrad;
+ }
+
+ public void registrieren() {
+
+ try (PrintWriter writer = new PrintWriter(new FileWriter("users.txt", true))) {
+ writer.println(username + "," + hashedPassword + "," + heimatstandort.getPLZ() + ","
+ + heimatstandort.getName() + "," + 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(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 Auto getAuto() {
- return auto;
+
+ public String zeigeWetterHeimatstandort() {
+ try {
+ return WetterService.getAktuellesWetter(heimatstandort.getName());
+ } catch (IOException | InterruptedException e) {
+ return "Fehler beim Abrufen des Wetters: " + e.getMessage();
+ }
}
+
+ public String zeigeWettervorhersageHeimatstandort() {
+ try {
+ return WetterService.getWettervorhersage(heimatstandort.getName());
+ } catch (IOException | InterruptedException e) {
+ return "Fehler beim Abrufen der Wettervorhersage: " + e.getMessage();
+ }
+ }
+
}
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();
+ }
}
diff --git a/TravelBuddyApp/src/main/java/fassade/ReiseFassade.java b/TravelBuddyApp/src/main/java/fassade/ReiseFassade.java
index 000ec7e..1fc5638 100644
--- a/TravelBuddyApp/src/main/java/fassade/ReiseFassade.java
+++ b/TravelBuddyApp/src/main/java/fassade/ReiseFassade.java
@@ -1,25 +1,30 @@
package fassade;
-
+
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
-
import domain.Ort;
import domain.Reiseplanung;
import domain.User;
+import java.util.List;
+import domain.KurztripEmpfehlung;
public class ReiseFassade {
+
+private Reiseplanung reiseplanung;
+private KurztripEmpfehlung kurztripEmpfehlung;
User user;
private Set orte;
- public ReiseFassade(User user) throws FileNotFoundException {
+ public ReiseFassade(User user) {
orte = new HashSet<>();
-// orteLaden();
+ // this.kurztripEmpfehlung = new KurztripEmpfehlung();
+
}
// //lädt Datei aus rescources ein und speichert Orte in HashSet ab
@@ -59,11 +64,56 @@ public class ReiseFassade {
}
for(Ort o : trefferliste) {
- ausgabe = ausgabe + o.getName() + " Entfernung: " + new Reiseplanung(user, o).getEntferung() + "\n";
+ ausgabe = ausgabe + o.getName() + " Entfernung: " + new Reiseplanung(user, o).getEntfernung() + "\n";
}
return ausgabe;
}
+
+
+
+ /*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() {
+ double dauer = reiseplanung.berechneDauer(reiseplanung.getDauerPKW());
+ return String.format("Die Reise dauert ca. %.2f Stunden.", dauer);
+ }
+
+ public String berechneReiseDauerFahrrad() {
+ double dauer = reiseplanung.berechneDauer(reiseplanung.getDauerFahrrad());
+ return String.format("Die Reise dauert ca. %.2f Stunden.", dauer);
+ }
+
+ public double berechneCO2AusstossPKW() {
+ return reiseplanung.getCO2Ausstoß();
+ }
+
+
+ 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/fassade/UserFassade.java b/TravelBuddyApp/src/main/java/fassade/UserFassade.java
index 1e6ccba..043d48f 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, int 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());
+ }
+ }
+
}
diff --git a/TravelBuddyApp/src/main/java/ui/UserInterface.java b/TravelBuddyApp/src/main/java/ui/UserInterface.java
index cbf4c3a..cf6db13 100644
--- a/TravelBuddyApp/src/main/java/ui/UserInterface.java
+++ b/TravelBuddyApp/src/main/java/ui/UserInterface.java
@@ -1,5 +1,215 @@
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(user);
+ 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();
+ 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!");
+ 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: ");
+ 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: ");
+ 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);
+
+ 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() {
+ 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) {
+ 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().getName() + ": " + wetter);
+ } else {
+ System.out.println("\nBenutzername oder Passwort ist falsch:(");
+ }
+ }
+
+ private void sucheOrt() {
+ System.out.print("Geben Sie den Namen des Ortes ein: ");
+ 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: ");
+ int startPlz = Integer.parseInt(scanner.nextLine());
+ System.out.print("Geben Sie Ihren Startort ein: ");
+ String startOrtName = scanner.nextLine();
+ 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();
+ 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() {
+ if (user != null && user.getHeimatstandort() != null) {
+ System.out.println("Empfehlung basiert auf Heimatort: " + user.getHeimatstandort().getName());
+
+ 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(10000);
+ 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.getName() + " (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.getName() + " (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();
+
+ }
+
}
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/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);
+ }
+ }
+}
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));
+ }
+
+
+}
+
+
diff --git a/TravelBuddyApp/users.txt b/TravelBuddyApp/users.txt
new file mode 100644
index 0000000..4d31b76
--- /dev/null
+++ 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