/*******************************************************************************
* Copyright (c) 2009 Daniel Grout.
*
* GNU GENERAL PUBLIC LICENSE - Version 3
*
* This file is part of Report Runner (http://code.google.com/p/reportrunner).
*
* Report Runner is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Report Runner is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Report Runner. If not, see <http://www.gnu.org/licenses/>.
*
* Module: RunnerJobServiceImpl.java
******************************************************************************/
package binky.reportrunner.service.impl;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import org.apache.log4j.Logger;
import binky.reportrunner.dao.ReportRunnerDao;
import binky.reportrunner.data.RunnerGroup;
import binky.reportrunner.data.RunnerJob;
import binky.reportrunner.data.RunnerJob_pk;
import binky.reportrunner.scheduler.Scheduler;
import binky.reportrunner.scheduler.SchedulerException;
import binky.reportrunner.service.DatasourceService;
import binky.reportrunner.service.ReportService;
public class ReportServiceImpl implements ReportService {
private Scheduler scheduler;
private ReportRunnerDao<RunnerJob, RunnerJob_pk> runnerJobDao;
private DatasourceService dataSourceService;
private static final Logger logger = Logger
.getLogger(ReportServiceImpl.class);
public void setReportRunnerDao(
ReportRunnerDao<RunnerJob, RunnerJob_pk> runnerJobDao) {
this.runnerJobDao = runnerJobDao;
}
public void addUpdateJob(RunnerJob job) throws SchedulerException {
String groupName = job.getPk().getGroup().getGroupName();
String jobName = job.getPk().getJobName();
logger.debug("add update job: " + groupName + "." + jobName);
RunnerJob job_comp = runnerJobDao.get(new RunnerJob_pk(jobName,
new RunnerGroup(groupName)));
if ((job_comp != null)
&& ((job_comp.getCronString() != null) && !job_comp
.getCronString().isEmpty())
&& !job_comp.getCronString().equals(job.getCronString())) {
scheduler.removeJob(jobName, groupName);
}
if (job.isScheduled() && (job.getCronString() != null)
&& !job.getCronString().isEmpty()
&& !scheduler.isScheduled(jobName, groupName)) {
scheduler.addJob(jobName, groupName, job.getCronString(),
job.getStartDate(), job.getEndDate());
}
runnerJobDao.saveOrUpdate(job);
}
public void deleteJob(String jobName, String groupName)
throws SchedulerException {
logger.debug("delete job: " + groupName + "." + jobName);
RunnerJob job = runnerJobDao.get(new RunnerJob_pk(jobName,
new RunnerGroup(groupName)));
if (job != null) {
if ((job.getCronString() != null) && !job.getCronString().isEmpty()) {
scheduler.removeJob(jobName, groupName);
}
runnerJobDao.delete(new RunnerJob_pk(jobName, new RunnerGroup(
groupName)));
}
}
public RunnerJob getJob(String jobName, String groupName) {
logger.debug("get job: " + groupName + "." + jobName);
return runnerJobDao.get(new RunnerJob_pk(jobName, new RunnerGroup(
groupName)));
}
public List<RunnerJob> listJobs(String groupName) {
return runnerJobDao.findByNamedQuery("getJobsByGroup",
new String[] { groupName });
}
public Scheduler getScheduler() {
return scheduler;
}
public void setScheduler(Scheduler scheduler) {
this.scheduler = scheduler;
}
public Boolean isJobActive(String jobName, String groupName)
throws SchedulerException {
logger.debug("is job active: " + groupName + "." + jobName);
RunnerJob job = runnerJobDao.get(new RunnerJob_pk(jobName,
new RunnerGroup(groupName)));
if (job != null && (job.getCronString() != null)
&& !job.getCronString().isEmpty()) {
if (scheduler.isScheduled(jobName, groupName)) {
if (job.getEndDate() != null
&& job.getEndDate().getTime() < Calendar.getInstance()
.getTimeInMillis()) {
// issue 84 - jobs showing as scheduled when the schedule
// has ended.
return false;
} else {
return this.scheduler.isJobActive(jobName, groupName);
}
} else {
return false;
}
} else {
return false;
}
}
public void pauseJob(String jobName, String groupName)
throws SchedulerException {
logger.debug("pause job: " + groupName + "." + jobName);
RunnerJob job = runnerJobDao.get(new RunnerJob_pk(jobName,
new RunnerGroup(groupName)));
if ((job.getCronString() != null) && !job.getCronString().isEmpty()) {
scheduler.pauseJob(jobName, groupName);
}
}
public void resumeJob(String jobName, String groupName)
throws SchedulerException {
logger.debug("resume job: " + groupName + "." + jobName);
RunnerJob job = runnerJobDao.get(new RunnerJob_pk(jobName,
new RunnerGroup(groupName)));
if ((job.getCronString() != null) && !job.getCronString().isEmpty()) {
scheduler.resumeJob(jobName, groupName);
}
}
public List<RunnerJob> getRunningJobs() throws SchedulerException {
logger.debug("executed getRunningJobs()");
List<String> runningJobs = scheduler.getCurrentRunningJobs();
List<RunnerJob> jobs = new LinkedList<RunnerJob>();
for (String string : runningJobs) {
logger.debug("found entry:" + string);
String groupName = string.split(":|:")[0];
String jobName = string.split(":|:")[2];
if (!groupName.equals(Scheduler.dashboardSchedulerGroup)) {
logger.debug("found a job with details of: " + jobName + "/"
+ groupName);
RunnerJob job = getJobHelper(jobName, groupName);
jobs.add(job);
}
}
return jobs;
}
private RunnerJob getJobHelper(String jobName, String groupName) {
return runnerJobDao.get(new RunnerJob_pk(jobName, new RunnerGroup(
groupName)));
}
public void interruptRunningJob(String jobName, String groupName)
throws SchedulerException {
logger.debug("interrupt job: " + groupName + "." + jobName);
RunnerJob job = getJobHelper(jobName, groupName);
if ((job.getCronString() != null) && !job.getCronString().isEmpty()) {
scheduler.interruptRunningJob(jobName, groupName);
}
}
public void invokeJob(String jobName, String groupName)
throws SchedulerException {
logger.debug("invoke job: " + groupName + "." + jobName);
RunnerJob job = getJobHelper(jobName, groupName);
if ((job.getCronString() != null) && !job.getCronString().isEmpty()) {
// if already in scheduler lets go
scheduler.invokeJob(jobName, groupName);
} else {
// schedule it then remove it
// TODO test this works as it is the mother of all hacks
Date date = Calendar.getInstance().getTime();
scheduler.addJob(jobName, groupName, "0/1 * * * * ?", date,
new Date(date.getTime() + 1000));
scheduler.invokeJob(jobName, groupName);
}
}
public Date getPreviousRunTime(String jobName, String groupName)
throws SchedulerException {
logger.debug("get previous run time job: " + groupName + "." + jobName);
if (scheduler.isScheduled(jobName, groupName)) {
return scheduler.getPreviousRunTime(jobName, groupName);
} else {
return null;
}
}
public Date getNextRunTime(String jobName, String groupName)
throws SchedulerException {
logger.debug("get next run time job: " + groupName + "." + jobName);
if (scheduler.isScheduled(jobName, groupName)) {
return scheduler.getNextRunTime(jobName, groupName);
} else {
return null;
}
}
public void pauseGroup(String groupName) throws SchedulerException {
logger.debug("pause group: " + groupName);
this.scheduler.pauseGroup(groupName);
}
public void resumeGroup(String groupName) throws SchedulerException {
logger.debug("resume group: " + groupName);
this.scheduler.resumeGroup(groupName);
}
public DatasourceService getDataSourceService() {
return dataSourceService;
}
public void setDataSourceService(DatasourceService dataSourceService) {
this.dataSourceService = dataSourceService;
}
public ReportRunnerDao<RunnerJob, RunnerJob_pk> getRunnerJobDao() {
return runnerJobDao;
}
public void setRunnerJobDao(
ReportRunnerDao<RunnerJob, RunnerJob_pk> runnerJobDao) {
this.runnerJobDao = runnerJobDao;
}
}