package com.github.pfichtner.jrunalyser.base.data;
import java.io.Serializable;
import java.util.concurrent.TimeUnit;
public class DefaultLink implements Link, Serializable {
private static final long serialVersionUID = 2772636706910732866L;
private final WayPoint next;
private final int elevationDifference;
private final Distance distance;
private final Duration duration;
private final Speed speed;
private final Gradient gradient;
public DefaultLink(WayPoint actual, WayPoint next, Distance distance,
Duration duration) {
this.next = next;
this.duration = duration;
this.elevationDifference = next.getElevation() == null
|| actual.getElevation() == null ? 0 : next.getElevation()
.intValue() - actual.getElevation().intValue();
this.distance = distance;
this.speed = new DefaultSpeed(distance, duration);
this.gradient = DefaultGradient.of(distance, DefaultDistance.of(
this.elevationDifference, DistanceUnit.METERS));
}
public static DefaultLink of(WayPoint wp1, WayPoint wp2) {
Distance di = GeoUtil.calcDistance(wp1, wp2);
Duration du = DefaultDuration.of(wp2.getTime().longValue()
- wp1.getTime().longValue(), TimeUnit.MILLISECONDS);
return new DefaultLink(wp1, wp2, di, du);
}
public int getElevationDifference() {
return this.elevationDifference;
}
public Distance getDistance() {
return this.distance;
}
public Duration getDuration() {
return this.duration;
}
public Speed getSpeed() {
return this.speed;
}
@Override
public Gradient getGradient() {
return this.gradient;
}
public WayPoint getNext() {
return this.next;
}
@Override
public String toString() {
return "DefaultLink [next=" + System.identityHashCode(this.next)
+ ", elevationDifference=" + this.elevationDifference
+ ", distance=" + this.distance + ", duration=" + this.duration
+ ", speed=" + this.speed + ", gradient=" + this.gradient + "]";
}
}