/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2010-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.reporting.core.svclayer.support; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Date; import java.util.List; import java.util.Map; import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.ValidationException; import org.opennms.api.reporting.ReportException; import org.opennms.api.reporting.ReportFormat; import org.opennms.api.reporting.ReportMode; import org.opennms.api.reporting.ReportService; import org.opennms.api.reporting.parameter.ReportParameters; import org.opennms.core.utils.ThreadCategory; import org.opennms.javamail.JavaMailer; import org.opennms.javamail.JavaMailerException; import org.opennms.netmgt.config.UserFactory; import org.opennms.netmgt.config.UserManager; import org.opennms.netmgt.model.ReportCatalogEntry; import org.opennms.reporting.core.DeliveryOptions; import org.opennms.reporting.core.svclayer.ReportServiceLocator; import org.opennms.reporting.core.svclayer.ReportStoreService; import org.opennms.reporting.core.svclayer.ReportWrapperService; /** * <p>DefaultReportWrapperService class.</p> * * @author ranger * @version $Id: $ */ public class DefaultReportWrapperService implements ReportWrapperService { private ReportServiceLocator m_reportServiceLocator; private final ThreadCategory log; private ReportStoreService m_reportStoreService; private static final String LOG4J_CATEGORY = "OpenNMS.Report"; /** * <p>Constructor for DefaultReportWrapperService.</p> */ public DefaultReportWrapperService() { String oldPrefix = ThreadCategory.getPrefix(); ThreadCategory.setPrefix(LOG4J_CATEGORY); log = ThreadCategory.getInstance(DefaultReportWrapperService.class); ThreadCategory.setPrefix(oldPrefix); } /** {@inheritDoc} */ public DeliveryOptions getDeliveryOptions(String reportId, String userId) { DeliveryOptions options = new DeliveryOptions(); options.setFormat(ReportFormat.HTML); options.setPersist(true); options.setSendMail(false); UserManager userFactory = UserFactory.getInstance(); try { String emailAddress = userFactory.getEmail(userId); if (emailAddress != null) { options.setMailTo(emailAddress); } } catch (MarshalException e) { log.error( "marshal exception trying to set destination email address", e); } catch (ValidationException e) { log.error( "validation exception trying to set destination email address", e); } catch (IOException e) { log.error("IO exception trying to set destination email address", e); } catch (NullPointerException e) { // See NMS-5111 for more details. log.warn("the user " + userId + " does not have any email configured."); } options.setInstanceId(reportId + " " + userId); return options; } /** {@inheritDoc} */ public List<ReportFormat> getFormats(String reportId) { return getReportService(reportId).getFormats(reportId); } /** {@inheritDoc} */ public ReportParameters getParameters(String reportId) { try { return getReportService(reportId).getParameters(reportId); } catch (ReportException e) { log.error("Report Exception when retrieving report parameters", e); } return null; } /** {@inheritDoc} */ public Boolean hasParameters(String reportId) { Map<String, Object> reportParms = getParameters(reportId).getReportParms(); if ((reportParms == null)||(reportParms.isEmpty())) { return false; } else { return true; } } /** {@inheritDoc} */ public void render(String reportId, String location, ReportFormat format, OutputStream outputStream) { try { getReportService(reportId).render(reportId, location, format, outputStream); } catch (ReportException e) { log.error("failed to render report", e); } } /** {@inheritDoc} */ public void run(ReportParameters parameters, ReportMode mode, DeliveryOptions deliveryOptions, String reportId) { if (!deliveryOptions.getPersist()) { ByteArrayOutputStream out = new ByteArrayOutputStream(); BufferedOutputStream bout = new BufferedOutputStream(out); try { getReportService(reportId).runAndRender( parameters.getReportParms(mode), reportId, deliveryOptions.getFormat(), bout); } catch (ReportException reportException) { log.error("failed to run or render report: " + reportId, reportException); } mailReport(deliveryOptions, out); } else { String outputPath; try { outputPath = getReportService(reportId).run( parameters.getReportParms(mode), reportId); ReportCatalogEntry catalogEntry = new ReportCatalogEntry(); catalogEntry.setReportId(reportId); catalogEntry.setTitle(deliveryOptions.getInstanceId()); catalogEntry.setLocation(outputPath); catalogEntry.setDate(new Date()); m_reportStoreService.save(catalogEntry); if (deliveryOptions.getMailTo().length() != 0) { ByteArrayOutputStream out = new ByteArrayOutputStream(); BufferedOutputStream bout = new BufferedOutputStream(out); getReportService(reportId).render( reportId, outputPath, deliveryOptions.getFormat(), bout); mailReport(deliveryOptions, out); } } catch (ReportException reportException) { log.error("failed to run or render report: " + reportId, reportException); } } } private void mailReport(DeliveryOptions deliveryOptions, ByteArrayOutputStream outputStream) { try { JavaMailer jm = new JavaMailer(); jm.setTo(deliveryOptions.getMailTo()); jm.setSubject(deliveryOptions.getInstanceId()); jm.setMessageText("Here is your report from the OpenNMS report service."); jm.setInputStream(new ByteArrayInputStream( outputStream.toByteArray())); switch (deliveryOptions.getFormat()) { case HTML: jm.setInputStreamName(deliveryOptions.getInstanceId() + ".htm"); jm.setInputStreamContentType("text/html"); break; case PDF: jm.setInputStreamName(deliveryOptions.getInstanceId() + ".pdf"); jm.setInputStreamContentType("application/pdf"); break; case SVG: jm.setInputStreamName(deliveryOptions.getInstanceId()+ ".pdf"); jm.setInputStreamContentType("application/pdf"); break; default: jm.setInputStreamName(deliveryOptions.getInstanceId() + ".htm"); jm.setInputStreamContentType("text/html"); } jm.mailSend(); } catch (JavaMailerException e) { log.error("Caught JavaMailer exception sending report", e); } } /** {@inheritDoc} */ public boolean validate(ReportParameters parameters, String reportId) { return getReportService(reportId).validate( parameters.getReportParms(), reportId); } private ReportService getReportService(String reportId) { return m_reportServiceLocator.getReportServiceForId(reportId); } /** * <p>setReportServiceLocator</p> * * @param reportServiceLocator a {@link org.opennms.reporting.core.svclayer.ReportServiceLocator} object. */ public void setReportServiceLocator( ReportServiceLocator reportServiceLocator) { m_reportServiceLocator = reportServiceLocator; } /** * <p>setReportStoreService</p> * * @param reportStoreService a {@link org.opennms.reporting.core.svclayer.ReportStoreService} object. */ public void setReportStoreService(ReportStoreService reportStoreService) { m_reportStoreService = reportStoreService; } /** {@inheritDoc} */ public void runAndRender(ReportParameters parameters, ReportMode mode, OutputStream outputStream) { // TODO remove this debug code Map<String, Object> reportParms = parameters.getReportParms(mode); for (String key : reportParms.keySet()) { String value; if (reportParms.get(key) == null) { value = "NULL"; } else { value = reportParms.get(key).toString(); } log.debug("param " + key + " set " + value); } try { getReportService(parameters.getReportId()).runAndRender( parameters.getReportParms(mode), parameters.getReportId(), parameters.getFormat(), outputStream); } catch (ReportException reportException) { log.error("failed to run or render report: " + parameters.getReportId(), reportException); } } }