package org.safehaus.penrose.scheduler;
import org.safehaus.penrose.partition.Partition;
import org.safehaus.penrose.partition.PartitionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.LinkedHashMap;
import java.util.Collection;
/**
* @author Endi Sukma Dewata
*/
public class Scheduler {
public Logger log = LoggerFactory.getLogger(getClass());
protected SchedulerConfig schedulerConfig;
protected SchedulerContext schedulerContext;
protected Partition partition;
public Map<String,Job> jobs = new LinkedHashMap<String,Job>();
public Map<String,Trigger> triggers = new LinkedHashMap<String,Trigger>();
public void init(SchedulerConfig schedulerConfig, SchedulerContext schedulerContext) throws Exception {
log.debug("Initializing scheduler.");
this.schedulerConfig = schedulerConfig;
this.schedulerContext = schedulerContext;
this.partition = schedulerContext.getPartition();
for (JobConfig jobConfig : schedulerConfig.getJobConfigs()) {
if (!jobConfig.isEnabled()) continue;
Job job = createJob(jobConfig);
addJob(job);
}
for (TriggerConfig triggerConfig : schedulerConfig.getTriggerConfigs()) {
if (!triggerConfig.isEnabled()) continue;
Trigger trigger = createTrigger(triggerConfig);
addTrigger(trigger);
}
init();
}
public void init() throws Exception {
}
public void destroy() throws Exception {
}
public Job createJob(JobConfig jobConfig) throws Exception {
String className = jobConfig.getJobClass();
PartitionContext partitionContext = partition.getPartitionContext();
ClassLoader classLoader = partitionContext.getClassLoader();
Class clazz = classLoader.loadClass(className);
Job job = (Job)clazz.newInstance();
JobContext jobContext = new JobContext();
jobContext.setPartition(partition);
job.init(jobConfig, jobContext);
return job;
}
public void addJob(Job job) {
jobs.put(job.getName(), job);
}
public Collection<String> getJobNames() {
return jobs.keySet();
}
public Job getJob(String name) {
return jobs.get(name);
}
public Collection<Job> getJobs() {
return jobs.values();
}
public void removeJob(String name) {
jobs.remove(name);
}
public Trigger createTrigger(TriggerConfig triggerConfig) throws Exception {
String className = triggerConfig.getTriggerClass();
PartitionContext partitionContext = partition.getPartitionContext();
ClassLoader classLoader = partitionContext.getClassLoader();
Class clazz = classLoader.loadClass(className);
Trigger trigger = (Trigger)clazz.newInstance();
TriggerContext triggerContext = new TriggerContext();
triggerContext.setPartition(partition);
trigger.init(triggerConfig, triggerContext);
return trigger;
}
public void addTrigger(Trigger trigger) {
triggers.put(trigger.getName(), trigger);
}
public Collection<String> getTriggerNames() {
return triggers.keySet();
}
public Trigger getTrigger(String name) {
return triggers.get(name);
}
public Collection<Trigger> getTriggers() {
return triggers.values();
}
public void removeTrigger(String name) {
triggers.remove(name);
}
public Partition getPartition() {
return partition;
}
public void setPartition(Partition partition) {
this.partition = partition;
}
public SchedulerConfig getSchedulerConfig() {
return schedulerConfig;
}
public void setSchedulerConfig(SchedulerConfig schedulerConfig) {
this.schedulerConfig = schedulerConfig;
}
public SchedulerContext getSchedulerContext() {
return schedulerContext;
}
public void setSchedulerContext(SchedulerContext schedulerContext) {
this.schedulerContext = schedulerContext;
}
}