package com.github.signed.sandboxe.quartz.domain;
import org.quartz.JobExecutionContext;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerKey;
import org.quartz.TriggerListener;
import org.quartz.impl.matchers.KeyMatcher;
import java.util.List;
public class SchedulerFacade {
private final Scheduler scheduler;
public SchedulerFacade(Scheduler scheduler) {
this.scheduler = scheduler;
}
public boolean isJobBeingExecuted(TriggerKey triggerKey) {
try {
List<JobExecutionContext> currentlyExecutingJobs = scheduler.getCurrentlyExecutingJobs();
for (JobExecutionContext currentlyExecutingJob : currentlyExecutingJobs) {
if (currentlyExecutingJob.getTrigger().getKey().equals(triggerKey)) {
return true;
}
}
return false;
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
}
public boolean noTriggerIsRegistered(TriggerKey triggerKey) {
try {
return null == this.scheduler.getTrigger(triggerKey);
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
}
public void scheduleJob(Trigger trigger) {
try {
this.scheduler.scheduleJob(trigger);
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
}
public void rescheduleJob(Trigger trigger) {
this.rescheduleJob(trigger.getKey(), trigger);
}
public void rescheduleJob(TriggerKey triggerKey, Trigger trigger) {
try {
this.scheduler.rescheduleJob(triggerKey, trigger);
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
}
public void addTriggerListener(TriggerListener jobResult, TriggerKey triggerKey) {
try {
this.scheduler.getListenerManager().addTriggerListener(jobResult, KeyMatcher.keyEquals(triggerKey));
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
}
public void removeTriggerListener(TriggerListener triggerListener) {
try {
this.scheduler.getListenerManager().removeTriggerListener(triggerListener.getName());
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
}
public void unscheduleJob(TriggerKey triggerKey) {
try {
this.scheduler.unscheduleJob(triggerKey);
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}
public void scheduleJobSmart(Trigger trigger) {
if (noTriggerIsRegistered(trigger.getKey())) {
scheduleJob(trigger);
} else {
rescheduleJob(trigger);
}
}
public void rescheduleExistingOrFallback(TriggerKey triggerKey, Trigger fallback) {
if (noTriggerIsRegistered(triggerKey)) {
scheduleJob(fallback);
} else {
rescheduleJobWithKnownTrigger(triggerKey);
}
}
private void rescheduleJobWithKnownTrigger(TriggerKey triggerKey) {
try {
Trigger trigger = this.scheduler.getTrigger(triggerKey);
rescheduleJob(triggerKey, trigger);
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
}
public boolean isRunningPeriodically(TriggerKey triggerKey) {
try {
Trigger trigger = scheduler.getTrigger(triggerKey);
return null != trigger && null == trigger.getFinalFireTime();
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
}
}