package io.robe.quartz;
import org.quartz.*;
import org.quartz.impl.matchers.GroupMatcher;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* Helps to manage all of the jobs from one place.
*/
public class JobManager {
private static final Object lock = new Object();
private static JobManager instance;
//TODO: Convert to factory later
private final Scheduler scheduler;
private JobManager(Scheduler scheduler) {
this.scheduler = scheduler;
}
protected static synchronized void initialize(Scheduler scheduler) {
if (instance != null)
throw new RuntimeException("Manager is already Initialized");
else
instance = new JobManager(scheduler);
}
public static JobManager getInstance() {
return instance;
}
public void scheduleJob(JobDetail jobDetail, Trigger trigger) throws SchedulerException {
synchronized (lock) {
scheduler.scheduleJob(jobDetail, trigger);
}
}
public void scheduleJob(JobDetail jobDetail, Set<Trigger> triggers, boolean replace) throws SchedulerException {
synchronized (lock) {
scheduler.scheduleJob(jobDetail, triggers, replace);
}
}
public boolean unScheduleJob(String name, String group) throws SchedulerException {
synchronized (lock) {
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(JobKey.jobKey(name, group));
for (Trigger t : triggers) {
if (!scheduler.unscheduleJob(t.getKey())) {
return false;
}
}
return true;
}
}
public boolean scheduleTrigger(Trigger trigger) throws SchedulerException {
synchronized (lock) {
return scheduler.scheduleJob(trigger) != null;
}
}
public boolean unScheduleTrigger(Trigger trigger) throws SchedulerException {
synchronized (lock) {
return scheduler.unscheduleJob(trigger.getKey());
}
}
public boolean checkExists(JobKey key) throws SchedulerException {
synchronized (lock) {
return scheduler.checkExists(key);
}
}
private List<? extends Trigger> getTriggersOfJob(JobKey jobKey) throws SchedulerException {
return scheduler.getTriggersOfJob(jobKey);
}
public List<? extends Trigger> getTriggersOfJob(String name, String group) throws SchedulerException {
return getTriggersOfJob(JobKey.jobKey(name, group));
}
public boolean isScheduledJob(String name, String group) throws SchedulerException {
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(JobKey.jobKey(name, group));
for (Trigger t : triggers) {
if (t.getNextFireTime() != null) {
return true;
}
}
return false;
}
public boolean isScheduledTrigger(String name, String group) throws SchedulerException {
Trigger trigger = scheduler.getTrigger(TriggerKey.triggerKey(name, group));
return trigger != null ? trigger.getNextFireTime() != null : false;
}
public boolean isPausedJob(String name, String group) throws SchedulerException {
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(JobKey.jobKey(name, group));
for (Trigger t : triggers) {
if (!scheduler.getTriggerState(t.getKey()).equals(Trigger.TriggerState.PAUSED)) {
return false;
}
}
return true;
}
public boolean isPausedTrigger(String name, String group) throws SchedulerException {
Trigger trigger = scheduler.getTrigger(TriggerKey.triggerKey(name, group));
return scheduler.getTriggerState(trigger.getKey()).equals(Trigger.TriggerState.PAUSED);
}
public List<JobKey> getGeneralReport() throws SchedulerException {
//TODO: sout is only for dev. Will change after deciding report
List<JobKey> jobKeys = new LinkedList<>();
for (String groupName : scheduler.getJobGroupNames()) {
for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) {
for (Trigger trigger : getTriggersOfJob(jobKey)) {
StringBuilder builder = new StringBuilder();
builder.append(jobKey.getGroup()).append(" ,");
builder.append(jobKey.getName()).append(" ,");
builder.append(trigger.getKey()).append(" ,");
builder.append(trigger.getDescription()).append(" ,");
builder.append(trigger.getStartTime()).append(" ,");
builder.append(trigger.getEndTime()).append(" ,");
builder.append(trigger.getPreviousFireTime()).append(" ,");
builder.append(trigger.getNextFireTime()).append(" ,");
builder.append(getTriggerStatus(trigger.getKey()).name());
System.out.println(builder.toString());
}
}
}
return jobKeys;
}
public Trigger.TriggerState getTriggerStatus(TriggerKey key) throws SchedulerException {
return scheduler.getTriggerState(key);
}
public void resumeTrigger(TriggerKey key) throws SchedulerException {
scheduler.resumeTrigger(key);
}
public void pauseJob(String name, String group) throws SchedulerException {
scheduler.pauseJob(JobKey.jobKey(name, group));
}
public void pauseJob(JobKey key) throws SchedulerException {
scheduler.pauseJob(key);
}
public void pauseTrigger(TriggerKey key) throws SchedulerException {
scheduler.pauseTrigger(key);
}
public void shutdown(boolean b) throws SchedulerException {
if (scheduler != null)
scheduler.shutdown(b);
}
public void resumeJob(JobKey jobKey) throws SchedulerException {
scheduler.resumeJob(jobKey);
}
public void resumeJob(String name, String group) throws SchedulerException {
this.resumeJob(JobKey.jobKey(name, group));
}
}