de.heartbeat.charts.AverageLineChart.java Source code

Java tutorial

Introduction

Here is the source code for de.heartbeat.charts.AverageLineChart.java

Source

/*
 * Copyright 2015 momo.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package de.heartbeat.charts;

import com.googlecode.wickedcharts.highcharts.options.Axis;
import com.googlecode.wickedcharts.highcharts.options.ChartOptions;
import com.googlecode.wickedcharts.highcharts.options.CssStyle;
import com.googlecode.wickedcharts.highcharts.options.DataLabels;
import com.googlecode.wickedcharts.highcharts.options.Function;
import com.googlecode.wickedcharts.highcharts.options.Labels;
import com.googlecode.wickedcharts.highcharts.options.Legend;
import com.googlecode.wickedcharts.highcharts.options.Options;
import com.googlecode.wickedcharts.highcharts.options.PlotBand;
import com.googlecode.wickedcharts.highcharts.options.PlotOptions;
import com.googlecode.wickedcharts.highcharts.options.PlotOptionsChoice;
import com.googlecode.wickedcharts.highcharts.options.SeriesType;
import com.googlecode.wickedcharts.highcharts.options.Title;
import com.googlecode.wickedcharts.highcharts.options.Tooltip;
import com.googlecode.wickedcharts.highcharts.options.color.HighchartsColor;
import com.googlecode.wickedcharts.highcharts.options.color.RgbaColor;
import com.googlecode.wickedcharts.highcharts.options.series.Series;
import com.googlecode.wickedcharts.highcharts.options.series.SimpleSeries;
import com.googlecode.wickedcharts.wicket7.highcharts.Chart;
import de.heartbeat.backend.GraphPage;
import de.heartbeat.datastorage.HibernateUtil;
import de.heartbeat.datastorage.entities.HeartBeat;
import de.heartbeat.datastorage.entities.Person;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.StringValue;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author momo
 */
public class AverageLineChart extends GraphPage {

    private final SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
    private List<HeartBeat> heartBeatList = new ArrayList<>();

    public AverageLineChart(PageParameters parameters) {
        super(parameters);
        StringValue deviceId = parameters.get("deviceId");
        Person person;
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        person = (Person) session.createCriteria(Person.class)
                .add(Restrictions.like("deviceID", deviceId.toString())).uniqueResult();
        heartBeatList = person.getHeartbeats();
        session.getTransaction().commit();
        session.close();
        Collections.sort(heartBeatList);
        Options options = new Options();
        options.setTitle(new Title("Overview"));

        ChartOptions chartOptions = new ChartOptions();
        chartOptions.setType(SeriesType.COLUMN);
        chartOptions.setMarginRight(130);
        chartOptions.setMarginBottom(25);
        options.setChartOptions(chartOptions);

        List<PlotBand> plotBands = new ArrayList<>();
        plotBands.add(createPlotBand("HIGH", 120, 10000, true));
        plotBands.add(createPlotBand("NORMAL", 45, 120, false));
        plotBands.add(createPlotBand("LOW", 0, 45, true));

        Title title = new Title("Average Pulse");
        title.setX(-20);
        options.setTitle(title);

        Axis xAxis = new Axis();
        xAxis.setCategories(Arrays.asList(new String[] { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
                "Sep", "Oct", "Nov", "Dec" }));
        options.setxAxis(xAxis);

        Axis yAxis = new Axis();
        yAxis.setPlotBands(plotBands);
        yAxis.setTitle(new Title("Pulse"));
        options.setyAxis(yAxis);
        options.setLegend(new Legend(Boolean.FALSE));
        options.setTooltip(new Tooltip()
                .setFormatter(new Function().setFunction(" return ''+ this.x +': '+ this.y.toFixed(2) +' bpm';")));

        DataLabels dataLabels = new DataLabels(Boolean.TRUE);

        options.setPlotOptions(new PlotOptionsChoice().setColumn(new PlotOptions()
                .setDataLabels(new DataLabels().setEnabled(Boolean.TRUE).setColor(new HighchartsColor(0))
                        .setFormatter(new Function("return this.y.toFixed(2)  +\" bpm\";")))));

        Series<Number> series = new SimpleSeries();
        List<Number> data = calculatePulse(heartBeatList);
        series.setData(data);
        options.addSeries(series);

        add(new Chart("chart", options));
    }

