/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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 Lesser General Public License for more details.
*
* Copyright 2005 - 2009 Pentaho Corporation. All rights reserved.
*
*/
package org.pentaho.platform.scheduler;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.api.scheduler.IJobSchedule;
import org.pentaho.platform.engine.security.SecurityHelper;
import org.pentaho.platform.scheduler.messages.Messages;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
public class SchedulerHelper {
public static List<IJobSchedule> getMySchedules(IPentahoSession session) throws SchedulerException {
try {
List<IJobSchedule> jobSchedules = new ArrayList<IJobSchedule>();
Scheduler sched = QuartzSystemListener.getSchedulerInstance();
String[] triggerGroups = sched.getTriggerGroupNames();
for (String triggerGroup : triggerGroups) {
String[] triggerNames = sched.getTriggerNames(triggerGroup);
for (String triggerName : triggerNames) {
JobSchedule jobSchedule = new JobSchedule();
Trigger trigger = sched.getTrigger(triggerName, triggerGroup);
// filter on group = my userid
if (trigger.getJobGroup().equalsIgnoreCase(session.getName())) {
org.quartz.JobDetail jobDetail = sched.getJobDetail(trigger.getJobName(), trigger.getJobGroup());
jobSchedule.setName(jobDetail.getJobDataMap().getString("background_action_name"));
jobSchedule.setFullname(jobDetail.getJobDataMap().getString("background_action_name"));
jobSchedule.setTriggerState(sched.getTriggerState(triggerName, triggerGroup));
jobSchedule.setTriggerName(trigger.getName()); //$NON-NLS-1$
jobSchedule.setTriggerGroup(trigger.getGroup()); //$NON-NLS-1$
jobSchedule.setNextFireTime(trigger.getNextFireTime());
jobSchedule.setPreviousFireTime(trigger.getPreviousFireTime());
jobSchedule.setJobName(trigger.getJobName());
jobSchedule.setJobGroup(trigger.getJobGroup());
jobSchedule.setJobDescription(jobDetail.getDescription());
jobSchedules.add(jobSchedule);
}
}
}
return jobSchedules;
} catch (org.quartz.SchedulerException se) {
throw new SchedulerException(se);
}
}
public static List<IJobSchedule> getAllSchedules(IPentahoSession session) throws SchedulerException {
List<IJobSchedule> jobSchedules = new ArrayList<IJobSchedule>();
if (SecurityHelper.isPentahoAdministrator(session)) {
try {
Scheduler sched = QuartzSystemListener.getSchedulerInstance();
String[] triggerGroups = sched.getTriggerGroupNames();
for (String triggerGroup : triggerGroups) {
String[] triggerNames = sched.getTriggerNames(triggerGroup);
for (String triggerName : triggerNames) {
JobSchedule jobSchedule = new JobSchedule();
Trigger trigger = sched.getTrigger(triggerName, triggerGroup);
org.quartz.JobDetail jobDetail = sched.getJobDetail(trigger.getJobName(), trigger.getJobGroup());
jobSchedule.setName(jobDetail.getJobDataMap().getString("background_action_name"));
jobSchedule.setFullname(jobDetail.getJobDataMap().getString("background_action_name"));
jobSchedule.setTriggerState(sched.getTriggerState(triggerName, triggerGroup));
jobSchedule.setTriggerName(trigger.getName()); //$NON-NLS-1$
jobSchedule.setTriggerGroup(trigger.getGroup()); //$NON-NLS-1$
jobSchedule.setNextFireTime(trigger.getNextFireTime());
jobSchedule.setPreviousFireTime(trigger.getPreviousFireTime());
jobSchedule.setJobName(trigger.getJobName());
jobSchedule.setJobGroup(trigger.getJobGroup());
jobSchedule.setJobDescription(jobDetail.getDescription());
jobSchedules.add(jobSchedule);
}
}
} catch (org.quartz.SchedulerException se) {
throw new SchedulerException(se);
}
}
return jobSchedules;
}
public static void runJob(IPentahoSession session, String jobName, String jobGroup) throws SchedulerException {
// only if owner or admin of job can job be run
if (SecurityHelper.isPentahoAdministrator(session) || jobGroup.equalsIgnoreCase(session.getName())) {
try {
Scheduler sched = QuartzSystemListener.getSchedulerInstance();
sched.triggerJob(jobName, jobGroup);
} catch (org.quartz.SchedulerException se) {
try {
Scheduler sched = QuartzSystemListener.getSchedulerInstance();
sched.triggerJobWithVolatileTrigger(jobName, jobGroup);
} catch (org.quartz.SchedulerException se2) {
throw new SchedulerException(se2);
}
}
}
}
public static void resumeJob(IPentahoSession session, String jobName, String jobGroup) throws SchedulerException {
// only if owner or admin of job can job be resumed
if (SecurityHelper.isPentahoAdministrator(session) || jobGroup.equalsIgnoreCase(session.getName())) {
try {
Scheduler sched = QuartzSystemListener.getSchedulerInstance();
sched.resumeJob(jobName, jobGroup);
} catch (org.quartz.SchedulerException se) {
throw new SchedulerException(se);
}
}
}
public static void suspendJob(IPentahoSession session, String jobName, String jobGroup) throws SchedulerException {
// only if owner or admin of job can job be resumed
if (SecurityHelper.isPentahoAdministrator(session) || jobGroup.equalsIgnoreCase(session.getName())) {
try {
Scheduler sched = QuartzSystemListener.getSchedulerInstance();
sched.pauseJob(jobName, jobGroup);
} catch (org.quartz.SchedulerException se) {
throw new SchedulerException(se);
}
}
}
public static void deleteJob(IPentahoSession session, String jobName, String jobGroup) throws SchedulerException {
// only if owner or admin of job can job be resumed
if (SecurityHelper.isPentahoAdministrator(session) || jobGroup.equalsIgnoreCase(session.getName())) {
try {
Scheduler sched = QuartzSystemListener.getSchedulerInstance();
sched.deleteJob(jobName, jobGroup);
} catch (org.quartz.SchedulerException se) {
throw new SchedulerException(se);
}
}
}
public static void createCronJob(IPentahoSession session, String solutionName, String path, String actionName,
String triggerName, String group, String description, String cronExpression) {
// Seconds 0-59 , - * /
// Minutes 0-59 , - * /
// Hours 0-23 , - * /
// Day-of-month 1-31 , - * ? / L W C
// Month 1-12 or JAN-DEC , - * /
// Day-of-Week 1-7 or SUN-SAT , - * ? / L C #
// Year (Optional) empty, 1970-2099 , - * /
try {
Scheduler sched = QuartzSystemListener.getSchedulerInstance();
org.quartz.JobDetail jobDetail = new org.quartz.JobDetail(actionName, session.getName(), QuartzExecute.class);
jobDetail.setDescription(description);
Trigger trigger = new CronTrigger(triggerName, group, cronExpression);
JobDataMap jdm = jobDetail.getJobDataMap();
jdm.put("solution", solutionName); //$NON-NLS-1$
jdm.put("path", path); //$NON-NLS-1$
jdm.put("action", actionName); //$NON-NLS-1$
// Support scheduled actions in the portal and assigning the credential properly in the execute.
if ((session != null) && (session.isAuthenticated())) {
jdm.put("username", session.getName()); //$NON-NLS-1$
}
if (sched.getJobDetail(jobDetail.getName(), Scheduler.DEFAULT_GROUP) != null) {
SchedulerHelper.deleteJob(session, jobDetail.getName(), Scheduler.DEFAULT_GROUP);
}
sched.scheduleJob(jobDetail, trigger);
} catch (ParseException e) {
throw new SchedulerException(e);
} catch (org.quartz.SchedulerException se) {
throw new SchedulerException(se);
}
}
public static void createCronJob(IPentahoSession session, String solutionName, String path, String actionName,
String cronExpression) {
createCronJob(session, solutionName, path, actionName, actionName, session.getName(), "", cronExpression);
}
public static void createSimpleTriggerJob(IPentahoSession session, String solutionName, String path, String actionName,
String triggerName, String group, String description, Date strStartDate, Date strEndDate, int repeatCount, int strRepeatInterval) {
try {
Scheduler sched = QuartzSystemListener.getSchedulerInstance();
org.quartz.JobDetail jobDetail = new org.quartz.JobDetail(actionName, session.getName(), QuartzExecute.class);
jobDetail.setDescription(description);
SimpleTrigger trigger = createRepeatTrigger(triggerName, group, strStartDate, strEndDate, repeatCount, strRepeatInterval);
JobDataMap jdm = jobDetail.getJobDataMap();
jdm.put("solution", solutionName); //$NON-NLS-1$
jdm.put("path", path); //$NON-NLS-1$
jdm.put("action", actionName); //$NON-NLS-1$
// Support scheduled actions in the portal and assigning the credential properly in the execute.
if ((session != null) && (session.isAuthenticated())) {
jdm.put("username", session.getName()); //$NON-NLS-1$
}
if (sched.getJobDetail(jobDetail.getName(), Scheduler.DEFAULT_GROUP) != null) {
SchedulerHelper.deleteJob(session, jobDetail.getName(), Scheduler.DEFAULT_GROUP);
}
sched.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
throw e;
} catch (org.quartz.SchedulerException se) {
throw new SchedulerException(se);
}
}
public static void executeJobNow(String jobName, String jobGroup) throws SchedulerException {
try {
Trigger trigger = new SimpleTrigger("Immediate", "DEFAULT"); //$NON-NLS-1$ //$NON-NLS-2$
Scheduler sched = QuartzSystemListener.getSchedulerInstance();
JobDetail jobDetail = sched.getJobDetail(jobName, jobGroup);
if (jobDetail == null) {
throw new SchedulerException(Messages.getInstance().getErrorString("SchedulerHelper.ERROR_0001_FAILED_TO_EXECUTE_NONEXISTENT_JOB",jobName)); //$NON-NLS-1$
} else {
jobDetail.setGroup("Immediate"); //$NON-NLS-1$
sched.scheduleJob(jobDetail, trigger);
}
} catch (org.quartz.SchedulerException se) {
throw new SchedulerException(se);
}
}
public static boolean isInStandbyMode() {
try {
Scheduler sched = QuartzSystemListener.getSchedulerInstance();
return sched.isInStandbyMode();
} catch (org.quartz.SchedulerException se) {
throw new SchedulerException(se);
}
}
public static void resumeAll() {
try {
Scheduler sched = QuartzSystemListener.getSchedulerInstance();
sched.resumeAll();
} catch (org.quartz.SchedulerException se) {
throw new SchedulerException(se);
}
}
public static void pauseAll() {
try {
Scheduler sched = QuartzSystemListener.getSchedulerInstance();
sched.pauseAll();
} catch (org.quartz.SchedulerException se) {
throw new SchedulerException(se);
}
}
public static CronTrigger createCronTrigger( String triggerName, String triggerGroupName,
String strStartDate, String strEndDate, String cronString ) throws ParseException {
// DateFormat fmtr = SubscriptionHelper.getDateTimeFormatter();
Date startDate = ( null != strStartDate ) ? new Date(Date.parse( strStartDate )) : null;
Date endDate = ( null != strEndDate ) ? new Date(Date.parse( strEndDate )) : null;
CronTrigger trigger = new CronTrigger( triggerName, triggerGroupName, cronString );
if ( null != startDate ) {
trigger.setStartTime( startDate );
}
if ( null != endDate ) {
trigger.setEndTime( endDate );
}
return trigger;
}
public static SimpleTrigger createRepeatTrigger(String triggerName, String triggerGroupName, Date startDate, Date endDate, int repeatCount, int repeatInterval) {
SimpleTrigger trigger = new SimpleTrigger( triggerName, triggerGroupName, repeatCount, repeatInterval );
if ( null != startDate ) {
trigger.setStartTime( startDate );
}
if ( null != endDate ) {
trigger.setEndTime( endDate );
}
return trigger;
}
/**
*
* @param triggerName
* @param triggerGroupName
* @param strStartDate
* @param strEndDate
* @param repeatCount
* @param strRepeatInterval repeat interval in milliseconds
* @return
* @throws ParseException
*/
public static SimpleTrigger createRepeatTrigger( String triggerName, String triggerGroupName,
String strStartDate, String strEndDate, String repeatCount, String strRepeatInterval ) throws ParseException {
// DateFormat fmtr = SubscriptionHelper.getDateTimeFormatter();
Date startDate = ( null != strStartDate ) ? new Date(Date.parse( strStartDate )) : null;
Date endDate = ( null != strEndDate ) ? new Date(Date.parse( strEndDate )) : null;
int repeatInterval = Integer.parseInt( strRepeatInterval );
int intRepeatCount = ( null == repeatCount )
? SimpleTrigger.REPEAT_INDEFINITELY
: Integer.parseInt( repeatCount );
return createRepeatTrigger(triggerName, triggerGroupName, startDate, endDate, intRepeatCount, repeatInterval);
}
}