/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2009-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) 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.
*
* OpenNMS(R) 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 OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.web.svclayer.support;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.opennms.api.reporting.ReportMode;
import org.opennms.api.reporting.parameter.ReportParameters;
import org.opennms.core.utils.LogUtils;
import org.opennms.core.utils.ThreadCategory;
import org.opennms.reporting.core.DeliveryOptions;
import org.opennms.reporting.core.svclayer.ReportServiceLocatorException;
import org.opennms.reporting.core.svclayer.ReportWrapperService;
import org.opennms.web.svclayer.SchedulerService;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.binding.message.MessageBuilder;
import org.springframework.webflow.execution.RequestContext;
/**
* <p>DefaultSchedulerService class.</p>
*
* @author ranger
* @version $Id: $
* @since 1.8.1
*/
public class DefaultSchedulerService implements InitializingBean, SchedulerService {
private static final String SUCCESS = "success";
private static final String ERROR = "error";
private static final String PARAMETER_ERROR = "Report parameters did not match the definition for the report please contact your OpenNMS administrator";
private static final String SCHEDULER_ERROR = "An exception occurred when scheduling the report";
private static final String TRIGGER_PARSE_ERROR = "An error occurred parsing the cron expression. It was not possible to schedule the report";
private static final String REPORTID_ERROR = "An error occurred locating the report service bean";
private Scheduler m_scheduler;
private JobDetail m_jobDetail;
private String m_triggerGroup;
private ReportWrapperService m_reportWrapperService;
/**
* <p>afterPropertiesSet</p>
*
* @throws java.lang.Exception if any.
*/
@Override
public void afterPropertiesSet() throws Exception {
log().debug("Adding job " + m_jobDetail.getName() + " to scheduler");
m_scheduler.addJob(m_jobDetail, true);
}
/**
* <p>getTriggerDescriptions</p>
*
* @return a {@link java.util.List} object.
*/
public List<TriggerDescription> getTriggerDescriptions() {
List<TriggerDescription> triggerDescriptions = new ArrayList<TriggerDescription>();
try {
String[] triggerNames = m_scheduler.getTriggerNames(m_triggerGroup);
for (int j = 0; j < triggerNames.length; j++) {
TriggerDescription description = new TriggerDescription();
description.setNextFireTime(m_scheduler.getTrigger(
triggerNames[j],
m_triggerGroup).getNextFireTime());
description.setTriggerName(triggerNames[j]);
triggerDescriptions.add(description);
}
} catch (SchedulerException e) {
log().error("exception lretrieving trigger descriptions", e);
}
return triggerDescriptions;
}
/** {@inheritDoc} */
public Boolean exists(String triggerName) {
Boolean found = false;
try {
Trigger trigger = m_scheduler.getTrigger(triggerName,
m_triggerGroup);
if (trigger != null) {
found = true;
}
} catch (SchedulerException e) {
log().error("exception looking up trigger name: " + triggerName);
log().error(e.getMessage());
}
return found;
}
/*
* (non-Javadoc)
* @see
* org.opennms.web.svclayer.support.SchedulerService#removeTrigger(java
* .lang.String)
*/
/** {@inheritDoc} */
public void removeTrigger(String triggerName) {
try {
m_scheduler.unscheduleJob(triggerName, m_triggerGroup);
} catch (SchedulerException e) {
log().error(
"exception when attempting to remove trigger "
+ triggerName);
log().error(e.getMessage());
}
}
/**
* <p>removeTriggers</p>
*
* @param triggerNames an array of {@link java.lang.String} objects.
*/
public void removeTriggers(String[] triggerNames) {
for (String triggerName : triggerNames) {
removeTrigger(triggerName);
}
}
/*
* (non-Javadoc)
* @see
* org.opennms.web.svclayer.support.SchedulerService#addCronTrigger(org
* .opennms.web.report.database.model.DatabaseReportCriteria,
* java.lang.String, java.lang.String, java.lang.String,
* org.springframework.webflow.execution.RequestContext)
*/
/** {@inheritDoc} */
public String addCronTrigger(String id, ReportParameters criteria,
DeliveryOptions deliveryOptions,
String cronExpression, RequestContext context) {
CronTrigger cronTrigger = null;
try {
if (m_reportWrapperService.validate(criteria,id) == false ) {
log().error(PARAMETER_ERROR);
context.getMessageContext().addMessage(
new MessageBuilder().error().defaultText(
PARAMETER_ERROR).build());
return ERROR;
} else {
try {
cronTrigger = new CronTrigger();
cronTrigger.setGroup(m_triggerGroup);
cronTrigger.setName(deliveryOptions.getInstanceId());
cronTrigger.setJobName(m_jobDetail.getName());
cronTrigger.setCronExpression(cronExpression);
// cronTrigger = new CronTrigger(triggerName, m_triggerGroup,
// cronExpression);
} catch (ParseException e) {
log().error(TRIGGER_PARSE_ERROR, e);
context.getMessageContext().addMessage(
new MessageBuilder().error().defaultText(
TRIGGER_PARSE_ERROR).build());
return ERROR;
}
cronTrigger.setJobName(m_jobDetail.getName());
cronTrigger.getJobDataMap().put("criteria", (ReportParameters) criteria);
cronTrigger.getJobDataMap().put("reportId", id);
cronTrigger.getJobDataMap().put("mode", ReportMode.SCHEDULED);
cronTrigger.getJobDataMap().put("deliveryOptions",
(DeliveryOptions) deliveryOptions);
try {
m_scheduler.scheduleJob(cronTrigger);
} catch (SchedulerException e) {
log().error(SCHEDULER_ERROR, e);
context.getMessageContext().addMessage(
new MessageBuilder().error().defaultText(
SCHEDULER_ERROR).build());
return ERROR;
}
return SUCCESS;
}
} catch (ReportServiceLocatorException e) {
log().error(REPORTID_ERROR);
context.getMessageContext().addMessage(
new MessageBuilder().error().defaultText(
REPORTID_ERROR).build());
return ERROR;
}
}
/*
* (non-Javadoc)
* @see
* org.opennms.web.svclayer.support.SchedulerService#execute(org.opennms
* .web.report.database.model.DatabaseReportCriteria, java.lang.String,
* org.springframework.webflow.execution.RequestContext)
*/
/** {@inheritDoc} */
public String execute(String id, ReportParameters criteria,
DeliveryOptions deliveryOptions, RequestContext context) {
try {
if (m_reportWrapperService.validate(criteria,id) == false ) {
context.getMessageContext().addMessage(new MessageBuilder().error().defaultText(PARAMETER_ERROR).build());
return ERROR;
} else {
SimpleTrigger trigger = new SimpleTrigger(deliveryOptions.getInstanceId(), m_triggerGroup, new Date(), null, 0, 0L);
trigger.setJobName(m_jobDetail.getName());
trigger.getJobDataMap().put("criteria", (ReportParameters) criteria);
trigger.getJobDataMap().put("reportId", id);
trigger.getJobDataMap().put("mode", ReportMode.IMMEDIATE);
trigger.getJobDataMap().put("deliveryOptions", (DeliveryOptions) deliveryOptions);
try {
m_scheduler.scheduleJob(trigger);
} catch (SchedulerException e) {
LogUtils.warnf(this, e, SCHEDULER_ERROR);
context.getMessageContext().addMessage(new MessageBuilder().error().defaultText(SCHEDULER_ERROR).build());
return ERROR;
}
return SUCCESS;
}
} catch (ReportServiceLocatorException e) {
LogUtils.errorf(this, e, REPORTID_ERROR);
context.getMessageContext().addMessage(new MessageBuilder().error().defaultText(REPORTID_ERROR).build());
return ERROR;
}
}
private ThreadCategory log() {
return ThreadCategory.getInstance();
}
/**
* <p>setScheduler</p>
*
* @param scheduler a {@link org.quartz.Scheduler} object.
*/
public void setScheduler(Scheduler scheduler) {
m_scheduler = scheduler;
}
/**
* <p>setJobDetail</p>
*
* @param reportJob a {@link org.quartz.JobDetail} object.
*/
public void setJobDetail(JobDetail reportJob) {
m_jobDetail = reportJob;
}
/**
* <p>setTriggerGroup</p>
*
* @param triggerGroup a {@link java.lang.String} object.
*/
public void setTriggerGroup(String triggerGroup) {
m_triggerGroup = triggerGroup;
}
/**
* <p>setReportWrapperService</p>
*
* @param reportWrapperService a {@link org.opennms.reporting.core.svclayer.ReportWrapperService} object.
*/
public void setReportWrapperService(ReportWrapperService reportWrapperService) {
m_reportWrapperService = reportWrapperService;
}
}