From 9570a5d3f03701dd79ba9de5076c610278d248e3 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 26 Mar 2015 17:41:47 +0100 Subject: [PATCH] allow multiple loading completion listeners to subscribe at the same last event in queue --- .../impl/AbstractReceiverWithQueue.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/AbstractReceiverWithQueue.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/AbstractReceiverWithQueue.java index 0c6543b53b4..094305259fd 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/AbstractReceiverWithQueue.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/AbstractReceiverWithQueue.java @@ -1,7 +1,9 @@ package com.sap.sailing.domain.tractracadapter.impl; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; @@ -41,7 +43,7 @@ public abstract class AbstractReceiverWithQueue implements Runnable, Re private final DynamicTrackedRegatta trackedRegatta; private final Simulator simulator; private final Thread thread; - private final Map, LoadingQueueDoneCallBack> loadingQueueDoneCallBacks; + private final Map, Set> loadingQueueDoneCallBacks; /** * used by {@link #stopAfterNotReceivingEventsForSomeTime(long)} and {@link #run()} to check if an event was received @@ -142,12 +144,14 @@ public abstract class AbstractReceiverWithQueue implements Runnable, Re if (!isStopEvent(event)) { handleEvent(event); } - LoadingQueueDoneCallBack callBack; + Set callBacks; synchronized (loadingQueueDoneCallBacks) { - callBack = loadingQueueDoneCallBacks.remove(event); + callBacks = loadingQueueDoneCallBacks.remove(event); } - if (callBack != null) { - callBack.loadingQueueDone(this); + if (callBacks != null) { + for (LoadingQueueDoneCallBack callback : callBacks) { + callback.loadingQueueDone(this); + } } } catch (InterruptedException e) { @@ -199,10 +203,16 @@ public abstract class AbstractReceiverWithQueue implements Runnable, Re public void callBackWhenLoadingQueueIsDone(LoadingQueueDoneCallBack callback) { synchronized (loadingQueueDoneCallBacks) { Triple lastInQueue = queue.peekLast(); - if (lastInQueue == null) { + // when simulator is attached, consider loading already done; the simulator simulates "live" tracking + if (lastInQueue == null || getSimulator() != null) { callback.loadingQueueDone(this); } else { - loadingQueueDoneCallBacks.put(lastInQueue, callback); + Set set = loadingQueueDoneCallBacks.get(lastInQueue); + if (set == null) { + set = new HashSet<>(); + loadingQueueDoneCallBacks.put(lastInQueue, set); + } + set.add(callback); } } }