package com.awsmithson.tcx2nikeplus.nike; import com.google.common.base.Preconditions; import javax.annotation.Nonnull; import java.math.BigDecimal; import java.util.List; /** * Utility class for (de)serializing objects to/from JSON format, using the GSON library. */ public class RunJson { private final @Nonnull BigDecimal distance; private final @Nonnull BigDecimal duration; private final long startTime; private final @Nonnull String status; private final @Nonnull String timeZoneId; private final @Nonnull String type; private final @Nonnull List<Detail> detail; private final @Nonnull Summary summary; public RunJson(@Nonnull BigDecimal distance, @Nonnull BigDecimal duration, long startTime, @Nonnull String status, @Nonnull String timeZoneId, @Nonnull String type, @Nonnull List<Detail> detail, @Nonnull Summary summary) { this.distance = Preconditions.checkNotNull(distance, "distance argument is null."); this.duration = Preconditions.checkNotNull(duration, "duration argument is null."); this.startTime = startTime; this.status = Preconditions.checkNotNull(status, "status argument is null."); this.timeZoneId = Preconditions.checkNotNull(timeZoneId, "timeZoneId argument is null."); this.type = Preconditions.checkNotNull(type, "type argument is null."); this.detail = Preconditions.checkNotNull(detail, "detail argument is null."); this.summary = Preconditions.checkNotNull(summary, "summary argument is null."); } public @Nonnull BigDecimal getDistance() { return distance; } public @Nonnull BigDecimal getDuration() { return duration; } public static class Detail { private final @Nonnull String metricType; private final @Nonnull String intervalType; private final @Nonnull String intervalUnit; private final long startTimeOffset; private final @Nonnull String intervalMetric; private final @Nonnull String objType; private final @Nonnull List<BigDecimal> value; public Detail(@Nonnull String metricType, @Nonnull String intervalType, @Nonnull String intervalUnit, long startTimeOffset, @Nonnull String intervalMetric, @Nonnull String objType, @Nonnull List<BigDecimal> value) { this.metricType = Preconditions.checkNotNull(metricType, "metricType argument is null."); this.intervalType = Preconditions.checkNotNull(intervalType, "intervalType argument is null."); this.intervalUnit = Preconditions.checkNotNull(intervalUnit, "intervalUnit argument is null."); this.startTimeOffset = startTimeOffset; this.intervalMetric = Preconditions.checkNotNull(intervalMetric, "intervalMetric argument is null."); this.objType = Preconditions.checkNotNull(objType, "objType argument is null."); this.value = Preconditions.checkNotNull(value, "value argument is null."); } } public static class Summary { private final @Nonnull List<Snapshot> snapshots; private final @Nonnull List<DeviceConfig> deviceConfig; public Summary(@Nonnull List<Snapshot> snapshots, @Nonnull List<DeviceConfig> deviceConfig) { this.snapshots = Preconditions.checkNotNull(snapshots, "value argument is null."); this.deviceConfig = Preconditions.checkNotNull(deviceConfig, "value argument is null."); } public static class Snapshot { private final @Nonnull String name; private final @Nonnull List<DataSeries> dataSeries; public Snapshot(@Nonnull String name, @Nonnull List<DataSeries> dataSeries) { this.name = Preconditions.checkNotNull(name, "value argument is null."); this.dataSeries = Preconditions.checkNotNull(dataSeries, "dataSeries argument is null."); } public static class DataSeries { private final @Nonnull Metrics metrics; private final @Nonnull String objType; public DataSeries(@Nonnull Metrics metrics, @Nonnull String objType) { this.metrics = Preconditions.checkNotNull(metrics, "metrics argument is null."); this.objType = Preconditions.checkNotNull(objType, "objType argument is null."); } public static class Metrics { private final int distance; private final long duration; public Metrics(int distance, long duration) { this.distance = distance; this.duration = duration; } } } } public static class DeviceConfig { private final @Nonnull Component component; public DeviceConfig(@Nonnull Component component) { this.component = Preconditions.checkNotNull(component, "component argument is null."); } public static class Component { private final @Nonnull String type; private final @Nonnull String category; public Component(@Nonnull String type, @Nonnull String category) { this.type = Preconditions.checkNotNull(type, "type argument is null."); this.category = Preconditions.checkNotNull(category, "category argument is null."); } } } } }