Compare commits

..

19 Commits

Author SHA1 Message Date
Caro 5e506beaa2 ausgabe korrigiert 2024-06-18 10:18:37 +02:00
Caro effacbb8ab ort suche korrigiert 2024-06-18 09:51:12 +02:00
Caro afdac68baa korrigierte pom mit main klasse 2024-06-18 08:03:44 +02:00
Bohdana Illiuk 808e0cfa7d TravelBuddyApp/users.txt aktualisiert 2024-06-18 02:58:58 +02:00
Bohdana Illiuk a2c19c6524 README.md aktualisiert 2024-06-18 02:44:50 +02:00
Bohdana Illiuk 94a00179b2 README.md aktualisiert 2024-06-18 02:42:02 +02:00
danai 8de5538563 Vollständige Implementierung 2024-06-18 02:20:52 +02:00
Caro a00963768f Merge 2024-06-18 00:36:47 +02:00
Caro 1bb8d15014 Wetteranzeige Trefferliste 2024-06-17 23:36:05 +02:00
Caro d7a46eef78 überarbeiteter merge, UI erweitert 2024-06-17 22:43:43 +02:00
Caro 1dcecea263 merge ohne Konflikte 2024-06-17 21:39:37 +02:00
Caro 963cdbad2b merge versuch 2024-06-17 13:18:56 +02:00
Caro b54c94fe6e Merge branch 'OrtSuche' into testmerge 2024-06-17 13:13:26 +02:00
danai 91dcafc607 Zwischenstand 2024-06-17 13:09:35 +02:00
Caro f5fa33e182 Test für Reiseplanung 2024-06-16 14:37:23 +02:00
Caro 378fcff162 Fassade aktualisiert 2024-06-16 13:24:28 +02:00
Caro 70836e2325 reiseplanung erweitert 2024-06-15 22:56:45 +02:00
Caro 4c96ee8075 entfernungsberechnung 2024-06-15 15:59:19 +02:00
Caro 0a4faef3d2 Ort Klasse erweitert, Ort Liste einlesen + Ort suche 2024-06-15 14:49:04 +02:00
17 changed files with 478 additions and 178 deletions

View File

@ -1,2 +1,9 @@
# TravelBuddyApp # TravelBuddyApp
( Caroline Ufer und Bohdana Illiuk )
Login-Namen:
1. max, 12345
2. lisa, 1111
3. anna, pass123
4. mike, 54321
5. sven, 112233

View File

@ -36,5 +36,6 @@
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
<classpathentry kind="output" path="target/classes"/> <classpathentry kind="output" path="target/classes"/>
</classpath> </classpath>

View File

@ -80,17 +80,25 @@
</build> </build>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>junit</groupId>
<artifactId>junit-jupiter-api</artifactId> <artifactId>junit</artifactId>
<version>5.8.1</version> <version>4.13.1</version>
<scope>test</scope> <scope>test</scope>
<exclusions> <exclusions>
<exclusion> <exclusion>
<artifactId>opentest4j</artifactId> <artifactId>hamcrest-core</artifactId>
<groupId>org.opentest4j</groupId> <groupId>org.hamcrest</groupId>
</exclusion> </exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.3</version>
<scope>test</scope>
<exclusions>
<exclusion> <exclusion>
<artifactId>junit-platform-commons</artifactId> <artifactId>junit-platform-engine</artifactId>
<groupId>org.junit.platform</groupId> <groupId>org.junit.platform</groupId>
</exclusion> </exclusion>
<exclusion> <exclusion>
@ -101,13 +109,13 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId> <artifactId>junit-jupiter-api</artifactId>
<version>5.8.1</version> <version>5.9.3</version>
<scope>test</scope> <scope>test</scope>
<exclusions> <exclusions>
<exclusion> <exclusion>
<artifactId>junit-platform-engine</artifactId> <artifactId>opentest4j</artifactId>
<groupId>org.junit.platform</groupId> <groupId>org.opentest4j</groupId>
</exclusion> </exclusion>
<exclusion> <exclusion>
<artifactId>apiguardian-api</artifactId> <artifactId>apiguardian-api</artifactId>
@ -115,6 +123,18 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-commons</artifactId>
<version>1.9.3</version>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>apiguardian-api</artifactId>
<groupId>org.apiguardian</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies> </dependencies>
<properties> <properties>
<maven.compiler.target>21</maven.compiler.target> <maven.compiler.target>21</maven.compiler.target>

View File

@ -75,7 +75,7 @@
<transformer <transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass> <mainClass>
de.hs_mannheim.informatik.mvn.Main</mainClass> ui.UserInterface</mainClass>
</transformer> </transformer>
</transformers> </transformers>
</configuration> </configuration>

