From c261652ce60b8a16b8f3e2766c6e55af53537911 Mon Sep 17 00:00:00 2001 From: Georg-Notebook Date: Sat, 17 Apr 2021 01:13:47 +0200 Subject: [PATCH] Export/Import in Json --- src/tourplaner/business/Exporter.java | 47 +++++++++--- src/tourplaner/business/JsonHelper.java | 13 ++++ src/tourplaner/business/TourPlaner.java | 80 ++++++++++++++++++++- src/tourplaner/data/DbConnect.java | 17 ++++- src/tourplaner/object/Data.java | 21 ------ src/tourplaner/object/Tour.java | 10 +++ src/tourplaner/tourplaner.fxml | 2 + src/tourplaner/ui/AlertHelper.java | 21 ++++++ src/tourplaner/ui/TourplanerController.java | 17 +++++ src/tourplaner/viewmodels/ViewModel.java | 37 +++++++++- 10 files changed, 230 insertions(+), 35 deletions(-) delete mode 100644 src/tourplaner/object/Data.java diff --git a/src/tourplaner/business/Exporter.java b/src/tourplaner/business/Exporter.java index b1d81e0..74ab5c2 100644 --- a/src/tourplaner/business/Exporter.java +++ b/src/tourplaner/business/Exporter.java @@ -1,25 +1,54 @@ package tourplaner.business; -import tourplaner.object.Data; +import tourplaner.data.DbConnect; +import tourplaner.object.Log; +import tourplaner.object.Tour; -import java.io.FileWriter; -import java.io.IOException; +import java.io.*; +import java.util.ArrayList; +/** + * Ist für das importieren und Exportieren der Daten zuständig + */ public class Exporter { - private Data data; + private ArrayList touren; private String path; - public Exporter(Data data, String path) { - this.data = data; + /** + * Erstellt den Exporter mit dem gegebenen Path + * @param path Gegebener Path + */ + public Exporter(String path) { this.path = path; } + /** + * Führt den Export aus -> Holt daten, erstellt file + * @throws IOException Fehler beim File erstellen + */ public void doExport() throws IOException { - JsonHelper.getJsonFromObj(data, new FileWriter(path)); + ArrayList data = new DbConnect().getAllTouren(); + FileWriter fileWriter = new FileWriter(path + ".json"); + JsonHelper.getJsonFromObj(data, fileWriter); + BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); + bufferedWriter.close(); } - public void doImport(){ - + /** + * Führt den Imput aus -> File holen, Daten in db erstellen + * @throws FileNotFoundException Fehler beim File öffnen + */ + public void doImport() throws FileNotFoundException { + this.touren = JsonHelper.getTourenFromJson(new FileReader(this.path)); + DbConnect dbConnect = new DbConnect(); + dbConnect.delAllData(); + for (Tour tour:this.touren) { + dbConnect.addTour(tour); + ArrayList logs = tour.getLogs(); + for (Log log:logs) { + dbConnect.addLog(tour.getName(), log); + } + } } } diff --git a/src/tourplaner/business/JsonHelper.java b/src/tourplaner/business/JsonHelper.java index 9c618b5..c12132b 100644 --- a/src/tourplaner/business/JsonHelper.java +++ b/src/tourplaner/business/JsonHelper.java @@ -2,8 +2,12 @@ package tourplaner.business; import com.google.gson.Gson; import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; +import tourplaner.object.Tour; +import java.io.FileReader; import java.io.FileWriter; +import java.util.ArrayList; /** * Hilfsklasse für Json (Gson) @@ -48,6 +52,15 @@ public class JsonHelper { new Gson().toJson(obj, writer); } + /** + * Wandelt ein Json file in ein Data Objekt um + * @param reader File aus dem gelesen wird + * @return Data objekt das gelesen wurde + */ + public static ArrayList getTourenFromJson(FileReader reader){ + return new Gson().fromJson(reader, new TypeToken>() {}.getType()); + } + /** * Json String to JsonObject * @param json Json string diff --git a/src/tourplaner/business/TourPlaner.java b/src/tourplaner/business/TourPlaner.java index 2d9fcad..97b0742 100644 --- a/src/tourplaner/business/TourPlaner.java +++ b/src/tourplaner/business/TourPlaner.java @@ -7,6 +7,7 @@ import tourplaner.object.Tour; import java.awt.*; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; @@ -46,6 +47,11 @@ public class TourPlaner{ return new DbConnect().editTour(oldname, tour); } + /** + * Löscht eine Tour + * @param tourname Tourname + * @return false bei error + */ public static boolean delTour(String tourname){ FileHelper.delFile(new File(getImagePath(tourname))); FileHelper.delFile(new File(getImagePdfPath(tourname))); @@ -63,51 +69,119 @@ public class TourPlaner{ return new DbConnect().addTour(newTour); } + /** + * Holt das Gui Bild + * @param tourname Name der Tour + * @return Das Bild + * @throws IOException Error beim Bild holen + */ public static Image getImage(String tourname) throws IOException { return FileHelper.getImage(new File(getImagePath(tourname))); } + /** + * Path zu dem Bild für die GUI + * @param tourname Name der Tour + * @return Path zu dem Bild für die GUI + */ public static String getImagePath(String tourname){ return ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "path") + tourname + ".jpg"; } + + /** + * Path zu dem Bild für die PDF + * @param tourname Name der Tour + * @return Path zu dem Bild für die PDF + */ public static String getImagePdfPath(String tourname){ return ConfigHelper.getIniString(ConfigHelper.getStandartConfig(), "map", "path") + tourname + "_pdf.jpg"; } + /** + * Öffnet ein Bild einer Tour + * @param tourname Tourname + */ public static void openImage(String tourname){ FileHelper.openDefault(getImagePath(tourname)); } + /** + * Holt alle Logs einer Tour + * @param tourname Tourname + * @return Alle Logs der Tour + */ public static ArrayList getLogs(String tourname){ return new DbConnect().getLogs(tourname); } + /** + * Führt einen Rport aus + * @param tourname Name der Tour die gereportet wird + */ public static void doReport(String tourname){ Reporter.createTourReport(tourname); } + /** + * Holt eine Tour + * @param tourname Name der zu holenden Tour + * @return Tour die geholt werden soll + */ public static Tour getTour(String tourname){ return new DbConnect().getTour(tourname); } + /** + * Fügt ein Log hinzu + * @param tourname Name der Tour + * @param log Neues Log + * @return false bei error + */ public static boolean addLog(String tourname, Log log){ if(Double.isInfinite(log.getAvgspeed())) log.setAvgspeed(-1.0); return new DbConnect().addLog(tourname, log); } + /** + * Löscht ein Log + * @param tourname Name der Tour + * @param id Id des Logs + * @return false bei error + */ public static boolean delLog(String tourname, String id){ return new DbConnect().delLog(tourname, id); } + /** + * Editiert ein Log + * @param tourname Name der Tour + * @param log Neues Log + * @return false bei error + */ public static boolean editLog(String tourname, Log log){ if(Double.isInfinite(log.getAvgspeed())) log.setAvgspeed(-1.0); return new DbConnect().editLog(tourname, log); } + /** + * Exportiert die Daten + * @param path Path zu den Daten + * @throws IOException Fehler beim schreiben der Daten + */ + public static void exportData(String path) throws IOException { + Exporter exporter = new Exporter(path); + exporter.doExport(); + FileHelper.openDefault(path); + } - public static String getMapJson(String start, String ziel){ - // TODO: 14.04.2021 Map Quest - return start + " " + ziel; + /** + * Importiert daten + * @param path Path zu den Daten + * @throws FileNotFoundException File konnte nicht geöffnet werden + */ + public static void importData(String path) throws FileNotFoundException { + Exporter exporter = new Exporter(path); + exporter.doImport(); } } diff --git a/src/tourplaner/data/DbConnect.java b/src/tourplaner/data/DbConnect.java index 2a1b9bb..fff971a 100644 --- a/src/tourplaner/data/DbConnect.java +++ b/src/tourplaner/data/DbConnect.java @@ -84,6 +84,21 @@ public class DbConnect { return !result.contains(false); } + public boolean delAllData(){ + ArrayList result = new ArrayList<>(); + result.add(delAllLog()); + result.add(delAllTour()); + return !result.contains(false); + } + + private boolean delAllTour(){ + return PostgresHelper.executeUpdate("DELETE FROM public.tour"); + } + + private boolean delAllLog(){ + return PostgresHelper.executeUpdate("DELETE FROM public.log"); + } + public ArrayList getLogs(String tourname){ this.c = PostgresHelper.con(); @@ -165,7 +180,7 @@ public class DbConnect { dauer = rs.getDouble("dauer"); strecke = rs.getDouble("strecke"); if (!tourname.isEmpty()) { - touren.add(new Tour(tourname, dauer + "", mapjson, strecke, start, ziel)); + touren.add(new Tour(tourname, dauer + "", mapjson, strecke, start, ziel, getLogs(tourname))); }else { return null; } diff --git a/src/tourplaner/object/Data.java b/src/tourplaner/object/Data.java deleted file mode 100644 index fcd960d..0000000 --- a/src/tourplaner/object/Data.java +++ /dev/null @@ -1,21 +0,0 @@ -package tourplaner.object; - -import java.util.ArrayList; - -public class Data { - private ArrayList logs; - private ArrayList touren; - - public Data(ArrayList logs, ArrayList touren){ - this.logs = logs; - this.touren = touren; - } - - public ArrayList getLogs() { - return logs; - } - - public ArrayList getTouren() { - return touren; - } -} diff --git a/src/tourplaner/object/Tour.java b/src/tourplaner/object/Tour.java index 37d0d2b..44adec0 100644 --- a/src/tourplaner/object/Tour.java +++ b/src/tourplaner/object/Tour.java @@ -21,6 +21,16 @@ public class Tour { this.log = new ArrayList<>(); } + public Tour(String name, String dauer, String mapJson, double strecke, String start, String ziel, ArrayList logs) { + this.dauer = dauer; + this.mapJson = mapJson; + this.strecke = strecke; + this.name = name; + this.start = start; + this.ziel = ziel; + this.log = logs; + } + public void setTour(Tour tour){ this.dauer = tour.getDauer(); this.mapJson = tour.getMapJson(); diff --git a/src/tourplaner/tourplaner.fxml b/src/tourplaner/tourplaner.fxml index 5625d1d..0da2be2 100644 --- a/src/tourplaner/tourplaner.fxml +++ b/src/tourplaner/tourplaner.fxml @@ -50,6 +50,8 @@ + + diff --git a/src/tourplaner/ui/AlertHelper.java b/src/tourplaner/ui/AlertHelper.java index f870164..d7ab3df 100644 --- a/src/tourplaner/ui/AlertHelper.java +++ b/src/tourplaner/ui/AlertHelper.java @@ -11,6 +11,7 @@ import javafx.stage.Stage; import javafx.stage.WindowEvent; import tourplaner.business.ConfigHelper; +import javax.swing.*; import java.io.PrintWriter; import java.io.StringWriter; import java.time.LocalDate; @@ -229,4 +230,24 @@ public class AlertHelper { stage.showAndWait(); return selectedDate.get(); } + + + /** + * File Auswahl + * @param btn Text des Speichern/Öffnen Btn + * @return String des Files, bei error null + */ + public static String fileChooser(String btn){ + // JFileChooser-Objekt erstellen + JFileChooser chooser = new JFileChooser(); + // Dialog zum Oeffnen von Dateien anzeigen + int rueckgabeWert = chooser.showDialog(null, btn); + + /* Abfrage, ob auf "Öffnen" geklickt wurde */ + if(rueckgabeWert == JFileChooser.APPROVE_OPTION) + { + return chooser.getSelectedFile().getAbsolutePath(); + } + return null; + } } diff --git a/src/tourplaner/ui/TourplanerController.java b/src/tourplaner/ui/TourplanerController.java index 59d1ecf..ebeac87 100644 --- a/src/tourplaner/ui/TourplanerController.java +++ b/src/tourplaner/ui/TourplanerController.java @@ -98,6 +98,7 @@ public class TourplanerController implements Initializable { } private void syncTourNamen(){ + TourListView.getItems().removeIf(s -> true); TourListView.setItems(this.viewModel.getTourNamen()); } @@ -216,12 +217,28 @@ public class TourplanerController implements Initializable { TourListView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); TourListView.setOrientation(Orientation.VERTICAL); syncTourNamen(); + deselectAll(); + + } + + private void deselectAll(){ //Tabs zu Tour -> rechts oben beschreibungTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinetourselected"))); titleTextView.setText( ConfigHelper.getLangIniString("keinetourselected")); //Log -> rechts unten logTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinetourselected"))); + } + @FXML + public void exportBtn(){ + this.viewModel.exportData(); + } + + @FXML + public void importBtn(){ + deselectAll(); + this.viewModel.importData(); + syncTourNamen(); } /** diff --git a/src/tourplaner/viewmodels/ViewModel.java b/src/tourplaner/viewmodels/ViewModel.java index 335172d..04e6f55 100644 --- a/src/tourplaner/viewmodels/ViewModel.java +++ b/src/tourplaner/viewmodels/ViewModel.java @@ -3,6 +3,7 @@ package tourplaner.viewmodels; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.image.Image; +import tourplaner.business.Exporter; import tourplaner.business.TourPlaner; import tourplaner.ui.AlertHelper; import tourplaner.business.ConfigHelper; @@ -11,6 +12,7 @@ import tourplaner.object.Log; import tourplaner.object.Tour; import java.awt.*; +import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -23,7 +25,7 @@ import java.util.concurrent.atomic.AtomicReference; public class ViewModel { //Tour private final ObservableList tourData = FXCollections.observableArrayList(); - private final ObservableList tourNamen = FXCollections.observableArrayList(); + private ObservableList tourNamen = FXCollections.observableArrayList(); private Tour selectedTour; private String neueTourName, neueTourStart, neueTourZiel, neueBemerkung; //Log @@ -582,4 +584,37 @@ public class ViewModel { TourPlaner.doReport(this.selectedTour.getName()); } } + + /** + * Exportiert alle daten in ein File das hier gewählt wird + */ + public void exportData(){ + String file = AlertHelper.fileChooser("Exportiere"); + System.out.println("EXPORT: " + file); + if(file != null){ + try { + new Exporter(file).doExport(); + } catch (IOException e) { + AlertHelper.error("Error", "Export Error", "Fehler beim Exportieren"); + LogHelper.error(e); + } + } + } + + /** + * Importiert alle daten von einem File das hier gewählt wird + */ + public void importData(){ + String file = AlertHelper.fileChooser("Importiere"); + System.out.println("IMPORT: " + file); + if (file != null){ + try { + this.tourNamen = FXCollections.observableArrayList(); + new Exporter(file).doImport(); + } catch (FileNotFoundException e) { + AlertHelper.error("Error", "Import Error", "Fehler beim Importieren"); + LogHelper.error(e); + } + } + } }