From ede9e933d7e966ee4122b7b57242c88efc868faa Mon Sep 17 00:00:00 2001 From: Dominic Rogetzer Date: Tue, 19 Jun 2018 00:31:05 +0200 Subject: Change versioning in RegistrationDatabaseDAO [#25963] --- .../dao/RegistrationDatabaseDAO.java | 112 ++++++++++++++------- .../missioncontrol/dao/VehicleDatabaseDAO.java | 2 +- 2 files changed, 79 insertions(+), 35 deletions(-) diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDatabaseDAO.java index 1f11024..2f52349 100644 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDatabaseDAO.java +++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/RegistrationDatabaseDAO.java @@ -3,6 +3,7 @@ package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dao; 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.missioncontrol.dto.Employee; +import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Registration; import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager; import java.sql.Connection; @@ -10,6 +11,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.time.LocalDate; import java.time.OffsetDateTime; import java.time.ZoneId; import java.util.ArrayList; @@ -32,6 +34,38 @@ public class RegistrationDatabaseDAO implements RegistrationDAO { this.employeePersistence = employeePersistence; } + private long getVehicleVersionId(long vehicleId) throws PersistenceException { + String sqlGetVehicleVersionId = "SELECT * FROM vehicle WHERE id = ?"; + try (PreparedStatement stmt = + jdbcConnectionManager.getConnection().prepareStatement(sqlGetVehicleVersionId)) { + stmt.setLong(1, vehicleId); + ResultSet rs = stmt.executeQuery(); + if (rs.next()) { + return rs.getLong("version"); + } else { + throw new PersistenceException("vehicle id not found"); + } + } catch (SQLException e) { + throw new PersistenceException(e); + } + } + + private long getEmployeeVersionId(long employeeId) throws PersistenceException { + String sqlGetEmployeeVersionId = "SELECT * FROM employee WHERE id = ?"; + try (PreparedStatement stmt = + jdbcConnectionManager.getConnection().prepareStatement(sqlGetEmployeeVersionId)) { + stmt.setLong(1, employeeId); + ResultSet rs = stmt.executeQuery(); + if (rs.next()) { + return rs.getLong("version"); + } else { + throw new PersistenceException("employee id not found"); + } + } catch (SQLException e) { + throw new PersistenceException(e); + } + } + @Override public Set add(long vehicleId, Set registrations) throws PersistenceException { @@ -47,10 +81,12 @@ public class RegistrationDatabaseDAO implements RegistrationDAO { try (PreparedStatement pstmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { - pstmt.setLong(1, vehicleId); + + // vehicleId is a Vehicle.id as it comes from GUI => fetch VehicleVersion.id + pstmt.setLong(1, getVehicleVersionId(vehicleId)); for (Registration r : registrations) { - pstmt.setLong(2, r.employee().id()); + pstmt.setLong(2, getEmployeeVersionId(r.employee().id())); pstmt.setObject(3, OffsetDateTime.ofInstant(r.start(), ZoneId.systemDefault())); pstmt.setObject(4, OffsetDateTime.ofInstant(r.end(), ZoneId.systemDefault())); pstmt.setBoolean(5, true); @@ -86,40 +122,48 @@ public class RegistrationDatabaseDAO implements RegistrationDAO { } protected List list(long vehicleId) throws PersistenceException { - String sql = "SELECT * FROM Registration WHERE vehicleId = ?"; - - List registrationList = new ArrayList<>(); - try { - Connection con = jdbcConnectionManager.getConnection(); - try (PreparedStatement pstmt = con.prepareStatement(sql)) { - pstmt.setLong(1, vehicleId); + // vehicleId is a Vehicle.id as it comes from GUI => fetch VehicleVersion.id + long vehicleVersionId = getVehicleVersionId(vehicleId); - try (ResultSet rs = pstmt.executeQuery()) { - while (rs.next()) { - long employeeId = rs.getLong("employeeId"); - // TODO: replace the following with employeePersistence.get once implemented - Employee emp = - employeePersistence - .list() - .stream() - .filter(employee -> employee.id() == employeeId) - .findAny() - .orElse(null); - Registration registration = - Registration.builder() - .id(rs.getLong("id")) - .start( - (rs.getObject("start", OffsetDateTime.class)) - .toInstant()) - .end( - (rs.getObject("end", OffsetDateTime.class)) - .toInstant()) - .employee(emp) - .build(); - registrationList.add(registration); - } - } + String sql = + "SELECT * FROM Registration r " + + "JOIN EmployeeVersion ev ON ev.id = r.employeeId " + + "JOIN VehicleVersion vv ON vv.id = r.vehicleId " + + "WHERE r.vehicleId = ?"; + + try (PreparedStatement stmt = jdbcConnectionManager.getConnection().prepareStatement(sql)) { + + List registrationList = new ArrayList<>(); + stmt.setLong(1, vehicleVersionId); + ResultSet rs = stmt.executeQuery(); + while (rs.next()) { + + Employee employee = + Employee.builder() + .id(rs.getLong("EmployeeVersion.id")) + .name(rs.getString("EmployeeVersion.name")) + .birthday(rs.getObject("EmployeeVersion.birthday", LocalDate.class)) + .educationLevel( + EducationLevel.valueOf( + rs.getString("EmployeeVersion.educationLevel"))) + .isDriver(rs.getBoolean("EmployeeVersion.isDriver")) + .isPilot(rs.getBoolean("EmployeeVersion.isPilot")) + .build(); + + Registration registration = + Registration.builder() + .id(rs.getLong("Registration.id")) + .start( + (rs.getObject("Registration.start", OffsetDateTime.class)) + .toInstant()) + .end( + (rs.getObject("Registration.end", OffsetDateTime.class)) + .toInstant()) + .employee(employee) + .build(); + + registrationList.add(registration); } return registrationList; diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDatabaseDAO.java index 9bd7ec7..eb3cc61 100644 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDatabaseDAO.java +++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/dao/VehicleDatabaseDAO.java @@ -205,7 +205,7 @@ public class VehicleDatabaseDAO implements VehicleDAO { .type(VehicleType.valueOf(rs.getString("type"))) .status(Status.values()[rs.getInt("status")]) .hasNef(rs.getBoolean("hasNef")) - .registrations(registrationDatabaseDao.list(rs.getLong("id"))) + .registrations(registrationDatabaseDao.list(rs.getLong("Vehicle.id"))) .build(); } } -- cgit v1.2.3-70-g09d2