@Util
  public static OrderCreateParam createOrder(
      CatalogServiceRestRep service,
      ServiceDescriptorRestRep descriptor,
      Map<String, String> parameters) {

    OrderCreateParam order = new OrderCreateParam();
    order.setTenantId(uri(Models.currentAdminTenant()));
    order.setCatalogService(service.getId());

    List<Parameter> orderParameters = Lists.newArrayList();
    List<ServiceFieldRestRep> fields =
        ServiceDescriptorUtils.getAllFieldList(descriptor.getItems());
    for (ServiceFieldRestRep field : fields) {
      String value = parameters.get(field.getName());
      if (StringUtils.isNotBlank(value)) {
        orderParameters.add(createOrderParameter(field, value));
      }
    }
    order.setParameters(orderParameters);
    return order;
  }
  protected static ScheduledEventCreateParam createScheduledOrder(OrderCreateParam orderParam) {
    if (!isSchedulerEnabled()) {
      return null;
    }
    ScheduleInfo scheduleInfo = new ScheduleInfo();
    String cycleFrequency = params.get("scheduler.cycleFrequency");
    if (cycleFrequency != null) {
      scheduleInfo.setCycleFrequency(Integer.parseInt(cycleFrequency));
    } else {
      scheduleInfo.setCycleFrequency(1);
    }

    String cycleType = params.get("scheduler.cycleType");
    if (cycleType != null) {
      ScheduleCycleType cycleTypeEnum = ScheduleCycleType.valueOf(cycleType);
      scheduleInfo.setCycleType(cycleTypeEnum);
      List<String> sectionsInCycleList = Lists.newArrayList();
      if (cycleTypeEnum == ScheduleCycleType.WEEKLY) {
        String sectionsInCycle = params.get("scheduler.dayOfWeek");
        sectionsInCycleList.add(sectionsInCycle);
      } else if (cycleTypeEnum == ScheduleCycleType.MONTHLY) {
        String sectionsInCycle = params.get("scheduler.dayOfMonth");
        sectionsInCycleList.add(sectionsInCycle);
      }
      scheduleInfo.setSectionsInCycle(sectionsInCycleList);
    } else {
      scheduleInfo.setCycleType(ScheduleCycleType.DAILY);
    }

    String currentTimezoneOffsetInMins = params.get("scheduler.currentTimezoneOffsetInMins");
    Integer timezoneOffset = Integer.parseInt(currentTimezoneOffsetInMins);

    String startDate = params.get("scheduler.startDate");
    String startTime = params.get("scheduler.startTime");

    String isoDateTimeStr = String.format("%sT%s", startDate, startTime);
    DateTime startDateTime =
        DateTime.parse(
            isoDateTimeStr,
            ISODateTimeFormat.localDateOptionalTimeParser()
                .withZone(TimeUtils.getLocalTimeZone(timezoneOffset)));
    startDateTime = startDateTime.withZone(DateTimeZone.UTC);
    scheduleInfo.setHourOfDay(startDateTime.getHourOfDay());
    scheduleInfo.setMinuteOfHour(startDateTime.getMinuteOfHour());
    scheduleInfo.setStartDate(
        String.format(
            "%d-%02d-%02d",
            startDateTime.getYear(),
            startDateTime.getMonthOfYear(),
            startDateTime.getDayOfMonth()));

    String recurrence = params.get("scheduler.recurrence");
    int recurrenceNum = 1;
    if (recurrence != null) {
      recurrenceNum = Integer.parseInt(recurrence);
      if (recurrenceNum == -1) {
        String range = params.get("scheduler.rangeOfRecurrence");
        recurrenceNum = Integer.parseInt(range);
      }
    }
    scheduleInfo.setReoccurrence(recurrenceNum);

    /*
     * if reoccurence number large than 1, we must make sure the name contains patten {datetime},
     * with the pattern in the name, vipr know how to generate dynamic name for each snaphot/fullcopy.
     */
    if (recurrenceNum != 1) {
      List<Parameter> parameters = orderParam.getParameters();
      CatalogServiceRestRep service =
          CatalogServiceUtils.getCatalogService(orderParam.getCatalogService());
      Logger.info("creating order with parameter for: " + service.getBaseService());
      String nameToValidate = SCHEDULED_SERVICE.get(service.getBaseService());
      for (Parameter parameter : parameters) {
        if (parameter.getLabel().equals(nameToValidate)
            && !parameter.getValue().contains("{datetime}")) {
          Validation.addError(
              nameToValidate,
              "need to add patten '{datetime}' in the name for reoccuring scheduled operation");
        }
        Logger.info(
            parameter.getLabel()
                + " = "
                + parameter.getValue()
                + ", "
                + parameter.getFriendlyLabel()
                + " = "
                + parameter.getFriendlyValue());
      }
    }

    String maxNumOfCopies = params.get("scheduler.maxNumOfCopies");
    if (maxNumOfCopies != null) {
      orderParam.setAdditionalScheduleInfo(maxNumOfCopies);
    }

    scheduleInfo.setDurationLength(3600);
    ScheduledEventCreateParam eventParam = new ScheduledEventCreateParam();
    eventParam.setOrderCreateParam(orderParam);
    eventParam.setScheduleInfo(scheduleInfo);

    return eventParam;
  }