diff options
author | Viktoria Pundy <viktoria.pundy@aon.at> | 2018-05-02 13:09:47 +0200 |
---|---|---|
committer | Viktoria Pundy <viktoria.pundy@aon.at> | 2018-05-06 18:12:30 +0200 |
commit | 8a351f2056cd26fd220c0193ba1400f2c810f940 (patch) | |
tree | 55eb683aa393cafaa8bdcc89e4e23d4317ee0b44 /src | |
parent | c3521f4415d5b2f722a25731d5f77be82767e118 (diff) | |
download | sepm-groupproject-8a351f2056cd26fd220c0193ba1400f2c810f940.tar.gz sepm-groupproject-8a351f2056cd26fd220c0193ba1400f2c810f940.tar.xz sepm-groupproject-8a351f2056cd26fd220c0193ba1400f2c810f940.zip |
Added Operation DAO and -Service for Operation, implemented needed methods.
Diffstat (limited to 'src')
2 files changed, 237 insertions, 0 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 new file mode 100644 index 0000000..c68b795 --- /dev/null +++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/DBOperationDAO.java @@ -0,0 +1,145 @@ +package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao; + +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Operation.Status; +import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.EnumSet; +import java.util.List; + +public class DBOperationDAO implements OperationDAO { + + @Override + public long add(Operation operation) throws PersistenceException { + PreparedStatement pstmt = null; + try { + pstmt = + H2Handler.getConnection() + .prepareStatement( + "INSERT INTO operation(opCode, severity, " + + "created, destination, additionalInfo, status) values (?,?,?,?,?,?)"); + + if (operation.opCode() == null) { + throw new PersistenceException("Code darf nicht null sein!"); + } else if (operation.opCode().length() > 20) + throw new PersistenceException( + "Länge des OP-Codes überschreitet erlaubte Länge von 100 Zeichen!"); + else pstmt.setString(1, operation.opCode()); + switch (operation.severity()) { + case A: + pstmt.setInt(2, 0); + break; + case B: + pstmt.setInt(2, 1); + break; + case C: + pstmt.setInt(2, 2); + break; + case D: + pstmt.setInt(2, 3); + break; + case E: + pstmt.setInt(2, 4); + break; + case O: + pstmt.setInt(2, 5); + break; + default: + throw new PersistenceException( + "Schwere des Einsatzes konnte nicht validiert werden!"); + } + // TODO: CHECK IF TIME ZONE CORRECT + if (operation.created() != null) { + pstmt.setTimestamp(3, Timestamp.from(operation.created())); + } else { + throw new PersistenceException("Zeitpunkt der Erstellung darf nicht null sein!"); + } + + if (operation.destination() == null) { + throw new PersistenceException("Einsatzort darf nicht null sein!"); + } else if (operation.destination().length() > 100) { + throw new PersistenceException( + "Länge der Adresse überschreitet erlaubte Länge von 100 Zeichen!"); + } else { + pstmt.setString(4, operation.destination()); + } + if (operation.additionalInfo().length() > 100) + throw new PersistenceException( + "Länge der zusätzlichen Information überschreitet erlaubte Länge von 100 Zeichen!"); + else pstmt.setString(5, operation.additionalInfo()); + if (operation.status() != null) { + pstmt.setString(6, operation.status().toString()); + } else if (operation.status().toString().length() > 100) { + throw new PersistenceException( + "Länge des Status überschreitet erlaubte Länge von 100 Zeichen!"); + } else { + throw new PersistenceException("Status darf nicht null sein!"); + } + + pstmt.executeQuery(); + ResultSet rs = pstmt.getGeneratedKeys(); + if (rs.next()) return rs.getInt(1); + else throw new PersistenceException("Einsatz konnte nicht gespeichert werden"); + } catch (SQLException | ClassNotFoundException e) { + throw new PersistenceException(e); + } finally { + if (pstmt != null) { + try { + pstmt.close(); + } catch (SQLException e) { + throw new PersistenceException( + "Verbindung zur Datenbank konnte nicht geschlossen werden!", e); + } + } + } + } + + @Override + public void update(Operation operation) throws ElementNotFoundException, PersistenceException {} + + @Override + public Operation get(long operationId) throws ElementNotFoundException, PersistenceException { + return null; + } + + @Override + public List<Operation> list(EnumSet<Status> statuses) throws PersistenceException { + return null; + } + + @Override + public int connectVehicleToOperation(long vehicleID, long operationID) + throws PersistenceException { + PreparedStatement pstmt = null; + try { + pstmt = + H2Handler.getConnection() + .prepareStatement( + "insert into VehicleOperation(vehicleId, operationId)" + + "values (?,?)"); + pstmt.setLong(1, vehicleID); + pstmt.setLong(2, operationID); + pstmt.executeQuery(); + ResultSet rs = pstmt.getGeneratedKeys(); + if (rs.next()) return rs.getInt(1); + else + throw new PersistenceException( + "Fahrzeug für die Operation konnte nicht abgespeichert werden!"); + } catch (SQLException | ClassNotFoundException e) { + throw new PersistenceException(e); + } finally { + if (pstmt != null) { + try { + pstmt.close(); + } catch (SQLException e) { + throw new PersistenceException( + "Verbindung zur Datenbank konnte nicht geschlossen werden!", e); + } + } + } + } +} 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 new file mode 100644 index 0000000..f705084 --- /dev/null +++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceImpl.java @@ -0,0 +1,92 @@ +package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service; + +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.DBOperationDAO; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDAO; +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.Vehicle; +import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType; +import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException; +import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; +import java.util.EnumSet; +import java.util.List; +import javafx.collections.transformation.SortedList; + +public class OperationServiceImpl implements OperationService { + + // TODO: anders? + private OperationDAO operationDAO = new DBOperationDAO(); + + @Override + public long add(Operation operation) throws InvalidOperationException, PersistenceException { + List<Vehicle> vehicles = operation.vehicles(); + boolean rtw = false; + for (Vehicle vehicle : vehicles) { + if (vehicle.status() == Vehicle.Status.ABGEMELDET) + throw new InvalidOperationException( + "Abgemeldete Fahrzeuge dürfen nicht zu einem Einsatz geschickt werden!"); + if (vehicle.type() == VehicleType.NEF && !rtw) { + for (Vehicle vehicleA : vehicles) { + if (vehicleA.type() == VehicleType.RTW && vehicleA.hasNef()) { + rtw = true; + break; + } + } + if (!rtw) + throw new InvalidOperationException( + "Zu einem Fahrzeug des Typs NEF muss auch ein Fahrzeug des Typs RTW mit NEF-Halterung geschickt werden!"); + } + if (vehicle.type() == VehicleType.NAH && !rtw) { + for (Vehicle vehicleA : vehicles) { + if (vehicleA.type() == VehicleType.RTW) { + rtw = true; + break; + } + } + if (!rtw) + throw new InvalidOperationException( + "Zu einem Fahrzeug des Typs NAH muss auch ein Fahrzeug des Typs RTW geschickt werden!"); + } + } + String[] codeParts = operation.opCode().split("\\-"); + String severity = ""; + for (int i = 0; i < codeParts[1].length(); i++) { + if ((int) (codeParts[1].charAt(i)) > 101 && (int) (codeParts[1].charAt(i)) < 117) { + severity = "" + codeParts[1].charAt(i); + break; + } + } + try { + operation = operation.toBuilder().severity(Severity.valueOf(severity)).build(); + } catch (IllegalArgumentException e) { + throw new InvalidOperationException( + "Der Schweregrad des Einsatzes konnte nicht ausgelesen werden!"); + } + for (Vehicle vehicle : vehicles) { + operationDAO.connectVehicleToOperation(vehicle.id(), operation.id()); + } + return operationDAO.add(operation); + // TODO: CODE VALIDIEREN, Adresse nach vierstelliger Nummer suchen, + } + + @Override + public void requestVehicles(long operationId, List<Long> vehicleIds) + throws InvalidOperationException, InvalidVehicleException, PersistenceException {} + + @Override + public void complete(long operationId, Status status) + throws InvalidOperationException, PersistenceException {} + + @Override + public SortedList<Vehicle> rankVehicles(long operationId) + throws InvalidOperationException, PersistenceException { + return null; + } + + @Override + public List<Operation> list(EnumSet<Status> statuses) throws PersistenceException { + return null; + } +} |