Java tutorial
/* * 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; } }