/**
   * Lazy initialization of the assignment map. For each ambulance that is currently being displayed
   * (the current CRUD page, represented by the attribute entities), checks if there's an active
   * assignment and stores the appropriate information (driver name, or "unassigned", properly
   * internationalized) to the assignment map.
   */
  private void initCurrentAssignments() {
    logger.log(Level.INFO, "Initializing current drivers map for {0} entities.", entities.size());
    currentAssignments = new TreeMap<Long, String>();
    for (Ambulance ambulance : entities) {
      // Retrieves the current assignment (if any) for this ambulance.
      DriverAssignment assignment = null;
      try {
        assignment = getCrudService().retrieveActiveAssignment(ambulance);
      } catch (AmbulanceHasMultipleCurrentDriverAssignmentsException e) {
        logger.log(
            Level.SEVERE,
            "There has been an error while retrieving the active assignment of ambulance # "
                + ambulance.getNumber()
                + " (id "
                + ambulance.getId()
                + ")",
            e);
        addGlobalI18nMessage(
            "msgs",
            FacesMessage.SEVERITY_ERROR,
            "manageAmbulances.error.assignmentError",
            ambulance.getNumber());
      }

      // Displays the status depending if the ambulance is active or not.
      currentAssignments.put(
          ambulance.getId(),
          getI18nMessage(
              "msgs",
              (assignment == null)
                  ? "manageAmbulances.text.currentDriver.none"
                  : assignment.getDriver().getName()));
    }
  }
  /**
   * Called from the assignment page's form, sends the data on the end of the current assignment
   * and/or the beginning of a new one and changes the driver assigned to the ambulance.
   *
   * <p>This method executes a scenario in the service class.
   */
  public void changeAssignment() {
    // Only change an assignment if the driver actually changed.
    if ((driverId != null)
        && (currentAssignment.getDriver() != null)
        && (driverId.equals(currentAssignment.getDriver().getId()))) {
      logger.log(
          Level.WARNING,
          "Assigning ambulance # {0} (id {1}) with the same driver. Current assignment's driver's ID: {3}, supplied ID: {4}.",
          new Object[] {
            selectedEntity.getNumber(),
            selectedEntity.getId(),
            currentAssignment.getDriver().getId(),
            driverId
          });
      addGlobalI18nMessage(
          "msgs",
          FacesMessage.SEVERITY_WARN,
          "manageAmbulances.warn.sameDriverAssignment",
          currentAssignment.getDriver().getName());
    } else {
      Employee driver = (driverId == null) ? null : employeeDAO.retrieveById(driverId);

      try {
        // If the driver was specified, create a new assignment, possibly ending a current
        // assignment.
        if (driver != null) {
          logger.log(
              Level.INFO,
              "Assigning ambulance # {0} (id {1}). Driver: {2}.",
              new Object[] {selectedEntity.getNumber(), selectedEntity.getId(), driver.getName()});
          currentAssignment = getCrudService().assignAmbulance(selectedEntity, driver);
          free = false;
          addGlobalI18nMessage(
              "msgs", FacesMessage.SEVERITY_INFO, "manageAmbulances.info.assignmentStarted");
        }
        // If not, end the current assignment.
        else {
          logger.log(
              Level.INFO,
              "Ending current assignment for ambulance # {0} (id {1}).",
              new Object[] {selectedEntity.getNumber(), selectedEntity.getId()});
          getCrudService().endCurrentAssignment(selectedEntity);
          currentAssignment = null;
          free = true;
          addGlobalI18nMessage(
              "msgs", FacesMessage.SEVERITY_INFO, "manageAmbulances.info.assignmentEnded");
        }
      } catch (AmbulanceHasMultipleCurrentDriverAssignmentsException e) {
        logger.log(
            Level.SEVERE,
            "There has been an error while assigning a driver to ambulance # "
                + selectedEntity.getNumber()
                + " (id "
                + selectedEntity.getId()
                + ")",
            e);
        addGlobalI18nMessage(
            "msgs",
            FacesMessage.SEVERITY_ERROR,
            "manageAmbulances.error.assignmentError",
            selectedEntity.getNumber());
        driverId = null;
      } catch (AmbulanceHasNoCurrentDriverAssignmentsException e) {
        logger.log(
            Level.SEVERE,
            "There has been an error while assigning a driver to ambulance # "
                + selectedEntity.getNumber()
                + " (id "
                + selectedEntity.getId()
                + ")",
            e);
        addGlobalI18nMessage(
            "msgs",
            FacesMessage.SEVERITY_ERROR,
            "manageAmbulances.error.assignmentError",
            selectedEntity.getNumber());
        driverId = null;
      } catch (EmployeeIsNotDriverException e) {
        logger.log(
            Level.SEVERE,
            "There has been an error while assigning a driver to ambulance # "
                + selectedEntity.getNumber()
                + " (id "
                + selectedEntity.getId()
                + "): the specified employee ("
                + driver.getLogin()
                + ") is not a driver!",
            e);
        addGlobalI18nMessage(
            "msgs",
            FacesMessage.SEVERITY_ERROR,
            "manageAmbulances.error.assignmentErrorNotDriver",
            driver.getName(),
            selectedEntity.getNumber());
        driverId = null;
      }
    }
  }