/* * $Id: SleepDataTimeSeries.java,v 1.10 2010-12-16 23:13:53 illetsch Exp $ * Copyright 3kraft May 15, 2007 */ package com.dreikraft.axbo.timeseries; import com.dreikraft.axbo.data.MovementData; import com.dreikraft.axbo.data.SleepData; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.TimeZone; import org.jfree.data.time.RegularTimePeriod; import org.jfree.data.time.TimePeriod; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesDataItem; /** * @author jan_solo * @author $Author: illetsch $ * @version $Revision */ public class SleepDataTimeSeries extends TimeSeries { private final TimeZone timeZone; private final int maxMovements; private final Map<TimePeriod, Integer> movementsX; private final Map<TimePeriod, Integer> movementsY; @SuppressWarnings("LeakingThisInConstructor") public SleepDataTimeSeries(final String name, final SleepData sleepData, final Class<?> timePeriodClass, final int maxMovements) { super(name); this.maxMovements = maxMovements; movementsX = new HashMap<>(); movementsY = new HashMap<>(); // set start and end time timeZone = TimeZone.getDefault(); final RegularTimePeriod startTime = RegularTimePeriod.createInstance( timePeriodClass, sleepData.calculateStartTime(), timeZone); add(startTime, 0); final Date endTime = sleepData.calculateEndTime(); final RegularTimePeriod endTimePeriod = RegularTimePeriod.createInstance( timePeriodClass, endTime, timeZone); addOrUpdate(endTimePeriod, 0); for (MovementData movement : sleepData.getMovements()) { addMovementData(movement); } } public int getMaxMovements() { return maxMovements; } private void addMovementData(MovementData data) { // get time of movement final RegularTimePeriod timePeriod = RegularTimePeriod.createInstance( getTimePeriodClass(), data.getTimestamp(), timeZone); int x; Integer xOld; if ((x = data.getMovementsX()) > 0) { if ((xOld = movementsX.get(timePeriod)) != null) { x += xOld; } movementsX.put(timePeriod, x); } int y; Integer yOld; if ((y = data.getMovementsY()) > 0) { if ((yOld = movementsY.get(timePeriod)) != null) { y += yOld; } movementsY.put(timePeriod, y); } if (x + y > 0) { final int value = (x > y ? x : y); final int trimmedValue = value < maxMovements ? value : maxMovements; delete(timePeriod); add(new TimeSeriesDataItem(timePeriod, trimmedValue)); } } }