001: /*
002: * Copyright 2002-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.scheduling.quartz;
018:
019: import java.text.ParseException;
020: import java.util.Date;
021: import java.util.Map;
022: import java.util.TimeZone;
023:
024: import org.quartz.CronTrigger;
025: import org.quartz.JobDetail;
026: import org.quartz.Scheduler;
027:
028: import org.springframework.beans.factory.BeanNameAware;
029: import org.springframework.beans.factory.InitializingBean;
030: import org.springframework.core.Constants;
031:
032: /**
033: * Convenience subclass of Quartz's {@link org.quartz.CronTrigger}
034: * class, making bean-style usage easier.
035: *
036: * <p>CronTrigger itself is already a JavaBean but lacks sensible defaults.
037: * This class uses the Spring bean name as job name, the Quartz default group
038: * ("DEFAULT") as job group, the current time as start time, and indefinite
039: * repetition, if not specified.
040: *
041: * <p>This class will also register the trigger with the job name and group of
042: * a given {@link org.quartz.JobDetail}. This allows {@link SchedulerFactoryBean}
043: * to automatically register a trigger for the corresponding JobDetail,
044: * instead of registering the JobDetail separately.
045: *
046: * <p><b>NOTE:</b> This convenience subclass does not work with trigger
047: * persistence in Quartz 1.6, due to a change in Quartz's trigger handling.
048: * Use Quartz 1.5 if you rely on trigger persistence based on this class,
049: * or the standard Quartz {@link org.quartz.CronTrigger} class instead.
050: *
051: * @author Juergen Hoeller
052: * @since 18.02.2004
053: * @see #setName
054: * @see #setGroup
055: * @see #setStartTime
056: * @see #setJobName
057: * @see #setJobGroup
058: * @see #setJobDetail
059: * @see SchedulerFactoryBean#setTriggers
060: * @see SchedulerFactoryBean#setJobDetails
061: * @see SimpleTriggerBean
062: */
063: public class CronTriggerBean extends CronTrigger implements
064: JobDetailAwareTrigger, BeanNameAware, InitializingBean {
065:
066: /** Constants for the CronTrigger class */
067: private static final Constants constants = new Constants(
068: CronTrigger.class);
069:
070: private JobDetail jobDetail;
071:
072: private String beanName;
073:
074: /**
075: * Register objects in the JobDataMap via a given Map.
076: * <p>These objects will be available to this Trigger only,
077: * in contrast to objects in the JobDetail's data map.
078: * @param jobDataAsMap Map with String keys and any objects as values
079: * (for example Spring-managed beans)
080: * @see JobDetailBean#setJobDataAsMap
081: */
082: public void setJobDataAsMap(Map jobDataAsMap) {
083: getJobDataMap().putAll(jobDataAsMap);
084: }
085:
086: /**
087: * Set the misfire instruction via the name of the corresponding
088: * constant in the {@link org.quartz.CronTrigger} class.
089: * Default is <code>MISFIRE_INSTRUCTION_SMART_POLICY</code>.
090: * @see org.quartz.CronTrigger#MISFIRE_INSTRUCTION_FIRE_ONCE_NOW
091: * @see org.quartz.CronTrigger#MISFIRE_INSTRUCTION_DO_NOTHING
092: * @see org.quartz.Trigger#MISFIRE_INSTRUCTION_SMART_POLICY
093: */
094: public void setMisfireInstructionName(String constantName) {
095: setMisfireInstruction(constants.asNumber(constantName)
096: .intValue());
097: }
098:
099: /**
100: * Set a list of TriggerListener names for this job, referring to
101: * non-global TriggerListeners registered with the Scheduler.
102: * <p>A TriggerListener name always refers to the name returned
103: * by the TriggerListener implementation.
104: * @see SchedulerFactoryBean#setTriggerListeners
105: * @see org.quartz.TriggerListener#getName
106: */
107: public void setTriggerListenerNames(String[] names) {
108: for (int i = 0; i < names.length; i++) {
109: addTriggerListener(names[i]);
110: }
111: }
112:
113: /**
114: * Set the JobDetail that this trigger should be associated with.
115: * <p>This is typically used with a bean reference if the JobDetail
116: * is a Spring-managed bean. Alternatively, the trigger can also
117: * be associated with a job by name and group.
118: * @see #setJobName
119: * @see #setJobGroup
120: */
121: public void setJobDetail(JobDetail jobDetail) {
122: this .jobDetail = jobDetail;
123: }
124:
125: public JobDetail getJobDetail() {
126: return this .jobDetail;
127: }
128:
129: public void setBeanName(String beanName) {
130: this .beanName = beanName;
131: }
132:
133: public void afterPropertiesSet() throws ParseException {
134: if (getName() == null) {
135: setName(this .beanName);
136: }
137: if (getGroup() == null) {
138: setGroup(Scheduler.DEFAULT_GROUP);
139: }
140: if (getStartTime() == null) {
141: setStartTime(new Date());
142: }
143: if (getTimeZone() == null) {
144: setTimeZone(TimeZone.getDefault());
145: }
146: if (this.jobDetail != null) {
147: setJobName(this.jobDetail.getName());
148: setJobGroup(this.jobDetail.getGroup());
149: }
150: }
151:
152: }
|