package com.github.pfichtner.jrunalyser.ui.mapprofile.config; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Iterables.filter; import java.math.BigDecimal; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.renderer.xy.XYItemRenderer; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import com.github.pfichtner.jrunalyser.base.data.LinkedTrackPoint; import com.github.pfichtner.jrunalyser.base.data.stat.Predicates; import com.github.pfichtner.jrunalyser.base.data.track.Track; import com.google.common.base.Function; public class DefaultDatasetConfig implements DatasetConfig { public static class Builder { private final int index; private String description; private Function<LinkedTrackPoint, ? extends Number> yFunc; private XYItemRenderer renderer; public Builder(int index) { this.index = index; } public DefaultDatasetConfig.Builder description(String description) { this.description = description; return this; } public DefaultDatasetConfig.Builder yFunc( Function<LinkedTrackPoint, ? extends Number> yFunc) { this.yFunc = yFunc; return this; } public DefaultDatasetConfig.Builder renderer(XYItemRenderer renderer) { this.renderer = renderer; return this; } public DefaultDatasetConfig build() { return new DefaultDatasetConfig(this); } } private final int index; private final String description; private final Function<LinkedTrackPoint, ? extends Number> yFunc; private final XYItemRenderer renderer; private DefaultDatasetConfig(Builder builder) { checkArgument(builder.index >= 0); this.index = builder.index; this.description = checkNotNull(builder.description); this.yFunc = checkNotNull(builder.yFunc); this.renderer = checkNotNull(builder.renderer); } public int getIndex() { return this.index; } public String getDescription() { return this.description; } public XYItemRenderer getRenderer() { return this.renderer; } public NumberAxis createNumberAxis(Track track) { return new NumberAxis(this.description); } public XYDataset createDataset(Track track, Function<LinkedTrackPoint, ? extends Number> xFunc) { return createDataset(track, xFunc, this.yFunc, this.description); } private static XYDataset createDataset(Track track, Function<LinkedTrackPoint, ? extends Number> xValFunc, Function<LinkedTrackPoint, ? extends Number> yValFunc, String key) { final XYSeries series = new XYSeries(key, false, false); BigDecimal absX = BigDecimal.ZERO; for (LinkedTrackPoint tpd : filter(track.getTrackpoints(), Predicates.LinkedWayPoints.hasLink())) { Number nextX = xValFunc.apply(tpd); Number y = yValFunc.apply(tpd); if (nextX.doubleValue() > 0.0 && isValid(nextX) && isValid(y)) { absX = absX.add(new BigDecimal(nextX.toString())); series.add(absX, y); } } return new XYSeriesCollection(series); } private static boolean isValid(Number value) { return !(value instanceof Double) || (!Double.isNaN(value.doubleValue()) && !Double .isInfinite(value.doubleValue())); } }