/******************************************************************************* * 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.remote; import com.sun.jersey.api.client.GenericType; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.client.apache.ApacheHttpClient; import com.sun.jersey.client.apache.config.ApacheHttpClientConfig; import com.sun.jersey.client.apache.config.DefaultApacheHttpClientConfig; import org.apache.commons.beanutils.BeanUtils; import org.opennms.features.reporting.model.basicreport.BasicReportDefinition; import org.opennms.features.reporting.model.jasperreport.SimpleJasperReportDefinition; import org.opennms.features.reporting.model.remoterepository.RemoteRepositoryDefinition; import org.opennms.features.reporting.repository.ReportRepository; import org.opennms.features.reporting.sdo.RemoteReportSDO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.test.context.ContextConfiguration; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; /** * <p>DefaultRemoteRepository class.</p> * <p/> * Implementation of OpenNMS CONNECT CIO Report repository * * @author Markus Neumann <markus@opennms.com> * @version $Id: $ * @since 1.10.1 */ @ContextConfiguration(locations = { "classpath:META-INF/opennms/applicationContext-reportingRepository.xml", "classpath:META-INF/opennms/applicationContext-reportingDao.xml"}) public class DefaultRemoteRepository implements ReportRepository { /** * Logging */ private Logger logger = LoggerFactory.getLogger("OpenNMS.Report." + DefaultRemoteRepository.class.getName()); /** * Model for repository configuration for remote-repository.xml */ private RemoteRepositoryDefinition m_remoteRepositoryDefintion; /** * Jasper report version number */ private String m_jasperReportsVersion; /** * HTTP client for ReST connection */ private ApacheHttpClient m_client; /** * HTTP client connection configuration */ private ApacheHttpClientConfig m_clientConfig; /** * Data structure from ReST call */ private WebResource m_webResource; /** * Default constructor to initialize the ReST HTTP client * * @param remoteRepositoryDefinition a {@link org.opennms.features.reporting.model.remoterepository.RemoteRepositoryDefinition} object * @param jasperReportsVersion a {@link java.lang.String} object */ public DefaultRemoteRepository( RemoteRepositoryDefinition remoteRepositoryDefinition, String jasperReportsVersion) { this.m_remoteRepositoryDefintion = remoteRepositoryDefinition; this.m_jasperReportsVersion = jasperReportsVersion; m_clientConfig = new DefaultApacheHttpClientConfig(); m_clientConfig.getState().setCredentials(null, m_remoteRepositoryDefintion.getURI().getHost(), m_remoteRepositoryDefintion.getURI().getPort(), m_remoteRepositoryDefintion.getLoginUser(), m_remoteRepositoryDefintion.getLoginRepoPassword()); m_client = ApacheHttpClient.create(m_clientConfig); } /** * {@inheritDoc} */ @Override public List<BasicReportDefinition> getReports() { List<BasicReportDefinition> resultReports = new ArrayList<BasicReportDefinition>(); if (isConfigOk()) { m_webResource = m_client.resource(m_remoteRepositoryDefintion.getURI() + "reports" + "/" + m_jasperReportsVersion); List<RemoteReportSDO> webCallResult = new ArrayList<RemoteReportSDO>(); try { webCallResult = m_webResource.get(new GenericType<List<RemoteReportSDO>>() { }); } catch (Exception e) { logger.error("Error requesting report template from repository. Error message: '{}' Uri was: '{}'", e.getMessage(), m_webResource.getURI()); e.printStackTrace(); } logger.debug("getReports got '{}' RemoteReportSDOs from uri '{}'", webCallResult.size(), m_webResource.getURI()); resultReports = this.mapSDOListToBasicReportList(webCallResult); } return resultReports; } /** * {@inheritDoc} */ @Override public List<BasicReportDefinition> getOnlineReports() { List<BasicReportDefinition> resultReports = new ArrayList<BasicReportDefinition>(); List<RemoteReportSDO> webCallResult = new ArrayList<RemoteReportSDO>(); if (isConfigOk()) { m_webResource = m_client.resource(m_remoteRepositoryDefintion.getURI() + "onlineReports" + "/" + m_jasperReportsVersion); try { webCallResult = m_webResource.get(new GenericType<List<RemoteReportSDO>>() { }); } catch (Exception e) { logger.error("Error requesting online reports. Error message: '{}' URI was: '{}'", e.getMessage(), m_webResource.getURI()); e.printStackTrace(); } logger.debug("getOnlineReports got '{}' RemoteReportSDOs from uri '{}'", webCallResult.size(), m_webResource.getURI()); resultReports = this.mapSDOListToBasicReportList(webCallResult); } return resultReports; } /** * {@inheritDoc} */ @Override public String getReportService(String reportId) { reportId = reportId.substring(reportId.indexOf("_") + 1); String result = ""; if (isConfigOk()) { m_webResource = m_client.resource(m_remoteRepositoryDefintion.getURI() + "reportService/" + reportId); try { result = m_webResource.get(String.class); } catch (Exception e) { logger.error("Error requesting report service by report id. Error message: '{}' URI was: '{}'", e.getMessage(), m_webResource.getURI()); e.printStackTrace(); } logger.debug("getReportService for id / result: '{}' URI was: '{}' ", reportId + " / " + result, m_webResource.getURI()); } return result; } /** * {@inheritDoc} */ @Override public String getDisplayName(String reportId) { reportId = reportId.substring(reportId.indexOf("_") + 1); String result = ""; if (isConfigOk()) { m_webResource = m_client.resource(m_remoteRepositoryDefintion.getURI() + "displayName/" + reportId); try { result = m_webResource.get(String.class); } catch (Exception e) { logger.error("Error requesting display name by report id. Error message: '{}' URI was: '{}'", e.getMessage(), m_webResource.getURI()); e.printStackTrace(); } logger.debug("getDisplayName for id / result: '{}' URI was: '{}' ", reportId + " / " + result, m_webResource.getURI()); } return result; } /** * {@inheritDoc} */ @Override public String getEngine(String reportId) { reportId = reportId.substring(reportId.indexOf("_") + 1); String result = ""; if (isConfigOk()) { m_webResource = m_client.resource(m_remoteRepositoryDefintion.getURI() + "engine/" + reportId); try { result = m_webResource.get(String.class); } catch (Exception e) { logger.error("Error requesting engine by id. Error message: '{}' URI was: '{}'", e.getMessage(), m_webResource.getURI()); e.printStackTrace(); } logger.debug("getEngine for id / result: '{}' URI was: '{}' ", reportId + " / " + result, m_webResource.getURI()); } return result; } /** * {@inheritDoc} */ @Override public InputStream getTemplateStream(String reportId) { reportId = reportId.substring(reportId.indexOf("_") + 1); InputStream templateStreamResult = null; if (isConfigOk()) { m_webResource = m_client.resource(m_remoteRepositoryDefintion.getURI() + "templateStream/" + reportId); try { templateStreamResult = m_webResource.get(InputStream.class); } catch (Exception e) { logger.error("Error requesting template stream by id. Error message: '{}' URI was: '{}'", e.getMessage(), m_webResource.getURI()); e.printStackTrace(); } logger.debug("getTemplateStream for id / inputstream: '{}' URI was: '{}' ", reportId + " / " + templateStreamResult, m_webResource.getURI()); } return templateStreamResult; } /** * {@inheritDoc} */ @Override public String getRepositoryId() { logger.debug("getRepositoryId was called: '{}'", m_remoteRepositoryDefintion.getRepositoryId()); return this.m_remoteRepositoryDefintion.getRepositoryId(); } /** * {@inheritDoc} */ @Override public String getRepositoryName() { logger.debug("getRepositoryName was called: '{}'", m_remoteRepositoryDefintion.getRepositoryName()); return this.m_remoteRepositoryDefintion.getRepositoryName(); } /** * {@inheritDoc} */ @Override public String getRepositoryDescription() { logger.debug("getRepositoryDescription was called: '{}'", m_remoteRepositoryDefintion.getRepositoryDescription()); return this.m_remoteRepositoryDefintion.getRepositoryDescription(); } /** * {@inheritDoc} */ @Override public String getManagementUrl() { logger.debug("getRepositoryDescription was called: '{}'", m_remoteRepositoryDefintion.getRepositoryDescription()); return this.m_remoteRepositoryDefintion.getRepositoryManagementURL(); } private Boolean isConfigOk() { if (m_remoteRepositoryDefintion != null) { if (m_remoteRepositoryDefintion.isRepositoryActive()) { } else { logger.debug("RemoteRepository '{}' is NOT activated.", m_remoteRepositoryDefintion.getRepositoryName()); return false; } } else { logger.debug("Problem by RemoteRepository Config Access. RemoteRepository can't be used."); return false; } return true; } private List<BasicReportDefinition> mapSDOListToBasicReportList(List<RemoteReportSDO> remoteReportSDOList) { List<BasicReportDefinition> resultList = new ArrayList<BasicReportDefinition>(); for (RemoteReportSDO report : remoteReportSDOList) { SimpleJasperReportDefinition result = new SimpleJasperReportDefinition(); try { BeanUtils.copyProperties(result, report); result.setId(m_remoteRepositoryDefintion.getRepositoryId() + "_" + result.getId()); } catch (IllegalAccessException e) { logger.debug("SDO to BasicReport mapping IllegalAssessException while copyProperties from '{}' to '{}' with exception.", report, result); logger.error("SDO to BasicReport mapping IllegalAssessException while copyProperties '{}' RepositoryURI: '{}'", e, m_remoteRepositoryDefintion.getURI()); e.printStackTrace(); } catch (InvocationTargetException e) { logger.debug("SDO to BasicReport mapping InvocationTargetException while copyProperties from '{}' to '{}' with exception.", report, result); logger.error("SDO to BasicReport mapping InvocationTargetException while copyProperties '{}' RepositoryURI: '{}'", e, m_remoteRepositoryDefintion.getURI()); e.printStackTrace(); } logger.debug("SDO to BasicReport mapping got: '{}'", report.toString()); resultList.add(result); } logger.debug("SDO to BasicReport mapping returns resultList: '{}'", resultList.toString()); return resultList; } @Override public void loadConfiguration() { logger.debug("reloading for configuration was called. No reoad for remote repository possible."); } }