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 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 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); } }