code: synchronized long calculateNextExpiration()
      {
          boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled())
              Tr.entry(tc, "calculateNextExpiration: " + this);
  
          ivLastExpiration = ivExpiration; // 598265
  
          if (ivParsedScheduleExpression != null) {
              // F7437591.codRev - getNextTimeout returns -1 for "no more timeouts",
              // but this class uses ivExpiration=0.
              ivExpiration = Math.max(0, ivParsedScheduleExpression.getNextTimeout(ivExpiration));
          }
          else {
              if (ivInterval > 0) {
                  ivExpiration += ivInterval; // 597753
              }
              else {
                  ivExpiration = 0;
              }
          }
  
          if (isTraceOn && tc.isEntryEnabled())
              Tr.exit(tc, "calculateNextExpiration: " + ivExpiration); // 597753
  
          return ivExpiration;
      }
docs: Calculate the next time that the timer should fire.
  
  @return the number of milliseconds until the next timeout, or 0 if the
  timer should not fire again