package de.invesdwin.util.time; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import javax.annotation.concurrent.Immutable; import de.invesdwin.util.bean.AValueObject; import de.invesdwin.util.time.duration.Duration; import de.invesdwin.util.time.fdate.FDate; import de.invesdwin.util.time.fdate.FDates; @Immutable public class TimeRange extends AValueObject { private final FDate from; private final FDate to; public TimeRange(final FDate from, final FDate to) { this.from = from; this.to = to; } public FDate getFrom() { return from; } public FDate getTo() { return to; } public Duration getDuration() { if (from == null || to == null) { return null; } else { return new Duration(from, to); } } @Override public String toString() { return getFrom() + " -> " + getTo() + " => " + getDuration(); } public TimeRange asNonNull(final FDate fromNullReplacement, final FDate toNullReplacement) { final FDate usedFrom; if (from == null) { usedFrom = fromNullReplacement; } else { usedFrom = from; } final FDate usedTo; if (to == null) { usedTo = toNullReplacement; } else { usedTo = to; } return new TimeRange(usedFrom, usedTo); } public static List<Duration> extractDurations(final Iterable<TimeRange> timeRanges) { final List<Duration> durations = new ArrayList<Duration>(); for (final TimeRange pr : timeRanges) { durations.add(pr.getDuration()); } return durations; } public static List<FDate> extractFroms(final Iterable<TimeRange> timeRanges) { final List<FDate> durations = new ArrayList<FDate>(); for (final TimeRange pr : timeRanges) { durations.add(pr.getFrom()); } return durations; } public static List<FDate> extractTos(final Iterable<TimeRange> timeRanges) { final List<FDate> durations = new ArrayList<FDate>(); for (final TimeRange pr : timeRanges) { durations.add(pr.getTo()); } return durations; } public static TimeRange avg(final List<TimeRange> timeRanges) { final FDate avgFrom = FDates.avg(extractFroms(timeRanges)); final FDate avgTo = FDates.avg(extractTos(timeRanges)); return new TimeRange(avgFrom, avgTo); } public boolean isZeroDuration() { return from == null || to == null || getDuration().isZero(); } public static void putTimeRange(final ByteBuffer buffer, final TimeRange timeRange) { if (timeRange == null) { buffer.putLong(Long.MAX_VALUE); buffer.putLong(Long.MAX_VALUE); } else { FDates.putFDate(buffer, timeRange.getFrom()); FDates.putFDate(buffer, timeRange.getTo()); } } public static TimeRange extractTimeRange(final ByteBuffer buffer, final int index) { final long from = buffer.getLong(index); final long to = buffer.getLong(index + 8); if (from == Long.MAX_VALUE && to == Long.MAX_VALUE) { return null; } else { return new TimeRange(FDates.extractFDate(buffer, index), FDates.extractFDate(buffer, index + 8)); } } }