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 | |
| 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.
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; +    } +}  | 
