/******************************************************************************* * 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 org.hibernate.criterion.Order; import org.opennms.api.reporting.ReportException; import org.opennms.api.reporting.ReportFormat; import org.opennms.api.reporting.ReportService; import org.opennms.core.utils.ThreadCategory; import org.opennms.features.reporting.model.basicreport.BasicReportDefinition; import org.opennms.features.reporting.repository.global.GlobalReportRepository; import org.opennms.netmgt.dao.ReportCatalogDao; import org.opennms.netmgt.model.OnmsCriteria; import org.opennms.netmgt.model.ReportCatalogEntry; import org.opennms.reporting.core.svclayer.ReportServiceLocator; import org.opennms.reporting.core.svclayer.ReportStoreService; import java.io.File; import java.io.OutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; /** * <p>DefaultReportStoreService class.</p> */ public class DefaultReportStoreService implements ReportStoreService { private ReportCatalogDao m_reportCatalogDao; private ReportServiceLocator m_reportServiceLocator; private GlobalReportRepository m_globalReportRepository; private static final String LOG4J_CATEGORY = "OpenNMS.Report"; private final ThreadCategory log; /** * <p>Constructor for DefaultReportStoreService.</p> */ public DefaultReportStoreService () { String oldPrefix = ThreadCategory.getPrefix(); ThreadCategory.setPrefix(LOG4J_CATEGORY); log = ThreadCategory.getInstance(DefaultReportStoreService.class); ThreadCategory.setPrefix(oldPrefix); } /** * <p>delete</p> * * @param ids an array of {@link java.lang.Integer} objects. */ public void delete(Integer[] ids) { for (Integer id : ids) { delete(id); } } /** * <p>delete</p> * * @param id a {@link java.lang.Integer} object. */ public void delete(Integer id) { String deleteFile = new String(m_reportCatalogDao.get(id).getLocation()); boolean success = (new File(deleteFile).delete()); if (success) { log().debug("deleted report XML file: " + deleteFile); } else { log().warn("unable to delete report XML file: " + deleteFile + " will delete reportCatalogEntry anyway"); } m_reportCatalogDao.delete(id); } /** * <p>getAll</p> * * @return a {@link java.util.List} object. */ public List<ReportCatalogEntry> getAll() { OnmsCriteria onmsCrit = new OnmsCriteria(ReportCatalogEntry.class); onmsCrit.addOrder(Order.desc("date")); return m_reportCatalogDao.findMatching(onmsCrit); } /** * <p>getFormatMap</p> * * @return a {@link java.util.Map} object. */ public Map<String, Object> getFormatMap() { HashMap <String, Object> formatMap = new HashMap<String, Object>(); //TODO Tak: This call will be heavy if many RemoteRepositories are involved. Is this method necessary? //TODO Tak: Not working Repository By Repository List <BasicReportDefinition> reports = m_globalReportRepository.getAllReports(); Iterator<BasicReportDefinition> reportIter = reports.iterator(); while (reportIter.hasNext()) { BasicReportDefinition report = reportIter.next(); String id = report.getId(); String service = report.getReportService(); List <ReportFormat> formats = m_reportServiceLocator.getReportService(service).getFormats(id); formatMap.put(id, formats); } return formatMap; } /** {@inheritDoc} */ public void render(Integer id, ReportFormat format, OutputStream outputStream) { ReportCatalogEntry catalogEntry = m_reportCatalogDao.get(id); String reportServiceName = m_globalReportRepository.getReportService(catalogEntry.getReportId()); ReportService reportService = m_reportServiceLocator.getReportService(reportServiceName); log().debug("attempting to rended the report as " + format.toString() + " using " + reportServiceName ); try { reportService.render(catalogEntry.getReportId(), catalogEntry.getLocation(), format, outputStream); } catch (ReportException e) { log.error("unable to render report", e); } } private ThreadCategory log() { return ThreadCategory.getInstance(getClass()); } /** {@inheritDoc} */ public void save(final ReportCatalogEntry reportCatalogEntry) { m_reportCatalogDao.save(reportCatalogEntry); m_reportCatalogDao.flush(); } /** {@inheritDoc} */ public void setReportCatalogDao(ReportCatalogDao reportCatalogDao) { m_reportCatalogDao = reportCatalogDao; } /** {@inheritDoc} */ public void setReportServiceLocator(ReportServiceLocator reportServiceLocator) { m_reportServiceLocator = reportServiceLocator; } /** * <p>setGlobalReportRepository</p> * * Set the global report repository which implements a local report for Community reports and remote * OpenNMS CONNECT repositories * * @param globalReportRepository a {@link org.opennms.features.reporting.repository.global.GlobalReportRepository} object */ public void setGlobalReportRepository(GlobalReportRepository globalReportRepository) { this.m_globalReportRepository = globalReportRepository; } }