/*
   * Standard set of MetaData. Updated by invoke,
   * overridden by individual schedulers as needed.
   */
  public MetaData createMetaData() {
    MetaData md = new MetaData();
    md.setConversionFactor((long) 3600000); // everything is in mills.
    md.setStatusVector("2;3;4");
    md.setKValue(1);
    md.setMaxPriority(13);
    md.setTravelVector("10;20;40;60;80");
    md.setTravelImportance(40);
    md.setTravelFunction(1);

    return md;
  }
  /*
   * Invoke prepares data calls run
   * This should likely not get overridden.
   */
  public void invoke(
      Long periodStart, Long hours, String topLevelLocator, SchedulerController scheduler) {
    schedulerRunComplete = false;
    schedulerUtility = BigDecimal.ZERO;
    schedulerRunTime = 0F;
    schedulerTotalSchedules = 0L;
    schedulerTotalLegalSchedules = 0L;

    SchedulerInterface si = new SchedulerInterface();
    SchedulingInputData sid = new SchedulingInputData();
    SchedulingOutputData sod = new SchedulingOutputData();

    // set up the metadata
    MetaData md = createMetaData();
    md.setPeriodStart(periodStart);
    md.setPeriodEnd(periodStart + (hours * 3600000)); // hours x 3.6M (convert to mills)
    md.setTopLevelLocatorId(topLevelLocator);
    md.setConversionFactor(3600000L);

    sid = si.buildSid(md);
    if (!validateSid(sid)) {
      // Validation Failed. Punt the invoke
      // TODO: Exception?
      return;
    }

    // We have a valid sid at this point. Run the scheduler
    try {
      sod = scheduler.schedule(sid);
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    // Validate sod. Don't persist and error
    if (sod == null) {
      System.out.println("Scheduler Output is NULL!");
      return;
    } else {
      if (!validateSod(sod)) {
        // Validation Failed. Do not persist.
        // TODO: Exception?
        return;
      }
    }

    // We have a valid sod at this point. Persist the results!
    si.persistSod(sod, md.getPeriodStart());

    schedulerUtility = sod.getUtility();
    schedulerRunTime = sod.getRunTime();
    schedulerTotalSchedules = sod.getNumberSchedulesAttempted();
    schedulerTotalLegalSchedules = sod.getNumberLegalSchedulesAttempted();
    schedulerRunComplete = true;
  } // ALL DONE, END INVOKE