diff options
author | Tharre <tharre3@gmail.com> | 2018-06-20 22:07:36 +0200 |
---|---|---|
committer | Tharre <tharre3@gmail.com> | 2018-06-20 22:07:36 +0200 |
commit | 0c995a05985da749d93aa56eba976c7fc621a4fa (patch) | |
tree | 5b80394920705aae5e2b6004c3dfbd839c8b8fa3 /src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung | |
parent | f5bc7925a8fbbe247972a6f0e0571cc7e92fbefa (diff) | |
parent | e21feb3ac772a5394dc5381b58142c3c061de716 (diff) | |
download | sepm-groupproject-0c995a05985da749d93aa56eba976c7fc621a4fa.tar.gz sepm-groupproject-0c995a05985da749d93aa56eba976c7fc621a4fa.tar.xz sepm-groupproject-0c995a05985da749d93aa56eba976c7fc621a4fa.zip |
Diffstat (limited to 'src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung')
32 files changed, 0 insertions, 3730 deletions
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ArchiveOperationController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ArchiveOperationController.java deleted file mode 100644 index 80d9fc4..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ArchiveOperationController.java +++ /dev/null @@ -1,127 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller; - -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.einsatzverwaltung.dto.Vehicle; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationService; -import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; -import java.time.LocalDateTime; -import java.time.ZoneOffset; -import java.util.Collection; -import java.util.EnumSet; -import java.util.LinkedList; -import java.util.Objects; -import java.util.stream.Collectors; -import javafx.fxml.FXML; -import javafx.scene.control.Alert; -import javafx.scene.control.Alert.AlertType; -import javafx.scene.control.Button; -import javafx.scene.control.Hyperlink; -import javafx.scene.control.Label; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.FlowPane; -import org.springframework.stereotype.Controller; - -@Controller -public class ArchiveOperationController { - @FXML private AnchorPane apDetails; - @FXML private Label lblCodeHeader; - @FXML private Hyperlink hypBack; - @FXML private Label lblOpCode; - @FXML private Label lblVehicles; - @FXML private Label lblDate; - @FXML private Label lblAddress; - @FXML private FlowPane fpVehicles; - private final OperationService operationService; - @FXML private FlowPane archiveOperationFlowPane; - private LinkedList<Operation> list = new LinkedList<>(); - - public ArchiveOperationController(OperationService operationService) { - this.operationService = operationService; - } - - @FXML - private void initialize() { - try { - list.addAll(operationService.list(EnumSet.of(Status.CANCELLED, Status.COMPLETED))); - } catch (ServiceException e) { - Alert alert = new Alert(AlertType.ERROR); - alert.setTitle("Fehler"); - alert.setHeaderText("Fehler!"); - alert.setContentText("Die Einsätze konnten nicht geladen werden!"); - alert.showAndWait(); - } - for (Operation operation : list) { - Button b = new Button(); - b.setPrefHeight(200); - b.setPrefWidth(750 / 2); - b.setText(operation.opCode()); - b.setOnAction(event -> buttonClicked(b)); - archiveOperationFlowPane.getChildren().add(b); - } - } - - private Operation detailOperation; - - private void buttonClicked(Button button) { - int size = archiveOperationFlowPane.getChildren().size(); - int index = 0; - for (int i = 0; i < size; i++) { - if (archiveOperationFlowPane.getChildren().get(i) == button) { - index = i; - break; - } - } - detailOperation = list.get(index); - setOperation(); - setDetailsVisible(true); - } - - private void setOperation() { - lblCodeHeader.setText(detailOperation.opCode()); - String date = "am "; - if (detailOperation.created() != null) { - LocalDateTime myDateTime = - LocalDateTime.ofInstant( - Objects.requireNonNull(detailOperation.created()), ZoneOffset.UTC); - date += - myDateTime.getDayOfMonth() - + "." - + myDateTime.getMonth().getValue() - + "." - + myDateTime.getYear(); - lblDate.setText(date); - } else { - lblDate.setText("---"); - } - - lblOpCode.setText(detailOperation.opCode()); - Collection<String> elements = - detailOperation.vehicles().stream().map(Vehicle::name).collect(Collectors.toList()); - String result = String.join(", ", elements); - - lblVehicles.setText(result); - lblAddress.setText(detailOperation.destination()); - - for (Vehicle vehicle : detailOperation.vehicles()) { - Button b = new Button(); - b.setPrefHeight(200); - b.setPrefWidth(600 / 2); - b.setText(vehicle.name()); - fpVehicles.getChildren().add(b); - } - } - - public void setListVisible(boolean b) { - archiveOperationFlowPane.setVisible(b); - } - - private void setDetailsVisible(boolean b) { - apDetails.setVisible(b); - } - - public void backClicked() { - fpVehicles.getChildren().clear(); - setDetailsVisible(false); - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateCarController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateCarController.java deleted file mode 100644 index ce795da..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateCarController.java +++ /dev/null @@ -1,206 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller; - -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.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.EnumSet; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import javafx.collections.FXCollections; -import javafx.event.ActionEvent; -import javafx.fxml.FXML; -import javafx.geometry.HPos; -import javafx.geometry.Orientation; -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.scene.layout.FlowPane; -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 Button btn_create; - @FXML private CheckBox cbx_NEF; - @FXML private FlowPane fp_vehicleList; - - private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - private final VehicleService vehicleService; - private boolean update = false; - private long vid = -1; - - public CreateCarController(VehicleService vehicleService) { - this.vehicleService = vehicleService; - } - - @FXML - private 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()); - vehicleListFP(); - } - - @FXML - private void onCancelClicked() { - ((Stage) btn_cancel.getScene().getWindow()).close(); - } - - @FXML - private void createCar(ActionEvent actionEvent) { - - if (!update) { - Vehicle vehicle = - Vehicle.builder() - .constructionType(parseConstructionType()) - .type(parseType()) - .name("") - .status(Status.ABGEMELDET) - .hasNef(cbx_NEF.isSelected()) - .build(); - try { - vehicleService.add(vehicle); - setToStart(); - } catch (InvalidVehicleException e) { - LOG.error("Invalid Vehicle: {}", e); - createComplete(AlertType.ERROR, "Ungültige Eingabe", e.getMessage()); - setToStart(); - return; - } catch (ServiceException e) { - LOG.error("Exception: {}", e); - createComplete(AlertType.ERROR, "Fehler", e.getMessage()); - setToStart(); - return; - } - createComplete( - AlertType.CONFIRMATION, - "Speichern Erfolgreich", - "Auto wurde erfolgreich angelegt"); - } else { - try { - Vehicle vehicle = - Vehicle.builder() - .id(vid) - .constructionType(parseConstructionType()) - .type(parseType()) - .name("") - .status(Status.ABGEMELDET) - .hasNef(cbx_NEF.isSelected()) - .build(); - vehicleService.update(vehicle); - setToStart(); - } catch (InvalidVehicleException e) { - LOG.error("Invalid Vehicle: {}", e); - createComplete(AlertType.ERROR, "Ungültige Eingabe", e.getMessage()); - setToStart(); - return; - } catch (ServiceException e) { - LOG.error("Exception: {}", e); - createComplete(AlertType.ERROR, "Fehler", e.getMessage()); - setToStart(); - return; - } - createComplete( - AlertType.CONFIRMATION, - "Bearbiten Erfolgreich", - "Auto wurde erfolgreich bearbeitet"); - } - vehicleListFP(); - } - - 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(); - } - - private void vehicleListFP() { - Set<Vehicle> vehicleList = null; - fp_vehicleList.getChildren().clear(); - try { - vehicleList = vehicleService.list(EnumSet.range(Status.ABGEMELDET, Status.FREI_FUNK)); - } catch (ServiceException e) { - e.printStackTrace(); - } - - fp_vehicleList.setOrientation(Orientation.HORIZONTAL); - fp_vehicleList.setColumnHalignment(HPos.LEFT); // align labels on left - fp_vehicleList.setPrefWrapLength(200); // preferred height = 200 - - for (Vehicle v : vehicleList) { - Button b = new Button(v.name()); - b.setOnAction(event -> updateVehicle(v)); - fp_vehicleList.getChildren().add(b); - } - fp_vehicleList.setVisible(true); - } - - private void setToStart() { - btn_create.setText("Erstellen"); - cbx_NEF.setSelected(false); - cmb_typ.setValue(VehicleType.BKTW.name()); - cmb_Ctyp.setValue(ConstructionType.NORMAL.name()); - update = false; - } - - private void updateVehicle(Vehicle vehicle) { - cmb_Ctyp.setValue(vehicle.constructionType().name()); - cmb_typ.setValue(vehicle.type().name()); - cbx_NEF.setSelected(vehicle.hasNef()); - btn_create.setText("Speichern"); - vid = vehicle.id(); - update = true; - } - - @FXML - public void cancelAction(ActionEvent actionEvent) { - setToStart(); - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeController.java deleted file mode 100644 index 15282cc..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateNewEmployeeController.java +++ /dev/null @@ -1,189 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller; - -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.service.EmployeeService; -import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; -import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader; -import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper; -import java.io.IOException; -import java.lang.invoke.MethodHandles; -import java.time.LocalDate; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import javafx.collections.FXCollections; -import javafx.fxml.FXML; -import javafx.scene.Node; -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.scene.control.Label; -import javafx.scene.control.TextField; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Controller; - -@Controller -@Scope("prototype") -public class CreateNewEmployeeController { - - private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - private final EmployeeService employeeService; - - @FXML private Label lblHeader; - @FXML private CheckBox inputIsDriver; - @FXML private CheckBox inputIsPilot; - @FXML private TextField inputName; - @FXML private ChoiceBox<String> inputQualification; - @FXML private Button btnCreate; - - private Node rootElement; - private Employee employee; - private boolean isEdit; - - private Runnable consumerCancelClicked; - private Runnable consumerCreateClicked; - - public CreateNewEmployeeController(EmployeeService employeeService) { - this.employeeService = employeeService; - } - - @FXML - private void initialize() { - inputQualification.setItems( - FXCollections.observableArrayList( - Stream.of( - EducationLevel.RS, - EducationLevel.NFS, - EducationLevel.NKV, - EducationLevel.NKA, - EducationLevel.NKI, - EducationLevel.NA) - .map(Enum::toString) - .collect(Collectors.toList()))); - - inputQualification.setValue(EducationLevel.RS.toString()); - employee = - Employee.builder() - .name("") - .educationLevel(EducationLevel.RS) - .isDriver(false) - .isPilot(false) - .birthday(LocalDate.MIN) - .build(); - } - - @FXML - private void onCancelClicked() { - if (consumerCancelClicked != null) { - consumerCancelClicked.run(); - } - } - - @FXML - private void onCreateClicked() { - - employee = - employee.toBuilder() - .name(inputName.getText()) - .educationLevel(parseEducationLevel()) - .birthday(LocalDate.MIN) // TODO: change UI to include birthday field - .isDriver(inputIsDriver.isSelected()) - .isPilot(inputIsPilot.isSelected()) - .build(); - - try { - if (isEdit) { - employeeService.update(employee); - } else { - employeeService.add(employee); - } - } catch (InvalidEmployeeException e) { - LOG.error("Invalid Employee: {}", e); - - showModalDialogWithOkButton( - AlertType.ERROR, - "Ungültige Eingabe", - "Mindestens eines der Eingabefelder haben einen ungültigen Wert!"); - return; - } catch (ServiceException e) { - LOG.error("Employee could not be saved: {}", e); - - showModalDialogWithOkButton( - AlertType.ERROR, - "Speicherfehler", - "Der Eintrag konnte nicht gespeichert werden. Bitte versuchen Sie es erneut."); - return; - } - - showModalDialogWithOkButton( - AlertType.INFORMATION, - "Erfolgreich angelegt", - "Mitarbeiter wurde erfolgreich angelegt und gespeichert!"); - - if (consumerCreateClicked != null) { - consumerCreateClicked.run(); - } - } - - private void showModalDialogWithOkButton( - AlertType alertType, String headerText, String contentText) { - Alert alert = new Alert(alertType, contentText, ButtonType.OK); - alert.setHeaderText(headerText); - alert.showAndWait(); - } - - private EducationLevel parseEducationLevel() { - if (inputQualification.getSelectionModel().getSelectedItem() == null) { - return EducationLevel.RS; - } - return EducationLevel.valueOf(inputQualification.getSelectionModel().getSelectedItem()); - } - - private void setData(Employee employee) { - isEdit = true; - this.employee = employee; - inputName.setText(employee.name()); - inputQualification.setValue(employee.educationLevel().name()); - inputIsDriver.setSelected(employee.isDriver()); - inputIsPilot.setSelected(employee.isPilot()); - - lblHeader.setText("Person bearbeiten"); - btnCreate.setText("Speichern"); - } - - public static CreateNewEmployeeController createCreateNewEmployeeController( - SpringFXMLLoader fxmlLoader, Employee employee) throws IOException { - CreateNewEmployeeController controller = createCreateNewEmployeeController(fxmlLoader); - controller.setData(employee); - return controller; - } - - public static CreateNewEmployeeController createCreateNewEmployeeController( - SpringFXMLLoader fxmlLoader) throws IOException { - FXMLWrapper<Object, CreateNewEmployeeController> wrapper = - fxmlLoader.loadAndWrap( - "/fxml/createNewEmployee.fxml", CreateNewEmployeeController.class); - Node root = (Node) wrapper.getLoadedObject(); - CreateNewEmployeeController controller = wrapper.getController(); - controller.rootElement = root; - return controller; - } - - public Node getRootElement() { - return rootElement; - } - - public void setConsumerCancelClicked(Runnable consumerCancelClicked) { - this.consumerCancelClicked = consumerCancelClicked; - } - - public void setConsumerCreateClicked(Runnable consumerCreateClicked) { - this.consumerCreateClicked = consumerCreateClicked; - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateOperationController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateOperationController.java deleted file mode 100644 index 57759e3..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/CreateOperationController.java +++ /dev/null @@ -1,365 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller; - -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.einsatzverwaltung.dto.Registration; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationService; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService; -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.ServiceException; -import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader; -import java.io.IOException; -import java.lang.invoke.MethodHandles; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; -import javafx.collections.FXCollections; -import javafx.event.ActionEvent; -import javafx.fxml.FXML; -import javafx.scene.Parent; -import javafx.scene.Scene; -import javafx.scene.control.Alert; -import javafx.scene.control.Alert.AlertType; -import javafx.scene.control.Button; -import javafx.scene.control.ContextMenu; -import javafx.scene.control.Label; -import javafx.scene.control.ListCell; -import javafx.scene.control.ListView; -import javafx.scene.control.MenuItem; -import javafx.scene.control.TextField; -import javafx.scene.input.KeyCode; -import javafx.scene.input.KeyEvent; -import javafx.scene.input.MouseButton; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.FlowPane; -import javafx.stage.Stage; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Controller; - -@Controller -public class CreateOperationController { - - private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - - public AnchorPane apCreateOperation; - @FXML private TextField txtCode; - @FXML private TextField txtAddress; - @FXML private TextField txtNote; - @FXML private Button btnCreateOperation; - @FXML private ListView<Vehicle> lvVehicles; - @FXML private ListView<Operation> lvActiveOperations; - @FXML private Label lblChosenVehicles; - @FXML private AnchorPane apInvisible; - @FXML private OperationDetailsController operationDetailsController; - @FXML private FlowPane fpVehicles; - - private LinkedList<Vehicle> chosenVehicles = new LinkedList<>(); - - private final OperationService operationService; - private final VehicleService vehicleService; - private final SpringFXMLLoader fxmlLoader; - - public CreateOperationController( - OperationService operationService, - VehicleService vehicleService, - SpringFXMLLoader fxmlLoader) { - this.operationService = operationService; - this.vehicleService = vehicleService; - this.fxmlLoader = fxmlLoader; - } - - @FXML - private void initialize() { - lblChosenVehicles.setText("keine ausgewählt"); - lvActiveOperations.setCellFactory( - param -> - new ListCell<>() { - @Override - protected void updateItem(Operation item, boolean empty) { - super.updateItem(item, empty); - - if (empty || item == null || item.opCode() == null) { - setText(null); - } else { - setText(item.opCode()); - } - } - }); - lvActiveOperations.setOnMouseClicked( - event -> { - if (event.getClickCount() == 2) { - if (lvActiveOperations.getSelectionModel().getSelectedItem() == null) { - return; - } - openDetailsWindow(lvActiveOperations.getSelectionModel().getSelectedItem()); - } - }); - } - - public void updateList() { - try { - fpVehicles.getChildren().clear(); - - // TODO: this should probably be handled differently - Set<Vehicle> vehicles; - if (txtCode.getText().isEmpty()) { - vehicles = - vehicleService.list( - EnumSet.complementOf(EnumSet.of(Vehicle.Status.ABGEMELDET))); - } else { - vehicles = operationService.rankVehicles(txtCode.getText()); - } - - for (Vehicle vehicle : vehicles) { - VehiclePaneController controller = VehiclePaneController.createVehiclePane(); - - controller.setData(vehicle, true); - controller - .getRootElement() - .setOnMouseClicked( - event -> { - if (event.getButton().equals(MouseButton.SECONDARY)) { - createContextMenu(vehicle, vehicleService) - .show( - controller.getRootElement(), - event.getScreenX(), - event.getScreenY()); - } else { - if (chosenVehicles.contains(vehicle)) { - chosenVehicles.remove(vehicle); - controller.setSelected(false); - } else { - chosenVehicles.add(vehicle); - controller.setSelected(true); - } - - StringBuilder result = new StringBuilder(); - for (int i = 0; i < chosenVehicles.size(); i++) { - if (i == chosenVehicles.size() - 1) { - result.append(chosenVehicles.get(i).name()); - } else { - result.append(chosenVehicles.get(i).name()) - .append(", "); - } - } - if (result.toString().equals("")) { - lblChosenVehicles.setText("keine ausgewählt"); - } else { - lblChosenVehicles.setText(result.toString()); - } - } - }); - - fpVehicles.getChildren().add(controller.getRootElement()); - } - } catch (ServiceException | IOException | InvalidOperationException e) { - LOG.error("Error while updating list.", e); - - Alert alert = new Alert(Alert.AlertType.ERROR); - alert.setTitle("Fehler"); - alert.setHeaderText("Fehler!"); - alert.setContentText(e.getMessage()); - alert.showAndWait(); - } - try { - lvActiveOperations.setItems( - FXCollections.observableArrayList( - operationService.list(EnumSet.of(Status.ACTIVE)))); - } catch (ServiceException e) { - Alert alert = new Alert(Alert.AlertType.ERROR); - alert.setTitle("Fehler - Einsätze"); - alert.setHeaderText("Beim Holen der aktiven Einsätze ist ein Fehler aufgetreten."); - alert.setContentText(e.getMessage()); - alert.showAndWait(); - } - } - - private ContextMenu createContextMenu(Vehicle data, VehicleService vehicleService) { - ContextMenu menu = new ContextMenu(); - - for (Vehicle.Status status : Vehicle.Status.values()) { - if (status == Vehicle.Status.ABGEMELDET) { - continue; - } - - MenuItem mi = new MenuItem(status.name()); - - if (status == Vehicle.Status.FREI_FUNK || status == Vehicle.Status.FREI_WACHE) { - mi.getStyleClass().add("mi-free"); - } else { - mi.getStyleClass().add("mi-other"); - } - - mi.setOnAction( - event -> { - try { - vehicleService.update(data.toBuilder().status(status).build()); - this.updateList(); - } catch (InvalidVehicleException | ServiceException e) { - LOG.error("Error while setting status.", e); - Alert a = new Alert(AlertType.ERROR, e.getMessage()); - a.show(); - } - }); - - menu.getItems().add(mi); - } - - MenuItem abmelden = new MenuItem("abmelden"); - - abmelden.setOnAction( - event -> { - try { - List<Registration> registrations = data.registrations(); - assert registrations - != null; // Otherwise the element shouldn't be in the list. - - List<Registration> newRegistrations = new ArrayList<>(); - Instant now = Instant.now(); - - for (Registration registration : registrations) { - if (registration.start().isBefore(now) - && registration.end().isAfter(now)) { - newRegistrations.add( - registration - .toBuilder() - .end(Instant.now().minus(1, ChronoUnit.SECONDS)) - .build()); - } else newRegistrations.add(registration); - } - - vehicleService.update( - data.toBuilder() - .registrations(newRegistrations) - .status(Vehicle.Status.ABGEMELDET) - .build()); - - this.updateList(); - } catch (InvalidVehicleException | ServiceException e) { - LOG.error("Error while unregistering.", e); - Alert a = new Alert(AlertType.ERROR, e.getMessage()); - a.show(); - } - }); - - menu.getItems().add(abmelden); - return menu; - } - - @FXML - protected void createOperationClicked() { - Vehicle[] vehicles = new Vehicle[chosenVehicles.size()]; - for (int i = 0; i < chosenVehicles.size(); i++) { - vehicles[i] = chosenVehicles.get(i); - } - Operation operation = - Operation.builder() - .additionalInfo(txtNote.getText()) - .destination(txtAddress.getText()) - .opCode(txtCode.getText()) - .status(Status.ACTIVE) - .vehicles(Set.of(vehicles)) - .build(); - try { - operationService.add(operation); - } catch (ServiceException | InvalidOperationException e) { - Alert alert = new Alert(Alert.AlertType.ERROR); - alert.setTitle("Fehler"); - alert.setHeaderText("Fehler!"); - alert.setContentText(e.getMessage()); - alert.showAndWait(); - return; - } - Alert alert = new Alert(AlertType.CONFIRMATION); - alert.setTitle("Erfolg"); - alert.setHeaderText("Erfolgreich gespeichert"); - alert.setContentText("Der Einsatz wurde erfolgreich gespeichert."); - alert.showAndWait(); - updateList(); - lblChosenVehicles.setText("keine ausgewählt"); - txtAddress.setText(""); - txtCode.setText(""); - txtNote.setText(""); - chosenVehicles = new LinkedList<>(); - } - - public void onRegistrationLinkClicked(ActionEvent actionEvent) { - openNewWindow("RegistrationWindow.fxml"); - } - - public void onEmployeeLinkClicked(ActionEvent actionEvent) { - openNewWindow("listEmployees.fxml"); - } - - public void onVehicleLinkClicked(ActionEvent actionEvent) { - openNewWindow("createCar.fxml"); - } - - public void onArchivLinkClicked() { - openNewArchivWindow(); - } - - private void openNewArchivWindow() { - Stage stage = new Stage(); - try { - stage.setScene( - new Scene( - (Parent) - fxmlLoader.load( - getClass() - .getResourceAsStream( - "/fxml/ArchiveOperation.fxml")))); - } catch (IOException e) { - LOG.error("Could not open new window: {}", e); - } - stage.setTitle("Einsatz erstellen"); - stage.centerOnScreen(); - stage.show(); - updateList(); - } - - private void openNewWindow(String fxmlFileName) { - - Stage stage = new Stage(); - try { - stage.setScene( - new Scene( - (Parent) - fxmlLoader.load( - getClass() - .getResourceAsStream( - "/fxml/" + fxmlFileName)))); - } catch (IOException e) { - LOG.error("Could not open new window: {}", e); - } - - stage.setTitle("Ressourcenverwaltung"); - stage.centerOnScreen(); - stage.showAndWait(); // important to call wait so that updateList is executed afterwards - - updateList(); - } - - void setVisible(boolean b) { - apInvisible.setVisible(!b); - } - - private void openDetailsWindow(Operation operation) { - operationDetailsController.initOperation(operation); - this.setVisible(false); - } - - @FXML - public void onOperationCodeChanged(KeyEvent keyEvent) { - if (keyEvent.getCode() == KeyCode.ENTER) { - updateList(); - } - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListItemController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListItemController.java deleted file mode 100644 index 11b5626..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListItemController.java +++ /dev/null @@ -1,83 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller; - -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee; -import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader; -import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper; -import java.io.IOException; -import java.util.function.Consumer; -import javafx.fxml.FXML; -import javafx.scene.Node; -import javafx.scene.control.Label; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Controller; - -@Controller -@Scope("prototype") -public class EmployeeListItemController { - - @FXML private Label lblName; - @FXML private Label lblQualification; - @FXML private Label lblPilot; - @FXML private Label lblDriver; - @FXML private ImageView imgPilot; - @FXML private ImageView imgDriver; - @FXML private ImageView imgQualification; - - private Node rootElement; - private Employee employee; - - private Consumer<Employee> consumerEditEmployeeClicked; - - @FXML - public void onEditEmployeeClicked() { - if (consumerEditEmployeeClicked != null) { - consumerEditEmployeeClicked.accept(employee); - } - } - - private void setData(Employee employee) { - this.employee = employee; - lblName.setText(employee.name()); - lblQualification.setText(employee.educationLevel().name()); - lblPilot.setText(String.format("%s Pilot", employee.isPilot() ? "ist" : "nicht")); - lblDriver.setText(String.format("%s Fahrer", employee.isDriver() ? "ist" : "nicht")); - imgQualification.setImage(new Image("/images/Qualification.png")); - String imgSrcPilot = - String.format("/images/%s", employee.isPilot() ? "Pilot.png" : "NotPilot.png"); - imgPilot.setImage(new Image(imgSrcPilot)); - String imgSrcDriver = - String.format("/images/%s", employee.isDriver() ? "Driver.png" : "NotDriver.png"); - imgDriver.setImage(new Image(imgSrcDriver)); - } - - public static EmployeeListItemController createEmployeeListItemController( - SpringFXMLLoader fxmlLoader, Employee employee) throws IOException { - EmployeeListItemController controller = createEmployeeListItemController(fxmlLoader); - controller.setData(employee); - return controller; - } - - public static EmployeeListItemController createEmployeeListItemController( - SpringFXMLLoader loader) throws IOException { - FXMLWrapper<Object, EmployeeListItemController> wrapper = - loader.loadAndWrap("/fxml/employeeListItem.fxml", EmployeeListItemController.class); - Node root = (Node) wrapper.getLoadedObject(); - EmployeeListItemController controller = wrapper.getController(); - controller.rootElement = root; - return controller; - } - - public Node getRootElement() { - return rootElement; - } - - public Employee getEmployee() { - return employee; - } - - public void setConsumerEditEmployeeClicked(Consumer<Employee> consumerEditEmployeeClicked) { - this.consumerEditEmployeeClicked = consumerEditEmployeeClicked; - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/FilterEmployeesController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/FilterEmployeesController.java deleted file mode 100644 index 6d6214d..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/FilterEmployeesController.java +++ /dev/null @@ -1,60 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller; - -import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader; -import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper; -import java.io.IOException; -import java.util.function.Consumer; -import javafx.fxml.FXML; -import javafx.scene.Node; -import javafx.scene.control.TextField; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Controller; - -@Controller -@Scope("prototype") -public class FilterEmployeesController { - - @FXML private TextField inputFilterString; - - private Consumer<String> consumerFilterTextChanged; - private Runnable consumerAddEmployeeClicked; - - private Node rootElement; - - @FXML - private void onAddEmployeeClicked() { - if (consumerAddEmployeeClicked != null) { - consumerAddEmployeeClicked.run(); - } - } - - @FXML - private void onFilterTextChanged() { - if (consumerFilterTextChanged != null) { - consumerFilterTextChanged.accept(inputFilterString.getText()); - } - } - - public void setOnFilterTextChangedListener(Consumer<String> callback) { - this.consumerFilterTextChanged = callback; - } - - public void setOnAddEmployeeClickedListener(Runnable callback) { - this.consumerAddEmployeeClicked = callback; - } - - public static FilterEmployeesController createFilterEmployeesController( - SpringFXMLLoader fxmlLoader) throws IOException { - FXMLWrapper<Object, FilterEmployeesController> wrapper = - fxmlLoader.loadAndWrap( - "/fxml/filterEmployeesControl.fxml", FilterEmployeesController.class); - Node root = (Node) wrapper.getLoadedObject(); - FilterEmployeesController controller = wrapper.getController(); - controller.rootElement = root; - return controller; - } - - public Node getRootElement() { - return rootElement; - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ListEmployeesController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ListEmployeesController.java deleted file mode 100644 index 25f1263..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ListEmployeesController.java +++ /dev/null @@ -1,117 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller; - -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeService; -import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; -import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader; -import java.io.IOException; -import java.lang.invoke.MethodHandles; -import javafx.fxml.FXML; -import javafx.geometry.Insets; -import javafx.scene.Node; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.FlowPane; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Controller; - -@Controller -public class ListEmployeesController { - - private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - - @FXML private AnchorPane containerHeader; - @FXML private FlowPane flowPaneEmployeeList; - - private final EmployeeService employeeService; - private final SpringFXMLLoader fxmlLoader; - - public ListEmployeesController(EmployeeService employeeService, SpringFXMLLoader fxmlLoader) { - this.employeeService = employeeService; - this.fxmlLoader = fxmlLoader; - } - - @FXML - private void initialize() { - openFilter(); - } - - private void openFilter() { - try { - FilterEmployeesController filterEmployeesController = - FilterEmployeesController.createFilterEmployeesController(fxmlLoader); - containerHeader.getChildren().clear(); - containerHeader.getChildren().add(filterEmployeesController.getRootElement()); - filterEmployeesController.setOnFilterTextChangedListener(this::updateEmployeeList); - filterEmployeesController.setOnAddEmployeeClickedListener(this::openAddEmployee); - - updateEmployeeList(); - - } catch (IOException e) { - LOG.error("Could not initialize controller: {}", e); - } - } - - private void openAddEmployee() { - openEmployee(null); - } - - private void openEditEmployee(Employee employee) { - openEmployee(employee); - } - - private void openEmployee(Employee employee) { - try { - CreateNewEmployeeController createNewEmployeeController = - employee == null - ? CreateNewEmployeeController.createCreateNewEmployeeController( - fxmlLoader) - : CreateNewEmployeeController.createCreateNewEmployeeController( - fxmlLoader, employee); - containerHeader.getChildren().clear(); - containerHeader.getChildren().add(createNewEmployeeController.getRootElement()); - createNewEmployeeController.setConsumerCancelClicked(this::openFilter); - createNewEmployeeController.setConsumerCreateClicked(this::openFilter); - } catch (IOException e) { - LOG.error("Could not prepare UI for adding employee: {}", e); - } - } - - private void updateEmployeeList() { - updateEmployeeList(""); - } - - private void updateEmployeeList(String searchString) { - try { - flowPaneEmployeeList.getChildren().clear(); - employeeService - .list() - .stream() - .filter( - employee -> - searchString.trim().isEmpty() - || employee.name() - .toLowerCase() - .contains(searchString.toLowerCase())) - .forEach(this::addEmployeeToFlowPane); - } catch (ServiceException e) { - LOG.error("Could not fetch employee list: {}", e); - } - } - - private void addEmployeeToFlowPane(Employee employee) { - Insets listItemMargins = new Insets(0, 5, 10, 5); - - try { - EmployeeListItemController controller = - EmployeeListItemController.createEmployeeListItemController( - fxmlLoader, employee); - Node rootElement = controller.getRootElement(); - flowPaneEmployeeList.getChildren().add(rootElement); - FlowPane.setMargin(rootElement, listItemMargins); - controller.setConsumerEditEmployeeClicked(this::openEditEmployee); - } catch (IOException e) { - LOG.error("Could not create a new EmployeeListItem: {}", e); - } - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/OperationDetailsController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/OperationDetailsController.java deleted file mode 100644 index dc7e969..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/OperationDetailsController.java +++ /dev/null @@ -1,162 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller; - -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.einsatzverwaltung.dto.Vehicle; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.OperationService; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService; -import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidOperationException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; -import java.util.Collection; -import java.util.EnumSet; -import java.util.stream.Collectors; -import javafx.collections.FXCollections; -import javafx.fxml.FXML; -import javafx.scene.control.Alert; -import javafx.scene.control.Alert.AlertType; -import javafx.scene.control.Button; -import javafx.scene.control.Label; -import javafx.scene.control.ListCell; -import javafx.scene.control.ListView; -import javafx.scene.layout.AnchorPane; -import org.springframework.stereotype.Controller; - -@Controller -public class OperationDetailsController { - - public Operation operation; - private final OperationService operationService; - private final VehicleService vehicleService; - private final CreateOperationController createOperationController; - @FXML private ListView<Vehicle> lvVehicles; - @FXML private ListView<Operation> lvActiveOperations; - @FXML private Label lblChosenVehicles; - @FXML private Button btnCloseOperation; - @FXML private Button btnCancelOperation; - @FXML private Label lblCode, lblAdditionalInfo, lblAddress; - @FXML private AnchorPane operationDetailsAP; - - public OperationDetailsController( - OperationService operationService, - VehicleService vehicleService, - CreateOperationController createOperationController) { - this.operationService = operationService; - this.vehicleService = vehicleService; - this.createOperationController = createOperationController; - } - - @FXML - private void initialize() { - lvVehicles.setCellFactory( - param -> - new ListCell<>() { - @Override - protected void updateItem(Vehicle item, boolean empty) { - super.updateItem(item, empty); - - if (empty || item == null || item.name() == null) { - setText(null); - } else { - setText(item.name()); - } - } - }); - lvActiveOperations.setCellFactory( - param -> - new ListCell<>() { - @Override - protected void updateItem(Operation item, boolean empty) { - super.updateItem(item, empty); - - if (empty || item == null || item.opCode() == null) { - setText(null); - } else { - setText(item.opCode()); - } - } - }); - lvActiveOperations.setOnMouseClicked( - event -> { - if (event.getClickCount() == 2) { - if (lvActiveOperations.getSelectionModel().getSelectedItem() == null) { - return; - } - initOperation(lvActiveOperations.getSelectionModel().getSelectedItem()); - } - }); - } - - void initOperation(Operation operation) { - fillActiveList(); - this.operation = operation; - lblCode.setText(operation.opCode()); - Collection<String> vehicleNames = - operation.vehicles().stream().map(Vehicle::name).collect(Collectors.toList()); - String result = String.join(", ", vehicleNames); - lblChosenVehicles.setText(result.toString()); - lblAdditionalInfo.setText(operation.additionalInfo()); - lblAddress.setText(operation.destination()); - lvVehicles.setItems(FXCollections.observableArrayList(operation.vehicles())); - operationDetailsAP.setVisible(true); - } - - private void fillActiveList() { - try { - lvActiveOperations.setItems( - FXCollections.observableArrayList( - operationService.list(EnumSet.of(Status.ACTIVE)))); - } catch (ServiceException e) { - Alert alert = new Alert(AlertType.ERROR); - alert.setTitle("Fehler"); - alert.setHeaderText("Fehler!"); - alert.setContentText(e.getMessage()); - alert.showAndWait(); - } - } - - @FXML - public void closeOperationClicked() { - try { - operationService.complete(operation.id(), Status.COMPLETED); - } catch (InvalidOperationException | ServiceException e) { - Alert alert = new Alert(AlertType.ERROR); - alert.setTitle("Fehler"); - alert.setHeaderText("Fehler!"); - alert.setContentText(e.getMessage()); - alert.showAndWait(); - return; - } - Alert alert = new Alert(AlertType.CONFIRMATION); - alert.setTitle("Erfolg"); - alert.setHeaderText("Erfolgreich aktualisiert"); - alert.setContentText("Der Einsatz wurde erfolgreich aktualisiert."); - alert.showAndWait(); - closeWindow(); - createOperationController.updateList(); - } - - public void cancelOperationClicked() { - try { - operationService.complete(operation.id(), Status.CANCELLED); - } catch (InvalidOperationException | ServiceException e) { - Alert alert = new Alert(AlertType.ERROR); - alert.setTitle("Fehler"); - alert.setHeaderText("Fehler!"); - alert.setContentText(e.getMessage()); - alert.showAndWait(); - return; - } - Alert alert = new Alert(AlertType.CONFIRMATION); - alert.setTitle("Erfolg"); - alert.setHeaderText("Erfolgreich aktualisiert"); - alert.setContentText("Der Einsatz wurde erfolgreich aktualisiert."); - alert.showAndWait(); - closeWindow(); - createOperationController.updateList(); - } - - public void closeWindow() { - operationDetailsAP.setVisible(false); - this.createOperationController.setVisible(true); - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowController.java deleted file mode 100644 index 4653663..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowController.java +++ /dev/null @@ -1,213 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller; - -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee; -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.Status; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.EmployeeService; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.RegistrationService; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.VehicleService; -import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetDateTime; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; -import javafx.beans.property.SimpleStringProperty; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import javafx.fxml.FXML; -import javafx.scene.control.Alert; -import javafx.scene.control.Alert.AlertType; -import javafx.scene.control.ChoiceBox; -import javafx.scene.control.Label; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TableView; -import javafx.scene.control.TextField; -import javafx.stage.Stage; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Controller; - -@Controller -public class RegistrationWindowController { - - private static final Logger LOG = LoggerFactory.getLogger(RegistrationWindowController.class); - - private final EmployeeService employeeService; - - private final VehicleService vehicleService; - - private final RegistrationService registrationService; - - public RegistrationWindowController( - EmployeeService employeeService, - VehicleService vehicleService, - RegistrationService registrationService) { - this.employeeService = employeeService; - this.vehicleService = vehicleService; - this.registrationService = registrationService; - } - - @FXML private ChoiceBox<Integer> cbStart; - @FXML private ChoiceBox<Integer> cbEnd; - @FXML private Label lVehicles; - @FXML private Label lEmployees; - @FXML private TextField tfVehicleSearch; - @FXML private TextField tfEmployeeSearch; - @FXML private TableView<Vehicle> tvVehicles; - @FXML private TableView<Employee> tvEmployees; - @FXML private TableColumn<Vehicle, String> tcVehicles; - @FXML private TableColumn<Employee, String> tcEmployees; - - private Vehicle chosenVehicle; - private List<Employee> chosenEmployees = new LinkedList<>(); - - @FXML - private void initialize() { - // will have to be replaced for FlowPane - try { - Set<Vehicle> vehicles = vehicleService.list(EnumSet.of(Status.ABGEMELDET)); - tcVehicles.setCellValueFactory(x -> new SimpleStringProperty(x.getValue().name())); - tvVehicles.setItems(FXCollections.observableArrayList(vehicles)); - } catch (ServiceException e) { - LOG.warn( - "Caught ServiceException while getting vehicles. Showing it to user. Error message: {}", - e.getMessage()); - Alert alert = new Alert(AlertType.ERROR); - alert.setTitle("Fahrzeuge - Fehler!"); - alert.setHeaderText("Beim Auflisten der Fahrzeug ist ein Fehler aufgetreten."); - alert.setContentText(e.getMessage()); - alert.show(); - } - try { - Set<Employee> employees = employeeService.list(); - tcEmployees.setCellValueFactory(x -> new SimpleStringProperty(x.getValue().name())); - tvEmployees.setItems(FXCollections.observableArrayList(employees)); - } catch (ServiceException e) { - LOG.warn( - "Caught ServiceException while getting employees. Showing it to user. Error message: {}", - e.getMessage()); - Alert alert = new Alert(AlertType.ERROR); - alert.setTitle("Personal - Fehler!"); - alert.setHeaderText("Beim Auflisten des Personals ist ein Fehler aufgetreten."); - alert.setContentText(e.getMessage()); - alert.show(); - } - tvVehicles.setOnMousePressed( - mouseEvent -> { - if (mouseEvent.isPrimaryButtonDown() && mouseEvent.getClickCount() == 2) { - chosenVehicle = tvVehicles.getSelectionModel().getSelectedItem(); - if (chosenVehicle == null) { - return; - } - lVehicles.setText(chosenVehicle.name()); - } - }); - tvEmployees.setOnMousePressed( - mouseEvent -> { - if (mouseEvent.isPrimaryButtonDown() && mouseEvent.getClickCount() == 2) { - Employee selection = tvEmployees.getSelectionModel().getSelectedItem(); - if (selection == null) { - return; - } else if (chosenEmployees.contains(selection)) { - chosenEmployees.remove(selection); - } else { - chosenEmployees.add(selection); - } - - StringBuilder text = new StringBuilder(); - for (Employee employee : chosenEmployees) { - text.append(employee.name()).append("\n"); - } - lEmployees.setText(text.toString()); - } - }); - ObservableList<Integer> hours = - FXCollections.observableArrayList( - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23); - cbStart.setItems(hours); - cbStart.setValue(0); - cbEnd.setItems(hours); - cbEnd.setValue(12); - } - - public void cancel() { - LOG.debug("Cancel Button clicked"); - chosenEmployees.clear(); - ((Stage) lVehicles.getScene().getWindow()).close(); - } - - public void create() { - LOG.debug("Create Button clicked"); - - Set<Registration> registrations = new HashSet<>(); - try { - if (chosenVehicle == null) { - throw new InvalidVehicleException("no Vehicle"); - } - for (Employee employee : chosenEmployees) { - registrations.add( - Registration.builder() - .id(chosenVehicle.id()) - .employee(employee) - .start( - LocalDateTime.of( - LocalDate.now(), - LocalTime.of(cbStart.getValue(), 0)) - .toInstant(OffsetDateTime.now().getOffset())) - .end( - LocalDateTime.of( - LocalDate.now(), - LocalTime.of(cbEnd.getValue(), 0)) - .toInstant(OffsetDateTime.now().getOffset())) - .build()); - } - - registrationService.add(chosenVehicle.id(), registrations); - chosenEmployees.clear(); - ((Stage) lVehicles.getScene().getWindow()).close(); - - } catch (InvalidVehicleException e) { - // NOT THROWN ANYWHERE RIGHT NOW - LOG.info( - "Caught InvalidVehicleException. Showing it to user. Error message: {}", - e.getClass().toString(), - e.getMessage()); - Alert alert = new Alert(AlertType.WARNING); - alert.setTitle("Ungültiges Fahrzeug"); - alert.setHeaderText("Das spezifizierte Fahrzeug ist nicht gültig."); - alert.setContentText(e.getMessage()); - alert.show(); - chosenEmployees.clear(); - } catch (ServiceException e) { - LOG.warn( - "Caught ServiceException while getting vehicles. Showing it to user. Error message: {}", - e.getMessage()); - Alert alert = new Alert(AlertType.ERROR); - alert.setTitle("Anmeldung - Fehler!"); - alert.setHeaderText("Beim Erstellen der Anmeldung ist ein Fehler aufgetreten."); - alert.setContentText(e.getMessage()); - alert.show(); - chosenEmployees.clear(); - } catch (InvalidRegistrationException e) { - LOG.info( - "Caught InvalidRegistrationException. Showing it to user. Error message: {}", - e.getMessage()); - Alert alert = new Alert(AlertType.WARNING); - alert.setTitle("Ungültige Eingabe"); - alert.setHeaderText( - "Die gewählte Kombination von Fahrzeug und Personal ist nicht gültig!"); - alert.setContentText(e.getMessage()); - alert.show(); - chosenEmployees.clear(); - } - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/VehiclePaneController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/VehiclePaneController.java deleted file mode 100644 index 6c0932b..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/VehiclePaneController.java +++ /dev/null @@ -1,113 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller; - -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle; -import java.io.IOException; -import java.time.Instant; -import java.util.List; -import java.util.Optional; -import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; -import javafx.scene.Node; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; -import javafx.scene.text.Text; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class VehiclePaneController { - - private static Logger LOG = LoggerFactory.getLogger(VehiclePaneController.class); - - public static VehiclePaneController createVehiclePane() throws IOException { - FXMLLoader fxmlLoader = - new FXMLLoader(VehiclePaneController.class.getResource("/fxml/vehiclePane.fxml")); - Node root = fxmlLoader.load(); - VehiclePaneController result = fxmlLoader.getController(); - result.rootElement = root; - - return result; - } - - @FXML private Text txtType; - @FXML private Text txtNumber; - @FXML private ImageView ivNEF; - @FXML private Text txtNEF; - @FXML private ImageView ivQualification; - @FXML private Text txtQualification; - @FXML private Text txtRooftype; - - private Node rootElement; - private Vehicle data; - - public Node getRootElement() { - return rootElement; - } - - public Vehicle getData() { - return data; - } - - /** - * * Set the displayed data of this VehiclePane. - * - * @param vehicle The data to display. - * @param showQualification If true, the most recent registration of vehicle will be searched - * for the highest qualification. - */ - public void setData(Vehicle vehicle, boolean showQualification) { - txtType.setText(vehicle.type().name()); - String constrType = vehicle.constructionType().name(); - txtRooftype.setText( - constrType.substring(0, 1).toUpperCase() + constrType.substring(1).toLowerCase()); - txtNumber.setText("-" + vehicle.id()); - if (vehicle.hasNef()) { - ivNEF.setImage(new Image("images/NEF.png")); - txtNEF.setText("hat NEF-Halterung"); - } else { - ivNEF.setImage(new Image("images/NotNEF.png")); - txtNEF.setText("keine NEF-Halterung"); - } - if (showQualification) { - - Instant now = Instant.now(); - List<Registration> regs = vehicle.registrations(); - - if (regs == null) { - return; - } - - Optional<EducationLevel> edu = - regs.stream() - .filter(reg -> reg.start().isBefore(now) && reg.end().isAfter(now)) - .map(reg -> reg.employee().educationLevel()) - .max(EducationLevel::compareTo); - - if (!edu.isPresent()) { - return; - } - - txtQualification.setText(edu.get().name()); - } else { - txtQualification.setVisible(false); - txtQualification.setManaged(false); - ivQualification.setVisible(false); - ivQualification.setManaged(false); - } - - this.data = vehicle; - } - - public void setSelected(boolean selected) { - rootElement.getStyleClass().clear(); - - if (selected) { - rootElement.getStyleClass().add("bg-yellow"); - rootElement.getStyleClass().add("shadowed"); - } else { - rootElement.getStyleClass().add("bg-white"); - rootElement.getStyleClass().add("shadowed"); - } - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAO.java deleted file mode 100644 index 539a8e5..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDAO.java +++ /dev/null @@ -1,44 +0,0 @@ -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.exception.ElementNotFoundException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; -import java.util.Set; - -public interface EmployeeDAO { - - /** - * Persist the given employee. - * - * @param employee that should be stored - * @return the id that was assigned - * @throws PersistenceException if the employee could not be persisted - */ - long add(Employee employee) throws PersistenceException; - - /** - * Update the given employee. - * - * @param employee that should be updated - * @throws ElementNotFoundException if no employee with the given id exists - * @throws PersistenceException if the employee could not be updated - */ - void update(Employee employee) throws ElementNotFoundException, PersistenceException; - - /** - * Get all stored employees. - * - * @return list containing all stored employees - * @throws PersistenceException if loading the stored employees failed - */ - Set<Employee> list() throws PersistenceException; - - /** - * Remove employee with the given id from the store. - * - * @param id of the employee that should be removed - * @throws ElementNotFoundException if no employee with the given id exists - * @throws PersistenceException if the employee could not be removed - */ - void remove(long id) throws ElementNotFoundException, PersistenceException; -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java deleted file mode 100644 index 43a5c9d..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/EmployeeDatabaseDAO.java +++ /dev/null @@ -1,201 +0,0 @@ -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.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.Savepoint; -import java.sql.Statement; -import java.sql.Timestamp; -import java.util.HashSet; -import java.util.Set; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Repository; - -@Repository -public class EmployeeDatabaseDAO implements EmployeeDAO { - - private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - private static final String INSERT_EMPLOYEE_VERSION = - "INSERT INTO EmployeeVersion(name, birthday, educationLevel, isDriver, isPilot) " - + "VALUES(?, ?, ?, ?, ?)"; - private static final String INSERT_EMPLOYEE = "INSERT INTO Employee(version) VALUES(?)"; - private static final String LIST_EMPLOYEE = - "SELECT emp.id, v.name, v.birthday, v.educationLevel, v.isDriver, v.isPilot " - + "FROM employee emp " - + "JOIN EmployeeVersion v ON v.id = emp.version"; - private static final String UPDATE_EMPLOYEE = "UPDATE Employee SET version = ? WHERE id = ?"; - - private final PreparedStatement insertEmployeeVersion, - insertEmployee, - listEmployee, - updateEmployee; - - private final Connection connection; - - public EmployeeDatabaseDAO(JDBCConnectionManager connectionManager) - throws PersistenceException { - - try { - - connection = connectionManager.getConnection(); - insertEmployeeVersion = - connection.prepareStatement( - INSERT_EMPLOYEE_VERSION, Statement.RETURN_GENERATED_KEYS); - insertEmployee = - connection.prepareStatement(INSERT_EMPLOYEE, Statement.RETURN_GENERATED_KEYS); - - listEmployee = connection.prepareStatement(LIST_EMPLOYEE); - - updateEmployee = connection.prepareStatement(UPDATE_EMPLOYEE); - - } catch (SQLException e) { - throw new PersistenceException(e); - } - } - - @Override - public long add(Employee employee) throws PersistenceException { - - // Assumption: the given employee is already validated (from service) - Savepoint savepoint = null; - try { - savepoint = connection.setSavepoint(); - connection.setAutoCommit(false); - insertEmployeeVersion.setString(1, employee.name()); - insertEmployeeVersion.setTimestamp( - 2, Timestamp.valueOf(employee.birthday().atStartOfDay())); - insertEmployeeVersion.setString(3, employee.educationLevel().toString()); - insertEmployeeVersion.setBoolean(4, employee.isDriver()); - insertEmployeeVersion.setBoolean(5, employee.isPilot()); - insertEmployeeVersion.executeUpdate(); - try (ResultSet resultSetEmployeeVersion = insertEmployeeVersion.getGeneratedKeys()) { - if (resultSetEmployeeVersion.next()) { - long versionId = resultSetEmployeeVersion.getLong(1); - - insertEmployee.setLong(1, versionId); - insertEmployee.executeUpdate(); - - try (ResultSet resultSetEmployee = insertEmployee.getGeneratedKeys()) { - if (resultSetEmployee.next()) { - connection.commit(); - return resultSetEmployee.getLong(1); - } - } - } - } - - throw new PersistenceException("Employee was not updated"); - - } catch (SQLException e) { - try { - if (savepoint != null) { - connection.rollback(savepoint); - } - } catch (SQLException e1) { - throw new PersistenceException(e); - } - throw new PersistenceException(e); - } finally { - try { - connection.setAutoCommit(true); - } catch (SQLException e) { - throw new PersistenceException(e); - } - } - } - - @Override - public void update(Employee employee) throws ElementNotFoundException, PersistenceException { - - Savepoint savepoint = null; - try { - savepoint = connection.setSavepoint(); - connection.setAutoCommit(false); - - insertEmployeeVersion.setString(1, employee.name()); - insertEmployeeVersion.setTimestamp( - 2, Timestamp.valueOf(employee.birthday().atStartOfDay())); - insertEmployeeVersion.setString(3, employee.educationLevel().toString()); - insertEmployeeVersion.setBoolean(4, employee.isDriver()); - insertEmployeeVersion.setBoolean(5, employee.isPilot()); - insertEmployeeVersion.executeUpdate(); - try (ResultSet resultSetEmployeeVersion = insertEmployeeVersion.getGeneratedKeys()) { - - if (resultSetEmployeeVersion.next()) { - long versionId = resultSetEmployeeVersion.getLong(1); - - updateEmployee.setLong(1, versionId); - updateEmployee.setLong(2, employee.id()); - int affectedRows = updateEmployee.executeUpdate(); - - if (affectedRows == 1) { - connection.commit(); - } else { - throw new ElementNotFoundException( - "element not found with id: " + employee.id()); - } - } - } - - } catch (SQLException e) { - try { - if (savepoint != null) { - connection.rollback(savepoint); - } - } catch (SQLException e1) { - throw new PersistenceException(e); - } - throw new PersistenceException(e); - } finally { - try { - connection.setAutoCommit(true); - } catch (SQLException e) { - throw new PersistenceException(e); - } - } - } - - @Override - public Set<Employee> list() throws PersistenceException { - - try { - Set<Employee> employees; - try (ResultSet rs = listEmployee.executeQuery()) { - - employees = new HashSet<>(); - while (rs.next()) { - - Employee employee = - Employee.builder() - .id(rs.getLong(1)) - .name(rs.getString(2)) - .birthday(rs.getTimestamp(3).toLocalDateTime().toLocalDate()) - .educationLevel(EducationLevel.valueOf(rs.getString(4))) - .isDriver(rs.getBoolean(5)) - .isPilot(rs.getBoolean(6)) - .build(); - - employees.add(employee); - } - } - - return employees; - - } catch (SQLException e) { - throw new PersistenceException(e); - } - } - - @Override - public void remove(long id) throws ElementNotFoundException, PersistenceException { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAO.java deleted file mode 100644 index d82f768..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDAO.java +++ /dev/null @@ -1,48 +0,0 @@ -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.util.EnumSet; -import java.util.Set; - -public interface OperationDAO { - - /** - * Persist the given operation. - * - * @param operation that should be stored - * @return the id that was assigned - * @throws PersistenceException if the operation could not be persisted - */ - long add(Operation operation) throws PersistenceException; - - /** - * Update the given operation. - * - * @param operation that should be updated - * @throws ElementNotFoundException if no operation with the given id exists - * @throws PersistenceException if the operation could not be updated - */ - void update(Operation operation) throws ElementNotFoundException, PersistenceException; - - /** - * Returns the operation with the given id. - * - * @param operationId id of the operation that should be returned - * @return operation with the given id - * @throws ElementNotFoundException if no operation with the given id exists - * @throws PersistenceException if the operation could not be loaded - */ - Operation get(long operationId) throws ElementNotFoundException, PersistenceException; - - /** - * Get all stored operations with matching status. - * - * @param statuses set containing all statuses that should be matched - * @return list containing all matched operations - * @throws PersistenceException if loading the stored operations failed - */ - Set<Operation> list(EnumSet<Status> statuses) throws PersistenceException; -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDatabaseDAO.java deleted file mode 100644 index 0a465f2..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/OperationDatabaseDAO.java +++ /dev/null @@ -1,218 +0,0 @@ -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.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.exception.ElementNotFoundException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; -import at.ac.tuwien.sepm.assignment.groupphase.util.JDBCConnectionManager; -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.Objects; -import java.util.Set; -import java.util.stream.Collectors; -import org.springframework.lang.NonNull; -import org.springframework.stereotype.Repository; - -@Repository -public class OperationDatabaseDAO implements OperationDAO { - - private JDBCConnectionManager jdbcConnectionManager; - private VehicleDAO vehicleDAO; - - public OperationDatabaseDAO( - JDBCConnectionManager jdbcConnectionManager, VehicleDAO vehicleDAO) { - this.jdbcConnectionManager = jdbcConnectionManager; - this.vehicleDAO = vehicleDAO; - } - - @Override - public long add(@NonNull Operation o) throws PersistenceException { - String sql = - "INSERT INTO Operation(opCode, severity, created, destination, additionalInfo," - + " status) VALUES (?, ?, ?, ?, ?, ?)"; - String sql2 = "INSERT INTO VehicleOperation(vehicleId, operationId) VALUES (?, ?)"; - long operationId; - - try { - Connection con = jdbcConnectionManager.getConnection(); - con.setAutoCommit(false); - try (PreparedStatement pstmt = con.prepareStatement(sql)) { - pstmt.setString(1, o.opCode()); - pstmt.setInt(2, o.severity().ordinal()); - pstmt.setTimestamp(3, Timestamp.from(Objects.requireNonNull(o.created()))); - pstmt.setString(4, o.destination()); - pstmt.setString(5, o.additionalInfo()); - pstmt.setInt(6, o.status().ordinal()); - pstmt.executeUpdate(); - - try (ResultSet rs = pstmt.getGeneratedKeys()) { - if (!rs.next()) throw new PersistenceException("Failed to persist operation"); - - operationId = rs.getLong(1); - } - } - - try (PreparedStatement pstmt = con.prepareStatement(sql2)) { - pstmt.setLong(2, operationId); - - for (long id : (Iterable<Long>) o.vehicles().stream().map(Vehicle::id)::iterator) { - pstmt.setLong(1, id); - pstmt.addBatch(); - } - - pstmt.executeBatch(); - } - con.commit(); - con.setAutoCommit(true); - return operationId; - } catch (SQLException e) { - throw new PersistenceException(e); - } - } - - @Override - public void update(@NonNull Operation o) throws ElementNotFoundException, PersistenceException { - // Note this will, by design, not update created - String sql = - "UPDATE Operation SET opCode = ?, severity = ?, destination = ?," - + " additionalInfo = ?, status = ? WHERE id = ?"; - String sql2 = "DELETE FROM VehicleOperation WHERE operationId = ?"; - String sql3 = "INSERT INTO VehicleOperation(vehicleId, operationId) VALUES (?, ?)"; - - try { - Connection con = jdbcConnectionManager.getConnection(); - con.setAutoCommit(false); - try (PreparedStatement pstmt = con.prepareStatement(sql)) { - pstmt.setString(1, o.opCode()); - pstmt.setInt(2, o.severity().ordinal()); - pstmt.setString(3, o.destination()); - pstmt.setString(4, o.additionalInfo()); - pstmt.setInt(5, o.status().ordinal()); - pstmt.setLong(6, o.id()); - - if (pstmt.executeUpdate() != 1) - throw new ElementNotFoundException("No such operationId exists"); - } - - try (PreparedStatement pstmt = con.prepareStatement(sql2)) { - pstmt.setLong(1, o.id()); - pstmt.executeUpdate(); - } - - try (PreparedStatement pstmt = con.prepareStatement(sql3)) { - pstmt.setLong(2, o.id()); - - for (long id : (Iterable<Long>) o.vehicles().stream().map(Vehicle::id)::iterator) { - pstmt.setLong(1, id); - pstmt.addBatch(); - } - - pstmt.executeBatch(); - } - con.commit(); - con.setAutoCommit(true); - } catch (SQLException e) { - throw new PersistenceException(e); - } - } - - @Override - public Operation get(long operationId) throws ElementNotFoundException, PersistenceException { - String sql = "Select * from operation where id = ?"; - - try { - Connection con = jdbcConnectionManager.getConnection(); - try (PreparedStatement pstmt = con.prepareStatement(sql)) { - pstmt.setLong(1, operationId); - pstmt.execute(); - - try (ResultSet rs = pstmt.getResultSet()) { - if (!rs.next()) - throw new ElementNotFoundException("No such element could be found"); - - return operationFromRS(rs); - } - } - } catch (SQLException e) { - throw new PersistenceException(e); - } - } - - @Override - public Set<Operation> list(EnumSet<Status> statuses) throws PersistenceException { - // This hack exists because H2 currently has a bug that prevents IN (?) with an array of - // ids, i.e. pstmt.setArray(1, con.createArrayOf("INT", intarray) from working. See - // commented code below. - String str = - statuses.stream() - .map(Enum::name) - .map(s -> "'" + s + "'") - .collect(Collectors.joining(",")); - String sql = "SELECT * FROM Operation WHERE status IN (" + str + ")"; - Set<Operation> operations = new HashSet<>(); - - try { - Connection con = jdbcConnectionManager.getConnection(); - - try (PreparedStatement pstmt = con.prepareStatement(sql)) { - // Object[] arr = statuses.stream().map(Enum::ordinal).toArray(); - // pstmt.setArray(1, con.createArrayOf("INT", arr)); - - try (ResultSet rs = pstmt.executeQuery()) { - while (rs.next()) operations.add(operationFromRS(rs)); - } - } - - return operations; - } catch (SQLException e) { - throw new PersistenceException(e); - } - } - - private Operation operationFromRS(ResultSet rs) throws PersistenceException, SQLException { - Long operationId = rs.getLong("id"); - - return Operation.builder() - .id(operationId) - .opCode(rs.getString("opCode")) - .severity(Severity.valueOf(rs.getString("severity"))) - .status(Status.valueOf(rs.getString("status"))) - .vehicles(getVehiclesFromOperationId(operationId)) - .created(rs.getTimestamp("created").toInstant()) - .destination(rs.getString("destination")) - .additionalInfo(rs.getString("additionalInfo")) - .build(); - } - - private Set<Vehicle> getVehiclesFromOperationId(long operationId) throws PersistenceException { - String sql = "SELECT vehicleId FROM VehicleOperation WHERE operationId = ?"; - Set<Vehicle> vehicles = new HashSet<>(); - - try { - Connection con = jdbcConnectionManager.getConnection(); - try (PreparedStatement pstmt = con.prepareStatement(sql)) { - pstmt.setLong(1, operationId); - pstmt.execute(); - - try (ResultSet rs = pstmt.getResultSet()) { - while (rs.next()) { - vehicles.add(vehicleDAO.get(rs.getLong("vehicleId"))); - } - } - } - } catch (SQLException e) { - throw new PersistenceException(e); - } catch (ElementNotFoundException e) { - throw new PersistenceException("VehicleOperation contained nonexistent vehicle", e); - } - - return vehicles; - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAO.java deleted file mode 100644 index 36b6f1b..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDAO.java +++ /dev/null @@ -1,28 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao; - -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration; -import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; -import java.util.Set; - -public interface RegistrationDAO { - - /** - * Persist the given registration. - * - * @param vehicleId the id of the target vehicle - * @param registrations that should be stored - * @return a list of the ids that were assigned - * @throws PersistenceException if the registration could not be persisted - */ - Set<Long> add(long vehicleId, Set<Registration> registrations) throws PersistenceException; - - /** - * Make registration with the given id inactive. - * - * @param id of the registration that should be made inactive - * @throws ElementNotFoundException if no registration with the given id exists - * @throws PersistenceException if the registration could not be made inactive - */ - void remove(long id) throws ElementNotFoundException, PersistenceException; -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDatabaseDAO.java deleted file mode 100644 index 13f2c0f..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/RegistrationDatabaseDAO.java +++ /dev/null @@ -1,147 +0,0 @@ -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.Registration; -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.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -@Repository -public class RegistrationDatabaseDAO implements RegistrationDAO { - - private static final Logger LOG = LoggerFactory.getLogger(RegistrationDatabaseDAO.class); - - private static final String ADD_REGISTRATION = - "INSERT INTO Registration (vehicleId, employeeId, start, end, active) VALUES (?,?,?,?,?);"; - private static final String UPDATE_VEHICLE = - "UPDATE Vehicle SET status = 'FREI_WACHE' WHERE id = ?;"; - private static final String FETCH_REGISTRATIONS = - "SELECT * FROM Registration WHERE vehicleId = ?"; - - private PreparedStatement addRegistration; - private PreparedStatement updateVehicle; - private PreparedStatement fetchRegistrations; - - private Connection connection; - private EmployeeDAO employeePersistence; - - @Autowired - public RegistrationDatabaseDAO( - JDBCConnectionManager connectionManager, EmployeeDAO employeePersistence) - throws PersistenceException { - this.employeePersistence = employeePersistence; - try { - connection = connectionManager.getConnection(); - addRegistration = - connection.prepareStatement(ADD_REGISTRATION, Statement.RETURN_GENERATED_KEYS); - updateVehicle = connection.prepareStatement(UPDATE_VEHICLE); - fetchRegistrations = connection.prepareStatement(FETCH_REGISTRATIONS); - } catch (SQLException e) { - LOG.error("Could not get connection or preparation of statement failed"); - throw new PersistenceException(e); - } - } - - @Override - public Set<Long> add(long vehicleId, Set<Registration> registrations) - throws PersistenceException { - Set<Long> returnValues = new HashSet<>(); - try { - connection.setAutoCommit(false); - for (Registration registration : registrations) { - addRegistration.setLong(1, vehicleId); - addRegistration.setLong(2, registration.employee().id()); - addRegistration.setTimestamp(3, Timestamp.from(registration.start())); - addRegistration.setTimestamp(4, Timestamp.from(registration.end())); - addRegistration.setBoolean( - 5, true); // ASSUMPTION: Registration gets created as active - addRegistration.executeUpdate(); - try (ResultSet rs = addRegistration.getGeneratedKeys()) { - if (rs.next()) { - returnValues.add(rs.getLong(1)); - } else { - LOG.error("No ResultSet was created while adding registration"); - throw new PersistenceException( - "Anmeldung konnte nicht gespeichert werden."); - } - } - } - - updateVehicle.setLong(1, vehicleId); - updateVehicle.executeUpdate(); - - connection.commit(); - return returnValues; - } catch (SQLException e) { - LOG.error( - "An SQLException occurred while trying to save registrations to database. " - + "Attempting a rollback. Error message: {}", - e.getMessage()); - try { - connection.rollback(); - } catch (SQLException e1) { - LOG.error("Rollback failed :("); - } - throw new PersistenceException(e); - } finally { - try { - connection.setAutoCommit(true); - } catch (SQLException e) { - LOG.error( - "Setting back AutoCommit to false failed! Error message: {}", - e.getMessage()); - // SonarLint insists on me not throwing anything here... - } - } - } - - @Override - public void remove(long id) throws ElementNotFoundException, PersistenceException { - throw new UnsupportedOperationException(); - } - - public List<Registration> list(long vehicleId) throws PersistenceException { - List<Registration> registrationList = new ArrayList<>(); - try { - fetchRegistrations.setLong(1, vehicleId); - ResultSet rs = fetchRegistrations.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.getTimestamp("start").toInstant()) - .end(rs.getTimestamp("end").toInstant()) - .employee(emp) - .build(); - registrationList.add(registration); - } - } catch (SQLException e) { - throw new PersistenceException(e); - } - - return registrationList; - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDAO.java deleted file mode 100644 index 5782fd9..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDAO.java +++ /dev/null @@ -1,54 +0,0 @@ -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.exception.ElementNotFoundException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; -import java.util.Set; - -public interface VehicleDAO { - - /** - * Persist the given vehicle. - * - * @param vehicle that should be stored - * @return the id that was assigned - * @throws PersistenceException if the vehicle could not be persisted - */ - long add(Vehicle vehicle) throws PersistenceException; - - /** - * Update the given vehicle. - * - * @param vehicle that should be updated - * @throws ElementNotFoundException if no vehicle with the given id exists - * @throws PersistenceException if the vehicle could not be updated - */ - void update(Vehicle vehicle) throws ElementNotFoundException, PersistenceException; - - /** - * Get all stored vehicles. - * - * @return list containing all stored vehicles - * @throws PersistenceException if loading the stored vehicles failed - */ - Set<Vehicle> list() throws PersistenceException; - - /** - * Returns the vehicle with the given id. - * - * @param vehicleId id of the vehicle that should be returned - * @return vehicle with the given id - * @throws ElementNotFoundException if no vehicle with the given id exists - * @throws PersistenceException if the vehicle could not be loaded - */ - Vehicle get(long vehicleId) throws ElementNotFoundException, PersistenceException; - - /** - * Remove vehicle with the given id from the store. - * - * @param id of the vehicle that should be removed - * @throws ElementNotFoundException if no vehicle with the given id exists - * @throws PersistenceException if the vehicle could not be removed - */ - void remove(long id) throws ElementNotFoundException, PersistenceException; -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDatabaseDAO.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDatabaseDAO.java deleted file mode 100644 index 6d50588..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dao/VehicleDatabaseDAO.java +++ /dev/null @@ -1,220 +0,0 @@ -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.ConstructionType; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.Status; -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.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.HashSet; -import java.util.Set; -import org.springframework.stereotype.Repository; - -@Repository -public class VehicleDatabaseDAO implements VehicleDAO { - - private final JDBCConnectionManager jdbcConnectionManager; - private RegistrationDatabaseDAO registrationDatabaseDao; - - public VehicleDatabaseDAO( - JDBCConnectionManager j, RegistrationDatabaseDAO registrationDatabaseDao) { - jdbcConnectionManager = j; - this.registrationDatabaseDao = registrationDatabaseDao; - } - - public long add(Vehicle vehicle) throws PersistenceException { - String query1 = - "INSERT INTO VehicleVersion (name,hasNef,constructionType,type) VALUES (?,?,?,?)"; - String query2 = "INSERT INTO Vehicle (version,status) VALUES (?,?)"; - - String status = "ABGEMELDET"; - String name = ""; - int id = -1; - int version = -1; - try { - Connection connection = jdbcConnectionManager.getConnection(); - connection.setAutoCommit(false); - try (PreparedStatement p1 = - connection.prepareStatement(query1, PreparedStatement.RETURN_GENERATED_KEYS)) { - - p1.setString(1, name); - p1.setBoolean(2, vehicle.hasNef()); - p1.setString(3, vehicle.constructionType().name()); - - p1.setString(4, vehicle.type().name()); - - p1.executeUpdate(); - try (ResultSet keyResultSet = p1.getGeneratedKeys()) { - - if (keyResultSet.next()) { - version = keyResultSet.getInt(1); - } - } - } - try (PreparedStatement p2 = - connection.prepareStatement(query2, Statement.RETURN_GENERATED_KEYS)) { - - p2.setInt(1, version); - p2.setString(2, status); - p2.executeUpdate(); - try (ResultSet keyResultSet = p2.getGeneratedKeys()) { - - if (keyResultSet.next()) { - id = keyResultSet.getInt(1); - } - } - - name = vehicle.type().name() + "-" + id; - } - query1 = "UPDATE VehicleVersion SET name=? WHERE id=?"; - try (PreparedStatement p3 = connection.prepareStatement(query1)) { - p3.setString(1, name); - p3.setInt(2, version); - p3.executeUpdate(); - } - - connection.commit(); - connection.setAutoCommit(true); - } catch (SQLException e) { - throw new PersistenceException(e); - } - return id; - } - - @Override - public void update(Vehicle vehicle) throws ElementNotFoundException, PersistenceException { - String query = "SELECT * FROM vehicle WHERE id=?"; - - long vehicleID = -1; - long vehicleVersion = -1; - try { - Connection connection = jdbcConnectionManager.getConnection(); - connection.setAutoCommit(false); - try (PreparedStatement p = - connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { - - p.setLong(1, vehicle.id()); - p.executeQuery(); - try (ResultSet rs = p.getResultSet()) { - while (rs.next()) { - vehicleID = rs.getLong("id"); - } - } - } - if (vehicleID == -1) { - throw new ElementNotFoundException("Vehicle don´t found"); - } - - query = - "INSERT INTO VehicleVersion (name,hasNef,constructionType,type) VALUES (?,?,?,?)"; - String name = ""; - try (PreparedStatement p = - connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { - p.setString(1, name); - p.setBoolean(2, vehicle.hasNef()); - p.setString(3, vehicle.constructionType().name()); - - p.setString(4, vehicle.type().name()); - - p.executeUpdate(); - - try (ResultSet keyResultSet = p.getGeneratedKeys()) { - - if (keyResultSet.next()) { - vehicleVersion = keyResultSet.getInt(1); - } - } - if (vehicleVersion == -1) { - throw new ElementNotFoundException("Vehicle don´t found"); - } - } - name = vehicle.type().name() + "-" + vehicleID; - - query = "UPDATE VehicleVersion SET name=? WHERE id=?"; - try (PreparedStatement p = connection.prepareStatement(query)) { - - p.setString(1, name); - p.setLong(2, vehicleVersion); - p.executeUpdate(); - } - query = "UPDATE Vehicle SET version=? WHERE id=?"; - try (PreparedStatement p = connection.prepareStatement(query)) { - - p.setLong(1, vehicleVersion); - p.setLong(2, vehicleID); - p.executeUpdate(); - } - connection.commit(); - connection.setAutoCommit(true); - } catch (SQLException e) { - throw new PersistenceException(e); - } - } - - @Override - public Set<Vehicle> list() throws PersistenceException { - Set<Vehicle> result = new HashSet<>(); - - String sql = - "Select * from VehicleVersion, Vehicle where VehicleVersion.id=Vehicle.version"; - - try (PreparedStatement pstmt = - jdbcConnectionManager.getConnection().prepareStatement(sql)) { - pstmt.executeQuery(); - try (ResultSet rs = pstmt.getResultSet()) { - while (rs.next()) { - result.add(vehicleFromRS(rs)); - } - } - } catch (SQLException e) { - throw new PersistenceException("Die Werte konnten nicht geladen werden.", e); - } - return result; - } - - @Override - public Vehicle get(long id) throws ElementNotFoundException, PersistenceException { - String sql = - "SELECT a.id, b.name, b.constructionType, b.type, a.status, b.hasNef" - + " FROM Vehicle a" - + " INNER JOIN VehicleVersion b" - + " ON version = b.id" - + " WHERE a.id = ?"; - - try { - Connection con = jdbcConnectionManager.getConnection(); - try (PreparedStatement pstmt = con.prepareStatement(sql)) { - pstmt.setLong(1, id); - - try (ResultSet rs = pstmt.executeQuery()) { - if (!rs.first()) throw new ElementNotFoundException("No such vehicle exists"); - - return vehicleFromRS(rs); - } - } - } catch (SQLException e) { - throw new PersistenceException(e); - } - } - - @Override - public void remove(long id) throws ElementNotFoundException, PersistenceException {} - - private Vehicle vehicleFromRS(ResultSet rs) throws SQLException, PersistenceException { - return Vehicle.builder() - .id(rs.getLong("Vehicle.id")) - .name(rs.getString("name")) - .constructionType(ConstructionType.values()[rs.getInt("constructionType")]) - .type(VehicleType.valueOf(rs.getString("type"))) - .status(Status.values()[rs.getInt("status")]) - .hasNef(rs.getBoolean("hasNef")) - .registrations(registrationDatabaseDao.list(rs.getLong("id"))) - .build(); - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Employee.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Employee.java deleted file mode 100644 index 583bf5b..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Employee.java +++ /dev/null @@ -1,51 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto; - -import com.google.auto.value.AutoValue; -import java.time.LocalDate; - -@AutoValue -public abstract class Employee { - public enum EducationLevel { - RS, - NFS, - NKV, - NKA, - NKI, - NA - } - - public abstract long id(); - - public abstract String name(); - - public abstract LocalDate birthday(); - - public abstract EducationLevel educationLevel(); - - public abstract boolean isDriver(); - - public abstract boolean isPilot(); - - public static Builder builder() { - return new AutoValue_Employee.Builder().id(0); - } - - @AutoValue.Builder - public abstract static class Builder { - public abstract Builder id(long id); - - public abstract Builder name(String name); - - public abstract Builder birthday(LocalDate birthday); - - public abstract Builder educationLevel(EducationLevel educationLevel); - - public abstract Builder isDriver(boolean isDriver); - - public abstract Builder isPilot(boolean isPilot); - - public abstract Employee build(); - } - - public abstract Builder toBuilder(); -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/EmployeeValidator.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/EmployeeValidator.java deleted file mode 100644 index d7fa9aa..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/EmployeeValidator.java +++ /dev/null @@ -1,23 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto; - -import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException; - -public class EmployeeValidator { - - public static boolean validate(Employee employee) throws InvalidEmployeeException { - - if (employee.name() == null || employee.name().trim().length() == 0) { - throw new InvalidEmployeeException("name not set"); - } - - if (employee.birthday() == null) { - throw new InvalidEmployeeException("birthday not set"); - } - - if (employee.educationLevel() == null) { - throw new InvalidEmployeeException("educationLevel not set"); - } - - return true; - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Operation.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Operation.java deleted file mode 100644 index 3a97dc7..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Operation.java +++ /dev/null @@ -1,70 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto; - -import com.google.auto.value.AutoValue; -import java.time.Instant; -import java.util.Set; -import javax.annotation.Nullable; - -@AutoValue -public abstract class Operation { - public enum Severity { - A, - B, - C, - D, - E, - O, - } - - public enum Status { - ACTIVE, - COMPLETED, - CANCELLED, - } - - public abstract long id(); - - public abstract String opCode(); - - @Nullable - public abstract Severity severity(); - - public abstract Status status(); - - public abstract Set<Vehicle> vehicles(); - - @Nullable - public abstract Instant created(); - - public abstract String destination(); - - @Nullable - public abstract String additionalInfo(); - - public static Builder builder() { - return new AutoValue_Operation.Builder().id(0); - } - - @AutoValue.Builder - public abstract static class Builder { - public abstract Builder id(long id); - - public abstract Builder opCode(String opCode); - - public abstract Builder severity(Severity severity); - - public abstract Builder status(Status status); - - public abstract Builder vehicles(Set<Vehicle> vehicles); - - public abstract Builder created(Instant created); - - public abstract Builder destination(String destination); - - public abstract Builder additionalInfo(String additionalInfo); - - public abstract Operation build(); - } - - public abstract Builder toBuilder(); -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Registration.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Registration.java deleted file mode 100644 index 8551266..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Registration.java +++ /dev/null @@ -1,34 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto; - -import com.google.auto.value.AutoValue; -import java.time.Instant; - -@AutoValue -public abstract class Registration { - public abstract long id(); - - public abstract Instant start(); - - public abstract Instant end(); - - public abstract Employee employee(); - - public static Builder builder() { - return new AutoValue_Registration.Builder().id(0); - } - - @AutoValue.Builder - public abstract static class Builder { - public abstract Builder id(long id); - - public abstract Builder start(Instant start); - - public abstract Builder end(Instant end); - - public abstract Builder employee(Employee employee); - - public abstract Registration build(); - } - - public abstract Builder toBuilder(); -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/RegistrationValidator.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/RegistrationValidator.java deleted file mode 100644 index 610426c..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/RegistrationValidator.java +++ /dev/null @@ -1,195 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto; - -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee.EducationLevel; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle.VehicleType; -import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class RegistrationValidator { - - private static final Logger LOG = LoggerFactory.getLogger(RegistrationValidator.class); - - private RegistrationValidator() {} - - public static void validate(Vehicle vehicle, Set<Registration> registrations) - throws InvalidVehicleException, InvalidRegistrationException { - /* - Vehicles and Employees are assumed to be valid. - They have been checked at creation, and for them to be checked again, access to - VehicleValidator and EmployeeValidator are needed, which are not available at this time. - */ - /* - The method used here goes as follows: All given employees are inspected in regards to their - qualifications, and added to the appropriate lists of the roles they could fill. - For example, an NFS, who is also a driver, would be added to the lists driverIds, nfsIds - and rsIds (because an NFS can always substitute an RS). - Afterwards, the number of people is checked according to the chosen vehicle type, and if - the number is okay, the program tries to find a valid combination of roles for the vehicle. - For example, for an RTW, first a driver is chosen, their ID marked as found in the aptly - titled HashMap, and then for the second RS, the list of RS is checked, excluding the chosen - driver. If no other valid RS is found, the next possible driver is chosen, and so on. If no - valid combination is found, an InvalidRegistrationException is thrown. - */ - List<Long> pilotIds = new LinkedList<>(); - List<Long> driverIds = new LinkedList<>(); - List<Long> naIds = new LinkedList<>(); - List<Long> nfsIds = new LinkedList<>(); - List<Long> rsIds = new LinkedList<>(); - HashMap<Long, Boolean> found = - new HashMap<>(); // needed later in DFS, checks that no person is chosen twice - int total = 0; - for (Registration registration : registrations) { - total++; - if (found.put(registration.employee().id(), false) != null) { - LOG.info("Employee with ID {} was added twice", registration.employee().id()); - throw new InvalidRegistrationException( - "Person with the ID: " - + registration.employee().id() - + " was added more than once!"); - } - if (registration.employee().isPilot()) { - pilotIds.add(registration.employee().id()); - } - if (registration.employee().isDriver()) { - driverIds.add(registration.employee().id()); - } - if (registration.employee().educationLevel() == EducationLevel.NA) { - naIds.add(registration.employee().id()); - nfsIds.add(registration.employee().id()); - rsIds.add(registration.employee().id()); - } else if (isNFS(registration.employee())) { - nfsIds.add(registration.employee().id()); - rsIds.add(registration.employee().id()); - } else { // only RS left - rsIds.add(registration.employee().id()); - } - } - if (total <= 0) { - LOG.info("No employees were added"); - throw new InvalidRegistrationException("Kein Personal ausgewählt!"); - } - if (vehicle.type() == VehicleType.NAH) { - /* - NAH - 1 Pilot - 1 NFS - 1 NA - 3-4 Personen - */ - if (total < 3) { - LOG.info("Too few employees for NAH"); - throw new InvalidRegistrationException("Zu wenig Personal für NAH!"); - } else if (total > 4) { - LOG.info("Too many employees for NAH"); - throw new InvalidRegistrationException("Zu viel Personal für NAH!"); - } - for (long pilot_id : pilotIds) { - found.put(pilot_id, true); - for (long na_id : naIds) { - if (found.get(na_id)) continue; - found.put(na_id, true); - for (long nfs_id : nfsIds) { - if (found.get(nfs_id)) continue; - LOG.info("Valid combination found for NAH"); - return; - } - found.put(na_id, false); - } - found.put(pilot_id, false); - } - LOG.info("No valid combination of employees found for NAH"); - throw new InvalidRegistrationException( - "Keine gültige Kombination von Personen für NAH!"); - } else if (vehicle.type() == VehicleType.NEF) { - /* - NEF - 1 Driver (has to be NFS) - 1 NA - */ - if (total < 2) { - LOG.info("Too few employees for NEF"); - throw new InvalidRegistrationException("Zu wenig Personal für NEF!"); - } else if (total > 3) { - LOG.info("Too many employees for NEF"); - throw new InvalidRegistrationException("Zu viel Personal für NEF!"); - } - for (long driver_id : driverIds) { - if (!nfsIds.contains(driver_id)) - continue; // if possible driver is not NFS, skip him - found.put(driver_id, true); - for (long na_id : naIds) { - if (found.get(na_id)) continue; - LOG.info("Valid combinaion found for NEF"); - return; - } - found.put(driver_id, false); - } - LOG.info("No valid combination of employees found for NEF"); - throw new InvalidRegistrationException( - "Keine gültige Kombination von Personen für NEF!"); - } else if (vehicle.type() == VehicleType.BKTW) { - /* - BKTW - 1 Driver - */ - if (total > 3) { - LOG.info("Too many employees for BKTW"); - throw new InvalidRegistrationException("Zu viel Personal für BKTW!"); - } - if (!driverIds.isEmpty()) { - LOG.info("Valid combination found for BKTW"); - return; - } - LOG.info("No driver was found for BKTW"); - throw new InvalidRegistrationException("Kein Fahrer gefunden für BKTW!"); - } else { // KTW or RTW, both have the same requirements - /* - RTW/KTW - 1 Driver - 1 RS - */ - if (total < 2) { - LOG.info("Too few employees for {}", vehicle.type().name()); - throw new InvalidRegistrationException( - "Zu wenig Personal für " + vehicle.type().name() + "!"); - } else if (total > 4) { - LOG.info("Too many employees for {}", vehicle.type().name()); - throw new InvalidRegistrationException( - "Zu viel Persoanl für " + vehicle.type().name() + "!"); - } - for (long driver_id : driverIds) { // driver includes rs - found.put(driver_id, true); - for (long rs_id : rsIds) { - if (found.get(rs_id)) continue; - LOG.info("Valid combination found for {}", vehicle.type().name()); - return; - } - } - LOG.info("No valid combination of employees found for {}", vehicle.type().name()); - throw new InvalidRegistrationException( - "Keine gültige Kombination von Personen für " + vehicle.type().name() + "!"); - } - } - - private static boolean isNFS(Employee employee) { - EducationLevel educationLevel = employee.educationLevel(); - switch (educationLevel) { - case NFS: - return true; - case NKA: - return true; - case NKI: - return true; - case NKV: - return true; - default: - return false; - } - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Vehicle.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Vehicle.java deleted file mode 100644 index e81db0b..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/dto/Vehicle.java +++ /dev/null @@ -1,73 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto; - -import com.google.auto.value.AutoValue; -import java.util.List; -import javax.annotation.Nullable; - -@AutoValue -public abstract class Vehicle { - public enum ConstructionType { - NORMAL, - HOCHDACH, - MITTELHOCHDACH, - } - - public enum VehicleType { - BKTW, - KTW_B, - KTW, - RTW, - NEF, - NAH, - } - - public enum Status { - ABGEMELDET, - FREI_WACHE, - FREI_FUNK, - ZUM_BERUFUNGSORT, - AM_BERUFUNGSORT, - ZUM_ZIELORT, - AM_ZIELORT, - } - - public abstract long id(); - - public abstract String name(); - - public abstract ConstructionType constructionType(); - - public abstract VehicleType type(); - - public abstract Status status(); - - public abstract boolean hasNef(); - - @Nullable - public abstract List<Registration> registrations(); - - public static Builder builder() { - return new AutoValue_Vehicle.Builder().id(0); - } - - @AutoValue.Builder - public abstract static class Builder { - public abstract Builder id(long id); - - public abstract Builder name(String name); - - public abstract Builder constructionType(ConstructionType constructionType); - - public abstract Builder type(VehicleType type); - - public abstract Builder status(Status status); - - public abstract Builder hasNef(boolean hasNef); - - public abstract Builder registrations(List<Registration> registrations); - - public abstract Vehicle build(); - } - - public abstract Builder toBuilder(); -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeService.java deleted file mode 100644 index f7f8e71..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeService.java +++ /dev/null @@ -1,46 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service; - -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee; -import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; -import java.util.Set; - -public interface EmployeeService { - - /** - * Add given employee to the store. - * - * @param employee that should be added to the store - * @return the id that was assigned - * @throws InvalidEmployeeException if the employee is invalid - * @throws ServiceException if the employee could not be persisted - */ - long add(Employee employee) throws InvalidEmployeeException, ServiceException; - - /** - * Update the given employee. - * - * @param employee that should be updated - * @return the updated employee - * @throws InvalidEmployeeException if the employee is invalid - * @throws ServiceException if the updated employee could not be persisted - */ - Employee update(Employee employee) throws InvalidEmployeeException, ServiceException; - - /** - * Get all stored employees. - * - * @return list containing all stored employees - * @throws ServiceException if loading the stored employees failed - */ - Set<Employee> list() throws ServiceException; - - /** - * Remove employee with the given id from the store. - * - * @param id of the employee that should be removed - * @throws InvalidEmployeeException if given employee id is invalid or does not exist - * @throws ServiceException if the employee could not be removed from the store - */ - void remove(long id) throws InvalidEmployeeException, ServiceException; -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceImpl.java deleted file mode 100644 index 31b5acd..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/EmployeeServiceImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service; - -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.EmployeeDAO; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Employee; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.EmployeeValidator; -import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.PersistenceException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; -import java.util.Set; -import org.springframework.stereotype.Service; - -@Service -public class EmployeeServiceImpl implements EmployeeService { - - private final EmployeeDAO employeePersistence; - - public EmployeeServiceImpl(EmployeeDAO employeePersistence) { - this.employeePersistence = employeePersistence; - } - - @Override - public long add(Employee employee) throws InvalidEmployeeException, ServiceException { - - EmployeeValidator.validate(employee); - try { - return employeePersistence.add(employee); - } catch (PersistenceException e) { - throw new ServiceException(e); - } - } - - @Override - public Employee update(Employee employee) throws InvalidEmployeeException, ServiceException { - - EmployeeValidator.validate(employee); - try { - employeePersistence.update(employee); - return employee; - } catch (ElementNotFoundException | PersistenceException e) { - throw new ServiceException(e); - } - } - - @Override - public Set<Employee> list() throws ServiceException { - - try { - return employeePersistence.list(); - } catch (PersistenceException e) { - throw new ServiceException(e); - } - } - - @Override - public void remove(long id) throws InvalidEmployeeException, ServiceException {} -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationService.java deleted file mode 100644 index 4b7e630..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationService.java +++ /dev/null @@ -1,70 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service; - -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.einsatzverwaltung.dto.Vehicle; -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.ServiceException; -import java.util.EnumSet; -import java.util.Set; -import java.util.SortedSet; - -public interface OperationService { - - /** - * Add given operation to the store. - * - * @param operation that should be added to the store - * @return the id that was assigned - * @throws InvalidOperationException if the operation is invalid - * @throws ServiceException if the operation could not be persisted - */ - long add(Operation operation) throws InvalidOperationException, ServiceException; - - /** - * Request new vehicles to the given operation. - * - * @param operationId id of the operation that the vehicles should be send to - * @param vehicleIds the ids of the vehicles that should be send to the given operation - * @throws InvalidOperationException if the operationId is invalid or does not exist - * @throws InvalidVehicleException if one of the vehicle ids is invalid or does not exist - * @throws ServiceException if the vehicles could not be loaded or the operation could not be - * persisted - */ - void requestVehicles(long operationId, Set<Long> vehicleIds) - throws InvalidOperationException, InvalidVehicleException, ServiceException; - - /** - * Completes the given operation with the specified status. - * - * @param operationId id of the operation that should be completed - * @param status of the completed operation, either {@link Status#COMPLETED} or {@link - * Status#CANCELLED} - * @throws InvalidOperationException if the operationId is invalid or does not exist - * @throws ServiceException if the operation could not be persisted - */ - void complete(long operationId, Status status) - throws InvalidOperationException, ServiceException; - - /** - * Get all available vehicles, sorted by how well they fit to the given opCode, starting with - * the best fitting. - * - * @param opCode the operation code that is used to determine the ranking - * @return a sorted list containing all available vehicles - * @throws InvalidOperationException if the opCode is invalid - * @throws ServiceException if loading the stored vehicles failed - */ - SortedSet<Vehicle> rankVehicles(String opCode) - throws InvalidOperationException, ServiceException; - - /** - * Get all stored operations with matching status. - * - * @param statuses set containing all statuses that should be matched - * @return list containing all matched operations - * @throws ServiceException if loading the stored operations failed - */ - Set<Operation> list(EnumSet<Status> statuses) throws ServiceException; -} 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 deleted file mode 100644 index d07f46f..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/OperationServiceImpl.java +++ /dev/null @@ -1,264 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service; - -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.OperationDAO; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO; -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.ElementNotFoundException; -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 at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; -import java.lang.invoke.MethodHandles; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; - -@Service -public class OperationServiceImpl implements OperationService { - - private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - - private final OperationDAO operationDAO; - private final VehicleDAO vehicleDAO; - private final VehicleService vehicleService; - - public OperationServiceImpl( - OperationDAO operationDAO, VehicleDAO vehicleDAO, VehicleService vehicleService) { - this.operationDAO = operationDAO; - this.vehicleDAO = vehicleDAO; - this.vehicleService = vehicleService; - } - - @Override - public long add(Operation o) throws InvalidOperationException, ServiceException { - if (o.created() != null) throw new InvalidOperationException("Created must not be set"); - - if (o.severity() != null) throw new InvalidOperationException("Severity must not be set"); - - if (o.id() != 0) throw new InvalidOperationException("Id must be 0"); - - if (o.status() != Status.ACTIVE) - LOG.warn("Status was set but will be overridden"); // TODO: nullable instead?? - - try { - for (long id : (Iterable<Long>) o.vehicles().stream().map(Vehicle::id)::iterator) { - Vehicle v = vehicleDAO.get(id); - VehicleServiceImpl.validateVehicle(v); - } - - validateOperation(o); - - return operationDAO.add( - o.toBuilder() - .created(Instant.now()) - .severity(extractSeverityFromOpCode(o.opCode())) - .status(Status.ACTIVE) - .build()); - } catch (PersistenceException e) { - LOG.error("PersistenceException while adding operation: {}", e); - throw new ServiceException(e); - } catch (InvalidVehicleException e) { - throw new InvalidOperationException("Enthaltenes Fahrzeug ist invalid", e); - } catch (ElementNotFoundException e) { - throw new InvalidOperationException("Enthaltenes Fahrzeug existiert nicht", e); - } - } - - @Override - public void requestVehicles(long operationId, Set<Long> vehicleIds) - throws InvalidOperationException, InvalidVehicleException, ServiceException { - Set<Vehicle> vs = new HashSet<>(); - - try { - if (operationId <= 0) throw new InvalidOperationException("OperationId ist invalid"); - Operation o = operationDAO.get(operationId); - validateOperation(o); - - if (o.opCode().trim().isEmpty() - || extractSeverityFromOpCode(o.opCode()) != o.severity()) - throw new InvalidOperationException("Einsatzcode ist invalid"); - - if (o.status() != Status.ACTIVE) - throw new InvalidOperationException("Einsatz ist inaktiv"); - - if (o.created() == null) - throw new InvalidOperationException("Created darf nicht leer sein"); - - for (Long id : vehicleIds) { - if (id <= 0) throw new InvalidVehicleException("VehicleId ist invalid"); - - try { - Vehicle v = vehicleDAO.get(id); - VehicleServiceImpl.validateVehicle(v); - if (v.status() == Vehicle.Status.ABGEMELDET) - throw new InvalidVehicleException( - "Kann keine inaktiven Fahrzeuge anfordern"); - - vs.add(v); - } catch (ElementNotFoundException e) { - throw new InvalidVehicleException("VehicleId ist invalid"); - } - } - - vs.addAll(o.vehicles()); - if (vs.equals(o.vehicles())) return; - - operationDAO.update(o.toBuilder().vehicles(vs).build()); - } catch (ElementNotFoundException e) { - throw new InvalidOperationException("Kein Einsatz mit dieser id existiert"); - } catch (PersistenceException e) { - LOG.error("PersistenceException while requesting vehicles: {}", e); - throw new ServiceException(e); - } - } - - @Override - public void complete(long operationId, Status status) - throws InvalidOperationException, ServiceException { - try { - Operation o = operationDAO.get(operationId); - operationDAO.update(o.toBuilder().status(status).build()); - } catch (ElementNotFoundException e) { - throw new InvalidOperationException(e); - } catch (PersistenceException e) { - LOG.error("PersistenceException while completing operation: {}", e); - throw new ServiceException(e); - } - } - - @Override - public SortedSet<Vehicle> rankVehicles(String opCode) - throws InvalidOperationException, ServiceException { - Set<Vehicle> vehicles = - vehicleService.list(EnumSet.complementOf(EnumSet.of(Vehicle.Status.ABGEMELDET))); - - List<Predicate<Vehicle>> priorities = new ArrayList<>(); - Predicate<Vehicle> ktw = v -> v.type() == VehicleType.KTW; - Predicate<Vehicle> rtwNoNEF = v -> v.type() == VehicleType.RTW && !v.hasNef(); - Predicate<Vehicle> rtwNEF = v -> v.type() == VehicleType.RTW && v.hasNef(); - Predicate<Vehicle> nef = v -> v.type() == VehicleType.NEF; - Predicate<Vehicle> nah = v -> v.type() == VehicleType.NAH; - - switch (extractSeverityFromOpCode(opCode)) { - case A: - // fallthrough - case B: - // fallthrough - case O: - priorities.add(ktw); - priorities.add(rtwNoNEF); - priorities.add(rtwNEF); - break; - case C: - priorities.add(rtwNEF); - priorities.add(rtwNoNEF); - priorities.add(ktw); - break; - case D: - priorities.add(rtwNEF); - priorities.add(nef); - priorities.add(nah); - priorities.add(rtwNoNEF); - priorities.add(ktw); - break; - case E: - priorities.add(nah); - priorities.add(nef); - priorities.add(rtwNEF); - priorities.add(rtwNoNEF); - priorities.add(ktw); - break; - } - - Comparator<Vehicle> vehicleComparator = - (v1, v2) -> { - for (Predicate<Vehicle> priority : priorities) { - if (priority.test(v1)) { - return -1; - } - if (priority.test(v2)) { - return +1; - } - } - return 0; - }; - - Supplier<TreeSet<Vehicle>> supplier = () -> new TreeSet<>(vehicleComparator); - - return vehicles.stream().collect(Collectors.toCollection(supplier)); - } - - @Override - public Set<Operation> list(EnumSet<Status> statuses) throws ServiceException { - try { - Set<Operation> operations = operationDAO.list(statuses); - for (Operation o : operations) validateOperation(o); - - return operations; - } catch (PersistenceException e) { - LOG.error("PersistenceException while listing operations", e); - throw new ServiceException(e); - } catch (InvalidOperationException e) { - // database returned invalid values - LOG.error("DB returned invalid operation: {}", e); - throw new ServiceException("DB returned invalid operation", e); - } - } - - private static void validateOperation(Operation o) throws InvalidOperationException { - if (o.vehicles().isEmpty()) - throw new InvalidOperationException( - "Es muss mindestens ein Fahrzeug ausgewählt werden!"); - - for (Vehicle v : o.vehicles()) { - try { - VehicleServiceImpl.validateVehicle(v); - } catch (InvalidVehicleException e) { - throw new InvalidOperationException("Fahrzeug " + v.name() + " ist invalid" + e); - } - - if (v.status() != Vehicle.Status.FREI_FUNK && v.status() != Vehicle.Status.FREI_WACHE) - throw new InvalidOperationException( - "Fahrzeug nicht verfügbar (" + v.status() + ")"); - - // TODO: validate if NEF/RTW/NAH conditions? - } - - Instant created = o.created(); - if (created != null && created.isAfter(Instant.now())) - throw new InvalidOperationException("Fahrzeug wurde in der Zukunft erstellt"); - - if (o.destination().trim().isEmpty()) - throw new InvalidOperationException("Adresse darf nicht leer sein"); - } - - private static final Pattern opCodePattern = - Pattern.compile("(?:\\w{1,3}-\\d{0,2})([ABCDEO])(?:.*)"); - - private static Severity extractSeverityFromOpCode(String opCode) - throws InvalidOperationException { - Matcher m = opCodePattern.matcher(opCode); - - if (!m.matches()) throw new InvalidOperationException("Einsatzcode ist invalid"); - - return Severity.valueOf(m.group(1)); - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationService.java deleted file mode 100644 index b7d8eef..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationService.java +++ /dev/null @@ -1,32 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service; - -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration; -import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; -import java.util.Set; - -public interface RegistrationService { - - /** - * Register employee to a vehicle. - * - * @param vehicleId the id of the target vehicle - * @param registrations that should be added to the vehicle - * @return the list of ids that were assigned - * @throws InvalidVehicleException if the vehicleId is invalid or does not exist - * @throws InvalidRegistrationException if the registration is invalid - * @throws ServiceException if the registration could not be persisted - */ - Set<Long> add(long vehicleId, Set<Registration> registrations) - throws InvalidVehicleException, InvalidRegistrationException, ServiceException; - - /** - * Remove given registration from the store. - * - * @param registrationId the id of the registration that should be removed - * @throws InvalidRegistrationException if the registration is invalid or does not exist - * @throws ServiceException if the registration could not be removed from the store - */ - void remove(long registrationId) throws InvalidRegistrationException, ServiceException; -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceImpl.java deleted file mode 100644 index 54d46e7..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/RegistrationServiceImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service; - -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.RegistrationDAO; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dao.VehicleDAO; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Registration; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.RegistrationValidator; -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle; -import at.ac.tuwien.sepm.assignment.groupphase.exception.ElementNotFoundException; -import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException; -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.Set; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class RegistrationServiceImpl implements RegistrationService { - - private static final Logger LOG = LoggerFactory.getLogger(RegistrationServiceImpl.class); - - private final RegistrationDAO registrationDAO; - private final VehicleDAO vehicleDAO; - - @Autowired - public RegistrationServiceImpl(RegistrationDAO registrationDAO, VehicleDAO vehicleDAO) { - this.registrationDAO = registrationDAO; - this.vehicleDAO = vehicleDAO; - } - - @Override - public Set<Long> add(long vehicleId, Set<Registration> registrations) - throws InvalidVehicleException, InvalidRegistrationException, ServiceException { - - if (vehicleId <= 0) throw new InvalidVehicleException("VehicleId invalid"); - - try { - Vehicle vehicle = vehicleDAO.get(vehicleId); - - RegistrationValidator.validate(vehicle, registrations); - - return registrationDAO.add(vehicle.id(), registrations); - } catch (PersistenceException e) { - LOG.warn("PersistenceException caught, throwing matching ServiceException"); - throw new ServiceException(e); - } catch (ElementNotFoundException e) { - throw new InvalidVehicleException(e); - } - } - - @Override - public void remove(long registrationId) throws InvalidRegistrationException, ServiceException { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleService.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleService.java deleted file mode 100644 index fe09ca1..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleService.java +++ /dev/null @@ -1,49 +0,0 @@ -package at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service; - -import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.dto.Vehicle; -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.ServiceException; -import java.util.EnumSet; -import java.util.Set; - -public interface VehicleService { - - /** - * Add given vehicle to the store. - * - * @param vehicle that should be added to the store - * @return the id that was assigned - * @throws InvalidVehicleException if the vehicle is invalid - * @throws ServiceException if the vehicle could not be persisted - */ - long add(Vehicle vehicle) throws InvalidVehicleException, ServiceException; - - /** - * Update the given vehicle. - * - * @param vehicle that should be updated - * @return the updated vehicle - * @throws InvalidVehicleException if the vehicle is invalid - * @throws ServiceException if the updated vehicle could not be persisted - */ - Vehicle update(Vehicle vehicle) throws InvalidVehicleException, ServiceException; - - /** - * Get all stored vehicles with matching status. - * - * @param statuses set containing all statuses that should be matched - * @return list containing all stored vehicles - * @throws ServiceException if loading the stored vehicles failed - */ - Set<Vehicle> list(EnumSet<Status> statuses) throws ServiceException; - - /** - * Remove vehicle with the given id from the store. - * - * @param id of the vehicle that should be removed - * @throws InvalidVehicleException if given vehicle id is invalid or does not exist - * @throws ServiceException if the vehicle could not be removed from the store - */ - void remove(long id) throws InvalidVehicleException, ServiceException; -} diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceImpl.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceImpl.java deleted file mode 100644 index 61a24e5..0000000 --- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/service/VehicleServiceImpl.java +++ /dev/null @@ -1,114 +0,0 @@ -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.ElementNotFoundException; -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.Set; -import java.util.stream.Collectors; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -@Service -public class VehicleServiceImpl implements VehicleService { - - private VehicleDAO vehiclePersistence; - - public VehicleServiceImpl(VehicleDAO vehiclePersistence) { - this.vehiclePersistence = vehiclePersistence; - } - - public long add(Vehicle vehicle) throws InvalidVehicleException, ServiceException { - if (!CollectionUtils.isEmpty(vehicle.registrations())) - throw new InvalidVehicleException("Vehicle can't be created with registrations"); - - validateVehicle(vehicle); - try { - vehiclePersistence.add(vehicle); - } catch (PersistenceException e) { - throw new ServiceException(e); - } - return 0; - } - - public Vehicle update(Vehicle vehicle) throws InvalidVehicleException, ServiceException { - validateVehicle(vehicle); - try { - vehiclePersistence.update(vehicle); - } catch (ElementNotFoundException e) { - throw new ServiceException("Element not found"); - } catch (PersistenceException e) { - throw new ServiceException(e); - } - return vehicle; - } - - protected static void validateVehicle(Vehicle vehicle) throws InvalidVehicleException { - switch (vehicle.type()) { - case RTW: - if (vehicle.constructionType() == ConstructionType.NORMAL) { - throw new InvalidVehicleException("RTW darf kein Normales Dach haben"); - } else if (vehicle.constructionType() == ConstructionType.MITTELHOCHDACH) { - throw new InvalidVehicleException("RTW darf kein Mittelhochdach haben"); - } - break; - case KTW: - if (vehicle.constructionType() == ConstructionType.NORMAL) { - throw new InvalidVehicleException("KTW darf kein Normales Dach haben"); - } - break; - case KTW_B: - if (vehicle.constructionType() == ConstructionType.NORMAL) { - throw new InvalidVehicleException("KTW-B darf kein Normales Dach haben"); - } - break; - case NEF: - if (vehicle.constructionType() == ConstructionType.MITTELHOCHDACH) { - throw new InvalidVehicleException("NEF darf kein Mittelhochdach haben"); - } else if (vehicle.constructionType() == ConstructionType.HOCHDACH) { - throw new InvalidVehicleException("NEF darf kein Hochdach haben"); - } - break; - case NAH: - if (vehicle.constructionType() == ConstructionType.MITTELHOCHDACH) { - throw new InvalidVehicleException("NEF darf kein Mittelhochdach haben"); - } else if (vehicle.constructionType() == ConstructionType.HOCHDACH) { - throw new InvalidVehicleException("NEF darf kein Hochdach haben"); - } - break; - case BKTW: - break; - default: - throw new IllegalStateException("BUG: invalid vehicle type" + vehicle.type()); - } - } - - @Override - public Set<Vehicle> list(EnumSet<Status> statuses) throws ServiceException { - if (statuses == null) { - throw new ServiceException("statuses may not be null"); - } - - Set<Vehicle> vehicles; - - try { - vehicles = vehiclePersistence.list(); - } catch (PersistenceException e) { - throw new ServiceException(e); - } - - return vehicles.stream() - .filter(vehicle -> statuses.contains(vehicle.status())) - .collect(Collectors.toSet()); - } - - @Override - public void remove(long id) throws InvalidVehicleException, ServiceException { - throw new UnsupportedOperationException(); - } -} |