code: private long getTimeout(long lastTimeout, boolean reschedule)
      {
          Calendar cal = createCalendar(lastTimeout);
  
          // If this expression is being rescheduled, then add a second to make
          // progress towards the next timeout.
          if (reschedule)
          {
              cal.add(Calendar.SECOND, 1);
          }
          // d666295 - Otherwise, if this method is called from getFirstTimeout,
          // we're using the current time rather than the start time, and the
          // current time is mid-second, then we also want to advance to the next
          // second.  Note that the parser has already guaranteed that the start
          // time has been rounded.
          else if (lastTimeout != start && lastTimeout % 1000 != 0) // d666295
          {
              cal.set(Calendar.MILLISECOND, 0);
              cal.add(Calendar.SECOND, 1);
          }
  
          if (!advance(cal))
          {
              return -1;
          }
  
          return cal.getTimeInMillis();
      }
docs: Determines the next timeout for the schedule expression.
  
  @param lastTimeout the last timeout in milliseconds, or the current time
  if reschedule is false
  @param reschedule <tt>true</tt> if lastTimeout is an exclusive lower
  bound for the next timeout
  @return the next timeout in milliseconds, or -1 if there are no more
  future timeouts for the expression
  @throws IllegalArgumentException if the expression contains an invalid
  attribute value