diff options
3 files changed, 244 insertions, 5 deletions
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/DBOperationDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/DBOperationDAO.java index 68185d6..16233e1 100644 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/DBOperationDAO.java +++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/DBOperationDAO.java @@ -1,27 +1,65 @@ package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel; import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Severity; import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration; 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.exception.ElementNotFoundException; import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager; +import java.lang.invoke.MethodHandles; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.EnumSet; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Repository; @Repository public class DBOperationDAO implements OperationDAO { private JDBCConnectionManager jdbcConnectionManager; + private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - public DBOperationDAO(JDBCConnectionManager j) { + public DBOperationDAO(JDBCConnectionManager j) throws PersistenceException { jdbcConnectionManager = j; + try { + + getVehicleId = jdbcConnectionManager.getConnection().prepareStatement(GET_VEHICLE_ID); + + getVehicle = jdbcConnectionManager.getConnection().prepareStatement(GET_VEHICLE); + + getVehicleVersion = + jdbcConnectionManager.getConnection().prepareStatement(GET_VEHICLE_VERSION); + + getRegistrations = + jdbcConnectionManager.getConnection().prepareStatement(GET_REGISTRATIONS); + + getEmployee = jdbcConnectionManager.getConnection().prepareStatement(GET_EMPLOYEE); + + getEmployeeVersion = + jdbcConnectionManager.getConnection().prepareStatement(GET_EMPLOYEE_VERSION); + + } catch (SQLException e) { + + LOG.error( + "SQLException occurred while preparing Statements. Error message: {} ", + e.getMessage()); + + throw new PersistenceException(e); + } } @Override @@ -165,7 +203,195 @@ public class DBOperationDAO implements OperationDAO { @Override public Set<Operation> list(EnumSet<Status> statuses) throws PersistenceException { - return null; + StringBuilder listString = new StringBuilder("SELECT * FROM Operation WHERE status IN ("); + boolean first = true; + for (Status status : statuses) { + if (first) { + first = false; + } else { + listString.append(", "); + } + listString.append("\'" + status.name() + "\'"); + } + listString.append(") ;"); + Set<Operation> operations = new HashSet<>(); + try { + try (PreparedStatement listStatement = + jdbcConnectionManager.getConnection().prepareStatement(listString.toString())) { + try (ResultSet resultSet = listStatement.executeQuery()) { + while (resultSet.next()) { + long operationId = resultSet.getLong("id"); + operations.add( + Operation.builder() + .id(operationId) + .opCode(resultSet.getString("opCode")) + .severity(Severity.valueOf(resultSet.getString("severity"))) + .status(Status.valueOf(resultSet.getString("status"))) + .vehicles(getVehiclesFromOperationId(operationId)) + .created(resultSet.getTimestamp("created").toInstant()) + .destination(resultSet.getString("destination")) + .additionalInfo(resultSet.getString("additionalInfo")) + .build()); + } + } + } + } catch (SQLException e) { + LOG.error( + "SQLException happened while preparing statement. Error message: {}", + e.getMessage()); + throw new PersistenceException(e); + } + return operations; + } + + private static String GET_VEHICLE_ID = + "SELECT vehicleId FROM VehicleOperation WHERE operationId = ? ;"; + + private final PreparedStatement getVehicleId; + + private Set<Vehicle> getVehiclesFromOperationId(long operationId) throws PersistenceException { + Set<Vehicle> vehicles = new HashSet<>(); + try { + getVehicleId.setLong(1, operationId); + try (ResultSet resultSet = getVehicleId.executeQuery()) { + while (resultSet.next()) { + vehicles.add(getVehicle(resultSet.getLong("vehicleId"))); + } + } + } catch (SQLException e) { + LOG.error( + "SQLException occurred while getting VehicleId from OperationId. Error message: {}", + e.getMessage()); + throw new PersistenceException(e); + } + return vehicles; + } + + private static String GET_VEHICLE = "SELECT * FROM Vehicle WHERE id = ? ;"; + + private final PreparedStatement getVehicle; + + private Vehicle getVehicle(long vehicleId) throws PersistenceException { + try { + getVehicle.setLong(1, vehicleId); + try (ResultSet resultSet = getVehicle.executeQuery()) { + resultSet.next(); + return getVehicleVersion( + resultSet.getLong("id"), + resultSet.getLong("version"), + resultSet.getString("status")); + } + } catch (SQLException e) { + LOG.error( + "SQLException occurred while getting Vehicle by id. Error message: {}", + e.getMessage()); + throw new PersistenceException(e); + } + } + + private static String GET_VEHICLE_VERSION = "SELECT * FROM VehicleVersion WHERE id = ? ;"; + + private final PreparedStatement getVehicleVersion; + + private Vehicle getVehicleVersion(long vehicleId, long versionId, String status) + throws PersistenceException { + try { + getVehicleVersion.setLong(1, versionId); + try (ResultSet resultSet = getVehicleVersion.executeQuery()) { + resultSet.next(); + return Vehicle.builder() + .id(vehicleId) + .name(resultSet.getString("name")) + .constructionType( + ConstructionType.valueOf(resultSet.getString("constructionType"))) + .type(VehicleType.valueOf(resultSet.getString("type"))) + .status(Vehicle.Status.valueOf(status)) + .hasNef(resultSet.getBoolean("hasNef")) + .registrations(getRegistrations(vehicleId)) + .build(); + } + } catch (SQLException e) { + LOG.error( + "SQLException occurred while getting VehicleVersion. Error message: {}", + e.getMessage()); + throw new PersistenceException(e); + } + } + + private static String GET_REGISTRATIONS = "SELECT * FROM Registration WHERE id = ? ;"; + + private final PreparedStatement getRegistrations; + + private List<Registration> getRegistrations(long vehicleId) throws PersistenceException { + List<Registration> registrations = new LinkedList<>(); + try { + getRegistrations.setLong(1, vehicleId); + try (ResultSet resultSet = getRegistrations.executeQuery()) { + while (resultSet.next()) { + long registrationId = resultSet.getLong("id"); + registrations.add( + Registration.builder() + .id(registrationId) + .start(resultSet.getTimestamp("start").toInstant()) + .end(resultSet.getTimestamp("end").toInstant()) + .employee(getEmployee(resultSet.getLong("employeeId"))) + .build()); + } + } + } catch (SQLException e) { + LOG.error( + "SQLException occurred while getting Registration. Error message: {}", + e.getMessage()); + throw new PersistenceException(e); + } + return registrations; + } + + private static String GET_EMPLOYEE = "SELECT version FROM Employee WHERE id = ? ;"; + + private final PreparedStatement getEmployee; + + private Employee getEmployee(long employeeId) throws PersistenceException { + try { + getEmployee.setLong(1, employeeId); + try (ResultSet resultSet = getEmployee.executeQuery()) { + resultSet.next(); + return getEmployeeVersion(employeeId, resultSet.getLong("version")); + } + } catch (SQLException e) { + LOG.error( + "SQLException occurred while getting Employee. Error message: {}", + e.getMessage()); + throw new PersistenceException(e); + } + } + + private static String GET_EMPLOYEE_VERSION = "SELECT * FROM EmployeeVersion WHERE id = ? ;"; + + private final PreparedStatement getEmployeeVersion; + + private Employee getEmployeeVersion(long employeeId, long versionId) + throws PersistenceException { + try { + getEmployeeVersion.setLong(1, versionId); + try (ResultSet resultSet = getEmployeeVersion.executeQuery()) { + resultSet.next(); + return Employee.builder() + .id(employeeId) + .name(resultSet.getString("name")) + .birthday(resultSet.getDate("birthday").toLocalDate()) + .educationLevel( + EducationLevel.valueOf(resultSet.getString("educationLevel"))) + .isDriver(resultSet.getBoolean("isDriver")) + .isPilot(resultSet.getBoolean("isPilot")) + .build(); + } + } catch (SQLException e) { + LOG.error( + "SQLException occurred while getting EmployeeVersion. Error message: {}", + e.getMessage()); + throw new PersistenceException(e); + } } @Override diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceImpl.java index ba4eb7f..8a9d61c 100644 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceImpl.java +++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceImpl.java @@ -19,12 +19,16 @@ import java.util.SortedSet; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.springframework.stereotype.Service; +import java.lang.invoke.MethodHandles; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Service public class OperationServiceImpl implements OperationService { // TODO: anders? private OperationDAO operationDAO; + private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private final VehicleDAO vehicleDAO; @@ -201,6 +205,13 @@ public class OperationServiceImpl implements OperationService { @Override public Set<Operation> list(EnumSet<Status> statuses) throws ServiceException { - return null; + try { + return operationDAO.list(statuses); + } catch (PersistenceException e) { + LOG.debug( + "Caught PersistenceException. Throwing ServiceException. Message: {}", + e.getMessage()); + throw new ServiceException(e); + } } } diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/userInterface/ArchivOperationController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/userInterface/ArchivOperationController.java index c0de7cc..57a3e3b 100644 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/userInterface/ArchivOperationController.java +++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/userInterface/ArchivOperationController.java @@ -5,8 +5,10 @@ import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.S import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationService; import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; import java.util.EnumSet; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Set; import javafx.fxml.FXML; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; @@ -51,7 +53,7 @@ public class ArchivOperationController { }*/ List<Operation> list = new LinkedList<>(); try { - list = operationService.list(EnumSet.of(Status.CANCELLED, Status.COMPLETED)); + list.addAll(operationService.list(EnumSet.of(Status.CANCELLED, Status.COMPLETED))); } catch (ServiceException e) { Alert alert = new Alert(AlertType.ERROR); alert.setTitle("Fehler"); @@ -59,7 +61,7 @@ public class ArchivOperationController { alert.setContentText("Die Einsätze konnten nicht geladen werden!"); alert.showAndWait(); } - for (int i =0;i<list.size();i++){ + for (int i = 0; i < list.size(); i++) { Button b = new Button(); b.setPrefHeight(200); b.setPrefWidth(800 / 2); |