blob: 2adb824e08afdb70f0c5e6dd6e5b9880b3618c17 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.syncope.core.logic;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.tuple.Triple;
import org.apache.syncope.common.lib.to.EntityTO;
import org.apache.syncope.common.lib.to.JobTO;
import org.apache.syncope.common.lib.types.JobAction;
import org.apache.syncope.common.lib.types.JobType;
import org.apache.syncope.core.provisioning.api.job.JobManager;
import org.apache.syncope.core.provisioning.java.job.AbstractInterruptableJob;
import org.apache.syncope.core.provisioning.java.job.SystemLoadReporterJob;
import org.apache.syncope.core.provisioning.java.job.TaskJob;
import org.apache.syncope.core.provisioning.java.job.notification.NotificationJob;
import org.apache.syncope.core.provisioning.java.job.report.ReportJob;
import org.apache.syncope.core.spring.ApplicationContextProvider;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
abstract class AbstractJobLogic<T extends EntityTO> extends AbstractTransactionalLogic<T> {
protected final JobManager jobManager;
protected final SchedulerFactoryBean scheduler;
protected AbstractJobLogic(final JobManager jobManager, final SchedulerFactoryBean scheduler) {
this.jobManager = jobManager;
this.scheduler = scheduler;
}
protected abstract Triple<JobType, String, String> getReference(JobKey jobKey);
protected JobTO getJobTO(final JobKey jobKey, final boolean includeCustom) throws SchedulerException {
JobTO jobTO = null;
if (scheduler.getScheduler().checkExists(jobKey)) {
Triple<JobType, String, String> reference = getReference(jobKey);
if (reference != null) {
jobTO = new JobTO();
jobTO.setType(reference.getLeft());
jobTO.setRefKey(reference.getMiddle());
jobTO.setRefDesc(reference.getRight());
} else if (includeCustom) {
JobDetail jobDetail = scheduler.getScheduler().getJobDetail(jobKey);
if (!TaskJob.class.isAssignableFrom(jobDetail.getJobClass())
&& !ReportJob.class.isAssignableFrom(jobDetail.getJobClass())
&& !SystemLoadReporterJob.class.isAssignableFrom(jobDetail.getJobClass())
&& !NotificationJob.class.isAssignableFrom(jobDetail.getJobClass())) {
jobTO = new JobTO();
jobTO.setType(JobType.CUSTOM);
jobTO.setRefKey(jobKey.getName());
jobTO.setRefDesc(jobDetail.getJobClass().getName());
}
}
if (jobTO != null) {
List<? extends Trigger> jobTriggers = scheduler.getScheduler().getTriggersOfJob(jobKey);
if (jobTriggers.isEmpty()) {
jobTO.setScheduled(false);
} else {
jobTO.setScheduled(true);
jobTO.setStart(jobTriggers.get(0).getStartTime());
}
jobTO.setRunning(jobManager.isRunning(jobKey));
jobTO.setStatus("UNKNOWN");
if (jobTO.isRunning()) {
try {
Object job = ApplicationContextProvider.getBeanFactory().getBean(jobKey.getName());
if (job instanceof AbstractInterruptableJob
&& ((AbstractInterruptableJob) job).getDelegate() != null) {
jobTO.setStatus(((AbstractInterruptableJob) job).getDelegate().currentStatus());
}
} catch (NoSuchBeanDefinitionException e) {
LOG.warn("Could not find job {} implementation", jobKey, e);
}
}
}
}
return jobTO;
}
protected List<JobTO> doListJobs(final boolean includeCustom) {
List<JobTO> jobTOs = new ArrayList<>();
try {
for (JobKey jobKey : scheduler.getScheduler().
getJobKeys(GroupMatcher.jobGroupEquals(Scheduler.DEFAULT_GROUP))) {
JobTO jobTO = getJobTO(jobKey, includeCustom);
if (jobTO != null) {
jobTOs.add(jobTO);
}
}
} catch (SchedulerException e) {
LOG.debug("Problems while retrieving scheduled jobs", e);
}
return jobTOs;
}
protected void doActionJob(final JobKey jobKey, final JobAction action) {
try {
if (scheduler.getScheduler().checkExists(jobKey)) {
switch (action) {
case START:
scheduler.getScheduler().triggerJob(jobKey);
break;
case STOP:
scheduler.getScheduler().interrupt(jobKey);
break;
case DELETE:
scheduler.getScheduler().deleteJob(jobKey);
break;
default:
}
} else {
LOG.warn("Could not find job {}", jobKey);
}
} catch (SchedulerException e) {
LOG.debug("Problems during {} operation on job {}", action.toString(), jobKey, e);
}
}
}