// Copyright © 2015 HSL <https://www.hsl.fi> // This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses. package fi.hsl.parkandride.core.domain.prediction; import org.joda.time.DateTime; import org.joda.time.Duration; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.Pattern; import java.util.regex.Matcher; import static org.joda.time.Duration.standardHours; import static org.joda.time.Duration.standardMinutes; public class PredictionRequest { public static final String HHMM_PATTERN = "((\\d+):)?(\\d+)"; @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) public DateTime at; @Pattern(regexp = HHMM_PATTERN) public String after; public DateTime requestedTime() { if (at != null) { return at; } if (after != null) { return DateTime.now().plus(parseRelativeTime(after)); } return DateTime.now(); } static Duration parseRelativeTime(String relativeTime) { Matcher matcher = java.util.regex.Pattern.compile(HHMM_PATTERN).matcher(relativeTime); if (matcher.matches()) { int hours = parseOptionalInt(matcher.group(2)); int minutes = Integer.parseInt(matcher.group(3)); return standardHours(hours).plus(standardMinutes(minutes)); } else { return Duration.ZERO; } } private static int parseOptionalInt(String s) { return s == null ? 0 : Integer.parseInt(s); } // generated getters and setters public DateTime getAt() { return at; } public void setAt(DateTime at) { this.at = at; } public String getAfter() { return after; } public void setAfter(String after) { this.after = after; } }