pass through the timeout parameter to the trackers; TracTrac receivers now use it; -1 means wait and is used for restore

Change-Id: Iee676ffceb44eb9459c51ba38cddbaf5ba40c9fb
This commit is contained in:
Axel Uhl committed 2017-01-27 15:07:56 +01:00
1 parent 4e1395d8a7
commit a615173f26
23 files changed
+92 -62

No files matched your search

@@ -128,17 +128,19 @@ public interface DomainFactory {
* Provides the capability to obtain the {@link WindTrack}s for the different wind sources. A trivial
* implementation is {@link EmptyWindStore} which simply provides new, empty tracks. This is always
* available but loses track of the wind, e.g., during server restarts.
* @param timeoutInMilliseconds TODO
*/
TracTracRaceTracker createRaceTracker(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry,
RaceLogResolver raceLogResolver, RaceTrackingConnectivityParametersImpl connectivityParams)
RaceLogResolver raceLogResolver, RaceTrackingConnectivityParametersImpl connectivityParams, long timeoutInMilliseconds)
throws MalformedURLException, FileNotFoundException, URISyntaxException, CreateModelException, SubscriberInitializationException;
/**
* Same as {@link #createRaceTracker(URL, URI, URI, URI, TimePoint, TimePoint, WindStore, TrackedRegattaRegistry)},
* only that a predefined {@link Regatta} is used to hold the resulting races.
* @param timeoutInMilliseconds TODO
*/
RaceTracker createRaceTracker(Regatta regatta, RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry,
RaceLogResolver raceLogResolver, RaceTrackingConnectivityParametersImpl connectivityParams)
RaceLogResolver raceLogResolver, RaceTrackingConnectivityParametersImpl connectivityParams, long timeoutInMilliseconds)
throws MalformedURLException, FileNotFoundException, URISyntaxException, CreateModelException,
SubscriberInitializationException;
@@ -155,6 +157,7 @@ public interface DomainFactory {
* must have been created before through
* {@link #getOrCreateTrackedRegatta(com.sap.sailing.domain.base.Regatta)} because otherwise the link to
* the {@link IEvent} can't be established
* @param timeoutInMilliseconds TODO
* @param tokenToRetrieveAssociatedRace
* used to update the set of{@link RaceDefinition}s received by the {@link RaceCourseReceiver} created by
* this call
@@ -163,7 +166,7 @@ public interface DomainFactory {
Simulator simulator, WindStore windStore, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, TrackedRegattaRegistry trackedRegattaRegistry,
RaceLogResolver raceLogResolver, IRace tractracRace,
URI courseDesignUpdateURI, String tracTracUsername, String tracTracPassword,
IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber, boolean useInternalMarkPassingAlgorithm);
IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber, boolean useInternalMarkPassingAlgorithm, long timeoutInMilliseconds);
/**
* Creates a {@link RaceDefinition} from a TracTrac {@link IRace} and a domain {@link Course} definition. The
@@ -203,11 +206,12 @@ public interface DomainFactory {
/**
* If the vm argument tractrac.usemarkpassings=false, the RecieverType MARKPASSINGS will not return anything
* @param raceLogResolver TODO
* @param timeoutInMilliseconds TODO
*/
Iterable<Receiver> getUpdateReceivers(DynamicTrackedRegatta trackedRegatta, IRace tractracRace, WindStore windStore,
long delayToLiveInMillis, Simulator simulator, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, TrackedRegattaRegistry trackedRegattaRegistry,
RaceLogResolver raceLogResolver, URI courseDesignUpdateURI,
String tracTracUsername, String tracTracPassword, IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber, boolean ignoreTracTracMarkPassings, ReceiverType... types);
String tracTracUsername, String tracTracPassword, IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber, boolean ignoreTracTracMarkPassings, long timeoutInMilliseconds, ReceiverType... types);
JSONService parseJSONURLWithRaceRecords(URL jsonURL, boolean loadClientParams) throws IOException, ParseException, org.json.simple.parser.ParseException, URISyntaxException;
@@ -44,6 +44,7 @@ public abstract class AbstractReceiverWithQueue<A, B, C> implements Runnable, Re
private final Simulator simulator;
private final Thread thread;
private final Map<Util.Triple<A, B, C>, Set<LoadingQueueDoneCallBack>> loadingQueueDoneCallBacks;
private final long timeoutInMilliseconds;
/**
* used by {@link #stopAfterNotReceivingEventsForSomeTime(long)} and {@link #run()} to check if an event was received
@@ -52,7 +53,8 @@ public abstract class AbstractReceiverWithQueue<A, B, C> implements Runnable, Re
private boolean receivedEventDuringTimeout;
public AbstractReceiverWithQueue(DomainFactory domainFactory, IEvent tractracEvent,
DynamicTrackedRegatta trackedRegatta, Simulator simulator, IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber) {
DynamicTrackedRegatta trackedRegatta, Simulator simulator, IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber,
long timeoutInMilliseconds) {
super();
this.eventSubscriber = eventSubscriber;
this.raceSubscriber = raceSubscriber;
@@ -63,6 +65,7 @@ public abstract class AbstractReceiverWithQueue<A, B, C> implements Runnable, Re
this.queue = new LinkedBlockingDeque<Util.Triple<A, B, C>>();
this.thread = new Thread(this, getClass().getName());
this.loadingQueueDoneCallBacks = new HashMap<>();
this.timeoutInMilliseconds = timeoutInMilliseconds;
}
protected IEventSubscriber getEventSubscriber() {
@@ -200,8 +203,7 @@ public abstract class AbstractReceiverWithQueue<A, B, C> implements Runnable, Re
*/
protected DynamicTrackedRace getTrackedRace(IRace race) {
DynamicTrackedRace result = null;
RaceDefinition raceDefinition = getDomainFactory().getAndWaitForRaceDefinition(race.getId(),
RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS);
RaceDefinition raceDefinition = getDomainFactory().getAndWaitForRaceDefinition(race.getId(), timeoutInMilliseconds);
if (raceDefinition != null) {
com.sap.sailing.domain.base.Regatta domainRegatta = trackedRegatta.getRegatta();
if (domainRegatta.getRaceByName(raceDefinition.getName()) != null) {
@@ -395,7 +395,8 @@ public class DomainFactoryImpl implements DomainFactory {
WindStore windStore, long delayToLiveInMillis, Simulator simulator, DynamicRaceDefinitionSet raceDefinitionSetToUpdate,
TrackedRegattaRegistry trackedRegattaRegistry, RaceLogResolver raceLogResolver,
URI courseDesignUpdateURI, String tracTracUsername, String tracTracPassword,
IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber, boolean useInternalMarkPassingAlgorithm, ReceiverType... types) {
IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber, boolean useInternalMarkPassingAlgorithm,
long timeoutInMilliseconds, ReceiverType... types) {
IEvent tractracEvent = tractracRace.getEvent();
Collection<Receiver> result = new ArrayList<Receiver>();
for (ReceiverType type : types) {
@@ -405,24 +406,24 @@ public class DomainFactoryImpl implements DomainFactory {
raceDefinitionSetToUpdate, delayToLiveInMillis,
WindTrack.DEFAULT_MILLISECONDS_OVER_WHICH_TO_AVERAGE_WIND, simulator, courseDesignUpdateURI,
tracTracUsername, tracTracPassword, eventSubscriber, raceSubscriber,
useInternalMarkPassingAlgorithm, raceLogResolver));
useInternalMarkPassingAlgorithm, raceLogResolver, timeoutInMilliseconds));
break;
case MARKPOSITIONS:
result.add(new MarkPositionReceiver(
trackedRegatta, tractracEvent, tractracRace, simulator, this, eventSubscriber, raceSubscriber));
trackedRegatta, tractracEvent, tractracRace, simulator, this, eventSubscriber, raceSubscriber, timeoutInMilliseconds));
break;
case RAWPOSITIONS:
result.add(new RawPositionReceiver(
trackedRegatta, tractracEvent, this, simulator, eventSubscriber, raceSubscriber));
trackedRegatta, tractracEvent, this, simulator, eventSubscriber, raceSubscriber, timeoutInMilliseconds));
break;
case MARKPASSINGS:
if (!useInternalMarkPassingAlgorithm) {
result.add(new MarkPassingReceiver(trackedRegatta, tractracEvent, simulator, this, eventSubscriber, raceSubscriber));
result.add(new MarkPassingReceiver(trackedRegatta, tractracEvent, simulator, this, eventSubscriber, raceSubscriber, timeoutInMilliseconds));
}
break;
case RACESTARTFINISH:
result.add(new RaceStartedAndFinishedReceiver(
trackedRegatta, tractracEvent, simulator, this, eventSubscriber, raceSubscriber));
trackedRegatta, tractracEvent, simulator, this, eventSubscriber, raceSubscriber, timeoutInMilliseconds));
break;
}
}
@@ -434,12 +435,13 @@ public class DomainFactoryImpl implements DomainFactory {
long delayToLiveInMillis, Simulator simulator, WindStore windStore,
DynamicRaceDefinitionSet raceDefinitionSetToUpdate, TrackedRegattaRegistry trackedRegattaRegistry, RaceLogResolver raceLogResolver,
IRace tractracRace, URI courseDesignUpdateURI,
String tracTracUsername, String tracTracPassword, IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber, boolean useInternalMarkPassingAlgorithm) {
String tracTracUsername, String tracTracPassword, IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber,
boolean useInternalMarkPassingAlgorithm, long timeoutInMilliseconds) {
return getUpdateReceivers(trackedRegatta, tractracRace, windStore, delayToLiveInMillis, simulator,
raceDefinitionSetToUpdate, trackedRegattaRegistry, raceLogResolver, courseDesignUpdateURI,
tracTracUsername, tracTracPassword, eventSubscriber, raceSubscriber,
useInternalMarkPassingAlgorithm, ReceiverType.RACECOURSE, ReceiverType.MARKPASSINGS,
ReceiverType.MARKPOSITIONS, ReceiverType.RACESTARTFINISH, ReceiverType.RAWPOSITIONS);
useInternalMarkPassingAlgorithm, timeoutInMilliseconds, ReceiverType.RACECOURSE,
ReceiverType.MARKPASSINGS, ReceiverType.MARKPOSITIONS, ReceiverType.RACESTARTFINISH, ReceiverType.RAWPOSITIONS);
}
@Override
@@ -653,18 +655,18 @@ public class DomainFactoryImpl implements DomainFactory {
@Override
public TracTracRaceTracker createRaceTracker(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry,
RaceLogResolver raceLogResolver, RaceTrackingConnectivityParametersImpl connectivityParams) throws MalformedURLException,
RaceLogResolver raceLogResolver, RaceTrackingConnectivityParametersImpl connectivityParams, long timeoutInMilliseconds) throws MalformedURLException,
FileNotFoundException, URISyntaxException, CreateModelException, SubscriberInitializationException {
return new TracTracRaceTrackerImpl(this, raceLogStore, regattaLogStore, windStore, trackedRegattaRegistry, raceLogResolver, connectivityParams);
return new TracTracRaceTrackerImpl(this, raceLogStore, regattaLogStore, windStore, trackedRegattaRegistry, raceLogResolver, connectivityParams, timeoutInMilliseconds);
}
@Override
public RaceTracker createRaceTracker(Regatta regatta, RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, WindStore windStore,
TrackedRegattaRegistry trackedRegattaRegistry, RaceLogResolver raceLogResolver, RaceTrackingConnectivityParametersImpl connectivityParams)
TrackedRegattaRegistry trackedRegattaRegistry, RaceLogResolver raceLogResolver, RaceTrackingConnectivityParametersImpl connectivityParams, long timeoutInMilliseconds)
throws MalformedURLException, FileNotFoundException, URISyntaxException, CreateModelException,
SubscriberInitializationException {
return new TracTracRaceTrackerImpl(regatta, this, raceLogStore, regattaLogStore, windStore, trackedRegattaRegistry,
raceLogResolver, connectivityParams);
raceLogResolver, connectivityParams, timeoutInMilliseconds);
}
@Override
@@ -33,8 +33,9 @@ public class MarkPassingReceiver extends AbstractReceiverWithQueue<IRaceCompetit
private final IControlPassingsListener listener;
public MarkPassingReceiver(DynamicTrackedRegatta trackedRegatta, IEvent tractracEvent,
Simulator simulator, DomainFactory domainFactory, IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber) {
super(domainFactory, tractracEvent, trackedRegatta, simulator, eventSubscriber, raceSubscriber);
Simulator simulator, DomainFactory domainFactory, IEventSubscriber eventSubscriber,
IRaceSubscriber raceSubscriber, long timeoutInMilliseconds) {
super(domainFactory, tractracEvent, trackedRegatta, simulator, eventSubscriber, raceSubscriber, timeoutInMilliseconds);
listener = new IControlPassingsListener() {
@Override
public void gotControlPassings(IRaceCompetitor raceCompetitor, IControlPassings controlPassings) {
@@ -44,8 +44,9 @@ public class MarkPositionReceiver extends AbstractReceiverWithQueue<IControl, IP
final IControlPointPositionListener listener;
public MarkPositionReceiver(final DynamicTrackedRegatta trackedRegatta, IEvent tractracEvent,
IRace tractracRace, Simulator simulator, final DomainFactory domainFactory, IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber) {
super(domainFactory, tractracEvent, trackedRegatta, simulator, eventSubscriber, raceSubscriber);
IRace tractracRace, Simulator simulator, final DomainFactory domainFactory, IEventSubscriber eventSubscriber,
IRaceSubscriber raceSubscriber, long timeoutInMilliseconds) {
super(domainFactory, tractracEvent, trackedRegatta, simulator, eventSubscriber, raceSubscriber, timeoutInMilliseconds);
// assumption: there is currently only one race per TracTrac Event object
this.tractracRace = tractracRace;
if (tractracEvent.getRaces().isEmpty()) {
@@ -69,8 +69,8 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue<IControlRoute,
long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, Simulator simulator,
URI courseDesignUpdateURI, String tracTracUsername, String tracTracPassword,
IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber, boolean useInternalMarkPassingAlgorithm,
RaceLogResolver raceLogResolver) {
super(domainFactory, tractracEvent, trackedRegatta, simulator, eventSubscriber, raceSubscriber);
RaceLogResolver raceLogResolver, long timeoutInMilliseconds) {
super(domainFactory, tractracEvent, trackedRegatta, simulator, eventSubscriber, raceSubscriber, timeoutInMilliseconds);
this.tractracRace = tractracRace;
this.raceLogResolver = raceLogResolver;
this.millisecondsOverWhichToAverageWind = millisecondsOverWhichToAverageWind;
@@ -34,8 +34,8 @@ public class RaceStartedAndFinishedReceiver extends AbstractReceiverWithQueue<IR
public RaceStartedAndFinishedReceiver(DynamicTrackedRegatta trackedRegatta, IEvent tractracEvent,
Simulator simulator, DomainFactory domainFactory, IEventSubscriber eventSubscriber,
IRaceSubscriber raceSubscriber) {
super(domainFactory, tractracEvent, trackedRegatta, simulator, eventSubscriber, raceSubscriber);
IRaceSubscriber raceSubscriber, long timeoutInMilliseconds) {
super(domainFactory, tractracEvent, trackedRegatta, simulator, eventSubscriber, raceSubscriber, timeoutInMilliseconds);
listener = new IRaceStartStopTimesChangeListener() {
@Override
public void gotTrackingStartStopTime(IRace race, IStartStopData startStopData) {
@@ -108,17 +108,17 @@ public class RaceTrackingConnectivityParametersImpl extends AbstractRaceTracking
@Override
public RaceTracker createRaceTracker(TrackedRegattaRegistry trackedRegattaRegistry, WindStore windStore,
RaceLogResolver raceLogResolver) throws MalformedURLException, FileNotFoundException, URISyntaxException,
RaceLogResolver raceLogResolver, long timeoutInMilliseconds) throws MalformedURLException, FileNotFoundException, URISyntaxException,
CreateModelException, SubscriberInitializationException {
RaceTracker tracker = domainFactory.createRaceTracker(raceLogStore, regattaLogStore, windStore, trackedRegattaRegistry, raceLogResolver, this);
RaceTracker tracker = domainFactory.createRaceTracker(raceLogStore, regattaLogStore, windStore, trackedRegattaRegistry, raceLogResolver, this, timeoutInMilliseconds);
return tracker;
}
@Override
public RaceTracker createRaceTracker(Regatta regatta, TrackedRegattaRegistry trackedRegattaRegistry,
WindStore windStore, RaceLogResolver raceLogResolver) throws Exception {
WindStore windStore, RaceLogResolver raceLogResolver, long timeoutInMilliseconds) throws Exception {
RaceTracker tracker = domainFactory.createRaceTracker(regatta, raceLogStore, regattaLogStore, windStore,
trackedRegattaRegistry, raceLogResolver, this);
trackedRegattaRegistry, raceLogResolver, this, timeoutInMilliseconds);
return tracker;
}
@@ -24,8 +24,9 @@ public class RawPositionReceiver extends AbstractReceiverWithQueue<IRaceCompetit
private final IPositionListener listener;
public RawPositionReceiver(DynamicTrackedRegatta trackedRegatta, IEvent tractracEvent,
DomainFactory domainFactory, Simulator simulator, IEventSubscriber eventSubscriber, IRaceSubscriber raceSubscriber) {
super(domainFactory, tractracEvent, trackedRegatta, simulator, eventSubscriber, raceSubscriber);
DomainFactory domainFactory, Simulator simulator, IEventSubscriber eventSubscriber,
IRaceSubscriber raceSubscriber, long timeoutInMilliseconds) {
super(domainFactory, tractracEvent, trackedRegatta, simulator, eventSubscriber, raceSubscriber, timeoutInMilliseconds);
listener = new IPositionListener() {
@Override
public void gotPosition(IRaceCompetitor controlPoint, IPosition position) {
@@ -36,6 +36,7 @@ import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.RaceHandle;
import com.sap.sailing.domain.tracking.RaceTracker;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.TrackedRaceStatus;
import com.sap.sailing.domain.tracking.TrackedRegatta;
@@ -242,13 +243,17 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl
* available but loses track of the wind, e.g., during server restarts.
* @param trackedRegattaRegistry
* used to create the {@link TrackedRegatta} for the domain event
* @param timeoutInMilliseconds
* use -1 to wait for the race and all its data forever; otherwise specify the milliseconds after which
* you expect things to have loaded; see also
* {@link RaceTracker#TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS}.
*/
TracTracRaceTrackerImpl(DomainFactory domainFactory, RaceLogStore raceLogStore,
RegattaLogStore regattaLogStore, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry,
RaceLogResolver raceLogResolver, RaceTrackingConnectivityParametersImpl connectivityParams)
RaceLogResolver raceLogResolver, RaceTrackingConnectivityParametersImpl connectivityParams, long timeoutInMilliseconds)
throws URISyntaxException, MalformedURLException, FileNotFoundException, SubscriberInitializationException {
this(/* regatta */ null, domainFactory, raceLogStore, regattaLogStore, windStore, trackedRegattaRegistry,
raceLogResolver, connectivityParams);
raceLogResolver, connectivityParams, timeoutInMilliseconds);
}
/**
@@ -260,10 +265,14 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl
* @param regatta
* if <code>null</code>, then <code>domainFactory.getOrCreateRegatta(tractracEvent)</code> will be used
* to obtain a default regatta
* @param timeoutInMilliseconds
* use -1 to wait for the race and all its data forever; otherwise specify the milliseconds after which
* you expect things to have loaded; see also
* {@link RaceTracker#TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS}.
*/
TracTracRaceTrackerImpl(final Regatta regatta, DomainFactory domainFactory, RaceLogStore raceLogStore,
RegattaLogStore regattaLogStore, WindStore windStore, TrackedRegattaRegistry trackedRegattaRegistry,
RaceLogResolver raceLogResolver, RaceTrackingConnectivityParametersImpl connectivityParams)
RaceLogResolver raceLogResolver, RaceTrackingConnectivityParametersImpl connectivityParams, long timeoutInMilliseconds)
throws URISyntaxException, MalformedURLException, FileNotFoundException, SubscriberInitializationException {
super(connectivityParams);
final URL paramURL = connectivityParams.getParamURL();
@@ -372,7 +381,8 @@ public class TracTracRaceTrackerImpl extends AbstractRaceTrackerImpl
receivers = new HashSet<Receiver>();
for (Receiver receiver : domainFactory.getUpdateReceivers(getTrackedRegatta(), delayToLiveInMillis,
simulator, windStore, this, trackedRegattaRegistry, raceLogResolver, tractracRace,
tracTracUpdateURI, tracTracUsername, tracTracPassword, eventSubscriber, raceSubscriber, useInternalMarkPassingAlgorithm)) {
tracTracUpdateURI, tracTracUsername, tracTracPassword, eventSubscriber, raceSubscriber,
useInternalMarkPassingAlgorithm, timeoutInMilliseconds)) {
receivers.add(receiver);
}
addListenersForStoredDataAndStartController(receivers);