From d9adebc934ceae5854597f4868d24824dd31bbc1 Mon Sep 17 00:00:00 2001
From: Georg-Notebook <georg@dergeorg.at>
Date: Wed, 14 Apr 2021 23:47:35 +0200
Subject: [PATCH] DB -> Log get, add, edit, del

---
 .gitignore                                  |  3 +-
 Tourplaner.iml                              |  1 +
 src/tourplaner/business/TourPlaner.java     | 44 ++++++++---
 src/tourplaner/data/DbConnect.java          | 82 ++++++++++++++++++++-
 src/tourplaner/ui/TourplanerController.java | 27 +++++--
 src/tourplaner/viewmodels/ViewModel.java    | 36 ++-------
 6 files changed, 147 insertions(+), 46 deletions(-)

diff --git a/.gitignore b/.gitignore
index 8b4d85b..ff1c429 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 out/
 conf.ini
-log/log4j/log.out/
+log/
 reports/
+.idea/dataSources*
\ No newline at end of file
diff --git a/Tourplaner.iml b/Tourplaner.iml
index ceedf37..f60b871 100644
--- a/Tourplaner.iml
+++ b/Tourplaner.iml
@@ -11,5 +11,6 @@
     <orderEntry type="library" name="org.ini4j:ini4j:0.5.4" level="project" />
     <orderEntry type="library" name="log4j:log4j:1.2.17" level="project" />
     <orderEntry type="library" name="org.apache.pdfbox:pdfbox:1.8.9" level="project" />
+    <orderEntry type="library" name="org.postgresql:postgresql:42.2.19" level="project" />
   </component>
 </module>
\ No newline at end of file
diff --git a/src/tourplaner/business/TourPlaner.java b/src/tourplaner/business/TourPlaner.java
index beae0a1..853a41f 100644
--- a/src/tourplaner/business/TourPlaner.java
+++ b/src/tourplaner/business/TourPlaner.java
@@ -1,10 +1,13 @@
 package tourplaner.business;
 
 import org.apache.log4j.Logger;
+import org.apache.pdfbox.exceptions.COSVisitorException;
 import tourplaner.data.DbConnect;
 import tourplaner.data.PostgresHelper;
+import tourplaner.object.Log;
 import tourplaner.object.Tour;
 
+import java.io.IOException;
 import java.util.ArrayList;
 
 /**
@@ -25,9 +28,7 @@ public class TourPlaner{
      * @return Alle touren als ArrayList
      */
     public static ArrayList<Tour> getAllTours(){
-        DbConnect dbConnect = new DbConnect();
-        ArrayList<Tour> touren = dbConnect.getAllTouren();
-        return touren;
+        return new DbConnect().getAllTouren();
     }
 
     /**
@@ -37,13 +38,11 @@ public class TourPlaner{
      * @return false bei error
      */
     public static boolean editTour(String oldname, Tour tour){
-        DbConnect dbConnect = new DbConnect();
-        return dbConnect.editTour(oldname, tour);
+        return new DbConnect().editTour(oldname, tour);
     }
 
     public static boolean delTour(String tourname){
-        DbConnect dbConnect = new DbConnect();
-        return dbConnect.delTour(tourname);
+        return new DbConnect().delTour(tourname);
     }
 
     /**
@@ -52,11 +51,38 @@ public class TourPlaner{
      * @return false bei error
      */
     public static boolean addTour(Tour newTour){
-        DbConnect dbConnect = new DbConnect();
-        return dbConnect.addTour(newTour);
+        return new DbConnect().addTour(newTour);
     }
 
 