View File

@ -5,7 +5,9 @@ public class Auto {
private String name; private String name;
private double co2AusstossProKm; private double co2AusstossProKm;
public Auto(String name, double co2AusstossProKm) { public Auto(String name, double co2AusstossProKm) {
this.name = name; this.name = name;
this.co2AusstossProKm = co2AusstossProKm; this.co2AusstossProKm = co2AusstossProKm;
} }

View File

@ -43,7 +43,7 @@ public class KurztripEmpfehlung {
return gefilterteOrte; return gefilterteOrte;
} }
return zufallsorteAuswaehlen(gefilterteOrte, Math.min(3, gefilterteOrte.size())); return zufallsorteAuswaehlen(gefilterteOrte, 3);
} }
@ -68,7 +68,7 @@ public class KurztripEmpfehlung {
return gefilterteOrte; return gefilterteOrte;
} }
return zufallsorteAuswaehlen(gefilterteOrte, Math.min(3, gefilterteOrte.size())); return zufallsorteAuswaehlen(gefilterteOrte, 3);
} }
private List<Ort> zufallsorteAuswaehlen(List<Ort> orte, int anzahl) { private List<Ort> zufallsorteAuswaehlen(List<Ort> orte, int anzahl) {
@ -91,27 +91,20 @@ public class KurztripEmpfehlung {
} }
public double berechneEntfernung(Ort standort, Ort zielort) { 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 b1 = Math.toRadians(standort.getBreitengrad());
double cosDeltaL = Math.cos(deltaL); double b2 = Math.toRadians(zielort.getBreitengrad());
double acosArgument = Math.sin(b1) * Math.sin(b2) + Math.cos(b1) * Math.cos(b2) * cosDeltaL; double l1 = Math.toRadians(standort.getLängengrad());
double l2 = Math.toRadians(zielort.getLängengrad());
acosArgument = Math.max(-1.0, Math.min(1.0, acosArgument)); double entfernung = (6378.388
* Math.acos(Math.sin(b1) * Math.sin(b2) + Math.cos(b1) * Math.cos(b2) * Math.cos(l2 - l1))) * 1.25;
double entfernung = 6378.388 * Math.acos(acosArgument); return entfernung;
return entfernung;
} }
private List<Ort> ladeAlleOrte() { private List<Ort> ladeAlleOrte() {
List<Ort> alleOrte = new ArrayList<>(); List<Ort> alleOrte = new ArrayList<>();

View File

@ -2,40 +2,32 @@ package domain;
import java.io.IOException; import java.io.IOException;
public class Ort { public class Ort {
private String plz; private int plz;
private String OrtName; private String name;
public double breitengrad;
public double längengrad;
public Ort(String plz, String name) { public Ort(int plz, String name) {
this.plz = plz;
this.name = name;
}
public Ort(int plz, String name, double breitengrad, double längengrad) {
this.plz = plz; this.plz = plz;
this.OrtName = name; this.name = name;
this.breitengrad = breitengrad;
this.längengrad = längengrad;
} }
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() { public String getAktuellesWetter() {
try { try {
return WetterService.getAktuellesWetter(OrtName); return WetterService.getAktuellesWetter(name);
} catch (IOException | InterruptedException e) { } catch (IOException | InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
return "Fehler beim Abrufen des aktuellen Wetters"; return "Fehler beim Abrufen des aktuellen Wetters";
@ -43,11 +35,30 @@ public class Ort {
} }
public String getWettervorhersage() { public String getWettervorhersage() {
try { try {
return WetterService.getWettervorhersage(OrtName); return WetterService.getWettervorhersage(name);
} catch (IOException | InterruptedException e) { } catch (IOException | InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
return "Fehler beim Abrufen der Wettervorhersage"; return "Fehler beim Abrufen der Wettervorhersage";
} }
} }
public String getName() {
return name;
}
public int getPLZ() {
return plz;
}
public double getBreitengrad() {
return breitengrad;
}
public double getLängengrad() {
return längengrad;
}
} }

View File

@ -1,5 +1,7 @@
package domain; package domain;
import java.lang.Math;
public class Reiseplanung { public class Reiseplanung {
private Ort standort; private Ort standort;
@ -9,40 +11,49 @@ public class Reiseplanung {
private double dauerFahrrad; private double dauerFahrrad;
private double co2AusstoßPKW; private double co2AusstoßPKW;
public Reiseplanung(Ort standort, Ort zielort, double durchschnittsgeschwindigkeitPKW, public Reiseplanung(User user, Ort zielort) {
double durchschnittsgeschwindigkeitFahrrad, double co2AusstossProKmPKW) { this.standort = user.getHeimatstandort();
this.standort = standort;
this.zielort = zielort; this.zielort = zielort;
this.entfernung = berechneEntfernung(standort, zielort); this.entfernung = berechneEntfernung(standort, zielort);
this.dauerPKW = entfernung / durchschnittsgeschwindigkeitPKW; this.dauerPKW = berechneDauer(user.getDurchschnittsgeschwindigkeitPKW());
this.dauerFahrrad = entfernung / durchschnittsgeschwindigkeitFahrrad; this.dauerFahrrad = berechneDauer(user.getDurchschnittsgeschwindigkeitFahrrad());
this.co2AusstoßPKW = entfernung * co2AusstossProKmPKW; this.co2AusstoßPKW = berechneCO2Ausstoß(user.getAuto());
} }
public double berechneEntfernung(Ort standort, Ort zielort) { public double berechneEntfernung(Ort standort, Ort zielort) {
double b1 = Math.toRadians(standort.getBreitengrad()); double b1 = Math.toRadians(standort.getBreitengrad());
double b2 = Math.toRadians(zielort.getBreitengrad()); double b2 = Math.toRadians(zielort.getBreitengrad());
double l1 = Math.toRadians(standort.getLängengrad()); double l1 = Math.toRadians(standort.getLängengrad());
double l2 = Math.toRadians(zielort.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)); entfernung = (6378.388
} * Math.acos(Math.sin(b1) * Math.sin(b2) + Math.cos(b1) * Math.cos(b2) * Math.cos(l2 - l1))) * 1.25;
public double getEntfernung() {
return entfernung; return entfernung;
} }
// berechnet die ungefähre Dauer zum gewählten Ort
public double berechneDauer(double geschwindigkeit) {
return entfernung / geschwindigkeit;
public String berechneReiseDauer(double durchschnittsgeschwindigkeit) {
double dauer = entfernung / durchschnittsgeschwindigkeit;
return String.format("Die Reise dauert ca. %.2f Stunden.", dauer);
} }
public double berechneCO2Ausstoss() { // berechnet ungefähren CO2 Ausstoß des Autos für eine Strecke
return co2AusstoßPKW; public double berechneCO2Ausstoß(Auto auto) {
return entfernung * auto.getCO2AusstossProKm();
}
public double getEntfernung() {
return Math.round(entfernung*100.0)/100.0;
}
@Override
public String toString() {
return String.format(
"Von %s nach %s\nEntfernung: %.1f km\nReisedauer mit dem PKW: %.1f Stunden\nReisedauer mit dem Fahrrad: %.1f Stunden\nCO2-Ausstoß durch PKW: %.1f kg",
standort.getName(), zielort.getName(), entfernung, dauerPKW, dauerFahrrad, co2AusstoßPKW);
} }
public double getDauerPKW() { public double getDauerPKW() {
@ -53,7 +64,7 @@ public class Reiseplanung {
return dauerFahrrad; return dauerFahrrad;
} }
public double getCO2Ausstoß() {
return co2AusstoßPKW;
}
} }

View File

@ -12,7 +12,7 @@ public class User {
private String username; private String username;
private String hashedPassword; private String hashedPassword;
private Ort heimatstandort; private Ort heimatstandort;
private Auto auto; public Auto auto;
private double durchschnittsgeschwindigkeitPKW; private double durchschnittsgeschwindigkeitPKW;
private double durchschnittsgeschwindigkeitFahrrad; private double durchschnittsgeschwindigkeitFahrrad;
@ -83,7 +83,7 @@ public class User {
try (PrintWriter writer = new PrintWriter(new FileWriter("users.txt", true))) { try (PrintWriter writer = new PrintWriter(new FileWriter("users.txt", true))) {
writer.println(username + "," + hashedPassword + "," + heimatstandort.getPLZ() + "," writer.println(username + "," + hashedPassword + "," + heimatstandort.getPLZ() + ","
+ heimatstandort.getOrtName() + "," + auto.getName() + "," + auto.getCO2AusstossProKm() + "," + heimatstandort.getName() + "," + auto.getName() + "," + auto.getCO2AusstossProKm() + ","
+ durchschnittsgeschwindigkeitPKW + "," + durchschnittsgeschwindigkeitFahrrad); + durchschnittsgeschwindigkeitPKW + "," + durchschnittsgeschwindigkeitFahrrad);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
@ -93,27 +93,29 @@ public class User {
public boolean einloggen() { public boolean einloggen() {
try (BufferedReader reader = new BufferedReader(new FileReader("users.txt"))) { try (BufferedReader reader = new BufferedReader(new FileReader("users.txt"))) {
String line; String line;
while ((line = reader.readLine()) != null) { while ((line = reader.readLine()) != null) {
String[] parts = line.split(","); String[] parts = line.split(",");
if (parts[0].equals(username) && parts[1].equals(hashedPassword)) { if (parts[0].equals(username) && parts[1].equals(hashedPassword)) {
this.heimatstandort = new Ort(parts[2], parts[3]); int plz = Integer.parseInt(parts[2]);
this.auto = new Auto(parts[4], Double.parseDouble(parts[5])); this.heimatstandort = new Ort(plz, parts[3]);
this.durchschnittsgeschwindigkeitPKW = Double.parseDouble(parts[6]); this.auto = new Auto(parts[4], Double.parseDouble(parts[5]));
this.durchschnittsgeschwindigkeitFahrrad = Double.parseDouble(parts[7]); this.durchschnittsgeschwindigkeitPKW = Double.parseDouble(parts[6]);
return true; this.durchschnittsgeschwindigkeitFahrrad = Double.parseDouble(parts[7]);
} return true;
} }
} catch (IOException e) { }
e.printStackTrace(); } catch (IOException e) {
} e.printStackTrace();
return false; }
return false;
} }
public String zeigeWetterHeimatstandort() { public String zeigeWetterHeimatstandort() {
try { try {
return WetterService.getAktuellesWetter(heimatstandort.getOrtName()); return WetterService.getAktuellesWetter(heimatstandort.getName());
} catch (IOException | InterruptedException e) { } catch (IOException | InterruptedException e) {
return "Fehler beim Abrufen des Wetters: " + e.getMessage(); return "Fehler beim Abrufen des Wetters: " + e.getMessage();
} }
@ -121,7 +123,7 @@ public class User {
public String zeigeWettervorhersageHeimatstandort() { public String zeigeWettervorhersageHeimatstandort() {
try { try {
return WetterService.getWettervorhersage(heimatstandort.getOrtName()); return WetterService.getWettervorhersage(heimatstandort.getName());
} catch (IOException | InterruptedException e) { } catch (IOException | InterruptedException e) {
return "Fehler beim Abrufen der Wettervorhersage: " + e.getMessage(); return "Fehler beim Abrufen der Wettervorhersage: " + e.getMessage();
} }

View File

@ -13,6 +13,7 @@ import org.json.JSONObject;
public class WetterService { public class WetterService {
private static final String API_KEY = "fc01dfd47f80659f12512c295e80b201"; private static final String API_KEY = "fc01dfd47f80659f12512c295e80b201";
private static final HttpClient client = HttpClient.newHttpClient(); private static final HttpClient client = HttpClient.newHttpClient();

View File

@ -1,65 +1,169 @@
package fassade; package fassade;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import domain.KurztripEmpfehlung;
import domain.Ort; import domain.Ort;
import domain.Reiseplanung; import domain.Reiseplanung;
import domain.User; import domain.User;
import domain.WetterService;
import java.util.List;
import java.util.Set;
import domain.KurztripEmpfehlung;
public class ReiseFassade { public class ReiseFassade {
private Reiseplanung reiseplanung; private Reiseplanung reiseplanung;
private KurztripEmpfehlung kurztripEmpfehlung; private KurztripEmpfehlung kurztripEmpfehlung;
User user;
List<Ort> alleOrte;
public ReiseFassade() { public ReiseFassade(User user) {
this.kurztripEmpfehlung = new KurztripEmpfehlung(); this.kurztripEmpfehlung = new KurztripEmpfehlung();
alleOrte = ladeAlleOrte();
}
public void setHeimatortFromUser(User user) {
Ort heimatort = user.getHeimatstandort();
this.kurztripEmpfehlung.setHeimatort(heimatort);
}
public List<Ort> ladeAlleOrte() {
List<Ort> 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[] sucheOrt(String suchbegriff) {
Set<Ort> trefferSet = new HashSet<>();
if (suchbegriff.equalsIgnoreCase("alle")) {
trefferSet.addAll(alleOrte);
} else {
for (Ort o : alleOrte) {
if (o.getName().contains(suchbegriff) && trefferSet.size() < 8) {
trefferSet.add(o);
}
}
}
return trefferSet.toArray(new Ort[0]);
} }
/*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) { public String anzeigeTrefferliste(Ort[] trefferliste) {
kurztripEmpfehlung.setHeimatort(user.getHeimatstandort()); StringBuilder ausgabe = new StringBuilder();
int i = 1;
for (Ort o : trefferliste) {
double entfernung = new Reiseplanung(user, o).getEntfernung();
ausgabe.append(i).append(". ").append(o.getName()).append(" (Entfernung: ")
.append(entfernung).append(" km)\n");
String wettervorhersage = getWettervorhersage(o.getName());
ausgabe.append(wettervorhersage).append("\n");
i++;
}
return ausgabe.toString();
} }
public String ortAnzeige(int index, Ort[] trefferliste) {
String anzeige = " ";
anzeige = trefferliste[index - 1].getName() + " " + trefferliste[index - 1].getPLZ() + " "
+ trefferliste[index - 1].getWettervorhersage();
return anzeige;
}
public String getReiseplanung(User user, Ort ziel) {
reiseplanung = new Reiseplanung(user, ziel);
return reiseplanung.toString();
}
public String getAktuellesWetter(String ortName) {
try {
return WetterService.getAktuellesWetter(ortName);
} catch (IOException | InterruptedException e) {
return "Fehler beim Abrufen des Wetters: " + e.getMessage();
}
}
public String getWettervorhersage(String ortName) {
try {
return WetterService.getWettervorhersage(ortName);
} catch (IOException | InterruptedException e) {
return "Fehler beim Abrufen des Wetters: " + e.getMessage();
}
}
public double berechneEntfernung() { public double berechneEntfernung() {
return reiseplanung.getEntfernung(); return reiseplanung.getEntfernung();
} }
public String berechneReiseDauerPKW() { public String berechneReiseDauerPKW() {
return reiseplanung.berechneReiseDauer(reiseplanung.getDauerPKW()); double dauer = reiseplanung.berechneDauer(reiseplanung.getDauerPKW());
return String.format("Die Reise dauert ca. %.2f Stunden.", dauer);
} }
public String berechneReiseDauerFahrrad() { public String berechneReiseDauerFahrrad() {
return reiseplanung.berechneReiseDauer(reiseplanung.getDauerFahrrad()); double dauer = reiseplanung.berechneDauer(reiseplanung.getDauerFahrrad());
return String.format("Die Reise dauert ca. %.2f Stunden.", dauer);
} }
public double berechneCO2AusstossPKW() { public double berechneCO2AusstossPKW() {
return reiseplanung.berechneCO2Ausstoss(); return reiseplanung.getCO2Ausstoß();
} }
public List<Ort> zufallsorteFahrrad(int maxEntfernung) { public List<Ort> zufallsorteFahrrad(int maxEntfernung) {
return kurztripEmpfehlung.zufallsorteFahrrad(maxEntfernung); return kurztripEmpfehlung.zufallsorteFahrrad(maxEntfernung);
} }
public List<Ort> zufallsortePKW(int minEntfernung) {
return kurztripEmpfehlung.zufallsortePKW(minEntfernung);
}
public List<Ort> zufallsortePKW(int minEntfernung) {
return kurztripEmpfehlung.zufallsortePKW(minEntfernung);
}
} }

View File

@ -6,7 +6,8 @@ import domain.Auto;
public class UserFassade { 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 co2AusstossProKm, double durchschnittsgeschwindigkeitPKW,
double durchschnittsgeschwindigkeitFahrrad) { double durchschnittsgeschwindigkeitFahrrad) {
Ort heimatstandort = new Ort(plz, ortName); Ort heimatstandort = new Ort(plz, ortName);
@ -18,6 +19,7 @@ public class UserFassade {
} }
public User einloggen(String username, String password) { public User einloggen(String username, String password) {
User user = new User(username, password, null, null, 0, 0); User user = new User(username, password, null, null, 0, 0);
if (user.einloggen()) { if (user.einloggen()) {
return user; return user;

View File

@ -3,6 +3,7 @@ package ui;
import java.util.List; import java.util.List;
import java.util.Scanner; import java.util.Scanner;
import domain.KurztripEmpfehlung;
import domain.Ort; import domain.Ort;
import domain.Reiseplanung; import domain.Reiseplanung;
import domain.User; import domain.User;
@ -18,7 +19,7 @@ public class UserInterface {
public UserInterface() { public UserInterface() {
this.reiseFacade = new ReiseFassade(); this.reiseFacade = new ReiseFassade(user);
this.userFacade = new UserFassade(); this.userFacade = new UserFassade();
this.scanner = new Scanner(System.in); this.scanner = new Scanner(System.in);
start(); start();
@ -29,6 +30,7 @@ public class UserInterface {
boolean exit = false; boolean exit = false;
System.out.println("\t\t\t Willkommen zur Travel-Buddy-App!"); System.out.println("\t\t\t Willkommen zur Travel-Buddy-App!");
System.out.println("\t\t\t --------------------------------"); System.out.println("\t\t\t --------------------------------");
while (!exit) { while (!exit) {
System.out.println("1. Registrieren"); System.out.println("1. Registrieren");
System.out.println("2. Einloggen"); System.out.println("2. Einloggen");
@ -122,89 +124,151 @@ public class UserInterface {
reiseFacade.setHeimatortFromUser(user); reiseFacade.setHeimatortFromUser(user);
System.out.println("\nLogin erfolgreich! Willkommen zurück, " + user.getUsername() + "!"); System.out.println("\nLogin erfolgreich! Willkommen zurück, " + user.getUsername() + "!");
String wetter = user.zeigeWetterHeimatstandort(); String wetter = user.zeigeWetterHeimatstandort();
System.out.println("Aktuelles Wetter in " + user.getHeimatstandort().getOrtName() + ": " + wetter); System.out.println("Aktuelles Wetter in " + user.getHeimatstandort().getName() + ": " + wetter);
} else { } else {
System.out.println("\nBenutzername oder Passwort ist falsch:("); System.out.println("\nBenutzername oder Passwort ist falsch:(");
} }
} }
private void sucheOrt() { private void sucheOrt() {
System.out.print("Geben Sie den Namen des Ortes ein: "); System.out.print("Geben Sie den Namen des Ortes ein: ");
String ortName = scanner.nextLine(); String ortName = scanner.nextLine();
/*
* List<Ort> treffer = reiseFacade.sucheOrt(ortName); if (treffer.isEmpty()) { // Search for the location
* System.out.println("Keine Treffer gefunden."); } else { Ort[] treffer = reiseFacade.sucheOrt(ortName);
* System.out.println("Trefferliste:"); for (Ort ort : treffer) {
* System.out.println(ort.getOrtName() + " (PLZ: " + ort.getPLZ() + ")"); String if (treffer.length == 0) {
* wetter = user.zeigeWettervorhersageHeimatstandort(); System.out.println("Keine Treffer gefunden.");
* System.out.println("Aktuelles Wetter in " + } else {
* user.getHeimatstandort().getOrtName() + ": " + wetter); } } System.out.println("Trefferliste:");
*/ for (int i = 0; i < treffer.length; i++) {
} Reiseplanung reiseplanung = new Reiseplanung(user, treffer[i]);
System.out.println((i + 1) + ". " + treffer[i].getName() + " (PLZ: " + treffer[i].getPLZ() +
"), Entfernung: " + reiseplanung.getEntfernung() + " km");
String wettervorhersage = reiseFacade.getWettervorhersage(treffer[i].getName());
System.out.println(wettervorhersage);
}
// Display the current weather at the user's home location
String wetter = reiseFacade.getAktuellesWetter(user.getHeimatstandort().getName());
System.out.println("Aktuelles Wetter in " + user.getHeimatstandort().getName() + ": " + wetter);
// Choose a location from the list
System.out.println("Wählen Sie einen Ort aus: ");
System.out.println("Geben Sie 'beenden' ein, um zu beenden");
String input = scanner.nextLine();
if (input.equalsIgnoreCase("beenden")) {
return;
}
try {
int eingabe = Integer.parseInt(input);
if (eingabe < 1 || eingabe > treffer.length) {
System.out.println("Ungültige Auswahl. Bitte versuchen Sie es erneut.");
} else {
System.out.println(reiseFacade.ortAnzeige(eingabe, treffer));
}
} catch (NumberFormatException e) {
System.out.println("Ungültige Eingabe. Bitte geben Sie eine Zahl ein.");
}
}
}
private void planeReise() { private void planeReise() {
System.out.print("Geben Sie Ihre Start-PLZ ein: "); System.out.print("Geben Sie die Ziel-PLZ ein: ");
int startPlz = Integer.parseInt(scanner.nextLine()); int zielPlz = Integer.parseInt(scanner.nextLine());
System.out.print("Geben Sie Ihren Startort ein: "); System.out.print("Geben Sie den Zielort ein: ");
String startOrtName = scanner.nextLine(); String zielOrtName = 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);
/* // Lade alle Orte, um den Ort mit den GPS-Koordinaten zu erhalten
* Reiseplanung reise = reiseFacade.planeReise(startort, zielort); List<Ort> alleOrte = reiseFacade.ladeAlleOrte();
* System.out.println("Reiseplanung:"); System.out.println("Entfernung: " + Ort zielort = null;
* reise.getEntfernung() + " km"); System.out.println("Reisedauer PKW: " + for (Ort ort : alleOrte) {
* reise.getDauerPKW() + " Stunden"); System.out.println("Reisedauer Fahrrad: " if (ort.getPLZ() == zielPlz && ort.getName().equalsIgnoreCase(zielOrtName)) {
* + reise.getDauerFahrrad() + " Stunden"); zielort = ort;
* System.out.println("CO2-Ausstoß PKW: " + reise.berechneCO2Ausstoss() + " g"); break;
*/ }
}
if (zielort != null) {
System.out.println(reiseFacade.getReiseplanung(user, zielort));
} else {
System.out.println("Der Zielort wurde nicht gefunden.");
}
} }
private void kurztripEmpfehlen() { private void kurztripEmpfehlen() {
if (user != null && user.getHeimatstandort() != null) { if (user != null && user.getHeimatstandort() != null) {
System.out.println("Empfehlung basiert auf Heimatort: " + user.getHeimatstandort().getOrtName()); System.out.println("Empfehlung basiert auf Heimatort: " + user.getHeimatstandort().getName());
reiseFacade.setHeimatortFromUser(user); reiseFacade.setHeimatortFromUser(user);
System.out.print("Wählen Sie ein Transportmittel (Fahrrad/Auto): "); System.out.print("Wählen Sie ein Transportmittel (Fahrrad/Auto): ");
String transportmittel = scanner.nextLine().trim().toLowerCase(); String transportmittel = scanner.nextLine().trim().toLowerCase();
List<Ort> empfohleneOrte = null;
switch (transportmittel) { switch (transportmittel) {
case "fahrrad": case "fahrrad":
List<Ort> fahrradOrte = reiseFacade.zufallsorteFahrrad(100); empfohleneOrte = reiseFacade.zufallsorteFahrrad(10000);
if (fahrradOrte.isEmpty()) { //List<Ort> fahrradOrte = reiseFacade.zufallsorteFahrrad(10000);
/*if (fahrradOrte.isEmpty()) {
System.out.println("Keine Orte innerhalb von 100 km gefunden."); System.out.println("Keine Orte innerhalb von 100 km gefunden.");
} else { } else {
System.out.println("Folgende Orte wurden für einen Fahrrad-Kurztrip empfohlen:"); System.out.println("Folgende Orte wurden für einen Fahrrad-Kurztrip empfohlen:");
for (Ort ort : fahrradOrte) { for (Ort ort : fahrradOrte) {
System.out.println("- " + ort.getOrtName() + " (PLZ: " + ort.getPLZ() + ")"); System.out.println("- " + ort.getOrtName() + " (PLZ: " + ort.getPLZ() + ")");
} }
} }*/
break; break;
case "auto": case "auto":
List<Ort> autoOrte = reiseFacade.zufallsortePKW(150); empfohleneOrte = reiseFacade.zufallsortePKW(150);
if (autoOrte.isEmpty()) { //List<Ort> autoOrte = reiseFacade.zufallsortePKW(150);
/*if (autoOrte.isEmpty()) {
System.out.println("Keine Orte mindestens 150 km entfernt gefunden."); System.out.println("Keine Orte mindestens 150 km entfernt gefunden.");
} else { } else {
System.out.println("Folgende Orte wurden für einen Auto-Kurztrip empfohlen:"); System.out.println("Folgende Orte wurden für einen Auto-Kurztrip empfohlen:");
for (Ort ort : autoOrte) { for (Ort ort : autoOrte) {
System.out.println("- " + ort.getOrtName() + " (PLZ: " + ort.getPLZ() + ")"); System.out.println("- " + ort.getOrtName() + " (PLZ: " + ort.getPLZ() + ")");
} }
} }*/
break; break;
default: default:
System.out.println("Ungültige Option. Bitte wählen Sie entweder 'Fahrrad' oder 'Auto'."); System.out.println("Ungültige Option. Bitte wählen Sie entweder 'Fahrrad' oder 'Auto'.");
break; break;
} }
if (!empfohleneOrte.isEmpty()) {
System.out.println("Empfohlene Orte:");
KurztripEmpfehlung kurztripEmpfehlung = new KurztripEmpfehlung();
for (Ort ort : empfohleneOrte) {
double entfernung = kurztripEmpfehlung.berechneEntfernung(user.getHeimatstandort(), ort);
System.out.printf("- %s (PLZ: %d, Entfernung: %.1f km)%n", ort.getName(), ort.getPLZ(), entfernung);
}
} else {
System.out.println("Keine Orte gefunden.");
}
} else { } else {
System.out.println("Bitte zuerst einloggen und Heimatort angeben!"); System.out.println("Bitte zuerst einloggen und Heimatort angeben!");
} }
} }
public static void main(String[] args) { public static void main(String[] args) {
new UserInterface(); new UserInterface();

View File

@ -1,4 +0,0 @@
public class UserTest {
}

View File

@ -0,0 +1,80 @@
package domain;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
public class ReiseplanungTest {
private Auto auto;
private Ort startOrt;
private Ort zielOrt;
private User user;
private Reiseplanung reiseplanung;
@Before
public void setUp() {
auto = new Auto("Brummi", 167.6); // CO2-Ausstoß in g/km
startOrt = new Ort(1067, "Dresden", 13.7210676148814, 51.0600336463379);
user = new User("Karl", "hallo", startOrt, auto, 70, 15); // Durchschnittsgeschwindigkeit PKW und Fahrrad
zielOrt = new Ort(1705, "Freital", 13.6382950999229, 50.9981963286759);
reiseplanung = new Reiseplanung(user, zielOrt);
}
@Test
public void testBerechneEntfernung() {
double result = reiseplanung.berechneEntfernung(startOrt, zielOrt);
// This value needs to be verified and adjusted if necessary
assertEquals(14.2125, result, 0.1);
}
@Test
public void testBerechneDauer() {
double entfernung = 136.5;
double geschwindigkeit = 70; // Durchschnittsgeschwindigkeit in km/h
double result = reiseplanung.berechneDauer(geschwindigkeit);
assertEquals(1.95, result, 0.01);
}
@Test
public void testBerechneCO2Ausstoß() {
double entfernung = 73.8;
double result = reiseplanung.berechneCO2Ausstoß(auto);
assertEquals(12368.88, result, 0.01);
}
@Test
public void testGetEntfernung() {
assertEquals(14.2125, reiseplanung.getEntfernung(), 0.1);
}
@Test
public void testGetDauerPKW() {
double geschwindigkeit = user.getDurchschnittsgeschwindigkeitPKW();
double erwarteteDauer = 14.2125 / geschwindigkeit;
assertEquals(erwarteteDauer, reiseplanung.getDauerPKW(), 0.1);
}
@Test
public void testGetDauerFahrrad() {
double geschwindigkeit = user.getDurchschnittsgeschwindigkeitFahrrad();
double erwarteteDauer = 14.2125 / geschwindigkeit;
assertEquals(erwarteteDauer, reiseplanung.getDauerFahrrad(), 0.1);
}
@Test
public void testGetCO2Ausstoß() {
double erwarteterCO2Ausstoß = 14.2125 * auto.getCO2AusstossProKm();
assertEquals(erwarteterCO2Ausstoß, reiseplanung.getCO2Ausstoß(), 0.1);
}
@Test
public void testToString() {
String expected = "Von " + startOrt.getName() + " Nach " + zielOrt.getName() +
"\nEntfernung: " + reiseplanung.getEntfernung() +
"\nReisedauer mit dem PKW: " + reiseplanung.getDauerPKW() +
"\nReisedauer mit dem Fahrrad: " + reiseplanung.getDauerFahrrad() +
"\nCO2-Ausstoß durch PKW: " + reiseplanung.getCO2Ausstoß();
assertEquals(expected, reiseplanung.toString());
}
}

View File

@ -64,7 +64,7 @@ public class UserTest {
assertTrue(testUser.einloggen()); assertTrue(testUser.einloggen());
// Überprüfe, ob die Userdaten korrekt gesetzt wurden // Überprüfe, ob die Userdaten korrekt gesetzt wurden
assertEquals("Teststadt", testUser.getHeimatstandort().getOrtName()); assertEquals("Teststadt", testUser.getHeimatstandort().getName());
assertEquals("Testauto", testUser.getAuto().getName()); assertEquals("Testauto", testUser.getAuto().getName());
assertEquals(0.12, testUser.getAuto().getCO2AusstossProKm(), 0.001); // Delta für Genauigkeit assertEquals(0.12, testUser.getAuto().getCO2AusstossProKm(), 0.001); // Delta für Genauigkeit
assertEquals(80.0, testUser.getDurchschnittsgeschwindigkeitPKW(), 0.001); // Delta für Genauigkeit assertEquals(80.0, testUser.getDurchschnittsgeschwindigkeitPKW(), 0.001); // Delta für Genauigkeit

View File

@ -0,0 +1,6 @@
max,5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5,10115,Berlin,VW,120.0,60.0,20.0
lisa,0ffe1abd1a08215353c233d6e009613e95eec4253832a761af28ff37ac5a150c,80331,Münnchen,auto,120.0,60.0,30.0
anna,9b8769a4a742959a2d0298c36fb70623f2dfacda8436237df08d8dfd5b37374c,76131,Karlsruhe,auto1,110.0,60.0,20.0
mike,20f3765880a5c269b747e1e906054a4b4a3a991259f1e16b5dde4742cec2319a,68159,Mannheim,auti2,130.0,50.0,20.0
sven,e0bc60c82713f64ef8a57c0c40d02ce24fd0141d5cc3086259c19b1e62a62bea,69115,Heidelberg,auto3,120.0,60.0,30.0