/******************************************************************************* * 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.netmgt.reporting.service; import java.util.List; import org.springframework.util.Assert; import org.opennms.core.utils.LogUtils; import org.opennms.core.utils.ThreadCategory; import org.opennms.netmgt.EventConstants; import org.opennms.netmgt.config.reportd.Report; import org.opennms.netmgt.daemon.SpringServiceDaemon; import org.opennms.netmgt.dao.ReportdConfigurationDao; import org.opennms.netmgt.model.events.EventBuilder; import org.opennms.netmgt.model.events.EventForwarder; import org.opennms.netmgt.model.events.annotations.EventHandler; import org.opennms.netmgt.model.events.annotations.EventListener; import org.opennms.netmgt.xml.event.Event; import org.opennms.netmgt.xml.event.Parm; /** * <p>Reportd class.</p> * * @author ranger * @version $Id: $ */ @EventListener(name="Reportd:EventListener") public class Reportd implements SpringServiceDaemon { /** Constant <code>NAME="Reportd"</code> */ public static final String NAME = "Reportd"; private volatile EventForwarder m_eventForwarder; private ReportScheduler m_reportScheduler; private ReportService m_reportService; private ReportDeliveryService m_reportDeliveryService; private ReportdConfigurationDao m_reportConfigurationDao; private String reportDirectory; /** * <p>start</p> * * @throws java.lang.Exception if any. */ @Override public void start() throws Exception { reportDirectory = m_reportConfigurationDao.getStorageDirectory(); m_reportScheduler.start(); } /** * <p>destroy</p> */ @Override public void destroy() throws Exception { m_reportScheduler.destroy(); } /** * <p>afterPropertiesSet</p> * * @throws java.lang.Exception if any. */ @Override public void afterPropertiesSet() throws Exception { Assert.notNull(m_eventForwarder, "No Event Forwarder Set"); Assert.notNull(m_reportScheduler, "No Report Scheduler Set"); Assert.notNull(m_reportService,"No Report service set"); Assert.notNull(m_reportDeliveryService,"No Delivery service set"); Assert.notNull(m_reportConfigurationDao,"NoConfiguration DAO Defined"); } /** * <p>runReport</p> * * @param reportName a {@link java.lang.String} object. */ public void runReport(String reportName){ LogUtils.infof(this, "Running report by name: (%s).", reportName); runReport(m_reportConfigurationDao.getReport(reportName)); } /** * <p>runReport</p> * * @param report a {@link org.opennms.netmgt.config.reportd.Report} object. */ public void runReport(Report report) { String originalName = ThreadCategory.getPrefix(); try { ThreadCategory.setPrefix(NAME); LogUtils.debugf(this, "reportd -- running job %s", report.getReportName() ); String fileName = m_reportService.runReport(report,reportDirectory); LogUtils.debugf(this,"reportd -- delivering report %s", report.getReportName()); m_reportDeliveryService.deliverReport(report, fileName); LogUtils.debugf(this,"reportd -- done running job %s",report.getReportName() ); } catch (ReportRunException e) { createAndSendReportingEvent(EventConstants.REPORT_RUN_FAILED_UEI, report.getReportName(), e.getMessage()); } catch (ReportDeliveryException e) { createAndSendReportingEvent(EventConstants.REPORT_DELIVERY_FAILED_UEI, report.getReportName(), e.getMessage()); } finally { ThreadCategory.setPrefix(originalName); } } /** * <p>createAndSendReportingEvent * * @param uei the UEI of the event to send * @param reportName the name of the report in question * @param reason an explanation of why this event was sent */ private void createAndSendReportingEvent(String uei, String reportName, String reason) { LogUtils.debugf(this, "Crafting reporting event with UEI '%s' for report '%s' with reason '%s'", uei, reportName, reason); EventBuilder bldr = new EventBuilder(uei, NAME); bldr.addParam(EventConstants.PARM_REPORT_NAME, reportName); bldr.addParam(EventConstants.PARM_REASON, reason); m_eventForwarder.sendNow(bldr.getEvent()); } /** * <p>handleRunReportEvent</p> * * @param e a {@link org.opennms.netmgt.xml.event.Event} object. */ @EventHandler(uei = EventConstants.REPORTD_RUN_REPORT) public void handleRunReportEvent(Event e){ String reportName = new String(); for(Parm parm : e.getParmCollection()){ if(EventConstants.PARM_REPORT_NAME.equals(parm.getParmName())) reportName = parm.getValue().getContent(); else LogUtils.infof(this,"Unknown Event Constant: %s",parm.getParmName()); } if (reportName != ""){ LogUtils.debugf(this, "running report %s", reportName); runReport(reportName); } else { LogUtils.errorf(this, "Can not run report -- reportName not specified"); } } /** * <p>handleReloadConfigEvent</p> * * @param e a {@link org.opennms.netmgt.xml.event.Event} object. */ @EventHandler(uei = EventConstants.RELOAD_DAEMON_CONFIG_UEI) public void handleReloadConfigEvent(Event e) { if (isReloadConfigEventTarget(e)) { LogUtils.infof(this,"handleReloadConfigEvent: reloading configuration..."); EventBuilder ebldr = null; try { reportDirectory = m_reportConfigurationDao.getStorageDirectory(); LogUtils.debugf(this,"handleReloadConfigEvent: lock acquired, unscheduling current reports..."); m_reportScheduler.rebuildReportSchedule(); LogUtils.debugf(this,"handleRelodConfigEvent: reports rescheduled."); ebldr = new EventBuilder(EventConstants.RELOAD_DAEMON_CONFIG_SUCCESSFUL_UEI, "Reportd"); ebldr.addParam(EventConstants.PARM_DAEMON_NAME, "Reportd"); } catch (Throwable ex) { LogUtils.errorf(this, ex, "handleReloadConfigurationEvent: Error reloading configuration: %s", ex.getMessage()); ebldr = new EventBuilder(EventConstants.RELOAD_DAEMON_CONFIG_FAILED_UEI, "Reportd"); ebldr.addParam(EventConstants.PARM_DAEMON_NAME, "Reportd"); ebldr.addParam(EventConstants.PARM_REASON, ex.getLocalizedMessage().substring(1, 128)); } if (ebldr != null) { getEventForwarder().sendNow(ebldr.getEvent()); } LogUtils.infof(this,"handleReloadConfigEvent: configuration reloaded."); } } private boolean isReloadConfigEventTarget(Event event) { boolean isTarget = false; List<Parm> parmCollection = event.getParmCollection(); for (Parm parm : parmCollection) { if (EventConstants.PARM_DAEMON_NAME.equals(parm.getParmName()) && "Reportd".equalsIgnoreCase(parm.getValue().getContent())) { isTarget = true; break; } } LogUtils.debugf(this,"isReloadConfigEventTarget: Reportd was target of reload event: "+isTarget); return isTarget; } /** * <p>setEventForwarder</p> * * @param eventForwarder a {@link org.opennms.netmgt.model.events.EventForwarder} object. */ public void setEventForwarder(EventForwarder eventForwarder) { m_eventForwarder = eventForwarder; } /** * <p>getEventForwarder</p> * * @return a {@link org.opennms.netmgt.model.events.EventForwarder} object. */ public EventForwarder getEventForwarder() { return m_eventForwarder; } /** * <p>setReportScheduler</p> * * @param reportScheduler a {@link org.opennms.netmgt.reporting.service.ReportScheduler} object. */ public void setReportScheduler(ReportScheduler reportScheduler) { m_reportScheduler = reportScheduler; } /** * <p>getReportScheduler</p> * * @return a {@link org.opennms.netmgt.reporting.service.ReportScheduler} object. */ public ReportScheduler getReportScheduler() { return m_reportScheduler; } /** * <p>getReportService</p> * * @return a {@link org.opennms.netmgt.reporting.service.ReportService} object. */ public ReportService getReportService() { return m_reportService; } /** * <p>setReportService</p> * * @param reportService a {@link org.opennms.netmgt.reporting.service.ReportService} object. */ public void setReportService(ReportService reportService) { m_reportService = reportService; } /** * <p>getReportDeliveryService</p> * * @return a {@link org.opennms.netmgt.reporting.service.ReportDeliveryService} object. */ public ReportDeliveryService getReportDeliveryService() { return m_reportDeliveryService; } /** * <p>setReportDeliveryService</p> * * @param reportDeliveryService a {@link org.opennms.netmgt.reporting.service.ReportDeliveryService} object. */ public void setReportDeliveryService( ReportDeliveryService reportDeliveryService) { m_reportDeliveryService = reportDeliveryService; } /** * <p>getReportdConfigurationDao</p> * * @return a {@link org.opennms.netmgt.dao.ReportdConfigurationDao} object. */ public ReportdConfigurationDao getReportdConfigurationDao() { return m_reportConfigurationDao; } /** * <p>setReportdConfigurationDao</p> * * @param reportConfigurationDao a {@link org.opennms.netmgt.dao.ReportdConfigurationDao} object. */ public void setReportdConfigurationDao( ReportdConfigurationDao reportConfigurationDao) { m_reportConfigurationDao = reportConfigurationDao; } }