1 package org.apache.stratum.scheduler;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 import java.io.FileInputStream;
21 import java.util.List;
22 import java.util.Properties;
23
24 import org.apache.commons.betwixt.XMLIntrospector;
25 import org.apache.commons.betwixt.io.BeanReader;
26 import org.apache.commons.betwixt.strategy.DecapitalizeNameMapper;
27 import org.apache.commons.betwixt.strategy.DefaultPluralStemmer;
28 import org.apache.commons.configuration.Configuration;
29 import org.apache.commons.configuration.PropertiesConfiguration;
30 import org.apache.commons.lang.exception.NestableException;
31 import org.apache.log4j.Category;
32 import org.apache.stratum.lifecycle.Configurable;
33 import org.apache.stratum.lifecycle.Startable;
34
35 import org.quartz.CronTrigger;
36 import org.quartz.JobDetail;
37 import org.quartz.SchedulerException;
38 import org.quartz.impl.StdScheduler;
39 import org.quartz.impl.StdSchedulerFactory;
40
41 /***
42 * This class is the Scheduler component that implements a Quartz scheduler.
43 *
44 * @author <a href="mailto:john@zenplex.com">John Thorhauer</a>
45 * @version $Id: Scheduler.java 264731 2005-08-30 08:04:32Z henning $
46 */
47 public class Scheduler
48 implements Configurable, Startable
49 {
50 /*** Log4j category used for logging. */
51 private static Category log = Category.getInstance(Scheduler.class);
52
53 /*** TODO: DOCUMENT ME! */
54 private static String confLocation = "/projects/jakarta-turbine-stratum/src/test-conf/Scheduler.properties";
55
56 /*** TODO: DOCUMENT ME! */
57 private StdSchedulerFactory schedulerFactory;
58
59 /*** TODO: DOCUMENT ME! */
60 protected StdScheduler scheduler;
61
62 /***
63 * Just a command line test tool to start the scheduler from the command line. If looks for the properties file in the
64 * following location: /projects/jakarta-turbine-stratum/src/test-conf/Scheduler.properties
65 *
66 * @param args command line arguments
67 *
68 * @throws Exception
69 */
70 public static void main(String [] args)
71 throws Exception
72 {
73 Scheduler sched = new Scheduler();
74 PropertiesConfiguration conf = new PropertiesConfiguration(confLocation);
75 sched.configure(conf);
76 sched.start();
77 }
78
79 /***
80 * start the scheduler.
81 *
82 * @throws Exception
83 */
84 public void start()
85 throws Exception
86 {
87 scheduler.start();
88 }
89
90 /***
91 * stop the scheduler.
92 *
93 * @throws Exception
94 */
95 public void stop()
96 throws Exception
97 {
98 scheduler.shutdown();
99 }
100
101 /***
102 * Configure the Scheduler
103 *
104 * @param configuration the configuration
105 *
106 * @throws NestableException
107 */
108 public void configure(Configuration configuration)
109 throws NestableException
110 {
111 String xmlLocation = configuration.getString("scheduler.config.location");
112
113 try
114 {
115
116
117 SchedulerConfig schedConfig = getSchedulerConfig(xmlLocation);
118 Properties factoryProps;
119
120 try
121 {
122 factoryProps = getFactoryProps(schedConfig);
123 }
124 catch (NullPointerException ex)
125 {
126 log.error("Error loading properties to initialize"
127 + " Scheduler Factory. Please make sure the following"
128 + " elements are properly filled out in the"
129 + " Scheduler .xml config file:\n"
130 + " <instanceName></instanceName>\n"
131 + " <threadPoolConfig>\n"
132 + " <className></className>\n"
133 + " <threadCount></threadCount>\n"
134 + " <threadPriority></threadPriority>\n"
135 + " </threadPoolConfig>\n"
136 + " <jobStoreConfig>\n"
137 + " <className></className>\n"
138 + " </jobStoreConfig>");
139
140 return;
141 }
142
143 schedulerFactory = new StdSchedulerFactory();
144 schedulerFactory.initialize(factoryProps);
145
146 scheduler = (StdScheduler) schedulerFactory.getScheduler();
147
148 List jobConfigs = schedConfig.getJobConfigs();
149
150 if (!jobConfigs.isEmpty())
151 {
152 for (int i = 0; i < jobConfigs.size(); i++)
153 {
154 JobConfig jobConf = (JobConfig) jobConfigs.get(i);
155 String jobName = (String) jobConf.getName();
156
157 String jobGroup = jobConf.getGroup();
158 String jobClassName = jobConf.getClassName();
159
160 JobDetail job = new JobDetail(jobName, jobGroup, Class.forName(jobClassName));
161
162
163 TriggerConfig triggerConf = getTriggerConfig(schedConfig, job.getName());
164
165 if (triggerConf != null)
166 {
167 job.getName();
168
169 String triggerGroup = triggerConf.getGroup();
170 String triggerName = triggerConf.getName();
171 String cronExpression =
172 triggerConf.getSeconds() + " " + triggerConf.getMinutes() + " " + triggerConf.getHours() + " "
173 + triggerConf.getDayOfMonth() + " " + triggerConf.getMonth() + " " + triggerConf.getDayOfWeek();
174
175 CronTrigger cronTrigger = new CronTrigger(triggerName, triggerGroup, jobName, jobGroup, cronExpression);
176
177 scheduler.scheduleJob(job, cronTrigger);
178 triggerConf = null;
179 cronTrigger = null;
180 }
181 }
182 }
183 }
184 catch (SchedulerException ex)
185 {
186 log.error("Error Initializing Scheduler: " + ex.toString(), ex);
187 }
188 catch (ClassNotFoundException ex)
189 {
190 log.error("Error Loading class: " + ex.toString(), ex);
191 }
192 catch (Exception ex)
193 {
194 log.error("Error: " + ex.toString(), ex);
195 }
196 }
197
198 /***
199 * DOCUMENT ME!
200 *
201 * @param schdConf Scheduler Config
202 *
203 * @return TODO: DOCUMENT ME!
204 */
205 private Properties getFactoryProps(SchedulerConfig schdConf)
206 {
207 Properties props = new Properties();
208
209 props.put("org.quartz.scheduler.instanceName", schdConf.getInstanceName());
210
211 ThreadPoolConfig threadPool = schdConf.getThreadPoolConfig();
212 props.put("org.quartz.threadPool.class", threadPool.getClassName());
213 props.put("org.quartz.threadPool.threadCount", threadPool.getThreadCount());
214 props.put("org.quartz.threadPool.threadPriority", threadPool.getThreadPriority());
215
216 JobStoreConfig jobStore = schdConf.getJobStoreConfig();
217 props.put("org.quartz.jobStore.class", jobStore.getClassName());
218
219 return props;
220 }
221
222 /***
223 * Loads the SchedulerConfig object from the xml file
224 *
225 * @param xmlLocation of the xml file
226 *
227 * @return TODO: DOCUMENT ME!
228 *
229 * @throws Exception
230 */
231 private SchedulerConfig getSchedulerConfig(String xmlLocation)
232 throws Exception
233 {
234 FileInputStream in = new FileInputStream(xmlLocation);
235
236
237 BeanReader reader = createBeanReader();
238
239 SchedulerConfig schedConf = (SchedulerConfig) reader.parse(in);
240
241 return schedConf;
242 }
243
244 /***
245 * Creates a beanreader
246 *
247 * @return beanreader
248 *
249 * @throws Exception
250 */
251 private BeanReader createBeanReader()
252 throws Exception
253 {
254 BeanReader reader = new BeanReader();
255 reader.setXMLIntrospector(createXMLIntrospector());
256 reader.registerBeanClass(SchedulerConfig.class);
257
258 return reader;
259 }
260
261 /***
262 * Loads Xml Introspector with needed values
263 *
264 * @return introspector
265 */
266 private XMLIntrospector createXMLIntrospector()
267 {
268 XMLIntrospector introspector = new XMLIntrospector();
269
270
271 introspector.getConfiguration().setAttributesForPrimitives(false);
272
273
274
275
276 introspector.getConfiguration().setElementNameMapper(new DecapitalizeNameMapper());
277 introspector.getConfiguration().setAttributeNameMapper(new DecapitalizeNameMapper());
278
279 introspector.getConfiguration().setPluralStemmer(new DefaultPluralStemmer());
280
281 return introspector;
282 }
283
284 private TriggerConfig getTriggerConfig(SchedulerConfig schedConf, String jobName)
285 {
286 TriggerConfig trig = null;
287 List triggers = schedConf.getTriggerConfigs();
288
289 for (int i = 0; i < triggers.size(); i++)
290 {
291 TriggerConfig tmpTrig = (TriggerConfig) triggers.get(i);
292
293 if (tmpTrig.getJobName().equals(jobName))
294 {
295 trig = tmpTrig;
296
297 return trig;
298 }
299 }
300
301 return trig;
302 }
303 }