/*
* Copyright 2008-2017 by Emeric Vernat
*
* This file is part of Java Melody.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.bull.javamelody;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import net.bull.javamelody.LOG;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobKey;
import org.quartz.JobListener;
import org.quartz.ListenerManager;
import org.quartz.Matcher;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.EverythingMatcher;
import org.quartz.impl.matchers.GroupMatcher;
/**
* Classe ayant la même API, que le QuartzAdapter par défaut des versions avant 2,<br/>
* mais avec une autre implémentation adaptée aux versions 2.0.0, 2.1.2 et suivantes.
*
* @author rogerc@customercentrix.com
* @author Emeric Vernat
*/
class Quartz2Adapter extends QuartzAdapter {
protected Quartz2Adapter() {
super();
}
@Override
String getJobName(JobDetail jobDetail) {
return jobDetail.getKey().getName();
}
@Override
String getJobGroup(JobDetail jobDetail) {
return jobDetail.getKey().getGroup();
}
@Override
String getJobFullName(JobDetail jobDetail) {
return getJobGroup(jobDetail) + '.' + getJobName(jobDetail);
}
// les getters suivants sont identiques à ceux de la classe parente,
// mais ils sont nécessaires ici car les types des objets ont changé de classes à interfaces à partir de Quartz v2
@Override
String getJobDescription(JobDetail jobDetail) {
return jobDetail.getDescription();
}
@Override
Class<?> getJobClass(JobDetail jobDetail) {
return jobDetail.getJobClass();
}
@Override
Date getTriggerPreviousFireTime(Trigger trigger) {
return trigger.getPreviousFireTime();
}
@Override
Date getTriggerNextFireTime(Trigger trigger) {
return trigger.getNextFireTime();
}
@Override
String getCronTriggerExpression(CronTrigger trigger) {
// getCronExpression gives a PMD false+
return trigger.getCronExpression(); // NOPMD
}
@Override
long getSimpleTriggerRepeatInterval(SimpleTrigger trigger) {
return trigger.getRepeatInterval(); // NOPMD
}
@Override
JobDetail getContextJobDetail(JobExecutionContext context) {
return context.getJobDetail();
}
@Override
Date getContextFireTime(JobExecutionContext context) {
return context.getFireTime();
}
@Override
void addGlobalJobListener(JobListener jobGlobalListener) throws SchedulerException {
final Scheduler defaultScheduler;
final List<Matcher<JobKey>> allJobs = new ArrayList<Matcher<JobKey>>();
allJobs.add(EverythingMatcher.allJobs());
if (Boolean.parseBoolean(Parameters
.getParameter(Parameter.QUARTZ_DEFAULT_LISTENER_DISABLED))) {
defaultScheduler = null;
LOG.debug("Initialization of Quartz default listener has been disabled");
} else {
defaultScheduler = StdSchedulerFactory.getDefaultScheduler();
defaultScheduler.getListenerManager().addJobListener(jobGlobalListener, allJobs);
}
for (final Scheduler scheduler : JobInformations.getAllSchedulers()) {
if (scheduler != defaultScheduler) {
scheduler.getListenerManager().addJobListener(jobGlobalListener, allJobs);
}
}
}
@Override
void removeGlobalJobListener() throws SchedulerException {
for (final Scheduler scheduler : JobInformations.getAllSchedulers()) {
final ListenerManager listenerManager = scheduler.getListenerManager();
final List<JobListener> globalJobListeners = listenerManager.getJobListeners();
for (final JobListener jobListener : new ArrayList<JobListener>(globalJobListeners)) {
if (jobListener instanceof JobGlobalListener) {
listenerManager.removeJobListener(jobListener.getName());
}
}
}
}
@Override
List<JobDetail> getAllJobsOfScheduler(Scheduler scheduler) throws SchedulerException {
final List<JobDetail> result = new ArrayList<JobDetail>();
for (final String jobGroupName : scheduler.getJobGroupNames()) {
final GroupMatcher<JobKey> groupMatcher = GroupMatcher.groupEquals(jobGroupName);
for (final JobKey jobKey : scheduler.getJobKeys(groupMatcher)) {
final JobDetail jobDetail;
try {
jobDetail = scheduler.getJobDetail(jobKey);
// le job peut être terminé et supprimé depuis la ligne ci-dessus
if (jobDetail != null) {
result.add(jobDetail);
}
} catch (final Exception e) {
// si les jobs sont persistés en base de données, il peut y avoir une exception
// dans getJobDetail, par exemple si la classe du job n'existe plus dans l'application
LOG.debug(e.toString(), e);
}
}
}
return result;
}
@Override
@SuppressWarnings("unchecked")
List<Trigger> getTriggersOfJob(JobDetail jobDetail, Scheduler scheduler)
throws SchedulerException {
return (List<Trigger>) scheduler.getTriggersOfJob(jobDetail.getKey());
}
@Override
boolean isTriggerPaused(Trigger trigger, Scheduler scheduler) throws SchedulerException {
return scheduler.getTriggerState(trigger.getKey()) == Trigger.TriggerState.PAUSED;
}
@Override
void pauseJob(JobDetail jobDetail, Scheduler scheduler) throws SchedulerException {
scheduler.pauseJob(jobDetail.getKey());
}
@Override
void resumeJob(JobDetail jobDetail, Scheduler scheduler) throws SchedulerException {
scheduler.resumeJob(jobDetail.getKey());
}
}