org.opennms.netmgt.jasper.analytics.HWForecastReportTest.java Source code

Java tutorial

Introduction

Here is the source code for org.opennms.netmgt.jasper.analytics.HWForecastReportTest.java

Source

/*******************************************************************************
 * This file is part of OpenNMS(R).
 *
 * Copyright (C) 2012-2015 The OpenNMS Group, Inc.
 * OpenNMS(R) is Copyright (C) 1999-2015 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 Affero 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero 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.jasper.analytics;

import java.io.File;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRCsvExporter;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleWriterExporterOutput;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import com.google.common.collect.Table;
import com.google.common.collect.TreeBasedTable;

public class HWForecastReportTest {
    @Rule
    public TemporaryFolder tempFolder = new TemporaryFolder();

    private JasperReport m_jasperReport;
    private JasperPrint m_jasperPrint;

    private File m_jrbFile;
    private String m_dsName;
    private long m_startTime;
    private long m_endTime;

    private File m_csvFile;

    @Test
    public void canForecastValues() throws Exception {
        useJrb();
        compile();
        fill();
        csv();
        verify();
    }

    private void useJrb() {
        m_jrbFile = new File("src/test/resources/forecasting/ifInOctets.jrb");
        assertTrue(m_jrbFile.canRead());
        m_dsName = "ifInOctets";
        m_startTime = 1414602000;
        m_endTime = 1417046400;
    }

    /*
    private void generateJrb() throws Exception {
    m_jrbFile = tempFolder.newFile();
    m_dsName = "test";
        
    final int secondsInYear = 60 * 60 * 24 * 365;
    final int numSlots = secondsInYear / 300;
        
    RrdDef def = new RrdDef(m_jrbFile.getAbsolutePath());
    def.setStep(300);
    def.addDatasource(m_dsName, "GAUGE", 300L, Double.NaN, Double.NaN);
    def.addArchive("RRA:AVERAGE:0.5:1:" + numSlots);
    RrdDb db = new RrdDb(def);
        
    // Fill in the values
    m_startTime = System.currentTimeMillis() / 1000;
    for (int i = 0; i < numSlots; i++) {
        long t = m_startTime + (i * 300);
        Sample sample = db.createSample();
        sample.setAndUpdate(t + ":" + 42);
    }
    m_endTime = m_startTime + ((numSlots - 1) * 300);
        
    db.close();
    }
    */

    private void compile() throws JRException {
        m_jasperReport = JasperCompileManager.compileReport("src/test/resources/forecasting/Forecast.jrxml");
    }

    private void fill() throws JRException {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put(JRParameter.IS_IGNORE_PAGINATION, true);

        params.put("jrbFile", m_jrbFile.getAbsolutePath());
        params.put("dsName", m_dsName);
        params.put("startDate", "" + m_startTime);
        params.put("endDate", "" + m_endTime);

        m_jasperPrint = JasperFillManager.fillReport(m_jasperReport, params);
    }

    private void csv() throws Exception {
        // Input
        SimpleExporterInput sei = new SimpleExporterInput(m_jasperPrint);

        // Output
        m_csvFile = tempFolder.newFile();
        SimpleWriterExporterOutput sweo = new SimpleWriterExporterOutput(m_csvFile);

        // Export
        JRCsvExporter exporter = new JRCsvExporter();
        exporter.setExporterInput(sei);
        exporter.setExporterOutput(sweo);
        exporter.exportReport();
    }

    private void verify() throws Exception {
        Table<Integer, String, Double> forecasts = TreeBasedTable.create();

        try (FileReader reader = new FileReader(m_csvFile);
                CSVParser parser = new CSVParser(reader, CSVFormat.RFC4180.withHeader());) {
            int k = 0;
            for (CSVRecord record : parser) {
                try {
                    Double fit = Double.parseDouble(record.get("HWFit"));
                    Double lwr = Double.parseDouble(record.get("HWLwr"));
                    Double upr = Double.parseDouble(record.get("HWUpr"));

                    if (Double.isNaN(fit)) {
                        continue;
                    }

                    forecasts.put(k, "fit", fit);
                    forecasts.put(k, "lwr", lwr);
                    forecasts.put(k, "upr", upr);

                    k++;
                } catch (NumberFormatException e) {
                    // pass
                }
            }
        }

        assertEquals(340, forecasts.rowKeySet().size());
        // First fitted value
        assertEquals(432.526086422424, forecasts.get(0, "fit"), 0.00001);
        // Last fitted value for which there is a known datapoint
        assertEquals(24079.4692522087, forecasts.get(327, "fit"), 0.00001);
        // First forecasted value
        assertEquals(22245.5417010936, forecasts.get(328, "fit"), 0.00001);
    }
}