+    public static ArrayList<Log> getLogs(String tourname){
+        return new DbConnect().getLogs(tourname);
+    }
+
+    public static void doReport(String tourname){
+        try {
+            Reporter.createTourReport(tourname);
+        } catch (IOException e) {
+            LogHelper.error(e.getMessage(), e.getClass().getName());
+        } catch (COSVisitorException e) {
+            LogHelper.error(e.getMessage(), e.getClass().getName());
+        }
+    }
+
+    public static boolean addLog(String tourname, Log log){
+        if(Double.isInfinite(log.getAvgspeed())) log.setAvgspeed(-1.0);
+        return new DbConnect().addLog(tourname, log);
+    }
+
+    public static boolean delLog(String tourname, String id){
+        return new DbConnect().delLog(tourname, id);
+    }
+
+    public static boolean editLog(String tourname, Log log){
+        if(Double.isInfinite(log.getAvgspeed())) log.setAvgspeed(-1.0);
+        return new DbConnect().editLog(tourname, log);
+    }
+
 
     public static String getMapJson(String start, String ziel){
         // TODO: 14.04.2021 Map Quest
diff --git a/src/tourplaner/data/DbConnect.java b/src/tourplaner/data/DbConnect.java
index 7112486..c76500c 100644
--- a/src/tourplaner/data/DbConnect.java
+++ b/src/tourplaner/data/DbConnect.java
@@ -1,10 +1,14 @@
 package tourplaner.data;
 
+import javafx.geometry.Pos;
+import tourplaner.object.Log;
 import tourplaner.object.Tour;
 
 import java.sql.Connection;
+import java.sql.Date;
 import java.sql.ResultSet;
 import java.sql.Statement;
+import java.time.LocalDate;
 import java.util.ArrayList;
 
 /**
@@ -45,9 +49,20 @@ public class DbConnect {
      * @return false bei error
      */
     public boolean editTour(String oldname, Tour tour) {
-        return PostgresHelper.executeUpdate("UPDATE public.tour SET tourname = '"+tour.getName()+"', dauer = 1, mapjson = '"+tour.getMapJson()+"', start = '"+tour.getStart()+"', ziel = '"+tour.getZiel()+"', strecke = "+tour.getStrecke()+" WHERE tourname ='" + oldname + "';");
+        String tourname = tour.getName();
+        ArrayList<Boolean> result = new ArrayList<>();
+        ArrayList<Log> logs = getLogs(oldname);
+        result.add(delLogs(oldname));
+        result.add(PostgresHelper.executeUpdate("UPDATE public.tour SET tourname = '"+tour.getName()+"', dauer = 1, mapjson = '"+tour.getMapJson()+"', start = '"+tour.getStart()+"', ziel = '"+tour.getZiel()+"', strecke = "+tour.getStrecke()+" WHERE tourname ='" + oldname + "';"));
+        logs.forEach(log -> {
+            result.add(addLog(tourname, log));
+        });
+        return !result.contains(false);
     }
 
+    private boolean delLogs(String tourname){
+        return PostgresHelper.executeUpdate("DELETE FROM public.log WHERE tourname = '"+tourname+"'");
+    }
     /**
      * Fügt eine Tour hinzu
      * @param tour Neue Tour
@@ -63,7 +78,70 @@ public class DbConnect {
      * @return false bei error
      */
     public boolean delTour(String tourname){
-        return  PostgresHelper.executeUpdate("DELETE FROM public.tour WHERE tourname = '"+tourname+"'");
+        ArrayList<Boolean> result = new ArrayList<>();
+        result.add(delLogs(tourname));
+        result.add(PostgresHelper.executeUpdate("DELETE FROM public.tour WHERE tourname = '"+tourname+"'"));
+        return !result.contains(false);
+    }
+
+    public ArrayList<Log> getLogs(String tourname){
+
+        this.c = PostgresHelper.con();
+        String id, bemerkung ;
+        double dauer, strecke, pause, gegangen, avg, hightmeter;
+        Date datum;
+
+        ArrayList<Log> logs = new ArrayList<>();
+        try {
+            stmt = this.c.createStatement();
+            ResultSet rs = stmt.executeQuery("SELECT * FROM public.log where tourname = '"+ tourname +"'");
+            while (rs.next()) {
+                id = rs.getString("id");
+                bemerkung = rs.getString("bemerkung");
+                datum = rs.getDate("datum");
+                dauer = rs.getDouble("dauer");
+//                avg = rs.getDouble("avg");
+                hightmeter = rs.getDouble("hightmeter");
+                pause = rs.getDouble("pause");
+//                gegangen = rs.getDouble("gegangen");
+                strecke = rs.getDouble("strecke");
+                if (!tourname.isEmpty()) {
+                    logs.add(new Log(id, dauer, datum.toLocalDate(), strecke, bemerkung,hightmeter, pause));
+                }else {
+                    return null;
+                }
+            }
+            rs.close();
+            stmt.close();
+            this.c.close();
+            return logs;
+        } catch (Exception e) {
+            System.err.println(e.getClass().getName() + ": " + e.getMessage());
+            return null;
+        }
+    }
+
+
+    /**
+     * Füght einen Logeintrag ein
+     * @param tourname Zu welcher Tour der Logeintrag gehört
+     * @param log Der Logeintrag
+     * @return false bei error
+     */
+    public boolean addLog(String tourname, Log log){
+        if(Double.isInfinite(log.getAvgspeed())) log.setAvgspeed(-1.0);
+        return PostgresHelper.executeUpdate("INSERT INTO public.log (tourname, id, bemerkung, datum, strecke, avg, hightmeter, pause, gegangen, dauer) VALUES ('"+tourname+"', '"+log.getId()+"', '"+log.getBemerkung()+"', '"+log.getDatum()+"', "
+                +log.getStrecke()+", "+log.getAvgspeed()+", "+log.getHightmeter()+", "+log.getPause()+", "+log.getGegangen()+", "+log.getDauer()+")");
+    }
+
+    public boolean editLog(String tourname, Log log){
+        return PostgresHelper.executeUpdate("UPDATE public.log SET bemerkung = '"+log.getBemerkung()+"', datum = '"+log.getDatum()+"', strecke = "+log.getStrecke()+", avg = "+log.getAvgspeed()+", hightmeter = "+
+                log.getHightmeter()+", pause = "+log.getPause()+", gegangen = "+log.getGegangen()+", dauer = "+log.getDauer()+" WHERE tourname = '"+tourname+"' and id = '"+log.getId()+"'");
+    }
+
+    public boolean delLog(String tourname, String id){
+        System.out.println("DELETE FROM public.log WHERE tourname = '"+tourname+"' and id = '"+id+"'");
+        return PostgresHelper.executeUpdate("DELETE FROM public.log WHERE tourname = '"+tourname+"' and id = '"+id+"'");
     }
 
     /**
diff --git a/src/tourplaner/ui/TourplanerController.java b/src/tourplaner/ui/TourplanerController.java
index 8cfc812..16ce388 100644
--- a/src/tourplaner/ui/TourplanerController.java
+++ b/src/tourplaner/ui/TourplanerController.java
@@ -11,6 +11,7 @@ import javafx.scene.control.cell.PropertyValueFactory;
 import javafx.scene.input.MouseEvent;
 import tourplaner.business.ConfigHelper;
 import tourplaner.business.LogHelper;
+import tourplaner.business.TourPlaner;
 import tourplaner.object.Log;
 import tourplaner.object.Tour;
 import tourplaner.viewmodels.ViewModel;
@@ -49,13 +50,13 @@ public class TourplanerController implements Initializable {
     @FXML
     private void editTourBtn(){
         this.viewModel.editTour();
-        beschreibungTableView.getItems().removeIf(s -> true); //Leert die Table View komplett
-        beschreibungTableView.getItems().add(this.viewModel.getTour(this.viewModel.getSelectedTour().getName()));
+        syncTour(this.viewModel.getSelectedTour().getName());
     }
 
     @FXML
     private void editLogBtn(){
         this.viewModel.editLog();
+        syncLogs();
     }
     /**
      * Öffnet github im standart browser
@@ -84,6 +85,19 @@ public class TourplanerController implements Initializable {
         this.viewModel.doxygenDocBrowser();
     }
 
+    private void syncTour(String selectedItem){
+        beschreibungTableView.getItems().removeIf(s -> true); //Leert die Table View komplett
+        beschreibungTableView.getItems().add(this.viewModel.getTour(selectedItem));
+    }
+
+    private void syncTourNamen(){
+        TourListView.setItems(this.viewModel.getTourNamen());
+    }
+
+    private void syncLogs(){
+        logTableView.getItems().removeIf(s -> true);
+        logTableView.setItems(this.viewModel.getLogData());
+    }
 
 
     /**
@@ -95,8 +109,7 @@ public class TourplanerController implements Initializable {
         String selectedItem = TourListView.getSelectionModel().getSelectedItem();
         this.viewModel.selectTour(selectedItem);
         titleTextView.setText(selectedItem);
-        beschreibungTableView.getItems().removeIf(s -> true); //Leert die Table View komplett
-        beschreibungTableView.getItems().add(this.viewModel.getTour(selectedItem));
+        syncTour(selectedItem);
         startCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("start"));
         zielCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("ziel"));
         dauerCol.setCellValueFactory(new PropertyValueFactory<Tour, String>("dauer"));
@@ -105,6 +118,7 @@ public class TourplanerController implements Initializable {
 
         //Log anzeigen
         logTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinelogsvorhanden")));
+        logTableView.getItems().removeIf(s -> true);
         logTableView.setItems(this.viewModel.getLogData());
         logDauerCol.setCellValueFactory(new PropertyValueFactory<Log, String>("dauer"));
         logStreckeCol.setCellValueFactory(new PropertyValueFactory<Log, String>("strecke"));
@@ -163,12 +177,13 @@ public class TourplanerController implements Initializable {
     @FXML
     private void addLog(){
         this.viewModel.addLog();
+        syncLogs();
     }
 
     @FXML
     private void delLog(){
         this.viewModel.delLog();
-
+        syncLogs();
     }
 
     /**
@@ -190,7 +205,7 @@ public class TourplanerController implements Initializable {
         //Tour list -> links
         TourListView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
         TourListView.setOrientation(Orientation.VERTICAL);
-        TourListView.setItems(this.viewModel.getTourNamen());
+        syncTourNamen();
         //Tabs zu Tour -> rechts oben
         beschreibungTableView.setPlaceholder(new Label( ConfigHelper.getLangIniString("keinetourselected")));
         titleTextView.setText( ConfigHelper.getLangIniString("keinetourselected"));
diff --git a/src/tourplaner/viewmodels/ViewModel.java b/src/tourplaner/viewmodels/ViewModel.java
index 45f5bf2..946ba6f 100644
--- a/src/tourplaner/viewmodels/ViewModel.java
+++ b/src/tourplaner/viewmodels/ViewModel.java
@@ -212,10 +212,11 @@ public class ViewModel {
                                 Log newLog = new Log(this.selectedLog.getId(), dauer, datum, strecke, this.neueBemerkung, hightmeter, pause);
                                 this.logData.removeIf(ld -> ld.getId().equals(this.selectedLog.getId()));
                                 this.logData.add(newLog);
-                                tourAkt.get().delLog(this.selectedLog.getId());
-                                tourAkt.get().addLog(newLog);
+//                                tourAkt.get().delLog(this.selectedLog.getId());
+//                                tourAkt.get().addLog(newLog);
                                 this.tourData.removeIf(td -> td.getName().equals(this.selectedTour.getName()));
                                 this.tourData.add(tourAkt.get());
+                                TourPlaner.editLog(this.selectedTour.getName(), newLog);
                             }
                         }
                     }
@@ -327,6 +328,7 @@ public class ViewModel {
                                         if (date != null) {
                                             Log newLog = new Log(newId.get(), dauer, date, strecke, this.neueBemerkung, hightmeter, pause);
                                             this.logData.add(newLog);
+                                            TourPlaner.addLog(this.selectedTour.getName(), newLog);
                                             s.addLog(newLog);
                                         }
                                     }
@@ -348,25 +350,8 @@ public class ViewModel {
      */
     public void delLog(){
         if(this.selectedLog != null) {
-            this.logData.removeIf(s -> s.getId().equals(this.selectedLog.getId()));
-            AtomicReference<Tour> tourToEdit = new AtomicReference<>();
-            this.tourData.forEach(s -> {
-                if (s.getLogs() != null) {
-                    s.getLogs().forEach(ss -> {
-                        if (ss.getId().equals(this.selectedLog.getId())) {
-                            tourToEdit.set(s);
-                        }
-                    });
-                }
-            });
-
-            if (tourToEdit.get() != null){
-                Tour toEdit = tourToEdit.get();
-                toEdit.delLog(this.selectedLog.getId());
-                this.tourData.removeIf(s -> s.getName().equals(toEdit.getName()));
-                this.tourData.add(toEdit);
+                TourPlaner.delLog(this.selectedTour.getName(), this.selectedLog.getId());
                 this.selectedLog = null;
-            }
         }else{
             AlertHelper.warn(ConfigHelper.getLangIniString("achtung"),
                     ConfigHelper.getLangIniString("keinetourselected"),
@@ -406,6 +391,8 @@ public class ViewModel {
     }
 
     public ObservableList<Log> getLogData() {
+        logData.removeAll();
+        logData.addAll(TourPlaner.getLogs(this.selectedTour.getName()));
         return logData;
     }
 
@@ -586,14 +573,7 @@ public class ViewModel {
                     ConfigHelper.getLangIniString("keinetourselected"),
                     ConfigHelper.getLangIniString("logtournotselectedmsg"));
         }else {
-            try {
-                Reporter.createTourReport(this.selectedTour.getName());
-            } catch (IOException e) {
-                LogHelper.error(e.getMessage(), e.getClass().getName());
-            } catch (COSVisitorException e) {
-                LogHelper.error(e.getMessage(), e.getClass().getName());
-            }
-
+           TourPlaner.doReport(this.selectedTour.getName());
         }
     }
 }