diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/EventStageCandidateCalculator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/EventStageCandidateCalculator.java index dbba6e86a69..41f36011c12 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/EventStageCandidateCalculator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/EventStageCandidateCalculator.java @@ -15,7 +15,7 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; public class EventStageCandidateCalculator implements EventVisitor { private final TimePoint now = MillisecondsTimePoint.now(); - private final SortedSet> featuredEvents = new TreeSet<>(FeaturedEventsComparator.INSTANCE); + private final SortedSet> featuredEvents = new TreeSet<>(new FeaturedEventsComparator()); @Override public void visit(EventBase event, boolean onRemoteServer, URL baseURL) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/FeaturedEventsComparator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/FeaturedEventsComparator.java index bd475ee6fa8..655503bdfbe 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/FeaturedEventsComparator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/FeaturedEventsComparator.java @@ -1,7 +1,11 @@ package com.sap.sailing.gwt.server; import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.gwt.ui.shared.start.StageEventType; import com.sap.sse.common.TimePoint; import com.sap.sse.common.TimeRange; @@ -10,15 +14,25 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.impl.TimeRangeImpl; public class FeaturedEventsComparator implements Comparator> { - public static final Comparator> INSTANCE = new FeaturedEventsComparator(); + + private final TimePoint now = MillisecondsTimePoint.now(); + private final Random randomizer = new Random(); + private final Map randomizedEvents = new HashMap<>(); @Override public int compare(Pair eventAndStageType1, Pair eventAndStageType2) { - TimePoint now = MillisecondsTimePoint.now(); - TimeRange event1Range = new TimeRangeImpl(eventAndStageType1.getB().event.getStartDate(), - eventAndStageType1.getB().event.getEndDate()); - TimeRange event2Range = new TimeRangeImpl(eventAndStageType2.getB().event.getStartDate(), - eventAndStageType2.getB().event.getEndDate()); - return event1Range.timeDifference(now).compareTo(event2Range.timeDifference(now)); + EventBase event1 = eventAndStageType1.getB().event, event2 = eventAndStageType2.getB().event; + TimeRange event1Range = new TimeRangeImpl(event1.getStartDate(), event1.getEndDate()); + TimeRange event2Range = new TimeRangeImpl(event2.getStartDate(), event2.getEndDate()); + int timeDiffComp = event1Range.timeDifference(now).compareTo(event2Range.timeDifference(now)); + return timeDiffComp == 0 ? getRandomValue(event1) - getRandomValue(event2) : timeDiffComp; + } + + private int getRandomValue(EventBase event) { + Integer randomValue = randomizedEvents.get(event); + if (randomValue == null) { + randomizedEvents.put(event, randomValue = randomizer.nextInt()); + } + return randomValue; } } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceImpl.java index ef98509eb7c..bd8d0a9779f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceImpl.java @@ -72,13 +72,14 @@ public class HomeServiceImpl extends ProxiedRemoteServiceServlet implements Home int count = 0; for(Pair pair : stageCandidateCalculator.getFeaturedEvents()) { + StageEventType stageType = pair.getA(); + EventHolder holder = pair.getB(); + count++; - if(count > MAX_STAGE_EVENTS) { + if(count > MAX_STAGE_EVENTS && stageType != StageEventType.RUNNING) { break; } - StageEventType stageType = pair.getA(); - EventHolder holder = pair.getB(); result.addStageEvent(HomeServiceUtil.convertToEventStageDTO(holder.event, holder.baseURL, holder.onRemoteServer, stageType, getService(), false)); EventReferenceDTO eventRef = new EventReferenceDTO(holder.event);