/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2007-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.features.reporting.repository.global;
import org.opennms.features.reporting.dao.remoterepository.RemoteRepositoryConfigDao;
import org.opennms.features.reporting.model.basicreport.BasicReportDefinition;
import org.opennms.features.reporting.model.remoterepository.RemoteRepositoryDefinition;
import org.opennms.features.reporting.repository.ReportRepository;
import org.opennms.features.reporting.repository.remote.DefaultRemoteRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
/**
* <p>DefaultGlobalReportRepository class.</p>
* Class realize the global report repository. It provides access to a local-repository and all configured remote-repositories.
*
* @author Markus Neumann <markus@opennms.com>
* @author Ronny Trommer <ronny@opennms.com>
* @version $Id: $
* @since 1.10
*/
public class DefaultGlobalReportRepository implements GlobalReportRepository {
/**
* Logging
*/
private final Logger logger = LoggerFactory.getLogger("OpenNMS.Report." + DefaultGlobalReportRepository.class.getName());
/**
* Configuration DAO to get configured remote-repositories.
*/
private RemoteRepositoryConfigDao m_remoteRepositoryConfigDao;
/**
* The local report-repository.
*/
private ReportRepository m_localReportRepository;
/**
* Separator for repositoryId and reportId.
*/
private final String REPOSITORY_REPORT_SEP = "_";
/**
* List of repositories managed by this class.
*/
private final List<ReportRepository> m_repositoryList;
/**
* JasperReports version number.
*/
private String m_jasperReportVersion;
/**
* Default constructor creates one local-repository and all configured remote-repositories.
*/
public DefaultGlobalReportRepository(RemoteRepositoryConfigDao remoteRepositoryConfigDao, ReportRepository localReportRepository) {
m_remoteRepositoryConfigDao = remoteRepositoryConfigDao;
m_localReportRepository = localReportRepository;
// Get the jasper report version from opennms.properties
m_jasperReportVersion = System.getProperty("org.opennms.jasperReportsVersion");
this.m_repositoryList = new ArrayList<ReportRepository>();
try {
logger.debug("Config resource is set to '{}'", m_remoteRepositoryConfigDao.toString());
Assert.notNull(m_remoteRepositoryConfigDao, "remote repository config dao property configResource must be set to a non-null value");
logger.debug("Local report repository is set to '{}'", m_localReportRepository.toString());
Assert.notNull(m_localReportRepository, "local report repository property must be set to a non-null value");
} catch (Exception e) {
logger.error("Error during create a default global report repository. Error message: '{}'", e.getMessage());
}
try {
logger.debug("JasperReports version is set to '{}'", m_jasperReportVersion);
Assert.notNull(m_jasperReportVersion, "jasper report version must be set to a non-null value");
} catch (Exception e) {
logger.error("Jasper report version must be set in opennms.properties. Error message: '{}'", e.getMessage());
}
setRemoteRepositoryConfigDao(remoteRepositoryConfigDao);
}
/**
* {@inheritDoc}
*/
@Override
public List<BasicReportDefinition> getAllReports() {
List<BasicReportDefinition> results = new ArrayList<BasicReportDefinition>();
for (ReportRepository repository : m_repositoryList) {
results.addAll(repository.getReports());
}
logger.debug("getAllReports was called result: '{}'", results);
return results;
}
/**
* {@inheritDoc}
*/
@Override
public List<BasicReportDefinition> getReports(String repositoryId) {
List<BasicReportDefinition> results = new ArrayList<BasicReportDefinition>();
ReportRepository repository = this.getRepositoryById(repositoryId);
if (repository != null) {
results.addAll(repository.getReports());
}
logger.debug("getReports was called for: '{}' result: '{}'", repositoryId, results);
return results;
}
/**
* {@inheritDoc}
*/
@Override
public List<BasicReportDefinition> getAllOnlineReports() {
List<BasicReportDefinition> results = new ArrayList<BasicReportDefinition>();
for (ReportRepository repository : m_repositoryList) {
results.addAll(repository.getOnlineReports());
}
logger.debug("getAllOnlineReports was called result: '{}'", results);
return results;
}
/**
* {@inheritDoc}
*/
@Override
public List<BasicReportDefinition> getOnlineReports(String repositoryId) {
List<BasicReportDefinition> results = new ArrayList<BasicReportDefinition>();
ReportRepository repository = this.getRepositoryById(repositoryId);
if (repository != null) {
results.addAll(repository.getOnlineReports());
}
logger.debug("getOnlineReports was called for: '{}' result: '{}'", repositoryId, results);
return results;
}
/**
* {@inheritDoc}
*/
@Override
public String getReportService(String reportId) {
String result = "";
ReportRepository repository = this.getRepositoryForReport(reportId);
if (repository != null) {
result = repository.getReportService(reportId);
}
logger.debug("getReportService was called for: '{}' result: '{}'", reportId, result);
return result;
}
/**
* {@inheritDoc}
*/
@Override
public String getDisplayName(String reportId) {
String result = "";
ReportRepository repository = this.getRepositoryForReport(reportId);
if (repository != null) {
result = repository.getDisplayName(reportId);
}
logger.debug("getDisplayName was called for: '{}' result: '{}'", reportId, result);
return result;
}
/**
* {@inheritDoc}
*/
@Override
public String getEngine(String reportId) {
String result = "";
ReportRepository repository = this.getRepositoryForReport(reportId);
if (repository != null) {
result = repository.getEngine(reportId);
}
logger.debug("getEngine was called for: '{}' result: '{}'", reportId, result);
return result;
}
/**
* {@inheritDoc}
*/
@Override
public InputStream getTemplateStream(String reportId) {
InputStream templateStream = null;
ReportRepository repository = this.getRepositoryForReport(reportId);
if (repository != null) {
templateStream = repository.getTemplateStream(reportId);
}
logger.debug("getTemplateStream was called for: '{}' result: '{}'", reportId, templateStream);
return templateStream;
}
/**
* {@inheritDoc}
*/
@Override
public List<ReportRepository> getRepositoryList() {
logger.debug("getRepositoryList was called, result: '{}'", m_repositoryList);
return m_repositoryList;
}
/**
* Add a report repository.
*
* @param repository a ReportRepository
*/
@Override
public void addReportRepository(ReportRepository repository) {
logger.debug("addReportRepository was called for: '{}'", repository);
m_repositoryList.add(repository);
}
/**
* Get a specific repository identified by repository id.
*
* @param repositoryId a String as repository identifier
* @return report repository as {@link org.opennms.features.reporting.repository.ReportRepository} object
*/
@Override
public ReportRepository getRepositoryById(String repositoryId) {
for (ReportRepository repository : m_repositoryList) {
if (repositoryId.equals(repository.getRepositoryId())) {
//leave if we have a repository
logger.debug("getRepositoryById was called for: '{}' result: '{}'", repositoryId, repository);
return repository;
}
}
logger.debug("getRepositoryById was called for: '{}' result: '{}'", repositoryId, null);
// we haven't a repository with repositoryId
return null;
}
/**
* Get a specific repository identified by a report id.
*
* @param reportId a String as report identifier
* @return report repository as {@link org.opennms.features.reporting.repository.ReportRepository} object
*/
protected ReportRepository getRepositoryForReport(String reportId) {
String repositoryId = reportId.substring(0, reportId.indexOf(REPOSITORY_REPORT_SEP));
logger.debug("getRepositoryForReport was called for: '{}' result repository: '{}'", reportId, repositoryId);
return this.getRepositoryById(repositoryId);
}
/**
* <p>setLocalReportRepository</p>
* <p/>
* Set the legacy local repository which provides all OpenNMS community reports
*
* @param reportRepository a {@link org.opennms.features.reporting.repository.local.LegacyLocalReportRepository} object
*/
public void setLocalReportRepository(ReportRepository reportRepository) {
m_localReportRepository = reportRepository;
}
/**
* <p>getReportRepository</p>
* <p/>
* Get the legacy local repository which provides all OpenNMS community reports
*
* @return a {@link org.opennms.features.reporting.repository.local.LegacyLocalReportRepository} object
*/
public ReportRepository getReportRepository() {
return m_localReportRepository;
}
/**
* <p>setRemoteRepositoryConfigDao</p>
* <p/>
* Set the default remote report repository which provides access to OpenNMS CONNECT reports
*
* @param remoteRepositoryConfigDao a {@link org.opennms.features.reporting.repository.remote.DefaultRemoteRepository} object
*/
//TODO Ronny: it's more then a simple setter refactor it.
public void setRemoteRepositoryConfigDao(RemoteRepositoryConfigDao remoteRepositoryConfigDao) {
m_remoteRepositoryConfigDao = remoteRepositoryConfigDao;
/**
* Clear all local-repositories, then
* Add local-repository to repository list.
*/
this.m_repositoryList.clear();
this.m_repositoryList.add(m_localReportRepository);
/**
* Add all active remote-repositories configured at remoteRepositoryConfigDao, to repositorylist.
*/
//TODO tak: This is tricky to test and to mock, we have to refactor this
try {
for (RemoteRepositoryDefinition repositoryDefinition : m_remoteRepositoryConfigDao.getActiveRepositories()) {
this.m_repositoryList.add(new DefaultRemoteRepository(repositoryDefinition, m_jasperReportVersion));
}
} catch (Exception e) {
logger.error("Could not add configured remote repositories in default global report repository. Error message: '{}'", e.getMessage());
}
}
/**
* <p>getRemoteRepositoryConfigDao</p>
* <p/>
* Get config Dao for remote-repositories
* @return a {@link org.opennms.features.reporting.repository.remote.DefaultRemoteRepository} object
*/
public RemoteRepositoryConfigDao getRemoteRepositoryConfigDao() {
return m_remoteRepositoryConfigDao;
}
@Override
public void reloadConfigurationFiles() {
try {
m_remoteRepositoryConfigDao.loadConfiguration();
this.setRemoteRepositoryConfigDao(m_remoteRepositoryConfigDao);
m_localReportRepository.loadConfiguration();
} catch (Exception e) {
logger.error("Could not reload configuration on repositories: '{}'", e.getMessage());
}
}
}