    private List<Number> calculatePulse(List<HeartBeat> list) {
        List<Number> averagePerMonth = new ArrayList<>();

        List<HeartBeat> jan = new ArrayList<>();
        List<HeartBeat> feb = new ArrayList<>();
        List<HeartBeat> march = new ArrayList<>();
        List<HeartBeat> april = new ArrayList<>();
        List<HeartBeat> may = new ArrayList<>();
        List<HeartBeat> jun = new ArrayList<>();
        List<HeartBeat> jul = new ArrayList<>();
        List<HeartBeat> aug = new ArrayList<>();
        List<HeartBeat> sep = new ArrayList<>();
        List<HeartBeat> oct = new ArrayList<>();
        List<HeartBeat> nov = new ArrayList<>();
        List<HeartBeat> dez = new ArrayList<>();

        Date date;
        int month;
        for (HeartBeat hbItem : list) {
            date = new Date(hbItem.getTime().getTime());
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            month = cal.get(Calendar.MONTH);

            switch (month) {
            case 0:
                jan.add(hbItem);
                break;
            case 1:
                feb.add(hbItem);
                break;
            case 2:
                march.add(hbItem);
                break;
            case 3:
                april.add(hbItem);
                break;
            case 4:
                may.add(hbItem);
                break;
            case 5:
                jun.add(hbItem);
                break;
            case 6:
                jul.add(hbItem);
                break;
            case 7:
                aug.add(hbItem);
                break;
            case 8:
                sep.add(hbItem);
                break;
            case 9:
                oct.add(hbItem);
                break;
            case 10:
                nov.add(hbItem);
                break;
            case 11:
                dez.add(hbItem);
                break;
            }
        }

        double average = 0;
        for (HeartBeat hb : jan) {
            average += Double.parseDouble(hb.getPulse());
        }
        average = average / jan.size();
        averagePerMonth.add(average);
        average = 0;
        for (HeartBeat hb : feb) {
            average += Double.parseDouble(hb.getPulse());
        }
        average = average / feb.size();
        averagePerMonth.add(average);
        average = 0;
        for (HeartBeat hb : march) {
            average += Double.parseDouble(hb.getPulse());
        }
        average = average / march.size();
        averagePerMonth.add(average);
        average = 0;
        for (HeartBeat hb : april) {
            average += Double.parseDouble(hb.getPulse());
        }
        average = average / april.size();
        averagePerMonth.add(average);
        average = 0;
        for (HeartBeat hb : may) {
            average += Double.parseDouble(hb.getPulse());
        }
        average = average / may.size();
        averagePerMonth.add(average);
        average = 0;
        for (HeartBeat hb : jun) {
            average += Double.parseDouble(hb.getPulse());
        }
        average = average / jun.size();
        averagePerMonth.add(average);
        average = 0;
        for (HeartBeat hb : jul) {
            average += Double.parseDouble(hb.getPulse());
        }
        average = average / jul.size();
        averagePerMonth.add(average);
        average = 0;
        for (HeartBeat hb : aug) {
            average += Double.parseDouble(hb.getPulse());
        }
        average = average / aug.size();
        averagePerMonth.add(average);
        average = 0;
        for (HeartBeat hb : sep) {
            average += Double.parseDouble(hb.getPulse());
        }
        average = average / sep.size();
        averagePerMonth.add(average);
        average = 0;
        for (HeartBeat hb : oct) {
            average += Double.parseDouble(hb.getPulse());
        }
        average = average / oct.size();
        averagePerMonth.add(average);
        average = 0;
        for (HeartBeat hb : nov) {
            average += Double.parseDouble(hb.getPulse());
        }
        average = average / nov.size();
        averagePerMonth.add(average);
        average = 0;
        for (HeartBeat hb : dez) {
            average += Double.parseDouble(hb.getPulse());
        }
        average = average / dez.size();
        averagePerMonth.add(average);
        double value;
        for (int k = 0; k <= averagePerMonth.size() - 1; k++) {
            value = (double) averagePerMonth.get(k);
            if (Double.isNaN((double) value)) {
                averagePerMonth.set(k, (double) 0);
            }
        }

        return averagePerMonth;
    }

    private PlotBand createPlotBand(final String label, final float from, final float to,
            final boolean highlighted) {
        Labels plotBandLabel = new Labels(label);
        plotBandLabel.setStyle(new CssStyle());

        PlotBand plotBand = new PlotBand();
        plotBand.setFrom(from);
        plotBand.setTo(to);
        plotBand.setLabel(plotBandLabel);
        if (highlighted) {
            plotBand.setColor(new RgbaColor(205, 51, 51, 0.1f));
        } else {
            plotBand.setColor(new RgbaColor(135, 206, 250, 0.1f));
        }

        return plotBand;
    }
}