From 0c8e84cf27f3477b1287295f8dec2e0d1e4039d0 Mon Sep 17 00:00:00 2001
From: Martin Weick <e1627760@student.tuwien.ac.at>
Date: Fri, 4 May 2018 11:06:42 +0200
Subject: Implement vehicleAdd, start creating tests

---
 .../einsatzverwaltung/dao/VehicleDBDAO.java        | 102 +++++++++++++++++++
 .../einsatzverwaltung/service/VehicleAdd.java      |  49 +++++----
 .../uiController/CreateCarController.java          | 108 --------------------
 .../uicontroller/CreateCarController.java          | 113 +++++++++++++++++++++
 src/main/resources/controller/CreateCar.fxml       |   2 +-
 .../sepm/assignment/groupphase/AddCarTest.java     |  43 ++++++++
 6 files changed, 290 insertions(+), 127 deletions(-)
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDBDAO.java
 delete mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/uiController/CreateCarController.java
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/uicontroller/CreateCarController.java
 create mode 100644 src/main/test/java/at/ac/tuwien/sepm/assignment/groupphase/AddCarTest.java

(limited to 'src')

diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDBDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDBDAO.java
new file mode 100644
index 0000000..66045a5
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDBDAO.java
@@ -0,0 +1,102 @@
+package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao;
+
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class VehicleDBDAO implements VehicleDAO {
+
+    private final JDBCConnectionManager jdbcConnectionManager;
+
+    public VehicleDBDAO(JDBCConnectionManager jdbcConnectionManager) {
+        this.jdbcConnectionManager = jdbcConnectionManager;
+    }
+
+    public long add(Vehicle vehicle) throws PersistenceException {
+        String query1 = "INSERT INTO VehicleVersion (name,constructionType,type) VALUES (?,?,?)";
+        String query2 = "INSERT INTO Vehicle (version,status) VALUES (?,?)";
+        PreparedStatement p1 = null;
+        PreparedStatement p2 = null;
+        PreparedStatement p3 = null;
+        String status = "abgemeldet";
+        String name = "";
+        int id = -1;
+        try {
+            p1 = jdbcConnectionManager.getConnection().prepareStatement(query1);
+            p1.setString(1, name);
+            p1.setString(2, vehicle.constructionType().name());
+            if (vehicle.type() == VehicleType.KTW_B) {
+                p1.setString(3, "KTW-B");
+            } else {
+                p1.setString(3, vehicle.type().name());
+            }
+            p1.executeUpdate();
+            query1 = "UPDATE VehicleVersion SET name=? WHERE id=?";
+            try (ResultSet keyResultSet = p1.getGeneratedKeys()) {
+                if (keyResultSet.next()) {
+                    id = keyResultSet.getInt(1);
+                }
+            }
+            name = vehicle.type().name() + "-" + id;
+
+        } catch (SQLException e) {
+            throw new PersistenceException("SQL Excpetion : " + e.toString());
+        } finally {
+            try {
+                p1.close();
+
+            } catch (SQLException e) {
+                throw new PersistenceException("SQL Excpetion : " + e.toString());
+            }
+        }
+        try {
+            p3 = jdbcConnectionManager.getConnection().prepareStatement(query1);
+            p3.setString(1, name);
+            p3.setInt(2, id);
+            p3.executeUpdate();
+        } catch (SQLException e) {
+            throw new PersistenceException("SQL Excpetion : " + e.toString());
+        } finally {
+            try {
+                p3.close();
+            } catch (SQLException e) {
+                throw new PersistenceException("SQL Excpetion : " + e.toString());
+            }
+        }
+        try {
+            p2 = jdbcConnectionManager.getConnection().prepareStatement(query2);
+            p2.setInt(1, id);
+            p2.setString(2, status);
+            p2.executeUpdate();
+        } catch (SQLException e) {
+            throw new PersistenceException("SQL Excpetion : " + e.toString());
+        } finally {
+            try {
+                p2.close();
+            } catch (SQLException e) {
+                throw new PersistenceException("SQL Excpetion : " + e.toString());
+            }
+        }
+        return id;
+    }
+
+    public void update(Vehicle vehicle) throws ElementNotFoundException, PersistenceException {
+        throw new UnsupportedOperationException();
+    }
+
+    public List<Vehicle> list() throws PersistenceException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void remove(long id) throws ElementNotFoundException, PersistenceException {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleAdd.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleAdd.java
index a0fadd5..be52fb6 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleAdd.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleAdd.java
@@ -1,52 +1,65 @@
 package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service;
 
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.ConstructionType;
 import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.Status;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import java.util.EnumSet;
 import java.util.List;
+import org.springframework.stereotype.Service;
 
+@Service
 public class VehicleAdd implements VehicleService {
+    private VehicleDAO vehicleDAO;
+
+    public VehicleAdd(VehicleDAO vehicleDAO) {
+        this.vehicleDAO = vehicleDAO;
+    }
 
     public long add(Vehicle vehicle) throws InvalidVehicleException, ServiceException {
-        final String normal="Normal";
-        final String mhd="Mittelhochdach";
 
-        switch (vehicle.type().toString()){
-            case "RTW":
-                if(vehicle.constructionType().name().contains(normal)){
+        switch (vehicle.type()) {
+            case RTW:
+                if (vehicle.constructionType() == ConstructionType.NORMAL) {
                     throw new InvalidVehicleException("RTW darf kein Normales Dach haben");
-                }else if(vehicle.constructionType().name().contains(mhd)){
+                } else if (vehicle.constructionType() == ConstructionType.MITTELHOCHDACH) {
                     throw new InvalidVehicleException("RTW darf kein Mittelhochdach haben");
                 }
                 break;
-            case "KTW":
-                if(vehicle.constructionType().name().contains(normal)){
+            case KTW:
+                if (vehicle.constructionType() == ConstructionType.NORMAL) {
                     throw new InvalidVehicleException("KTW darf kein Normales Dach haben");
                 }
                 break;
-            case "KTW_B":
-                if(vehicle.constructionType().name().contains(normal)){
+            case KTW_B:
+                if (vehicle.constructionType() == ConstructionType.NORMAL) {
                     throw new InvalidVehicleException("KTW-B darf kein Normales Dach haben");
                 }
                 break;
-            case "NEF":
-                if(vehicle.constructionType().name().contains(mhd)){
+            case NEF:
+                if (vehicle.constructionType() == ConstructionType.MITTELHOCHDACH) {
                     throw new InvalidVehicleException("NEF darf kein Mittelhochdach haben");
-                }else if(vehicle.constructionType().name().contains("Hochdach")){
+                } else if (vehicle.constructionType().name().contains("Hochdach")) {
                     throw new InvalidVehicleException("NEF darf kein Hochdach haben");
                 }
                 break;
-            case "NAH":
-                if(vehicle.constructionType().name().contains(mhd)){
+            case NAH:
+                if (vehicle.constructionType() == ConstructionType.MITTELHOCHDACH) {
                     throw new InvalidVehicleException("NEF darf kein Mittelhochdach haben");
-                }else if(vehicle.constructionType().name().contains("Hochdach")){
+                } else if (vehicle.constructionType().name().contains("Hochdach")) {
                     throw new InvalidVehicleException("NEF darf kein Hochdach haben");
                 }
                 break;
-                default:
-                    throw new ServiceException("not a Valid type");
+            default:
+                throw new ServiceException("not a Valid type");
+        }
+        try {
+            vehicleDAO.add(vehicle);
+        } catch (PersistenceException e) {
+            throw new ServiceException(e);
         }
         return 0;
     }
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/uiController/CreateCarController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/uiController/CreateCarController.java
deleted file mode 100644
index dcf6ff7..0000000
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/uiController/CreateCarController.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.uiController;
-
-
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.ConstructionType;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType;
-import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
-import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
-import java.lang.invoke.MethodHandles;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import javafx.collections.FXCollections;
-import javafx.event.ActionEvent;
-import javafx.fxml.FXML;
-import javafx.scene.control.Alert;
-import javafx.scene.control.Alert.AlertType;
-import javafx.scene.control.Button;
-import javafx.scene.control.ButtonType;
-import javafx.scene.control.CheckBox;
-import javafx.scene.control.ChoiceBox;
-import javafx.stage.Stage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class CreateCarController {
-
-    @FXML private ChoiceBox cmb_Ctyp;
-    @FXML private ChoiceBox cmb_typ;
-    @FXML private Button btn_cancel;
-    @FXML private CheckBox cbx_NEF;
-
-    private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-    private final VehicleService vehicleService;
-
-    public CreateCarController(VehicleService vehicleService) {
-        this.vehicleService = vehicleService;
-    }
-    @FXML
-    public void initialize() {
-        cmb_Ctyp.setItems(
-                FXCollections.observableArrayList(
-                        Stream.of(
-                                ConstructionType.NORMAL,
-                                ConstructionType.MITTELHOCHDACH,
-                                ConstructionType.HOCHDACH)
-                                .map(Enum::toString)
-                                .collect(Collectors.toList())));
-        cmb_Ctyp.setValue(ConstructionType.NORMAL.toString());
-        cmb_typ.setItems(
-                FXCollections.observableArrayList(
-                        Stream.of(
-                                VehicleType.BKTW,
-                                VehicleType.KTW_B,
-                                VehicleType.KTW,
-                                VehicleType.RTW,
-                                VehicleType.NEF,
-                                VehicleType.NAH)
-                                .map(Enum::toString)
-                        .collect(Collectors.toList())));
-        cmb_typ.setValue(VehicleType.BKTW.toString());
-    }
-
-    @FXML
-    public void onCancelClicked() {
-        ((Stage) btn_cancel.getScene().getWindow()).close();
-    }
-    @FXML
-    public void createCar(ActionEvent actionEvent) {
-        Vehicle vehicle =
-                Vehicle.builder()
-                .constructionType(parseConstructionType())
-                .type(parseType())
-                .hasNef(cbx_NEF.isSelected())
-                .build();
-        try {
-            vehicleService.add(vehicle);
-        } catch (InvalidVehicleException e) {
-            LOG.error("Invalid Vehicle: {}", e);
-            createComplete(AlertType.ERROR,"Ungültige Eingabe",e.getMessage());
-            return;
-        } catch (ServiceException e) {
-            LOG.error("Exception: {}", e);
-            createComplete(AlertType.ERROR,"Ungültige Eingabe",e.getMessage());
-            return;
-        }
-        createComplete(AlertType.CONFIRMATION,"Speichern Erfolgreich","Auto wurde erfolgreich angelegt");
-    }
-    private ConstructionType parseConstructionType(){
-        if(cmb_Ctyp.getSelectionModel().getSelectedItem()==null){
-            return ConstructionType.NORMAL;
-        }
-        return ConstructionType.valueOf(cmb_Ctyp.getSelectionModel().getSelectedItem().toString());
-    }
-    private VehicleType parseType(){
-        if(cmb_typ.getSelectionModel().getSelectedItem()==null){
-            return VehicleType.BKTW;
-        }
-        return VehicleType.valueOf(cmb_typ.getSelectionModel().getSelectedItem().toString());
-    }
-    private void createComplete(AlertType alertType, String headerText, String contentText) {
-        Alert alert = new Alert(alertType, contentText, ButtonType.OK);
-        alert.setHeaderText(headerText);
-        alert.showAndWait();
-    }
-}
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/uicontroller/CreateCarController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/uicontroller/CreateCarController.java
new file mode 100644
index 0000000..721cf6d
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/uicontroller/CreateCarController.java
@@ -0,0 +1,113 @@
+package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.uicontroller;
+
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.ConstructionType;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import java.lang.invoke.MethodHandles;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import javafx.collections.FXCollections;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.scene.control.Alert;
+import javafx.scene.control.Alert.AlertType;
+import javafx.scene.control.Button;
+import javafx.scene.control.ButtonType;
+import javafx.scene.control.CheckBox;
+import javafx.scene.control.ChoiceBox;
+import javafx.stage.Stage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class CreateCarController {
+
+    @FXML private ChoiceBox<String> cmb_Ctyp;
+    @FXML private ChoiceBox<String> cmb_typ;
+    @FXML private Button btn_cancel;
+    @FXML private CheckBox cbx_NEF;
+
+    private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+    private final VehicleService vehicleService;
+
+    public CreateCarController(VehicleService vehicleService) {
+        this.vehicleService = vehicleService;
+    }
+
+    @FXML
+    public void initialize() {
+        cmb_Ctyp.setItems(
+                FXCollections.observableArrayList(
+                        Stream.of(
+                                        ConstructionType.NORMAL,
+                                        ConstructionType.MITTELHOCHDACH,
+                                        ConstructionType.HOCHDACH)
+                                .map(Enum::toString)
+                                .collect(Collectors.toList())));
+        cmb_Ctyp.setValue(ConstructionType.NORMAL.toString());
+        cmb_typ.setItems(
+                FXCollections.observableArrayList(
+                        Stream.of(
+                                        VehicleType.BKTW,
+                                        VehicleType.KTW_B,
+                                        VehicleType.KTW,
+                                        VehicleType.RTW,
+                                        VehicleType.NEF,
+                                        VehicleType.NAH)
+                                .map(Enum::toString)
+                                .collect(Collectors.toList())));
+        cmb_typ.setValue(VehicleType.BKTW.toString());
+    }
+
+    @FXML
+    public void onCancelClicked() {
+        ((Stage) btn_cancel.getScene().getWindow()).close();
+    }
+
+    @FXML
+    public void createCar(ActionEvent actionEvent) {
+        Vehicle vehicle =
+                Vehicle.builder()
+                        .constructionType(parseConstructionType())
+                        .type(parseType())
+                        .hasNef(cbx_NEF.isSelected())
+                        .build();
+        try {
+            vehicleService.add(vehicle);
+        } catch (InvalidVehicleException e) {
+            LOG.error("Invalid Vehicle: {}", e);
+            createComplete(AlertType.ERROR, "Ungültige Eingabe", e.getMessage());
+            return;
+        } catch (ServiceException e) {
+            LOG.error("Exception: {}", e);
+            createComplete(AlertType.ERROR, "Ungültige Eingabe", e.getMessage());
+            return;
+        }
+        createComplete(
+                AlertType.CONFIRMATION, "Speichern Erfolgreich", "Auto wurde erfolgreich angelegt");
+    }
+
+    private ConstructionType parseConstructionType() {
+        if (cmb_Ctyp.getSelectionModel().getSelectedItem() == null) {
+            return ConstructionType.NORMAL;
+        }
+        return ConstructionType.valueOf(cmb_Ctyp.getSelectionModel().getSelectedItem().toString());
+    }
+
+    private VehicleType parseType() {
+        if (cmb_typ.getSelectionModel().getSelectedItem() == null) {
+            return VehicleType.BKTW;
+        }
+        return VehicleType.valueOf(cmb_typ.getSelectionModel().getSelectedItem().toString());
+    }
+
+    private void createComplete(AlertType alertType, String headerText, String contentText) {
+        Alert alert = new Alert(alertType, contentText, ButtonType.OK);
+        alert.setHeaderText(headerText);
+        alert.showAndWait();
+    }
+}
diff --git a/src/main/resources/controller/CreateCar.fxml b/src/main/resources/controller/CreateCar.fxml
index 600d7fb..2daac67 100644
--- a/src/main/resources/controller/CreateCar.fxml
+++ b/src/main/resources/controller/CreateCar.fxml
@@ -6,7 +6,7 @@
 <?import javafx.scene.layout.AnchorPane?>
 
 
-<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.uiController.CreateCarController">
+<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.uicontroller.CreateCarController">
    <children>
       <ChoiceBox fx:id="cmb_Ctyp" layoutX="14.0" layoutY="14.0" prefWidth="150.0" />
       <ChoiceBox fx:id="cmb_typ" layoutX="191.0" layoutY="14.0" prefWidth="150.0" />
diff --git a/src/main/test/java/at/ac/tuwien/sepm/assignment/groupphase/AddCarTest.java b/src/main/test/java/at/ac/tuwien/sepm/assignment/groupphase/AddCarTest.java
new file mode 100644
index 0000000..e7c4543
--- /dev/null
+++ b/src/main/test/java/at/ac/tuwien/sepm/assignment/groupphase/AddCarTest.java
@@ -0,0 +1,43 @@
+package at.ac.tuwien.sepm.assignment.groupphase;
+
+import static junit.framework.TestCase.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDBDAO;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.ConstructionType;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleAdd;
+import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException;
+import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import org.junit.Test;
+
+public class AddCarTest {
+    private final VehicleDAO vehicleP = mock(VehicleDBDAO.class);
+    private final VehicleService vehicleService = new VehicleAdd(vehicleP);
+
+    public AddCarTest() throws PersistenceException {
+        when(vehicleP.add(any())).thenReturn(1L);
+    }
+
+    @Test
+    public void add() {
+        Vehicle vehicle =
+                Vehicle.builder()
+                        .constructionType(ConstructionType.HOCHDACH)
+                        .type(VehicleType.RTW)
+                        .hasNef(true)
+                        .build();
+        try {
+            vehicleService.add(vehicle);
+        } catch (InvalidVehicleException | ServiceException e) {
+            fail();
+        }
+    }
+
+}
-- 
cgit v1.2.3-70-g09d2