package eu.lod2.rsine.queryhandling.policies; import eu.lod2.rsine.queryhandling.EvaluationPostponedException; import eu.lod2.rsine.registrationservice.NotificationQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; import java.util.HashMap; import java.util.Map; public class MinTimePassedEvaluationPolicy implements IEvaluationPolicy { private final Logger logger = LoggerFactory.getLogger(MinTimePassedEvaluationPolicy.class); private long minMillisBetweenEvaluations; private Map<NotificationQuery, Long> timeBetweenEvaluations = new HashMap<NotificationQuery, Long>(); public MinTimePassedEvaluationPolicy(long minMillisBetweenEvaluations) { logger.info("Minimum milliseconds between evaluation: " +minMillisBetweenEvaluations); this.minMillisBetweenEvaluations = minMillisBetweenEvaluations; } @Override public void checkEvaluationNeeded(NotificationQuery query) { Date queryLastIssued = query.getLastIssued(); if (queryLastIssued == null) return; long millisPassed = new Date().getTime() - queryLastIssued.getTime(); if (millisPassed <= getMinTimeForQuery(query)) { throw new EvaluationPostponedException(); } } private long getMinTimeForQuery(NotificationQuery query) { Long time = timeBetweenEvaluations.get(query); if (time == null) { time = minMillisBetweenEvaluations + Math.round(Math.random() * 3 * minMillisBetweenEvaluations); timeBetweenEvaluations.put(query, time); } return time; } }