/**
   * Update.
   *
   * @param request the request
   * @return the response
   */
  @RequestMapping(value = UPDATE, method = RequestMethod.POST)
  @ResponseBody
  public Response update(@RequestBody Map<String, Object> request) {
    ScheduleResponse response = new ScheduleResponse();

    try {
      ScheduleRequest scheduleRequest =
          new ScheduleRequest(new DMSchedule(Integer.parseInt(request.get(ID).toString())));

      // ADD user context to request
      addUserContextToRequest(scheduleRequest);

      response = getScheduleBCF().fetchScheduleById(scheduleRequest);
      if (!response.isOperationSuccess()) {
        return response;
      }

      DMSchedule schedule = response.getSchedules().get(0);

      if (STATUS_PAUSED.equals(request.get(TYPE))) {
        schedule.setStatusEnum(ScheduleStatusEnum.PAUSED);
      } else if (STATUS_RESUME.equals(request.get(TYPE))) {
        schedule.setStatusEnum(ScheduleStatusEnum.ENABLED);
      } else if (STATUS_FAILED.equals(request.get(TYPE))) {
        schedule.setStatusEnum(ScheduleStatusEnum.ENABLED);

        // New Next Execution Date
        Date serverUTC = DMConvertUtil.convertDateToDefaultUTC(new Date());

        // New Action Date = New Next Execution Date + (Old Action Date - Old Next Execution Date)
        Date actionDate =
            DMConvertUtil.convertDateToDefaultUTC(
                DMConvertUtil.convertIntegerToDate(
                    DMConvertUtil.convertDateToInteger(serverUTC)
                        + (DMConvertUtil.convertDateToInteger(
                                DMConvertUtil.convertDateToDefaultUTC(
                                    schedule.getDmAction().getActionTime()))
                            - DMConvertUtil.convertDateToInteger(
                                DMConvertUtil.convertDateToDefaultUTC(
                                    schedule.getFrequency().getNextExecution())))));

        schedule.getDmAction().setActionTime(actionDate);
        schedule.getFrequency().setNextExecution(serverUTC);
      }

      scheduleRequest.setSchedule(schedule);

      response = getScheduleBCF().updateScheduleStatus(scheduleRequest);

    } catch (Exception e) {
      SensusInterfaceUtil.handleException(
          LOG, response, e, DEFAULT_EXCEPTION_MSG, new String[] {CONTROLLER_EXCEPTION_MSG});
    }

    return response;
  }