public static void writeTrigger(Trigger trigger, MarshallerWriteContext outCtx)
      throws IOException {
    if (trigger instanceof CronTrigger) {
      outCtx.writeShort(PersisterEnums.CRON_TRIGGER);

      CronTrigger cronTrigger = (CronTrigger) trigger;
      outCtx.writeLong(cronTrigger.getStartTime().getTime());
      if (cronTrigger.getEndTime() != null) {
        outCtx.writeBoolean(true);
        outCtx.writeLong(cronTrigger.getEndTime().getTime());
      } else {
        outCtx.writeBoolean(false);
      }
      outCtx.writeInt(cronTrigger.getRepeatLimit());
      outCtx.writeInt(cronTrigger.getRepeatCount());
      outCtx.writeUTF(cronTrigger.getCronEx().getCronExpression());
      if (cronTrigger.getNextFireTime() != null) {
        outCtx.writeBoolean(true);
        outCtx.writeLong(cronTrigger.getNextFireTime().getTime());
      } else {
        outCtx.writeBoolean(false);
      }
      outCtx.writeObject(cronTrigger.getCalendarNames());
    } else if (trigger instanceof IntervalTrigger) {
      outCtx.writeShort(PersisterEnums.INT_TRIGGER);

      IntervalTrigger intTrigger = (IntervalTrigger) trigger;
      outCtx.writeLong(intTrigger.getStartTime().getTime());
      if (intTrigger.getEndTime() != null) {
        outCtx.writeBoolean(true);
        outCtx.writeLong(intTrigger.getEndTime().getTime());
      } else {
        outCtx.writeBoolean(false);
      }
      outCtx.writeInt(intTrigger.getRepeatLimit());
      outCtx.writeInt(intTrigger.getRepeatCount());
      if (intTrigger.getNextFireTime() != null) {
        outCtx.writeBoolean(true);
        outCtx.writeLong(intTrigger.getNextFireTime().getTime());
      } else {
        outCtx.writeBoolean(false);
      }
      outCtx.writeLong(intTrigger.getPeriod());
      outCtx.writeObject(intTrigger.getCalendarNames());
    } else if (trigger instanceof PointInTimeTrigger) {
      outCtx.writeShort(PersisterEnums.POINT_IN_TIME_TRIGGER);

      PointInTimeTrigger pinTrigger = (PointInTimeTrigger) trigger;

      outCtx.writeLong(pinTrigger.hasNextFireTime().getTime());
    }

    //        else if ( trigger instanceof DelayedTrigger ) {
    //
    //        } else if ( trigger instanceof PointInTimeTrigger ) {
    //
    //        } else if ( trigger instanceof CompositeMaxDurationTimer ) {
    //
    //        }
  }
 public static ProtobufMessages.Trigger writeTrigger(
     Trigger trigger, MarshallerWriteContext outCtx) {
   if (trigger instanceof CronTrigger) {
     CronTrigger cronTrigger = (CronTrigger) trigger;
     ProtobufMessages.Trigger.CronTrigger.Builder _cron =
         ProtobufMessages.Trigger.CronTrigger.newBuilder()
             .setStartTime(cronTrigger.getStartTime().getTime())
             .setRepeatLimit(cronTrigger.getRepeatLimit())
             .setRepeatCount(cronTrigger.getRepeatCount())
             .setCronExpression(cronTrigger.getCronEx().getCronExpression());
     if (cronTrigger.getEndTime() != null) {
       _cron.setEndTime(cronTrigger.getEndTime().getTime());
     }
     if (cronTrigger.getNextFireTime() != null) {
       _cron.setNextFireTime(cronTrigger.getNextFireTime().getTime());
     }
     if (cronTrigger.getCalendarNames() != null) {
       for (String calendarName : cronTrigger.getCalendarNames()) {
         _cron.addCalendarName(calendarName);
       }
     }
     return ProtobufMessages.Trigger.newBuilder()
         .setType(ProtobufMessages.Trigger.TriggerType.CRON)
         .setCron(_cron.build())
         .build();
   } else if (trigger instanceof IntervalTrigger) {
     IntervalTrigger intTrigger = (IntervalTrigger) trigger;
     ProtobufMessages.Trigger.IntervalTrigger.Builder _interval =
         ProtobufMessages.Trigger.IntervalTrigger.newBuilder()
             .setStartTime(intTrigger.getStartTime().getTime())
             .setRepeatLimit(intTrigger.getRepeatLimit())
             .setRepeatCount(intTrigger.getRepeatCount())
             .setPeriod(intTrigger.getPeriod());
     if (intTrigger.getEndTime() != null) {
       _interval.setEndTime(intTrigger.getEndTime().getTime());
     }
     if (intTrigger.getNextFireTime() != null) {
       _interval.setNextFireTime(intTrigger.getNextFireTime().getTime());
     }
     if (intTrigger.getCalendarNames() != null) {
       for (String calendarName : intTrigger.getCalendarNames()) {
         _interval.addCalendarName(calendarName);
       }
     }
     return ProtobufMessages.Trigger.newBuilder()
         .setType(ProtobufMessages.Trigger.TriggerType.INTERVAL)
         .setInterval(_interval.build())
         .build();
   } else if (trigger instanceof PointInTimeTrigger) {
     PointInTimeTrigger pinTrigger = (PointInTimeTrigger) trigger;
     return ProtobufMessages.Trigger.newBuilder()
         .setType(ProtobufMessages.Trigger.TriggerType.POINT_IN_TIME)
         .setPit(
             ProtobufMessages.Trigger.PointInTimeTrigger.newBuilder()
                 .setNextFireTime(pinTrigger.hasNextFireTime().getTime())
                 .build())
         .build();
   }
   throw new RuntimeException("Unable to serialize Trigger for type: " + trigger.getClass());
 }
  public static Trigger readTrigger(MarshallerReaderContext inCtx)
      throws IOException, ClassNotFoundException {
    short triggerInt = inCtx.readShort();

    switch (triggerInt) {
      case PersisterEnums.CRON_TRIGGER:
        {
          long startTime = inCtx.readLong();

          CronTrigger trigger = new CronTrigger();
          trigger.setStartTime(new Date(startTime));
          if (inCtx.readBoolean()) {
            long endTime = inCtx.readLong();
            trigger.setEndTime(new Date(endTime));
          }

          int repeatLimit = inCtx.readInt();
          trigger.setRepeatLimit(repeatLimit);

          int repeatCount = inCtx.readInt();
          trigger.setRepeatCount(repeatCount);

          String expr = inCtx.readUTF();
          trigger.setCronExpression(expr);
          if (inCtx.readBoolean()) {
            long nextFireTime = inCtx.readLong();
            trigger.setNextFireTime(new Date(nextFireTime));
          }

          String[] calendarNames = (String[]) inCtx.readObject();
          trigger.setCalendarNames(calendarNames);
          return trigger;
        }
      case PersisterEnums.INT_TRIGGER:
        {
          IntervalTrigger trigger = new IntervalTrigger();
          long startTime = inCtx.readLong();
          trigger.setStartTime(new Date(startTime));
          if (inCtx.readBoolean()) {
            long endTime = inCtx.readLong();
            trigger.setEndTime(new Date(endTime));
          }
          int repeatLimit = inCtx.readInt();
          trigger.setRepeatLimit(repeatLimit);
          int repeatCount = inCtx.readInt();
          trigger.setRepeatCount(repeatCount);
          if (inCtx.readBoolean()) {
            long nextFireTime = inCtx.readLong();
            trigger.setNextFireTime(new Date(nextFireTime));
          }
          long period = inCtx.readLong();
          trigger.setPeriod(period);
          String[] calendarNames = (String[]) inCtx.readObject();
          trigger.setCalendarNames(calendarNames);
          return trigger;
        }
      case PersisterEnums.POINT_IN_TIME_TRIGGER:
        {
          long startTime = inCtx.readLong();

          PointInTimeTrigger trigger = new PointInTimeTrigger(startTime, null, null);
          return trigger;
        }
    }
    throw new RuntimeException("Unable to persist Trigger for type: " + triggerInt);
  }