public static List<Date> computeFireTimesBetween(
     OperableTrigger trigger, org.quartz.Calendar cal, Date from, Date to, int num) {
   LinkedList<Date> lst = new LinkedList<>();
   OperableTrigger t = (OperableTrigger) trigger.clone();
   if (t.getNextFireTime() == null) {
     t.setStartTime(from);
     t.setEndTime(to);
     t.computeFirstFireTime(cal);
   }
   for (int i = 0; i < num; i++) {
     Date d = t.getNextFireTime();
     if (d != null) {
       if (d.before(from)) {
         t.triggered(cal);
         continue;
       }
       if (d.after(to)) {
         break;
       }
       lst.add(d);
       t.triggered(cal);
     } else {
       break;
     }
   }
   return java.util.Collections.unmodifiableList(lst);
 }
 /**
  * For debugging
  *
  * @return a human readable description of the TriggerWrapper
  */
 public String getTriggerInfo() {
   return "TriggerInfo: "
       + ClusterCacheJobStore.generateKey(trigger.getKey())
       + "\nState: "
       + getTriggerStateName()
       + "\nFireringInstance: "
       + (fireingInstance == null ? "null" : fireingInstance)
       + "\nJobExecuting: "
       + jobExecuting
       + "\nFireTime: "
       + (fireTime == null ? "null" : fireTime.toString())
       + "\nScheduleTime: "
       + (scheduleTime == null ? "null" : scheduleTime.toString())
       + "\nRecovering: "
       + recovering;
 }