/*
* All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
*/
package org.quartz;
import java.util.Calendar;
import java.util.TimeZone;
import org.quartz.DateBuilder.IntervalUnit;
/**
* A concrete <code>{@link Trigger}</code> that is used to fire a <code>{@link org.quartz.JobDetail}</code>
* based upon repeating calendar time intervals.
*
* <p>The trigger will fire every N (see {@link #getRepeatInterval()} ) units of calendar time
* (see {@link #getRepeatIntervalUnit()}) as specified in the trigger's definition.
* This trigger can achieve schedules that are not possible with {@link SimpleTrigger} (e.g
* because months are not a fixed number of seconds) or {@link CronTrigger} (e.g. because
* "every 5 months" is not an even divisor of 12).</p>
*
* <p>If you use an interval unit of <code>MONTH</code> then care should be taken when setting
* a <code>startTime</code> value that is on a day near the end of the month. For example,
* if you choose a start time that occurs on January 31st, and have a trigger with unit
* <code>MONTH</code> and interval <code>1</code>, then the next fire time will be February 28th,
* and the next time after that will be March 28th - and essentially each subsequent firing will
* occur on the 28th of the month, even if a 31st day exists. If you want a trigger that always
* fires on the last day of the month - regardless of the number of days in the month,
* you should use <code>CronTrigger</code>.</p>
*
* @see TriggerBuilder
* @see CalendarIntervalScheduleBuilder
* @see SimpleScheduleBuilder
* @see CronScheduleBuilder
*
* @author James House
*/
public interface CalendarIntervalTrigger extends Trigger {
/**
* <p>
* Instructs the <code>{@link Scheduler}</code> that upon a mis-fire
* situation, the <code>{@link CalendarIntervalTrigger}</code> wants to be
* fired now by <code>Scheduler</code>.
* </p>
*/
public static final int MISFIRE_INSTRUCTION_FIRE_ONCE_NOW = 1;
/**
* <p>
* Instructs the <code>{@link Scheduler}</code> that upon a mis-fire
* situation, the <code>{@link CalendarIntervalTrigger}</code> wants to have it's
* next-fire-time updated to the next time in the schedule after the
* current time (taking into account any associated <code>{@link Calendar}</code>,
* but it does not want to be fired now.
* </p>
*/
public static final int MISFIRE_INSTRUCTION_DO_NOTHING = 2;
/**
* <p>Get the interval unit - the time unit on with the interval applies.</p>
*/
public IntervalUnit getRepeatIntervalUnit();
/**
* <p>
* Get the the time interval that will be added to the <code>DateIntervalTrigger</code>'s
* fire time (in the set repeat interval unit) in order to calculate the time of the
* next trigger repeat.
* </p>
*/
public int getRepeatInterval();
/**
* <p>
* Get the number of times the <code>DateIntervalTrigger</code> has already
* fired.
* </p>
*/
public int getTimesTriggered();
/**
* <p>
* Gets the time zone within which time calculations related to this
* trigger will be performed.
* </p>
*
* <p>
* If null, the system default TimeZone will be used.
* </p>
*/
public TimeZone getTimeZone();
/**
* If intervals are a day or greater, this property (set to true) will
* cause the firing of the trigger to always occur at the same time of day,
* (the time of day of the startTime) regardless of daylight saving time
* transitions. Default value is false.
*
* <p>
* For example, without the property set, your trigger may have a start
* time of 9:00 am on March 1st, and a repeat interval of 2 days. But
* after the daylight saving transition occurs, the trigger may start
* firing at 8:00 am every other day.
* </p>
*
* <p>
* If however, the time of day does not exist on a given day to fire
* (e.g. 2:00 am in the United States on the days of daylight saving
* transition), the trigger will go ahead and fire one hour off on
* that day, and then resume the normal hour on other days. If
* you wish for the trigger to never fire at the "wrong" hour, then
* you should set the property skipDayIfHourDoesNotExist.
* </p>
*
* @see #isSkipDayIfHourDoesNotExist()
* @see #getStartTime()
* @see #getTimeZone()
*/
public boolean isPreserveHourOfDayAcrossDaylightSavings();
/**
* If intervals are a day or greater, and
* preserveHourOfDayAcrossDaylightSavings property is set to true, and the
* hour of the day does not exist on a given day for which the trigger
* would fire, the day will be skipped and the trigger advanced a second
* interval if this property is set to true. Defaults to false.
*
* <p>
* <b>CAUTION!</b> If you enable this property, and your hour of day happens
* to be that of daylight savings transition (e.g. 2:00 am in the United
* States) and the trigger's interval would have had the trigger fire on
* that day, then you may actually completely miss a firing on the day of
* transition if that hour of day does not exist on that day! In such a
* case the next fire time of the trigger will be computed as double (if
* the interval is 2 days, then a span of 4 days between firings will
* occur).
* </p>
*
* @see #isPreserveHourOfDayAcrossDaylightSavings()
*/
public boolean isSkipDayIfHourDoesNotExist();
TriggerBuilder<CalendarIntervalTrigger> getTriggerBuilder();
}