aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java')
-rw-r--r--src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java194
1 files changed, 194 insertions, 0 deletions
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java
new file mode 100644
index 0000000..daeaedd
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/missioncontrol/controller/OperationDetailsController.java
@@ -0,0 +1,194 @@
+package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller;
+
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showAlertWithOkButtonAndWait;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showServiceExceptionAlertAndWait;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showSuccessAlertAndWait;
+import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showValidationErrorAlertAndWait;
+
+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.missioncontrol.dto.Operation;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Operation.Status;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Vehicle;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.OperationService;
+import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.VehicleService;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import javafx.collections.FXCollections;
+import javafx.fxml.FXML;
+import javafx.scene.control.Alert.AlertType;
+import javafx.scene.control.Button;
+import javafx.scene.control.Label;
+import javafx.scene.control.ListView;
+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 OperationDetailsController {
+ private static final Logger LOG = LoggerFactory.getLogger(OperationDetailsController.class);
+
+ public Operation operation;
+ private final OperationService operationService;
+ private final VehicleService vehicleService;
+ private final CreateOperationController createOperationController;
+ @FXML private FlowPane fpVehicles;
+ @FXML private FlowPane fpAdditional;
+ @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() {
+ lvActiveOperations.setCellFactory(
+ param -> CreateOperationController.generateOpCodeListItem());
+ lvActiveOperations.setOnMouseClicked(
+ event -> {
+ if (event.getClickCount() == 2) {
+ if (lvActiveOperations.getSelectionModel().getSelectedItem() == null) {
+ return;
+ }
+ initOperation(lvActiveOperations.getSelectionModel().getSelectedItem());
+ }
+ });
+ }
+
+ private void updateFlowPane() {
+ try {
+ fpVehicles.getChildren().clear();
+ for (Vehicle vehicle : operation.vehicles()) {
+ VehiclePaneController controller = VehiclePaneController.createVehiclePane();
+ controller.setData(vehicle, true, false);
+ fpVehicles.getChildren().add(controller.getRootElement());
+ }
+
+ fpAdditional.getChildren().clear();
+ for (Vehicle vehicle : operationService.rankVehicles(operation.opCode())) {
+ if (operation.vehicles().contains(vehicle)) continue;
+
+ VehiclePaneController controller = VehiclePaneController.createVehiclePane();
+ controller.setData(vehicle, true, true);
+ controller.getBtnRequest().setOnAction(e -> requestVehicleClicked(controller));
+ fpAdditional.getChildren().add(controller.getRootElement());
+ }
+ } catch (IOException | ServiceException e) {
+ LOG.error("Error while updating list.", e);
+ showServiceExceptionAlertAndWait("Error while updating list.");
+ } catch (InvalidOperationException e) {
+ LOG.debug("Validation for Operation failed");
+ showValidationErrorAlertAndWait(e.getMessage());
+ }
+ }
+
+ 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());
+ updateFlowPane();
+ operationDetailsAP.setVisible(true);
+ }
+
+ private void fillActiveList() {
+ try {
+ lvActiveOperations.setItems(
+ FXCollections.observableArrayList(
+ operationService.list(EnumSet.of(Status.ACTIVE))));
+ } catch (ServiceException e) {
+ LOG.error("ServiceException in fillActiveList(). ", e);
+ showServiceExceptionAlertAndWait(e.getMessage());
+ }
+ }
+
+ @FXML
+ public void closeOperationClicked() {
+ LOG.debug("Button \"Abschließen\" clicked.");
+ try {
+ operationService.complete(operation.id(), Status.COMPLETED);
+ } catch (InvalidOperationException e) {
+ LOG.debug("Validation error in closeOperationClicked(). ", e);
+ showAlertWithOkButtonAndWait(AlertType.ERROR, "Validierungsfehler", e.getMessage());
+ return;
+ } catch (ServiceException e) {
+ LOG.error("Exception in closeOperationClicked(). ", e);
+ showServiceExceptionAlertAndWait(e.getMessage());
+ return;
+ }
+ showSuccessAlertAndWait("Der Einsatz wurde erfolgreich aktualisiert");
+ createOperationController.updateList();
+ closeWindow();
+ }
+
+ public void cancelOperationClicked() {
+ LOG.debug("Button \"Stornieren\" clicked.");
+ try {
+ operationService.complete(operation.id(), Status.CANCELLED);
+ } catch (InvalidOperationException e) {
+ LOG.debug("Validation error in cancelOperationClicked(). ", e);
+ showValidationErrorAlertAndWait(e.getMessage());
+ return;
+ } catch (ServiceException e) {
+ LOG.error("Exception in cancelOperationClicked(). ", e);
+ showServiceExceptionAlertAndWait(e.getMessage());
+ return;
+ }
+ showSuccessAlertAndWait("Der Einsatz wurde erfolgreich aktualisiert");
+ createOperationController.updateList();
+ closeWindow();
+ }
+
+ private void requestVehicleClicked(VehiclePaneController v) {
+ LOG.debug("Button \"Nachfordern\" clicked.");
+
+ Vehicle vehicle = null;
+
+ try {
+ vehicle = v.getData();
+ if (vehicle == null) return;
+
+ operationService.requestVehicles(operation.id(), Set.of(vehicle.id()));
+ } catch (ServiceException e) {
+ LOG.error("ServiceException in requestVehicleClicked()", e);
+ showServiceExceptionAlertAndWait(e.getMessage());
+ return;
+ } catch (InvalidVehicleException e) {
+ LOG.debug("Validation of Vehicle failed");
+ showValidationErrorAlertAndWait(e.getMessage());
+ } catch (InvalidOperationException e) {
+ LOG.debug("Validation of Operation failed");
+ showValidationErrorAlertAndWait(e.getMessage());
+ }
+ showSuccessAlertAndWait("Das Fahrzeug wurde erfolgreich angefordert");
+ operation.vehicles().add(vehicle);
+ updateFlowPane();
+ }
+
+ public void closeWindow() {
+ LOG.debug("Hyperlink \"Zurück\" clicked.");
+ operationDetailsAP.setVisible(false);
+ this.createOperationController.setVisible(true);
+ }
+}