From 7ee0ad76faeb1666fb51113a0549baf5e28894d5 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Fri, 1 May 2015 15:10:15 +0200 Subject: [PATCH 01/85] Added inner RacesExecutionOrderCache class to TrackedRegatta and getPreviousRaceInExecutionOrder(...) Method --- .../domain/test/mock/MockedTrackedRace.java | 5 + .../base/impl/AbstractRaceColumnListener.java | 111 +++++++++++++++++ .../domain/tracking/TrackedRegatta.java | 5 + .../tracking/impl/TrackedRegattaImpl.java | 114 ++++++++++++++++++ .../gwt/ui/test/MockedTrackedRace.java | 5 + 5 files changed, 240 insertions(+) create mode 100644 java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index 204dbbe707b..0adf3219332 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -487,6 +487,11 @@ public class MockedTrackedRace implements DynamicTrackedRace { DynamicRaceDefinitionSet raceDefinitionSetToUpdate, boolean useMarkPassingcalculator) { return null; } + + @Override + public TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race) { + return null; + } }; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java new file mode 100644 index 00000000000..dea1f6b2219 --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java @@ -0,0 +1,111 @@ +package com.sap.sailing.domain.base.impl; + +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.base.RaceColumnListener; +import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; +import com.sap.sailing.domain.racelog.RaceLogIdentifier; +import com.sap.sailing.domain.tracking.TrackedRace; + +/** + * Delegates all listener operations to a default action which is implemented here to do nothing. This way, subclasses + * can easily provide a default action to be executed for all callback methods except for maybe a few which then need to + * be explicitly overridden. If not most methods need to perform the same action then instead of implementing a default + * action subclasses should rather override the {@link RaceColumnListener} operations individually. + * + * @author Alexander Ries (D062114) + * + */ +public abstract class AbstractRaceColumnListener implements RaceColumnListener{ + + private static final long serialVersionUID = -6210815580399401162L; + + /** + * This implementation of the default action to which all other operations delegate does nothing. Subclasses can + * choose to override this method to provide this as the default behavior for all other methods and then still + * override individual {@link RaceColumnListener} methods, or they can leave the default action empty and just + * override {@link RaceColumnListener} methods. + */ + protected void defaultAction() { + // Does nothing + } + + @Override + public void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + defaultAction(); + } + + @Override + public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + defaultAction(); + } + + @Override + public void isMedalRaceChanged(RaceColumn raceColumn, boolean newIsMedalRace) { + defaultAction(); + } + + @Override + public void isStartsWithZeroScoreChanged(RaceColumn raceColumn, boolean newIsStartsWithZeroScore) { + defaultAction(); + } + + @Override + public void isFirstColumnIsNonDiscardableCarryForwardChanged(RaceColumn raceColumn, + boolean firstColumnIsNonDiscardableCarryForward) { + defaultAction(); + } + + @Override + public void hasSplitFleetContiguousScoringChanged(RaceColumn raceColumn, boolean hasSplitFleetContiguousScoring) { + defaultAction(); + } + + @Override + public boolean canAddRaceColumnToContainer(RaceColumn raceColumn) { + return false; + } + + @Override + public void raceColumnAddedToContainer(RaceColumn raceColumn) { + defaultAction(); + } + + @Override + public void raceColumnRemovedFromContainer(RaceColumn raceColumn) { + defaultAction(); + } + + @Override + public void raceColumnMoved(RaceColumn raceColumn, int newIndex) { + defaultAction(); + } + + @Override + public void factorChanged(RaceColumn raceColumn, Double oldFactor, Double newFactor) { + defaultAction(); + } + + @Override + public void competitorDisplayNameChanged(Competitor competitor, String oldDisplayName, String displayName) { + defaultAction(); + } + + @Override + public void resultDiscardingRuleChanged(ResultDiscardingRule oldDiscardingRule, + ResultDiscardingRule newDiscardingRule) { + defaultAction(); + } + + @Override + public void raceLogEventAdded(RaceColumn raceColumn, RaceLogIdentifier raceLogIdentifier, RaceLogEvent event) { + defaultAction(); + } + + @Override + public boolean isTransient() { + return false; + } +} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegatta.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegatta.java index 227a8a216f5..17040171583 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegatta.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegatta.java @@ -73,4 +73,9 @@ public interface TrackedRegatta extends Serializable { void removeTrackedRace(RaceDefinition raceDefinition); + /** + * Parameter race is a {@link TrackedRace} from which the method returns the previous {@link TrackedRace} in the execution order of a {@link Regatta}. + * */ + TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race); + } \ No newline at end of file diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java index 32532ee476e..8740773af5c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java @@ -7,6 +7,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.logging.Level; @@ -14,9 +16,13 @@ import java.util.logging.Logger; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Sideline; +import com.sap.sailing.domain.base.impl.AbstractRaceColumnListener; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; @@ -26,8 +32,18 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sse.common.TimePoint; +import com.sap.sse.concurrent.LockUtil; +import com.sap.sse.concurrent.NamedReentrantReadWriteLock; +import com.sap.sse.util.SmartFutureCache; +import com.sap.sse.util.SmartFutureCache.AbstractCacheUpdater; +import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; public class TrackedRegattaImpl implements TrackedRegatta { + + private RaceOrderCache raceOrderCache; + + private transient NamedReentrantReadWriteLock lock = createLock(); + private static final long serialVersionUID = 6480508193567014285L; private static final Logger logger = Logger.getLogger(TrackedRegattaImpl.class.getName()); @@ -43,6 +59,7 @@ public class TrackedRegattaImpl implements TrackedRegatta { this.trackedRaces = new HashMap(); this.trackedRacesByBoatClass = new HashMap>(); raceListeners = new HashSet(); + this.raceOrderCache = new RaceOrderCache(); } private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { @@ -65,6 +82,10 @@ public class TrackedRegattaImpl implements TrackedRegatta { result.trackedRacesByBoatClass.putAll(this.trackedRacesByBoatClass); return result; } + + private NamedReentrantReadWriteLock createLock() { + return new NamedReentrantReadWriteLock(getClass().getName(), true); + } @Override public void addTrackedRace(TrackedRace trackedRace) { @@ -184,5 +205,98 @@ public class TrackedRegattaImpl implements TrackedRegatta { addTrackedRace(result); return result; } + + @Override + public TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race) { + List racesInOrder = raceOrderCache.getRacesOrder(); + if (racesInOrder != null) { + int indexOfRace = racesInOrder.indexOf(race); + if (indexOfRace != -1 && indexOfRace != 0) { + return racesInOrder.get(indexOfRace - 1); + } + } + return null; + } + + private class RaceOrderCache extends AbstractRaceColumnListener { + SmartFutureCache, EmptyUpdateInterval> racesOrderCache; + private final String RACES_ORDER_LIST_CACHE_KEY = "racesOrderCacheKey"; + private static final long serialVersionUID = -1016823551825618490L; + + public RaceOrderCache() { + racesOrderCache = createRacesOrderCache(); + getRegatta().addRaceColumnListener(this); + } + + public List getRacesOrder() { + List result; + LockUtil.lockForRead(lock); + result = racesOrderCache.get(RACES_ORDER_LIST_CACHE_KEY, true); + LockUtil.unlockAfterRead(lock); + return result; + } + + @Override + public void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, null); + } + + @Override + public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, null); + } + + @Override + public void raceColumnAddedToContainer(RaceColumn raceColumn) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, null); + } + + @Override + public void raceColumnRemovedFromContainer(RaceColumn raceColumn) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, null); + } + + @Override + public void raceColumnMoved(RaceColumn raceColumn, int newIndex) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, null); + } + + private List reloadRacesInExecutionOrder() { + List raceIdListInExecutionOrder = new ArrayList(); + Iterator seriesInRegatta = getRegatta().getSeries().iterator(); + while (seriesInRegatta.hasNext()) { + Series currentSeries = seriesInRegatta.next(); + Iterator raceColumns = currentSeries.getRaceColumns().iterator(); + while (raceColumns.hasNext()) { + RaceColumn currentRaceColumn = raceColumns.next(); + Iterator fleetsInRaceColumn = currentRaceColumn.getFleets().iterator(); + while (fleetsInRaceColumn.hasNext()) { + TrackedRace trackedRaceInColumnForFleet = currentRaceColumn.getTrackedRace(fleetsInRaceColumn + .next()); + if(trackedRaceInColumnForFleet != null){ + raceIdListInExecutionOrder.add(trackedRaceInColumnForFleet); + } + } + } + } + return raceIdListInExecutionOrder; + } + + private SmartFutureCache, EmptyUpdateInterval> createRacesOrderCache() { + return new SmartFutureCache, SmartFutureCache.EmptyUpdateInterval>( + new AbstractCacheUpdater, SmartFutureCache.EmptyUpdateInterval>() { + + @Override + public List computeCacheUpdate(String key, + EmptyUpdateInterval updateInterval) throws Exception { + if (key.equals(RACES_ORDER_LIST_CACHE_KEY)) { + return reloadRacesInExecutionOrder(); + } else { + return null; + } + } + }, "RacesOrderCache"); + } + } } diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index 4a2c35b490d..495afc7a110 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -483,6 +483,11 @@ public class MockedTrackedRace implements DynamicTrackedRace { boolean useMarkPassingCalculator) { return null; } + + @Override + public TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race) { + return null; + } }; } From ccae5416cf3292853db5d097566adae0490b022d Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Fri, 1 May 2015 15:13:20 +0200 Subject: [PATCH 02/85] recordWind(...) in DynamicTrackedRaceImpl adds now wind 30 min before race start if previous race is null, has ended or has no wind --- .../domain/tracking/impl/DynamicTrackedRaceImpl.java | 12 ++++++++++-- .../domain/tracking/impl/TrackedRaceImpl.java | 9 ++++++++- .../domain/tracking/impl/TrackedRegattaImpl.java | 12 ++++++------ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 038478a20ae..599da8c7110 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -45,6 +45,7 @@ import com.sap.sailing.domain.tracking.RaceAbortedListener; import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.StartTimeChangedListener; import com.sap.sailing.domain.tracking.TrackedLeg; +import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRaceStatus; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.WindStore; @@ -657,8 +658,15 @@ DynamicTrackedRace, GPSTrackListener { TimePoint startOfTracking = getStartOfTracking(); TimePoint endOfRace = getEndOfRace(); TimePoint endOfTracking = getEndOfTracking(); - if ((startOfTracking == null || !startOfTracking.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_MILLIS).after(wind.getTimePoint()) || - (startOfRace != null && !startOfRace.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_MILLIS).after(wind.getTimePoint()))) + TrackedRace previosRaceInExecutionOrder = getTrackedRegatta().getPreviousRaceInExecutionOrder(this); + long conditional_time_before_start_to_track_wind; + if(previosRaceInExecutionOrder == null || previosRaceInExecutionOrder.getEndOfTracking() != null || !previosRaceInExecutionOrder.hasWindData()){ + conditional_time_before_start_to_track_wind = EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; + }else{ + conditional_time_before_start_to_track_wind = TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; + } + if ((startOfTracking == null || !startOfTracking.minus(conditional_time_before_start_to_track_wind).after(wind.getTimePoint()) || + (startOfRace != null && !startOfRace.minus(conditional_time_before_start_to_track_wind).after(wind.getTimePoint()))) && (endOfTracking == null || endOfTracking.plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS).after(wind.getTimePoint()) || (endOfRace != null && endOfRace.plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS).after(wind.getTimePoint())))) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index eb288236793..88cc0ba0dcd 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -150,8 +150,15 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl // TODO make this variable private static final long DELAY_FOR_CACHE_CLEARING_IN_MILLISECONDS = 7500; + // TODO rename to in milliseconds public static final long TIME_BEFORE_START_TO_TRACK_WIND_MILLIS = 4 * 60 * 1000l; // let wind start four minutes before race - + + // TODO rename to in milliseconds + /** + * To make wind accessible 30 minutes before first race starts, there is a additional time buffer to record wind. + */ + public static final long EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS = 30 * 60 * 1000l; + private TrackedRaceStatus status; private final Object statusNotifier; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java index 8740773af5c..40788abfc8f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java @@ -40,7 +40,7 @@ import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; public class TrackedRegattaImpl implements TrackedRegatta { - private RaceOrderCache raceOrderCache; + private RaceExecutionOrderCache raceExecutionOrderCache; private transient NamedReentrantReadWriteLock lock = createLock(); @@ -59,7 +59,7 @@ public class TrackedRegattaImpl implements TrackedRegatta { this.trackedRaces = new HashMap(); this.trackedRacesByBoatClass = new HashMap>(); raceListeners = new HashSet(); - this.raceOrderCache = new RaceOrderCache(); + this.raceExecutionOrderCache = new RaceExecutionOrderCache(); } private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { @@ -208,7 +208,7 @@ public class TrackedRegattaImpl implements TrackedRegatta { @Override public TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race) { - List racesInOrder = raceOrderCache.getRacesOrder(); + List racesInOrder = raceExecutionOrderCache.getRacesInExecutionOrder(); if (racesInOrder != null) { int indexOfRace = racesInOrder.indexOf(race); if (indexOfRace != -1 && indexOfRace != 0) { @@ -218,18 +218,18 @@ public class TrackedRegattaImpl implements TrackedRegatta { return null; } - private class RaceOrderCache extends AbstractRaceColumnListener { + private class RaceExecutionOrderCache extends AbstractRaceColumnListener { SmartFutureCache, EmptyUpdateInterval> racesOrderCache; private final String RACES_ORDER_LIST_CACHE_KEY = "racesOrderCacheKey"; private static final long serialVersionUID = -1016823551825618490L; - public RaceOrderCache() { + public RaceExecutionOrderCache() { racesOrderCache = createRacesOrderCache(); getRegatta().addRaceColumnListener(this); } - public List getRacesOrder() { + public List getRacesInExecutionOrder() { List result; LockUtil.lockForRead(lock); result = racesOrderCache.get(RACES_ORDER_LIST_CACHE_KEY, true); From bcde857ccbff35b6583fa8eb3dd4fcb31eb5f782 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Fri, 1 May 2015 22:46:32 +0200 Subject: [PATCH 03/85] declared SmartFutureCache in RaceExecutionOrderCache as transient and added readObjet Method --- .../sailing/domain/tracking/impl/TrackedRegattaImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java index 40788abfc8f..e28defe3956 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java @@ -38,6 +38,8 @@ import com.sap.sse.util.SmartFutureCache; import com.sap.sse.util.SmartFutureCache.AbstractCacheUpdater; import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; +import difflib.PatchFailedException; + public class TrackedRegattaImpl implements TrackedRegatta { private RaceExecutionOrderCache raceExecutionOrderCache; @@ -220,7 +222,7 @@ public class TrackedRegattaImpl implements TrackedRegatta { private class RaceExecutionOrderCache extends AbstractRaceColumnListener { - SmartFutureCache, EmptyUpdateInterval> racesOrderCache; + private transient SmartFutureCache, EmptyUpdateInterval> racesOrderCache; private final String RACES_ORDER_LIST_CACHE_KEY = "racesOrderCacheKey"; private static final long serialVersionUID = -1016823551825618490L; @@ -298,5 +300,9 @@ public class TrackedRegattaImpl implements TrackedRegatta { } }, "RacesOrderCache"); } + + private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException, PatchFailedException { + racesOrderCache = createRacesOrderCache(); + } } } From 0be730b87613664a95e3088ea035dd6ba9cf654f Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Sat, 2 May 2015 00:36:38 +0200 Subject: [PATCH 04/85] made RaceExecutionOrderCache in TrackedRegattaImpl transient --- .../sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java index e28defe3956..d2b7b4fdc74 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java @@ -42,7 +42,7 @@ import difflib.PatchFailedException; public class TrackedRegattaImpl implements TrackedRegatta { - private RaceExecutionOrderCache raceExecutionOrderCache; + private transient RaceExecutionOrderCache raceExecutionOrderCache; private transient NamedReentrantReadWriteLock lock = createLock(); @@ -67,6 +67,7 @@ public class TrackedRegattaImpl implements TrackedRegatta { private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); this.raceListeners = new HashSet(); + this.raceExecutionOrderCache = new RaceExecutionOrderCache(); } private void writeObject(ObjectOutputStream oos) throws IOException { From 8fe7bb8137458f91a9df1bd37471fa5b562b5c9c Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Mon, 4 May 2015 13:24:27 +0200 Subject: [PATCH 05/85] small changes to readObject() Method in RaceExecutionOrderCache --- .../tracking/impl/DynamicTrackedRaceImpl.java | 4 ++-- .../domain/tracking/impl/TrackedRaceImpl.java | 4 +--- .../domain/tracking/impl/TrackedRegattaImpl.java | 16 ++++------------ .../impl/VirtualWindFixesAsNavigableSet.java | 2 +- .../tracking/impl/VirtualWindTrackImpl.java | 2 +- 5 files changed, 9 insertions(+), 19 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 599da8c7110..5a3bc491724 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -661,9 +661,9 @@ DynamicTrackedRace, GPSTrackListener { TrackedRace previosRaceInExecutionOrder = getTrackedRegatta().getPreviousRaceInExecutionOrder(this); long conditional_time_before_start_to_track_wind; if(previosRaceInExecutionOrder == null || previosRaceInExecutionOrder.getEndOfTracking() != null || !previosRaceInExecutionOrder.hasWindData()){ - conditional_time_before_start_to_track_wind = EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; + conditional_time_before_start_to_track_wind = EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_IN_MILLISECONDS; }else{ - conditional_time_before_start_to_track_wind = TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; + conditional_time_before_start_to_track_wind = TIME_BEFORE_START_TO_TRACK_WIND_IN_MILLISECONDS; } if ((startOfTracking == null || !startOfTracking.minus(conditional_time_before_start_to_track_wind).after(wind.getTimePoint()) || (startOfRace != null && !startOfRace.minus(conditional_time_before_start_to_track_wind).after(wind.getTimePoint()))) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 88cc0ba0dcd..24af2adef21 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -150,14 +150,12 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl // TODO make this variable private static final long DELAY_FOR_CACHE_CLEARING_IN_MILLISECONDS = 7500; - // TODO rename to in milliseconds public static final long TIME_BEFORE_START_TO_TRACK_WIND_MILLIS = 4 * 60 * 1000l; // let wind start four minutes before race - // TODO rename to in milliseconds /** * To make wind accessible 30 minutes before first race starts, there is a additional time buffer to record wind. */ - public static final long EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS = 30 * 60 * 1000l; + public static final long EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_IN_MILLISECONDS = 30 * 60 * 1000l; private TrackedRaceStatus status; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java index d2b7b4fdc74..faff2cf31b6 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java @@ -32,8 +32,6 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sse.common.TimePoint; -import com.sap.sse.concurrent.LockUtil; -import com.sap.sse.concurrent.NamedReentrantReadWriteLock; import com.sap.sse.util.SmartFutureCache; import com.sap.sse.util.SmartFutureCache.AbstractCacheUpdater; import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; @@ -42,9 +40,7 @@ import difflib.PatchFailedException; public class TrackedRegattaImpl implements TrackedRegatta { - private transient RaceExecutionOrderCache raceExecutionOrderCache; - - private transient NamedReentrantReadWriteLock lock = createLock(); + private RaceExecutionOrderCache raceExecutionOrderCache; private static final long serialVersionUID = 6480508193567014285L; @@ -85,10 +81,6 @@ public class TrackedRegattaImpl implements TrackedRegatta { result.trackedRacesByBoatClass.putAll(this.trackedRacesByBoatClass); return result; } - - private NamedReentrantReadWriteLock createLock() { - return new NamedReentrantReadWriteLock(getClass().getName(), true); - } @Override public void addTrackedRace(TrackedRace trackedRace) { @@ -225,6 +217,7 @@ public class TrackedRegattaImpl implements TrackedRegatta { private transient SmartFutureCache, EmptyUpdateInterval> racesOrderCache; private final String RACES_ORDER_LIST_CACHE_KEY = "racesOrderCacheKey"; + private final String RACES_ORDER_LIST_LOCKS_NAME = getClass().getName(); private static final long serialVersionUID = -1016823551825618490L; public RaceExecutionOrderCache() { @@ -234,9 +227,7 @@ public class TrackedRegattaImpl implements TrackedRegatta { public List getRacesInExecutionOrder() { List result; - LockUtil.lockForRead(lock); result = racesOrderCache.get(RACES_ORDER_LIST_CACHE_KEY, true); - LockUtil.unlockAfterRead(lock); return result; } @@ -299,10 +290,11 @@ public class TrackedRegattaImpl implements TrackedRegatta { return null; } } - }, "RacesOrderCache"); + }, RACES_ORDER_LIST_LOCKS_NAME); } private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException, PatchFailedException { + ois.defaultReadObject(); racesOrderCache = createRacesOrderCache(); } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindFixesAsNavigableSet.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindFixesAsNavigableSet.java index 70fe342982b..02a948344d1 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindFixesAsNavigableSet.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindFixesAsNavigableSet.java @@ -141,7 +141,7 @@ public abstract class VirtualWindFixesAsNavigableSet extends AbstractUnmodifiabl protected TimePoint getFrom() { final TimePoint startOfRace = getTrackedRace().getStartOfRace(); return from == null ? startOfRace == null ? new MillisecondsTimePoint(Long.MAX_VALUE) - : floorToResolution(startOfRace.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_MILLIS)) : from; + : floorToResolution(startOfRace.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_IN_MILLISECONDS)) : from; } /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindTrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindTrackImpl.java index 3c0429c9537..0585df1eb03 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindTrackImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindTrackImpl.java @@ -63,7 +63,7 @@ public abstract class VirtualWindTrackImpl extends WindTrackImpl { final TimePoint startOfRace = getTrackedRace().getStartOfRace(); TimePoint timePointOfNewestEvent = getTrackedRace().getTimePointOfNewestEvent(); if (startOfRace != null) { - TimePoint fourMinutesBeforeRaceStartTimePoint = startOfRace.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_MILLIS); // let wind tracks start four minutes before start + TimePoint fourMinutesBeforeRaceStartTimePoint = startOfRace.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_IN_MILLISECONDS); // let wind tracks start four minutes before start if (timePointOfNewestEvent != null) { if (at.compareTo(fourMinutesBeforeRaceStartTimePoint) < 0) { adjustedAt = fourMinutesBeforeRaceStartTimePoint; From 8216ed0277a2ebbe35a4adcc519fd24eeba274e3 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Mon, 4 May 2015 16:05:51 +0200 Subject: [PATCH 06/85] corrected constant name and added comments to null/boolean parameters in RaceExecutionOrderCache methods --- .../domain/tracking/impl/TrackedRaceImpl.java | 2 +- .../tracking/impl/TrackedRegattaImpl.java | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 24af2adef21..eedeb82167a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -150,7 +150,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl // TODO make this variable private static final long DELAY_FOR_CACHE_CLEARING_IN_MILLISECONDS = 7500; - public static final long TIME_BEFORE_START_TO_TRACK_WIND_MILLIS = 4 * 60 * 1000l; // let wind start four minutes before race + public static final long TIME_BEFORE_START_TO_TRACK_WIND_IN_MILLISECONDS = 4 * 60 * 1000l; // let wind start four minutes before race /** * To make wind accessible 30 minutes before first race starts, there is a additional time buffer to record wind. diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java index faff2cf31b6..c4fa256a9e0 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java @@ -222,38 +222,39 @@ public class TrackedRegattaImpl implements TrackedRegatta { public RaceExecutionOrderCache() { racesOrderCache = createRacesOrderCache(); + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); getRegatta().addRaceColumnListener(this); } public List getRacesInExecutionOrder() { List result; - result = racesOrderCache.get(RACES_ORDER_LIST_CACHE_KEY, true); + result = racesOrderCache.get(RACES_ORDER_LIST_CACHE_KEY,/*waitForLatest*/ true); return result; } @Override public void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, null); + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); } @Override public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, null); + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); } @Override public void raceColumnAddedToContainer(RaceColumn raceColumn) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, null); + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); } @Override public void raceColumnRemovedFromContainer(RaceColumn raceColumn) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, null); + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); } @Override public void raceColumnMoved(RaceColumn raceColumn, int newIndex) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, null); + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); } private List reloadRacesInExecutionOrder() { @@ -268,8 +269,8 @@ public class TrackedRegattaImpl implements TrackedRegatta { while (fleetsInRaceColumn.hasNext()) { TrackedRace trackedRaceInColumnForFleet = currentRaceColumn.getTrackedRace(fleetsInRaceColumn .next()); - if(trackedRaceInColumnForFleet != null){ - raceIdListInExecutionOrder.add(trackedRaceInColumnForFleet); + if (trackedRaceInColumnForFleet != null) { + raceIdListInExecutionOrder.add(trackedRaceInColumnForFleet); } } } From d2fd42bdcee150215abfd45d9024ca96ea7f4a2c Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Mon, 18 May 2015 10:56:06 +0200 Subject: [PATCH 07/85] added RaceExecutionOrderProvider interface --- .../tracking/RaceExecutionOrderProvider.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java new file mode 100644 index 00000000000..90bde1209a7 --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java @@ -0,0 +1,15 @@ +package com.sap.sailing.domain.tracking; + +import com.sap.sailing.domain.base.Regatta; + +/** + * @author Alexander Ries (D062114) + * + */ +public interface RaceExecutionOrderProvider { + + /** + * Parameter race is a {@link TrackedRace} from which the method returns the previous {@link TrackedRace} in the execution order of a {@link Regatta}. + * */ + TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race); +} From 32de26195278bba69dbd3b9a3f0894b846fea1e8 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Mon, 18 May 2015 11:02:42 +0200 Subject: [PATCH 08/85] added getRaceExeutionOrderProvider Method Declaration to RaceColumn --- .../src/com/sap/sailing/domain/base/RaceColumn.java | 3 +++ .../sailing/domain/base/impl/RaceColumnInSeriesImpl.java | 6 ++++++ .../sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java | 6 ++++++ .../domain/leaderboard/meta/MetaLeaderboardColumn.java | 6 ++++++ 4 files changed, 21 insertions(+) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java index fcc88bf3ea0..dd2e60003a4 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumn.java @@ -7,6 +7,7 @@ import com.sap.sailing.domain.leaderboard.MetaLeaderboard; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.util.impl.RaceColumnListeners; import com.sap.sse.common.Named; @@ -226,4 +227,6 @@ public interface RaceColumn extends Named { boolean hasSplitFleetContiguousScoring(); boolean hasSplitFleets(); + + RaceExecutionOrderProvider getRaceExecutionOrderProvider(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java index e6d97e325ff..715fc261179 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java @@ -8,6 +8,7 @@ import com.sap.sailing.domain.base.RaceColumnInSeries; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Series; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; @@ -119,6 +120,11 @@ public class RaceColumnInSeriesImpl extends AbstractRaceColumn implements RaceCo public boolean hasSplitFleetContiguousScoring() { return getSeries().hasSplitFleetContiguousScoring(); } + + @Override + public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { + return null; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java index 0182667e6ce..84725acf7f2 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java @@ -5,6 +5,7 @@ import java.util.Collections; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.impl.AbstractRaceColumn; import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceColumn { private static final long serialVersionUID = -7801617988982540470L; @@ -44,4 +45,9 @@ public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceCo return Collections.singleton(FlexibleLeaderboardImpl.defaultFleet); } + @Override + public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { + return null; + } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java index 81acb8e8054..df62cb5e664 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/meta/MetaLeaderboardColumn.java @@ -15,6 +15,7 @@ import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.TrackedRace; /** @@ -197,4 +198,9 @@ public class MetaLeaderboardColumn extends SimpleAbstractRaceColumn implements R @Override public void reloadRaceLog(Fleet fleet) { } + + @Override + public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { + return null; + } } From bdd74dc1ce43cf3edd7a4887ca610a39e23a134f Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Mon, 18 May 2015 11:11:24 +0200 Subject: [PATCH 09/85] added attachRaceExecutionProvider method declaration to TrackedRace interface --- .../com/sap/sailing/domain/test/mock/MockedTrackedRace.java | 5 +++++ .../test/mock/MockedTrackedRaceWithStartTimeAndRanks.java | 5 +++++ .../src/com/sap/sailing/domain/tracking/TrackedRace.java | 6 ++++++ .../domain/tracking/impl/DynamicTrackedRaceImpl.java | 5 +++++ .../src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java | 5 +++++ .../com/sap/sailing/server/masterdata/DummyTrackedRace.java | 5 +++++ 6 files changed, 31 insertions(+) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index aa2a2d12451..6aaea0dbc53 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -56,6 +56,7 @@ import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.RaceAbortedListener; import com.sap.sailing.domain.tracking.RaceChangeListener; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.RaceListener; import com.sap.sailing.domain.tracking.StartTimeChangedListener; import com.sap.sailing.domain.tracking.TrackedLeg; @@ -918,4 +919,8 @@ public class MockedTrackedRace implements DynamicTrackedRace { // TODO Auto-generated method stub return null; } + + @Override + public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { + } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index 05e4ff232bf..a249dd76044 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -41,6 +41,7 @@ import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.RaceAbortedListener; import com.sap.sailing.domain.tracking.RaceChangeListener; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.StartTimeChangedListener; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; @@ -623,4 +624,8 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { return null; } + @Override + public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { + } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index ccf7e3f9ddb..0af14b1aac7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -640,6 +640,12 @@ public interface TrackedRace extends Serializable { */ void attachRegattaLog(RegattaLog regattaLog); + /** + * Attaches a {@link RaceExecutionOrderProvider} to make a {@link TrackedRace} aware + * which races are scheduled around it in the execution order of a {@link Regatta}. + * */ + void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider); + /** * Returns the attached race log event track for this race if any. * Otherwise null. diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 2c51a3fb80c..e5e1fa37625 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -43,6 +43,7 @@ import com.sap.sailing.domain.tracking.GPSTrackListener; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.RaceAbortedListener; import com.sap.sailing.domain.tracking.RaceChangeListener; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.StartTimeChangedListener; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedRaceStatus; @@ -812,4 +813,8 @@ DynamicTrackedRace, GPSTrackListener { public DynamicGPSFixTrack getTrack(Mark mark) { return (DynamicGPSFixTrack) super.getTrack(mark); } + + @Override + public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { + } } diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index 026e4ff0ac0..c453914d176 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -54,6 +54,7 @@ import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.RaceAbortedListener; import com.sap.sailing.domain.tracking.RaceChangeListener; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.RaceListener; import com.sap.sailing.domain.tracking.StartTimeChangedListener; import com.sap.sailing.domain.tracking.TrackedLeg; @@ -916,4 +917,8 @@ public class MockedTrackedRace implements DynamicTrackedRace { // TODO Auto-generated method stub return null; } + + @Override + public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { + } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java index ce378a0a55c..69a3268ba9a 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java @@ -40,6 +40,7 @@ import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.RaceAbortedListener; import com.sap.sailing.domain.tracking.RaceChangeListener; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.StartTimeChangedListener; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; @@ -597,4 +598,8 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { // TODO Auto-generated method stub return null; } + + @Override + public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { + } } From 094c45fda652d333a55011b8bc65258559dd37c1 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Mon, 18 May 2015 15:00:37 +0200 Subject: [PATCH 10/85] added abstract getRaceExecutionProvider method to AbstractRaceColumn --- .../sap/sailing/domain/base/impl/AbstractRaceColumn.java | 2 ++ .../sailing/domain/base/impl/RaceColumnInSeriesImpl.java | 6 ++++++ .../sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java | 6 ++++++ 3 files changed, 14 insertions(+) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 6fae2a3dc8c..dd02edd0659 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -15,6 +15,7 @@ import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.racelog.impl.RaceLogIdentifierImpl; import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sse.common.Util; @@ -198,4 +199,5 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem trackedRaces.setMasterDataExportOngoingThreadFlag(flagValue); } + public abstract RaceExecutionOrderProvider getRaceExecutionProvider(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java index 715fc261179..de9faccd1b5 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java @@ -125,6 +125,12 @@ public class RaceColumnInSeriesImpl extends AbstractRaceColumn implements RaceCo public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { return null; } + + @Override + public RaceExecutionOrderProvider getRaceExecutionProvider() { + // TODO Auto-generated method stub + return null; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java index 84725acf7f2..1f8cf9b8b37 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java @@ -50,4 +50,10 @@ public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceCo return null; } + @Override + public RaceExecutionOrderProvider getRaceExecutionProvider() { + // TODO Auto-generated method stub + return null; + } + } From cf58de7a7c15c96f182f7ae488ce241da6dd3ad1 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Mon, 18 May 2015 15:22:46 +0200 Subject: [PATCH 11/85] added implementations to RaceColumns from Series and FlexibleLeaderboard for getRaceExecutionOrderProvider --- .../sap/sailing/domain/test/mock/MockedTrackedRace.java | 5 +++++ .../src/com/sap/sailing/domain/base/Regatta.java | 3 +++ .../sailing/domain/base/impl/RaceColumnInSeriesImpl.java | 7 +++++-- .../src/com/sap/sailing/domain/base/impl/RegattaImpl.java | 7 +++++++ .../domain/leaderboard/impl/FlexibleLeaderboardImpl.java | 3 ++- .../sailing/domain/leaderboard/impl/RaceColumnImpl.java | 7 ++++--- .../src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java | 5 +++++ 7 files changed, 31 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index 6aaea0dbc53..e7d9f1084de 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -439,6 +439,11 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public void adjustEventToRegattaAssociation(EventFetcher eventFetcher) { } + + @Override + public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { + return null; + } }; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java index 1dfb3d18d64..65149464d1a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java @@ -5,6 +5,7 @@ import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaIdentifier; import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.regattalike.IsRegattaLike; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sse.common.Named; @@ -176,4 +177,6 @@ public interface Regatta extends Named, WithID, IsRegattaLike { * opposite end of the association needs to be maintained on the event's side. */ void adjustEventToRegattaAssociation(EventFetcher eventFetcher); + + RaceExecutionOrderProvider getRaceExecutionOrderProvider(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java index de9faccd1b5..79a218a180c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java @@ -128,8 +128,11 @@ public class RaceColumnInSeriesImpl extends AbstractRaceColumn implements RaceCo @Override public RaceExecutionOrderProvider getRaceExecutionProvider() { - // TODO Auto-generated method stub - return null; + if (getRegatta() != null) { + return getRegatta().getRaceExecutionOrderProvider(); + } else { + return null; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index 45e5348b2d3..76cee780c88 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -44,6 +44,7 @@ import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier; import com.sap.sailing.domain.regattalike.RegattaLikeListener; import com.sap.sailing.domain.regattalog.RegattaLogStore; import com.sap.sailing.domain.regattalog.impl.EmptyRegattaLogStore; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; @@ -580,4 +581,10 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } } + + @Override + public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { + // TODO Return instance that implements RaceExecutionOrderProvider + return null; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java index 989e468e8b9..9b4ffd71a7e 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java @@ -172,7 +172,8 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements } protected RaceColumnImpl createRaceColumn(String column, boolean medalRace) { - return new RaceColumnImpl(column, medalRace); + // TODO hand over instance that implements RaceExecutionOrderProvider + return new RaceColumnImpl(column, medalRace, null); } protected Iterable turnNullOrEmptyFleetsIntoDefaultFleet(Fleet... fleets) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java index 1f8cf9b8b37..2a8de096033 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java @@ -12,11 +12,13 @@ public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceCo private String name; private boolean medalRace; + private RaceExecutionOrderProvider raceExecutionOrderProvider; - public RaceColumnImpl(String name, boolean medalRace) { + public RaceColumnImpl(String name, boolean medalRace, RaceExecutionOrderProvider raceExecutionOrderProvider) { super(); this.name = name; this.medalRace = medalRace; + this.raceExecutionOrderProvider = raceExecutionOrderProvider; } @Override @@ -52,8 +54,7 @@ public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceCo @Override public RaceExecutionOrderProvider getRaceExecutionProvider() { - // TODO Auto-generated method stub - return null; + return raceExecutionOrderProvider; } } diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index c453914d176..e95709c5e19 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -435,6 +435,11 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public void adjustEventToRegattaAssociation(EventFetcher eventFetcher) { } + + @Override + public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { + return null; + } }; } From 9825ea997fc0987456998acaab12bff4c9740c04 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Mon, 18 May 2015 16:25:09 +0200 Subject: [PATCH 12/85] RaceExecutionOrderProvider not extends WithId --- .../sailing/domain/tracking/RaceExecutionOrderProvider.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java index 90bde1209a7..1e13bee9580 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java @@ -1,12 +1,13 @@ package com.sap.sailing.domain.tracking; import com.sap.sailing.domain.base.Regatta; +import com.sap.sse.common.WithID; /** * @author Alexander Ries (D062114) * */ -public interface RaceExecutionOrderProvider { +public interface RaceExecutionOrderProvider extends WithID{ /** * Parameter race is a {@link TrackedRace} from which the method returns the previous {@link TrackedRace} in the execution order of a {@link Regatta}. From c408954881244b43614a74fbe7e30516234563af Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Mon, 18 May 2015 16:43:43 +0200 Subject: [PATCH 13/85] added RaceExecutionOrderProvider ConcurrentHashMap to TrackedRaceImpl and implemented attach and detach method for RaceExecutionProviders in DynamicTrackedRace --- .../domain/test/mock/MockedTrackedRace.java | 4 ++++ ...ockedTrackedRaceWithStartTimeAndRanks.java | 4 ++++ .../sailing/domain/tracking/TrackedRace.java | 5 +++++ .../tracking/impl/DynamicTrackedRaceImpl.java | 19 +++++++++++++++---- .../domain/tracking/impl/TrackedRaceImpl.java | 4 ++++ .../gwt/ui/test/MockedTrackedRace.java | 4 ++++ .../server/masterdata/DummyTrackedRace.java | 4 ++++ 7 files changed, 40 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index e7d9f1084de..4b311f7d7cd 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -928,4 +928,8 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } + + @Override + public void detachRaceExecutionOrderProvider(Serializable identifier) { + } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index a249dd76044..bfb68c03924 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -628,4 +628,8 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } + @Override + public void detachRaceExecutionOrderProvider(Serializable identifier) { + } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 0af14b1aac7..713c87bb813 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -617,6 +617,11 @@ public interface TrackedRace extends Serializable { */ void detachRaceLog(Serializable identifier); + /** + * Detaches the link {@link RaceExecutionOrderProvider} with this identifier. + */ + void detachRaceExecutionOrderProvider(Serializable identifier); + /** * Detaches all {@link RaceLog} instances from this race */ diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index e5e1fa37625..278755d5a8f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -754,6 +754,20 @@ DynamicTrackedRace, GPSTrackListener { } super.detachRaceLog(identifier); } + + @Override + public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { + if(raceExecutionOrderProvider != null && raceExecutionOrderProvider.getId() != null){ + super.attachedRaceExecutionOrderProvider.put(raceExecutionOrderProvider.getId(), raceExecutionOrderProvider); + } + } + + @Override + public void detachRaceExecutionOrderProvider(Serializable identifier) { + if (identifier != null) { + super.attachedRaceExecutionOrderProvider.remove(identifier); + } + } @Override public void addCourseDesignChangedListener(CourseDesignChangedListener listener) { @@ -813,8 +827,5 @@ DynamicTrackedRace, GPSTrackListener { public DynamicGPSFixTrack getTrack(Mark mark) { return (DynamicGPSFixTrack) super.getTrack(mark); } - - @Override - public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { - } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 6492f3de69c..77ed7eadc63 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -111,6 +111,7 @@ import com.sap.sailing.domain.tracking.GPSTrackListener; import com.sap.sailing.domain.tracking.LineDetails; import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.MarkPassing; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.RaceListener; import com.sap.sailing.domain.tracking.Track; import com.sap.sailing.domain.tracking.TrackedLeg; @@ -272,6 +273,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl protected transient WeakHashMap raceStates; protected transient ConcurrentHashMap attachedRegattaLogs; + + protected transient ConcurrentHashMap attachedRaceExecutionOrderProvider; /** * The time delay to the current point in time in milliseconds. @@ -333,6 +336,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl locksForMarkPassings = new IdentityHashMap<>(); attachedRaceLogs = new ConcurrentHashMap<>(); attachedRegattaLogs = new ConcurrentHashMap<>(); + attachedRaceExecutionOrderProvider = new ConcurrentHashMap<>(); this.status = new TrackedRaceStatusImpl(TrackedRaceStatusEnum.PREPARED, 0.0); this.statusNotifier = new Object[0]; this.loadingFromWindStoreLock = new NamedReentrantReadWriteLock("Loading from wind store lock for tracked race " diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index e95709c5e19..72d10813ee1 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -926,4 +926,8 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } + + @Override + public void detachRaceExecutionOrderProvider(Serializable identifier) { + } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java index 69a3268ba9a..41c80e3a464 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java @@ -602,4 +602,8 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { @Override public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } + + @Override + public void detachRaceExecutionOrderProvider(Serializable identifier) { + } } From 5562e1121c50bf9ec56487585f0eef911fcd881d Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 19 May 2015 11:40:01 +0200 Subject: [PATCH 14/85] DynamicTrackedRace attachRaceExecutionOrderProvider Implementation now checks if map already contains id --- .../sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 278755d5a8f..b07f2899e4c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -757,7 +757,7 @@ DynamicTrackedRace, GPSTrackListener { @Override public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { - if(raceExecutionOrderProvider != null && raceExecutionOrderProvider.getId() != null){ + if (raceExecutionOrderProvider != null && raceExecutionOrderProvider.getId() != null && !super.attachedRaceExecutionOrderProvider.containsKey(raceExecutionOrderProvider.getId())) { super.attachedRaceExecutionOrderProvider.put(raceExecutionOrderProvider.getId(), raceExecutionOrderProvider); } } From aacab56983d49d580aa496ecc80685e5c502eb9c Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 19 May 2015 11:41:19 +0200 Subject: [PATCH 15/85] Series now attaches RaceExecutionOrderProvider to TrackedRaces in RaceColumns if Regatta is set. If set Regatta is null it detaches them. --- .../sailing/domain/base/impl/SeriesImpl.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java index e61d34d46a9..21f0d7b595f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java @@ -106,6 +106,11 @@ public class SeriesImpl extends RenamableImpl implements Series, RaceColumnListe @Override public void setRegatta(Regatta regatta) { this.regatta = regatta; + if (this.regatta != null) { + attachRaceExecutionOrderProviderToTrackedRacesInRaceCollumns(); + } else { + detachRaceExecutionOrderProviderFromTrackedRacesInRaceCollumns(); + } } public Iterable getFleets() { @@ -157,6 +162,28 @@ public class SeriesImpl extends RenamableImpl implements Series, RaceColumnListe this, trackedRegattaRegistry); } + + private void attachRaceExecutionOrderProviderToTrackedRacesInRaceCollumns(){ + for(RaceColumnInSeries raceColumnInSeries : raceColumns){ + for(Fleet fleet : raceColumnInSeries.getFleets()){ + TrackedRace trackedRace = raceColumnInSeries.getTrackedRace(fleet); + if(trackedRace != null && regatta != null){ + trackedRace.attachRaceExecutionProvider(regatta.getRaceExecutionOrderProvider()); + } + } + } + } + + private void detachRaceExecutionOrderProviderFromTrackedRacesInRaceCollumns(){ + for(RaceColumnInSeries raceColumnInSeries : raceColumns){ + for(Fleet fleet : raceColumnInSeries.getFleets()){ + TrackedRace trackedRace = raceColumnInSeries.getTrackedRace(fleet); + if(trackedRace != null && regatta != null && regatta.getRaceExecutionOrderProvider() != null){ + trackedRace.detachRaceExecutionOrderProvider(regatta.getRaceExecutionOrderProvider().getId()); + } + } + } + } @Override public void moveRaceColumnUp(String raceColumnName) { From 5610ae7e66af0477c49eb34254d85a5b5fdb7da2 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 19 May 2015 20:11:44 +0200 Subject: [PATCH 16/85] AbstractRaceColumn attaches now RaceExecutionOrderProvider to TrackedRace in setTrackedRace() method --- .../sap/sailing/domain/base/impl/AbstractRaceColumn.java | 3 ++- .../sailing/domain/base/impl/RaceColumnInSeriesImpl.java | 7 ------- .../sailing/domain/leaderboard/impl/RaceColumnImpl.java | 6 ------ 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index dd02edd0659..e7f669542e7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -75,6 +75,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem } if (trackedRace != null) { trackedRace.attachRaceLog(getRaceLog(fleet)); + trackedRace.attachRaceExecutionProvider(getRaceExecutionOrderProvider()); getRaceColumnListeners().notifyListenersAboutTrackedRaceLinked(this, fleet, trackedRace); } } @@ -199,5 +200,5 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem trackedRaces.setMasterDataExportOngoingThreadFlag(flagValue); } - public abstract RaceExecutionOrderProvider getRaceExecutionProvider(); + public abstract RaceExecutionOrderProvider getRaceExecutionOrderProvider(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java index 79a218a180c..3400997f591 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java @@ -123,17 +123,10 @@ public class RaceColumnInSeriesImpl extends AbstractRaceColumn implements RaceCo @Override public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { - return null; - } - - @Override - public RaceExecutionOrderProvider getRaceExecutionProvider() { if (getRegatta() != null) { return getRegatta().getRaceExecutionOrderProvider(); } else { return null; } } - - } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java index 2a8de096033..fa25b1c9e24 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java @@ -49,12 +49,6 @@ public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceCo @Override public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { - return null; - } - - @Override - public RaceExecutionOrderProvider getRaceExecutionProvider() { return raceExecutionOrderProvider; } - } From 99be7cc95a42196447aaf4e3f4a7a90362d88429 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Wed, 20 May 2015 22:57:20 +0200 Subject: [PATCH 17/85] Added AbstractRaceColumnListener --- .../base/impl/AbstractRaceColumnListener.java | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java new file mode 100644 index 00000000000..dea1f6b2219 --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java @@ -0,0 +1,111 @@ +package com.sap.sailing.domain.base.impl; + +import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.base.RaceColumnListener; +import com.sap.sailing.domain.leaderboard.ResultDiscardingRule; +import com.sap.sailing.domain.racelog.RaceLogIdentifier; +import com.sap.sailing.domain.tracking.TrackedRace; + +/** + * Delegates all listener operations to a default action which is implemented here to do nothing. This way, subclasses + * can easily provide a default action to be executed for all callback methods except for maybe a few which then need to + * be explicitly overridden. If not most methods need to perform the same action then instead of implementing a default + * action subclasses should rather override the {@link RaceColumnListener} operations individually. + * + * @author Alexander Ries (D062114) + * + */ +public abstract class AbstractRaceColumnListener implements RaceColumnListener{ + + private static final long serialVersionUID = -6210815580399401162L; + + /** + * This implementation of the default action to which all other operations delegate does nothing. Subclasses can + * choose to override this method to provide this as the default behavior for all other methods and then still + * override individual {@link RaceColumnListener} methods, or they can leave the default action empty and just + * override {@link RaceColumnListener} methods. + */ + protected void defaultAction() { + // Does nothing + } + + @Override + public void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + defaultAction(); + } + + @Override + public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + defaultAction(); + } + + @Override + public void isMedalRaceChanged(RaceColumn raceColumn, boolean newIsMedalRace) { + defaultAction(); + } + + @Override + public void isStartsWithZeroScoreChanged(RaceColumn raceColumn, boolean newIsStartsWithZeroScore) { + defaultAction(); + } + + @Override + public void isFirstColumnIsNonDiscardableCarryForwardChanged(RaceColumn raceColumn, + boolean firstColumnIsNonDiscardableCarryForward) { + defaultAction(); + } + + @Override + public void hasSplitFleetContiguousScoringChanged(RaceColumn raceColumn, boolean hasSplitFleetContiguousScoring) { + defaultAction(); + } + + @Override + public boolean canAddRaceColumnToContainer(RaceColumn raceColumn) { + return false; + } + + @Override + public void raceColumnAddedToContainer(RaceColumn raceColumn) { + defaultAction(); + } + + @Override + public void raceColumnRemovedFromContainer(RaceColumn raceColumn) { + defaultAction(); + } + + @Override + public void raceColumnMoved(RaceColumn raceColumn, int newIndex) { + defaultAction(); + } + + @Override + public void factorChanged(RaceColumn raceColumn, Double oldFactor, Double newFactor) { + defaultAction(); + } + + @Override + public void competitorDisplayNameChanged(Competitor competitor, String oldDisplayName, String displayName) { + defaultAction(); + } + + @Override + public void resultDiscardingRuleChanged(ResultDiscardingRule oldDiscardingRule, + ResultDiscardingRule newDiscardingRule) { + defaultAction(); + } + + @Override + public void raceLogEventAdded(RaceColumn raceColumn, RaceLogIdentifier raceLogIdentifier, RaceLogEvent event) { + defaultAction(); + } + + @Override + public boolean isTransient() { + return false; + } +} From 1c8bb3b4140216f214fb9e05082638bf1e1287d5 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Wed, 20 May 2015 22:58:30 +0200 Subject: [PATCH 18/85] Added RaceExecutionOrderProvider implementations to RegattaImpl and FlexibleLeaderboardImpl --- .../sailing/domain/base/impl/RegattaImpl.java | 118 +++++++++++++++- .../impl/FlexibleLeaderboardImpl.java | 131 +++++++++++++++++- 2 files changed, 243 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index 76cee780c88..6fec3836113 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -6,6 +6,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.logging.Logger; @@ -52,6 +53,10 @@ import com.sap.sailing.util.impl.RaceColumnListeners; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.NamedImpl; +import com.sap.sse.util.SmartFutureCache; +import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; + +import difflib.PatchFailedException; public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListener { @@ -85,7 +90,8 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene private CourseArea defaultCourseArea; private RegattaConfiguration configuration; - + private RaceExecutionOrderCache raceExecutionOrderCache; + /** * Regattas may be constructed as implicit default regattas in which case they won't need to be stored * durably and don't contain valuable information worth being preserved; or they are constructed explicitly @@ -161,6 +167,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene this.defaultCourseArea = courseArea; this.configuration = null; this.regattaLikeHelper = new BaseRegattaLikeImpl(new RegattaAsRegattaLikeIdentifier(this), regattaLogStore); + this.raceExecutionOrderCache = new RaceExecutionOrderCache(); } private void registerRaceLogsOnRaceColumns(Series series) { @@ -584,7 +591,112 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene @Override public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { - // TODO Return instance that implements RaceExecutionOrderProvider - return null; + return raceExecutionOrderCache; + } + + private class RaceExecutionOrderCache extends AbstractRaceColumnListener implements RaceExecutionOrderProvider { + + private static final long serialVersionUID = 4795731834688229568L; + private transient SmartFutureCache, EmptyUpdateInterval> racesOrderCache; + private final String RACES_ORDER_LIST_CACHE_KEY = "racesOrderCacheKey"; + private final String RACES_ORDER_LIST_LOCKS_NAME = getClass().getName(); + + public RaceExecutionOrderCache() { + racesOrderCache = createRacesOrderCache(); + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + addRaceColumnListener(this); + } + + public List getRacesInExecutionOrder() { + List result; + result = racesOrderCache.get(RACES_ORDER_LIST_CACHE_KEY,/*waitForLatest*/ true); + return result; + } + + @Override + public void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + } + + @Override + public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + } + + @Override + public void raceColumnAddedToContainer(RaceColumn raceColumn) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + } + + @Override + public void raceColumnRemovedFromContainer(RaceColumn raceColumn) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + } + + @Override + public void raceColumnMoved(RaceColumn raceColumn, int newIndex) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + } + + private List reloadRacesInExecutionOrder() { + List raceIdListInExecutionOrder = new ArrayList(); + Iterator seriesInRegatta = getSeries().iterator(); + while (seriesInRegatta.hasNext()) { + Series currentSeries = seriesInRegatta.next(); + Iterator raceColumns = currentSeries.getRaceColumns().iterator(); + while (raceColumns.hasNext()) { + RaceColumn currentRaceColumn = raceColumns.next(); + Iterator fleetsInRaceColumn = currentRaceColumn.getFleets().iterator(); + while (fleetsInRaceColumn.hasNext()) { + TrackedRace trackedRaceInColumnForFleet = currentRaceColumn.getTrackedRace(fleetsInRaceColumn + .next()); + if (trackedRaceInColumnForFleet != null) { + raceIdListInExecutionOrder.add(trackedRaceInColumnForFleet); + } + } + } + } + return raceIdListInExecutionOrder; + } + + private SmartFutureCache, EmptyUpdateInterval> createRacesOrderCache() { + return new SmartFutureCache, SmartFutureCache.EmptyUpdateInterval>( + new SmartFutureCache.AbstractCacheUpdater, SmartFutureCache.EmptyUpdateInterval>() { + + @Override + public List computeCacheUpdate(String key, + EmptyUpdateInterval updateInterval) throws Exception { + if (key.equals(RACES_ORDER_LIST_CACHE_KEY)) { + return reloadRacesInExecutionOrder(); + } else { + List emptyList = new ArrayList(); + return emptyList; + } + } + }, RACES_ORDER_LIST_LOCKS_NAME); + } + + private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException, PatchFailedException { + ois.defaultReadObject(); + racesOrderCache = createRacesOrderCache(); + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + } + + @Override + public TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race) { + List racesInOrder = getRacesInExecutionOrder(); + if (racesInOrder != null) { + int indexOfRace = racesInOrder.indexOf(race); + if (indexOfRace != -1 && indexOfRace != 0) { + return racesInOrder.get(indexOfRace - 1); + } + } + return null; + } + + @Override + public Serializable getId() { + return serialVersionUID; + } } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java index 9b4ffd71a7e..6da0cbd244d 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java @@ -3,10 +3,12 @@ package com.sap.sailing.domain.leaderboard.impl; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.logging.Logger; @@ -18,6 +20,7 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnListener; +import com.sap.sailing.domain.base.impl.AbstractRaceColumnListener; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn; import com.sap.sailing.domain.leaderboard.ScoringScheme; @@ -31,7 +34,12 @@ import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier; import com.sap.sailing.domain.regattalike.RegattaLikeListener; import com.sap.sailing.domain.regattalog.RegattaLogStore; import com.sap.sailing.domain.regattalog.impl.EmptyRegattaLogStore; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sse.util.SmartFutureCache; +import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; + +import difflib.PatchFailedException; /** * A leaderboard implementation that allows users to flexibly configure which columns exist. No constraints need to be observed regarding @@ -53,6 +61,7 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements private String name; private transient RaceLogStore raceLogStore; private CourseArea courseArea; + private RaceExecutionOrderProvider raceExecutionOrderProvider; /** * @see RegattaLog for the reason why the leaderboard manages a {@code RegattaLog} @@ -78,6 +87,7 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements this.raceLogStore = raceLogStore; this.courseArea = courseArea; this.regattaLikeHelper = new BaseRegattaLikeImpl(new FlexibleLeaderboardAsRegattaLikeIdentifier(this), regattaLogStore); + this.raceExecutionOrderProvider = new RaceExecutionOrderCache(); } /** @@ -168,12 +178,15 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements @Override public Iterable getRaceColumns() { - return Collections.unmodifiableCollection(new ArrayList(races)); + if (races != null) { + return Collections.unmodifiableCollection(new ArrayList(races)); + } else { + return null; + } } protected RaceColumnImpl createRaceColumn(String column, boolean medalRace) { - // TODO hand over instance that implements RaceExecutionOrderProvider - return new RaceColumnImpl(column, medalRace, null); + return new RaceColumnImpl(column, medalRace, raceExecutionOrderProvider); } protected Iterable turnNullOrEmptyFleetsIntoDefaultFleet(Fleet... fleets) { @@ -292,4 +305,116 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements result.addAll(viaLog); return result; } + + private class RaceExecutionOrderCache extends AbstractRaceColumnListener implements RaceExecutionOrderProvider { + + private transient SmartFutureCache, EmptyUpdateInterval> racesOrderCache; + private final String RACES_ORDER_LIST_CACHE_KEY = "racesOrderCacheKey"; + private final String RACES_ORDER_LIST_LOCKS_NAME = getClass().getName(); + private static final long serialVersionUID = -1016823551825618490L; + + public RaceExecutionOrderCache() { + racesOrderCache = createRacesOrderCache(); + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + addRaceColumnListener(this); + } + + public List getRacesInExecutionOrder() { + List result; + result = racesOrderCache.get(RACES_ORDER_LIST_CACHE_KEY,/*waitForLatest*/ true); + return result; + } + + @Override + public void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + } + + @Override + public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + } + + @Override + public void raceColumnAddedToContainer(RaceColumn raceColumn) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + } + + @Override + public void raceColumnRemovedFromContainer(RaceColumn raceColumn) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + } + + @Override + public void raceColumnMoved(RaceColumn raceColumn, int newIndex) { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + } + + private List reloadRacesInExecutionOrder() { + List raceIdListInExecutionOrder = new ArrayList(); + if (getRaceColumns() != null) { + Iterator raceColumns = getRaceColumns().iterator(); + if (raceColumns != null) { + while (raceColumns.hasNext()) { + RaceColumn currentRaceColumn = raceColumns.next(); + if (currentRaceColumn.getFleets() != null) { + Iterator fleetsInRaceColumn = currentRaceColumn.getFleets().iterator(); + if (fleetsInRaceColumn != null) { + while (fleetsInRaceColumn.hasNext()) { + TrackedRace trackedRaceInColumnForFleet = currentRaceColumn + .getTrackedRace(fleetsInRaceColumn.next()); + if (trackedRaceInColumnForFleet != null) { + raceIdListInExecutionOrder.add(trackedRaceInColumnForFleet); + } + } + } + } + } + } + } + return raceIdListInExecutionOrder; + } + + + + private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException, PatchFailedException { + ois.defaultReadObject(); + racesOrderCache = createRacesOrderCache(); + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + } + + private SmartFutureCache, EmptyUpdateInterval> createRacesOrderCache() { + return new SmartFutureCache, SmartFutureCache.EmptyUpdateInterval>( + new SmartFutureCache.AbstractCacheUpdater, SmartFutureCache.EmptyUpdateInterval>() { + + @Override + public List computeCacheUpdate(String key, + EmptyUpdateInterval updateInterval) throws Exception { + if (key.equals(RACES_ORDER_LIST_CACHE_KEY)) { + return reloadRacesInExecutionOrder(); + } else { + List emptyList = new ArrayList(); + return emptyList; + } + } + }, RACES_ORDER_LIST_LOCKS_NAME); + } + + @Override + public TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race) { + List racesInOrder = getRacesInExecutionOrder(); + if (racesInOrder != null) { + int indexOfRace = racesInOrder.indexOf(race); + if (indexOfRace != -1 && indexOfRace != 0) { + return racesInOrder.get(indexOfRace - 1); + } + } + return null; + } + + @Override + public Serializable getId() { + return serialVersionUID; + } + } } From 3069a2d70d6d6ac6e10f1f78b1339681cf0ce15b Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 21 May 2015 09:39:01 +0200 Subject: [PATCH 19/85] fixing incorrect veto of race column addition in race execution order listener --- .../domain/base/RaceColumnListener.java | 4 ++- .../base/impl/AbstractRaceColumnListener.java | 7 +--- .../sailing/domain/base/impl/SeriesImpl.java | 33 ++++++++----------- .../leaderboard/LeaderboardCacheManager.java | 5 --- .../server/impl/RaceLogReplicator.java | 5 --- .../server/impl/RaceLogScoringReplicator.java | 5 --- 6 files changed, 18 insertions(+), 41 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumnListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumnListener.java index 873954d9379..cbc21268ee3 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumnListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/RaceColumnListener.java @@ -20,7 +20,9 @@ public interface RaceColumnListener extends Serializable { void hasSplitFleetContiguousScoringChanged(RaceColumn raceColumn, boolean hasSplitFleetContiguousScoring); - boolean canAddRaceColumnToContainer(RaceColumn raceColumn); + default boolean canAddRaceColumnToContainer(RaceColumn raceColumn) { + return true; + } void raceColumnAddedToContainer(RaceColumn raceColumn); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java index dea1f6b2219..47d57dba115 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java @@ -18,7 +18,7 @@ import com.sap.sailing.domain.tracking.TrackedRace; * @author Alexander Ries (D062114) * */ -public abstract class AbstractRaceColumnListener implements RaceColumnListener{ +public abstract class AbstractRaceColumnListener implements RaceColumnListener { private static final long serialVersionUID = -6210815580399401162L; @@ -63,11 +63,6 @@ public abstract class AbstractRaceColumnListener implements RaceColumnListener{ defaultAction(); } - @Override - public boolean canAddRaceColumnToContainer(RaceColumn raceColumn) { - return false; - } - @Override public void raceColumnAddedToContainer(RaceColumn raceColumn) { defaultAction(); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java index 21f0d7b595f..5f13b207de9 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java @@ -25,6 +25,11 @@ import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.util.impl.RaceColumnListeners; import com.sap.sse.common.Util; +/** + * A series listens on its columns; however, a veto for column addition isn't done here but in a {@link RegattaLeaderboard}. + * + * @see #addRaceColumn(String, TrackedRegattaRegistry) + */ public class SeriesImpl extends RenamableImpl implements Series, RaceColumnListener { private static final long serialVersionUID = -1640404303144907381L; private final Map fleetsByName; @@ -164,21 +169,21 @@ public class SeriesImpl extends RenamableImpl implements Series, RaceColumnListe } private void attachRaceExecutionOrderProviderToTrackedRacesInRaceCollumns(){ - for(RaceColumnInSeries raceColumnInSeries : raceColumns){ - for(Fleet fleet : raceColumnInSeries.getFleets()){ - TrackedRace trackedRace = raceColumnInSeries.getTrackedRace(fleet); - if(trackedRace != null && regatta != null){ + for (RaceColumnInSeries raceColumnInSeries : raceColumns) { + for (Fleet fleet : raceColumnInSeries.getFleets()) { + TrackedRace trackedRace = raceColumnInSeries.getTrackedRace(fleet); + if (trackedRace != null && regatta != null) { trackedRace.attachRaceExecutionProvider(regatta.getRaceExecutionOrderProvider()); } } } } - private void detachRaceExecutionOrderProviderFromTrackedRacesInRaceCollumns(){ - for(RaceColumnInSeries raceColumnInSeries : raceColumns){ - for(Fleet fleet : raceColumnInSeries.getFleets()){ - TrackedRace trackedRace = raceColumnInSeries.getTrackedRace(fleet); - if(trackedRace != null && regatta != null && regatta.getRaceExecutionOrderProvider() != null){ + private void detachRaceExecutionOrderProviderFromTrackedRacesInRaceCollumns() { + for (RaceColumnInSeries raceColumnInSeries : raceColumns) { + for (Fleet fleet : raceColumnInSeries.getFleets()) { + TrackedRace trackedRace = raceColumnInSeries.getTrackedRace(fleet); + if (trackedRace != null && regatta != null && regatta.getRaceExecutionOrderProvider() != null) { trackedRace.detachRaceExecutionOrderProvider(regatta.getRaceExecutionOrderProvider().getId()); } } @@ -302,16 +307,6 @@ public class SeriesImpl extends RenamableImpl implements Series, RaceColumnListe raceColumnListeners.notifyListenersAboutIsFirstColumnIsNonDiscardableCarryForwardChanged(raceColumn, firstColumnIsNonDiscardableCarryForward); } - /** - * A series listens on its columns; individual columns, however, don't ask whether they can be added; the series itself does. - * - * @see #addRaceColumn(String, TrackedRegattaRegistry) - */ - @Override - public boolean canAddRaceColumnToContainer(RaceColumn raceColumn) { - return true; - } - @Override public void raceColumnAddedToContainer(RaceColumn raceColumn) { raceColumnListeners.notifyListenersAboutRaceColumnAddedToContainer(raceColumn); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java index 38ad728922b..a95c6199c30 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java @@ -293,11 +293,6 @@ public class LeaderboardCacheManager { removeFromCache(leaderboard); } - @Override - public boolean canAddRaceColumnToContainer(RaceColumn raceColumn) { - return true; - } - @Override public void raceColumnAddedToContainer(RaceColumn raceColumn) { removeFromCache(leaderboard); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogReplicator.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogReplicator.java index 6ccd2bcc396..9aa44d096da 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogReplicator.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogReplicator.java @@ -90,11 +90,6 @@ public class RaceLogReplicator implements RaceColumnListener { public void hasSplitFleetContiguousScoringChanged(RaceColumn raceColumn, boolean hasSplitFleetContiguousScoring) { } - @Override - public boolean canAddRaceColumnToContainer(RaceColumn raceColumn) { - return true; - } - @Override public void raceColumnAddedToContainer(RaceColumn raceColumn) { } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java index eaa614b551e..8fb76bc3920 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RaceLogScoringReplicator.java @@ -62,11 +62,6 @@ public class RaceLogScoringReplicator implements RaceColumnListener { public void isFirstColumnIsNonDiscardableCarryForwardChanged(RaceColumn raceColumn, boolean firstColumnIsNonDiscardableCarryForward) { } - @Override - public boolean canAddRaceColumnToContainer(RaceColumn raceColumn) { - return true; - } - @Override public void raceColumnAddedToContainer(RaceColumn raceColumn) { } From 73684d27c84770c490580a4d711ca271da63c7a5 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Thu, 21 May 2015 14:53:49 +0200 Subject: [PATCH 20/85] Revert "Merge remote-tracking branch 'server/ribdashboard' into ribdashboard" This reverts commit 1fc692e4d34b3a02458d656f7e0181708b13e90b, reversing changes made to 1c8bb3b4140216f214fb9e05082638bf1e1287d5. --- .../domain/test/mock/MockedTrackedRace.java | 5 - .../domain/tracking/TrackedRegatta.java | 5 - .../tracking/impl/DynamicTrackedRaceImpl.java | 12 +- .../domain/tracking/impl/TrackedRaceImpl.java | 9 +- .../tracking/impl/TrackedRegattaImpl.java | 114 ------------------ .../impl/VirtualWindFixesAsNavigableSet.java | 2 +- .../tracking/impl/VirtualWindTrackImpl.java | 2 +- .../gwt/ui/test/MockedTrackedRace.java | 5 - 8 files changed, 6 insertions(+), 148 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index 5e86d04aa60..4b311f7d7cd 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -495,11 +495,6 @@ public class MockedTrackedRace implements DynamicTrackedRace { DynamicRaceDefinitionSet raceDefinitionSetToUpdate, boolean useMarkPassingcalculator) { return null; } - - @Override - public TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race) { - return null; - } }; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegatta.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegatta.java index 17040171583..227a8a216f5 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegatta.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRegatta.java @@ -73,9 +73,4 @@ public interface TrackedRegatta extends Serializable { void removeTrackedRace(RaceDefinition raceDefinition); - /** - * Parameter race is a {@link TrackedRace} from which the method returns the previous {@link TrackedRace} in the execution order of a {@link Regatta}. - * */ - TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race); - } \ No newline at end of file diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 5b71bf2df0a..567f59de16f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -46,7 +46,6 @@ import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.StartTimeChangedListener; import com.sap.sailing.domain.tracking.TrackedLeg; -import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRaceStatus; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.WindStore; @@ -661,15 +660,8 @@ DynamicTrackedRace, GPSTrackListener { TimePoint startOfTracking = getStartOfTracking(); TimePoint endOfRace = getEndOfRace(); TimePoint endOfTracking = getEndOfTracking(); - TrackedRace previosRaceInExecutionOrder = getTrackedRegatta().getPreviousRaceInExecutionOrder(this); - long conditional_time_before_start_to_track_wind; - if(previosRaceInExecutionOrder == null || previosRaceInExecutionOrder.getEndOfTracking() != null || !previosRaceInExecutionOrder.hasWindData()){ - conditional_time_before_start_to_track_wind = EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_IN_MILLISECONDS; - }else{ - conditional_time_before_start_to_track_wind = TIME_BEFORE_START_TO_TRACK_WIND_IN_MILLISECONDS; - } - if ((startOfTracking == null || !startOfTracking.minus(conditional_time_before_start_to_track_wind).after(wind.getTimePoint()) || - (startOfRace != null && !startOfRace.minus(conditional_time_before_start_to_track_wind).after(wind.getTimePoint()))) + if ((startOfTracking == null || !startOfTracking.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_MILLIS).after(wind.getTimePoint()) || + (startOfRace != null && !startOfRace.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_MILLIS).after(wind.getTimePoint()))) && // Caution: don't add to endOfTracking; it may be the end of time, leading to a wrap-around / overflow (endOfTracking == null || endOfTracking.after(wind.getTimePoint().minus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS)) || diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 07ce24c9fcb..77ed7eadc63 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -152,13 +152,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl // TODO make this variable private static final long DELAY_FOR_CACHE_CLEARING_IN_MILLISECONDS = 7500; - public static final long TIME_BEFORE_START_TO_TRACK_WIND_IN_MILLISECONDS = 4 * 60 * 1000l; // let wind start four minutes before race - - /** - * To make wind accessible 30 minutes before first race starts, there is a additional time buffer to record wind. - */ - public static final long EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_IN_MILLISECONDS = 30 * 60 * 1000l; - + public static final long TIME_BEFORE_START_TO_TRACK_WIND_MILLIS = 4 * 60 * 1000l; // let wind start four minutes before race + private TrackedRaceStatus status; private final Object statusNotifier; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java index c4fa256a9e0..32532ee476e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java @@ -7,8 +7,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.logging.Level; @@ -16,13 +14,9 @@ import java.util.logging.Logger; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.Fleet; -import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; -import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Sideline; -import com.sap.sailing.domain.base.impl.AbstractRaceColumnListener; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; @@ -32,16 +26,8 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sse.common.TimePoint; -import com.sap.sse.util.SmartFutureCache; -import com.sap.sse.util.SmartFutureCache.AbstractCacheUpdater; -import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; - -import difflib.PatchFailedException; public class TrackedRegattaImpl implements TrackedRegatta { - - private RaceExecutionOrderCache raceExecutionOrderCache; - private static final long serialVersionUID = 6480508193567014285L; private static final Logger logger = Logger.getLogger(TrackedRegattaImpl.class.getName()); @@ -57,13 +43,11 @@ public class TrackedRegattaImpl implements TrackedRegatta { this.trackedRaces = new HashMap(); this.trackedRacesByBoatClass = new HashMap>(); raceListeners = new HashSet(); - this.raceExecutionOrderCache = new RaceExecutionOrderCache(); } private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); this.raceListeners = new HashSet(); - this.raceExecutionOrderCache = new RaceExecutionOrderCache(); } private void writeObject(ObjectOutputStream oos) throws IOException { @@ -200,103 +184,5 @@ public class TrackedRegattaImpl implements TrackedRegatta { addTrackedRace(result); return result; } - - @Override - public TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race) { - List racesInOrder = raceExecutionOrderCache.getRacesInExecutionOrder(); - if (racesInOrder != null) { - int indexOfRace = racesInOrder.indexOf(race); - if (indexOfRace != -1 && indexOfRace != 0) { - return racesInOrder.get(indexOfRace - 1); - } - } - return null; - } - - private class RaceExecutionOrderCache extends AbstractRaceColumnListener { - private transient SmartFutureCache, EmptyUpdateInterval> racesOrderCache; - private final String RACES_ORDER_LIST_CACHE_KEY = "racesOrderCacheKey"; - private final String RACES_ORDER_LIST_LOCKS_NAME = getClass().getName(); - private static final long serialVersionUID = -1016823551825618490L; - - public RaceExecutionOrderCache() { - racesOrderCache = createRacesOrderCache(); - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - getRegatta().addRaceColumnListener(this); - } - - public List getRacesInExecutionOrder() { - List result; - result = racesOrderCache.get(RACES_ORDER_LIST_CACHE_KEY,/*waitForLatest*/ true); - return result; - } - - @Override - public void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - @Override - public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - @Override - public void raceColumnAddedToContainer(RaceColumn raceColumn) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - @Override - public void raceColumnRemovedFromContainer(RaceColumn raceColumn) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - @Override - public void raceColumnMoved(RaceColumn raceColumn, int newIndex) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - private List reloadRacesInExecutionOrder() { - List raceIdListInExecutionOrder = new ArrayList(); - Iterator seriesInRegatta = getRegatta().getSeries().iterator(); - while (seriesInRegatta.hasNext()) { - Series currentSeries = seriesInRegatta.next(); - Iterator raceColumns = currentSeries.getRaceColumns().iterator(); - while (raceColumns.hasNext()) { - RaceColumn currentRaceColumn = raceColumns.next(); - Iterator fleetsInRaceColumn = currentRaceColumn.getFleets().iterator(); - while (fleetsInRaceColumn.hasNext()) { - TrackedRace trackedRaceInColumnForFleet = currentRaceColumn.getTrackedRace(fleetsInRaceColumn - .next()); - if (trackedRaceInColumnForFleet != null) { - raceIdListInExecutionOrder.add(trackedRaceInColumnForFleet); - } - } - } - } - return raceIdListInExecutionOrder; - } - - private SmartFutureCache, EmptyUpdateInterval> createRacesOrderCache() { - return new SmartFutureCache, SmartFutureCache.EmptyUpdateInterval>( - new AbstractCacheUpdater, SmartFutureCache.EmptyUpdateInterval>() { - - @Override - public List computeCacheUpdate(String key, - EmptyUpdateInterval updateInterval) throws Exception { - if (key.equals(RACES_ORDER_LIST_CACHE_KEY)) { - return reloadRacesInExecutionOrder(); - } else { - return null; - } - } - }, RACES_ORDER_LIST_LOCKS_NAME); - } - - private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException, PatchFailedException { - ois.defaultReadObject(); - racesOrderCache = createRacesOrderCache(); - } - } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindFixesAsNavigableSet.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindFixesAsNavigableSet.java index 02a948344d1..70fe342982b 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindFixesAsNavigableSet.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindFixesAsNavigableSet.java @@ -141,7 +141,7 @@ public abstract class VirtualWindFixesAsNavigableSet extends AbstractUnmodifiabl protected TimePoint getFrom() { final TimePoint startOfRace = getTrackedRace().getStartOfRace(); return from == null ? startOfRace == null ? new MillisecondsTimePoint(Long.MAX_VALUE) - : floorToResolution(startOfRace.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_IN_MILLISECONDS)) : from; + : floorToResolution(startOfRace.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_MILLIS)) : from; } /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindTrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindTrackImpl.java index 0585df1eb03..3c0429c9537 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindTrackImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/VirtualWindTrackImpl.java @@ -63,7 +63,7 @@ public abstract class VirtualWindTrackImpl extends WindTrackImpl { final TimePoint startOfRace = getTrackedRace().getStartOfRace(); TimePoint timePointOfNewestEvent = getTrackedRace().getTimePointOfNewestEvent(); if (startOfRace != null) { - TimePoint fourMinutesBeforeRaceStartTimePoint = startOfRace.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_IN_MILLISECONDS); // let wind tracks start four minutes before start + TimePoint fourMinutesBeforeRaceStartTimePoint = startOfRace.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_MILLIS); // let wind tracks start four minutes before start if (timePointOfNewestEvent != null) { if (at.compareTo(fourMinutesBeforeRaceStartTimePoint) < 0) { adjustedAt = fourMinutesBeforeRaceStartTimePoint; diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index e8330bc26e6..72d10813ee1 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -491,11 +491,6 @@ public class MockedTrackedRace implements DynamicTrackedRace { boolean useMarkPassingCalculator) { return null; } - - @Override - public TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race) { - return null; - } }; } From 5001b2ee9cb78994813a85f4409d1cc1c824b009 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Thu, 21 May 2015 15:02:54 +0200 Subject: [PATCH 21/85] Added null checks in RegattaImpl inner RaceExecutionOrderCache class --- .../sailing/domain/base/impl/RegattaImpl.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index 6fec3836113..b23b58266eb 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -640,18 +640,24 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene private List reloadRacesInExecutionOrder() { List raceIdListInExecutionOrder = new ArrayList(); - Iterator seriesInRegatta = getSeries().iterator(); - while (seriesInRegatta.hasNext()) { - Series currentSeries = seriesInRegatta.next(); - Iterator raceColumns = currentSeries.getRaceColumns().iterator(); - while (raceColumns.hasNext()) { - RaceColumn currentRaceColumn = raceColumns.next(); - Iterator fleetsInRaceColumn = currentRaceColumn.getFleets().iterator(); - while (fleetsInRaceColumn.hasNext()) { - TrackedRace trackedRaceInColumnForFleet = currentRaceColumn.getTrackedRace(fleetsInRaceColumn - .next()); - if (trackedRaceInColumnForFleet != null) { - raceIdListInExecutionOrder.add(trackedRaceInColumnForFleet); + if (getSeries() != null) { + Iterator seriesInRegatta = getSeries().iterator(); + while (seriesInRegatta.hasNext()) { + Series currentSeries = seriesInRegatta.next(); + if (currentSeries.getRaceColumns() != null) { + Iterator raceColumns = currentSeries.getRaceColumns().iterator(); + while (raceColumns.hasNext()) { + RaceColumn currentRaceColumn = raceColumns.next(); + if (currentRaceColumn.getFleets() != null) { + Iterator fleetsInRaceColumn = currentRaceColumn.getFleets().iterator(); + while (fleetsInRaceColumn.hasNext()) { + TrackedRace trackedRaceInColumnForFleet = currentRaceColumn + .getTrackedRace(fleetsInRaceColumn.next()); + if (trackedRaceInColumnForFleet != null) { + raceIdListInExecutionOrder.add(trackedRaceInColumnForFleet); + } + } + } } } } From cc02a1e2723e5bad4c2b0260304b2592d9d0ea4e Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Thu, 21 May 2015 15:15:18 +0200 Subject: [PATCH 22/85] Added getPreviousRaceFromAttachedRaceExecutionOrderProviders() method to TrackedRace interface --- .../com/sap/sailing/domain/test/mock/MockedTrackedRace.java | 5 +++++ .../test/mock/MockedTrackedRaceWithStartTimeAndRanks.java | 5 +++++ .../src/com/sap/sailing/domain/tracking/TrackedRace.java | 1 + .../domain/tracking/impl/DynamicTrackedRaceImpl.java | 6 ++++++ .../src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java | 5 +++++ .../com/sap/sailing/server/masterdata/DummyTrackedRace.java | 6 ++++++ 6 files changed, 28 insertions(+) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index 4b311f7d7cd..1d22b949e1a 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -932,4 +932,9 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public void detachRaceExecutionOrderProvider(Serializable identifier) { } + + @Override + public TrackedRace getPreviousRaceFromAttachedRaceExecutionOrderProviders() { + return null; + } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index bfb68c03924..8c5c1e8263c 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -632,4 +632,9 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { public void detachRaceExecutionOrderProvider(Serializable identifier) { } + @Override + public TrackedRace getPreviousRaceFromAttachedRaceExecutionOrderProviders() { + return null; + } + } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 713c87bb813..7273ea272a3 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -795,4 +795,5 @@ public interface TrackedRace extends Serializable { void setPolarDataService(PolarDataService polarDataService); + TrackedRace getPreviousRaceFromAttachedRaceExecutionOrderProviders(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 567f59de16f..e20bc7e9f21 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -46,6 +46,7 @@ import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.StartTimeChangedListener; import com.sap.sailing.domain.tracking.TrackedLeg; +import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRaceStatus; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.WindStore; @@ -829,5 +830,10 @@ DynamicTrackedRace, GPSTrackListener { public DynamicGPSFixTrack getTrack(Mark mark) { return (DynamicGPSFixTrack) super.getTrack(mark); } + + @Override + public TrackedRace getPreviousRaceFromAttachedRaceExecutionOrderProviders() { + return null; + } } diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index 72d10813ee1..da5a6db7ca7 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -930,4 +930,9 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public void detachRaceExecutionOrderProvider(Serializable identifier) { } + + @Override + public TrackedRace getPreviousRaceFromAttachedRaceExecutionOrderProviders() { + return null; + } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java index 41c80e3a464..76f5a67e905 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java @@ -44,6 +44,7 @@ import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.StartTimeChangedListener; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; +import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRaceStatus; import com.sap.sailing.domain.tracking.TrackedRaceWithWindEssentials; import com.sap.sailing.domain.tracking.TrackedRegatta; @@ -606,4 +607,9 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { @Override public void detachRaceExecutionOrderProvider(Serializable identifier) { } + + @Override + public TrackedRace getPreviousRaceFromAttachedRaceExecutionOrderProviders() { + return null; + } } From d7c2972bf8f07c72832ed248565c221e8bb3a762 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Thu, 21 May 2015 15:49:37 +0200 Subject: [PATCH 23/85] Added getPreviousRaceFromAttachedRaceExecutionOrderProviders() implementation to DynamicTrackedRaceImpl --- .../tracking/impl/DynamicTrackedRaceImpl.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index e20bc7e9f21..01fc8580705 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -833,6 +833,22 @@ DynamicTrackedRace, GPSTrackListener { @Override public TrackedRace getPreviousRaceFromAttachedRaceExecutionOrderProviders() { + if (attachedRaceExecutionOrderProvider != null && attachedRaceExecutionOrderProvider.values() != null) { + if (attachedRaceExecutionOrderProvider.values().isEmpty()) { + return null; + } else { + Iterator raceExecutionOrderProviders = attachedRaceExecutionOrderProvider.values().iterator(); + TrackedRace firstPreviousRaceInExecutionOrder = raceExecutionOrderProviders.next().getPreviousRaceInExecutionOrder(this); + while (raceExecutionOrderProviders.hasNext()) { + RaceExecutionOrderProvider raceExecutionOrderProvider = raceExecutionOrderProviders.next(); + TrackedRace currentPreviousRaceInExecutionOrder = raceExecutionOrderProvider.getPreviousRaceInExecutionOrder(this); + if (currentPreviousRaceInExecutionOrder == null || !currentPreviousRaceInExecutionOrder.equals(firstPreviousRaceInExecutionOrder)) { + return null; + } + } + return firstPreviousRaceInExecutionOrder; + } + } return null; } From b1155f8b4880c0b32e3d9cb7438418cebcfe991d Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Thu, 21 May 2015 15:50:53 +0200 Subject: [PATCH 24/85] Added extra long time before start to track wind in millis constant to TrackedRaceImpl --- .../com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 77ed7eadc63..b138ec7b69c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -153,6 +153,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl private static final long DELAY_FOR_CACHE_CLEARING_IN_MILLISECONDS = 7500; public static final long TIME_BEFORE_START_TO_TRACK_WIND_MILLIS = 4 * 60 * 1000l; // let wind start four minutes before race + + public static final long EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS = 60 * 60 * 1000l; private TrackedRaceStatus status; From 7f9d27889592f8ada4cb7fb582cc1631f3162179 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Thu, 21 May 2015 16:08:02 +0200 Subject: [PATCH 25/85] recordWind changes now time before race start to track wind depending on previous race that has wind --- .../tracking/impl/DynamicTrackedRaceImpl.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 01fc8580705..af578e4f32b 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -661,8 +661,9 @@ DynamicTrackedRace, GPSTrackListener { TimePoint startOfTracking = getStartOfTracking(); TimePoint endOfRace = getEndOfRace(); TimePoint endOfTracking = getEndOfTracking(); - if ((startOfTracking == null || !startOfTracking.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_MILLIS).after(wind.getTimePoint()) || - (startOfRace != null && !startOfRace.minus(TrackedRaceImpl.TIME_BEFORE_START_TO_TRACK_WIND_MILLIS).after(wind.getTimePoint()))) + long conditional_time_before_start_to_track_wind = getConditionalTimeBeforeStartToTrackWind(); + if ((startOfTracking == null || !startOfTracking.minus(conditional_time_before_start_to_track_wind).after(wind.getTimePoint()) || + (startOfRace != null && !startOfRace.minus(conditional_time_before_start_to_track_wind).after(wind.getTimePoint()))) && // Caution: don't add to endOfTracking; it may be the end of time, leading to a wrap-around / overflow (endOfTracking == null || endOfTracking.after(wind.getTimePoint().minus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS)) || @@ -676,6 +677,15 @@ DynamicTrackedRace, GPSTrackListener { } return result; } + + private long getConditionalTimeBeforeStartToTrackWind(){ + TrackedRace previosRaceInExecutionOrder = getPreviousRaceFromAttachedRaceExecutionOrderProviders(); + if (previosRaceInExecutionOrder == null || previosRaceInExecutionOrder.getEndOfTracking() != null || !previosRaceInExecutionOrder.hasWindData()) { + return EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; + } else { + return TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; + } + } @Override public void removeWind(Wind wind, WindSource windSource) { From 532ad8903c01601f479a4fd72ea290d78af81e48 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Sat, 23 May 2015 16:22:58 +0200 Subject: [PATCH 26/85] RegattaImpl getSeries() checks series for null --- .../src/com/sap/sailing/domain/base/impl/RegattaImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index b23b58266eb..6c87000a711 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -233,7 +233,11 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene @Override public Iterable getSeries() { - return Collections.unmodifiableCollection(series); + if (series != null) { + return Collections.unmodifiableCollection(series); + } else { + return null; + } } @Override From 4cc806704d979971084b1a1bb341d45851d8ca98 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 26 May 2015 10:02:05 +0200 Subject: [PATCH 27/85] Chaning now not only dashboard eventlogo but also window title according to given eventid parameter --- .../RibDashboard.html | 2 +- .../gwt/client/eventlogo/EventLogo.java | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.dashboards.gwt/RibDashboard.html b/java/com.sap.sailing.dashboards.gwt/RibDashboard.html index 5d6d9768d35..a4a51f7dbc1 100644 --- a/java/com.sap.sailing.dashboards.gwt/RibDashboard.html +++ b/java/com.sap.sailing.dashboards.gwt/RibDashboard.html @@ -13,7 +13,7 @@ -ESS Dashboard +Dashboard diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/eventlogo/EventLogo.java b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/eventlogo/EventLogo.java index 27c06e0ee36..f42cb8519d4 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/eventlogo/EventLogo.java +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/eventlogo/EventLogo.java @@ -3,6 +3,7 @@ package com.sap.sailing.dashboards.gwt.client.eventlogo; import java.util.UUID; import com.google.gwt.dom.client.Style.Visibility; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Image; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; @@ -22,12 +23,17 @@ public class EventLogo extends Image { sailingServiceAsync.getEventById(eventUUID, true, new AsyncCallback() { @Override public void onSuccess(final EventDTO event) { - final String logoUrl = event.getLogoImageURL(); - if (logoUrl != null) { - eventLogo.getElement().setAttribute("src", logoUrl); - } else { - eventLogo.getElement().getStyle().setVisibility(Visibility.HIDDEN); - } + if (event != null) { + final String logoUrl = event.getLogoImageURL(); + if (logoUrl != null) { + eventLogo.getElement().setAttribute("src", logoUrl); + } else { + eventLogo.getElement().getStyle().setVisibility(Visibility.HIDDEN); + } + if (event.getName() != null) { + Window.setTitle(event.getName() + " Dashboard"); + } + } } @Override From 5984e33e342b0843ad97d3fe99a5bdd459eb780e Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 26 May 2015 14:15:07 +0200 Subject: [PATCH 28/85] delted fontface.css and referenced new fontface from home, changed font in all dashboard css files to new Open Sans --- .../RibDashboard.css | 7 +- .../RibDashboard.html | 1 + .../fontface.css | 115 ------------------ .../dashboards/gwt/client/Ribstyle.css | 11 +- .../popups/PopupWithMessageAndImage.css | 3 +- .../startanalysis/StartlineAnalysis.css | 6 +- .../LiveAverageComponent.css | 6 +- .../windchart/VerticalWindChartStyle.css | 4 +- .../windchart/WindBotComponentStyle.css | 2 +- .../compass/LocationPointerCompass.css | 2 + 10 files changed, 22 insertions(+), 135 deletions(-) delete mode 100644 java/com.sap.sailing.dashboards.gwt/fontface.css diff --git a/java/com.sap.sailing.dashboards.gwt/RibDashboard.css b/java/com.sap.sailing.dashboards.gwt/RibDashboard.css index ef3be51375d..cb096f5372f 100644 --- a/java/com.sap.sailing.dashboards.gwt/RibDashboard.css +++ b/java/com.sap.sailing.dashboards.gwt/RibDashboard.css @@ -22,7 +22,7 @@ } .highcharts-container { - position: absulute; + position: absolute; top: 0pt; bottom: 0pt; left: 0pt; @@ -38,11 +38,10 @@ width: 100%; bottom: 0pt; text-align: center; - font-weight: bold; font-size: 15pt; line-height: 30pt; color: black; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; z-index: 2; } @@ -134,5 +133,5 @@ font-weight: bold; font-size: 13px; color: grey; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; } \ No newline at end of file diff --git a/java/com.sap.sailing.dashboards.gwt/RibDashboard.html b/java/com.sap.sailing.dashboards.gwt/RibDashboard.html index a4a51f7dbc1..f74c19632da 100644 --- a/java/com.sap.sailing.dashboards.gwt/RibDashboard.html +++ b/java/com.sap.sailing.dashboards.gwt/RibDashboard.html @@ -12,6 +12,7 @@ + Dashboard diff --git a/java/com.sap.sailing.dashboards.gwt/fontface.css b/java/com.sap.sailing.dashboards.gwt/fontface.css deleted file mode 100644 index 2bede9b22a5..00000000000 --- a/java/com.sap.sailing.dashboards.gwt/fontface.css +++ /dev/null @@ -1,115 +0,0 @@ -/* Generated by Font Squirrel (http://www.fontsquirrel.com) on October 17, 2012 06:01:42 AM America/New_York */ - - -/* @font-face { */ -/* font-family: 'OpenSansLightItalic'; */ -/* src: url('fonts/OpenSans-LightItalic-webfont.eot'); */ -/* src: url('fonts/OpenSans-LightItalic-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/OpenSans-LightItalic-webfont.woff') format('woff'), url('fonts/OpenSans-LightItalic-webfont.ttf') format('truetype'), url('fonts/OpenSans-LightItalic-webfont.svg#OpenSansLightItalic') format('svg'); */ -/* font-weight: normal; */ -/* font-style: normal; */ - -/* } */ - -@font-face { - font-family: 'OpenSansRegular'; - src: url('fonts/OpenSans-Regular-webfont.eot'); - src: url('fonts/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/OpenSans-Regular-webfont.woff') format('woff'), url('fonts/OpenSans-Regular-webfont.ttf') format('truetype'), url('fonts/OpenSans-Regular-webfont.svg#OpenSansRegular') format('svg'); - font-weight: normal; - font-style: normal; -} - -/* @font-face { */ -/* font-family: 'OpenSansItalic'; */ -/* src: url('fonts/OpenSans-Italic-webfont.eot'); */ -/* src: url('fonts/OpenSans-Italic-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/OpenSans-Italic-webfont.woff') format('woff'), url('fonts/OpenSans-Italic-webfont.ttf') format('truetype'), url('fonts/OpenSans-Italic-webfont.svg#OpenSansItalic') format('svg'); */ -/* font-weight: normal; */ -/* font-style: normal; */ - -/* } */ - -/* @font-face { */ -/* font-family: 'OpenSansSemibold'; */ -/* src: url('fonts/OpenSans-Semibold-webfont.eot'); */ -/* src: url('fonts/OpenSans-Semibold-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/OpenSans-Semibold-webfont.woff') format('woff'), url('fonts/OpenSans-Semibold-webfont.ttf') format('truetype'), url('fonts/OpenSans-Semibold-webfont.svg#OpenSansSemibold') format('svg'); */ -/* font-weight: normal; */ -/* font-style: normal; */ - -/* } */ - -/* @font-face { */ -/* font-family: 'OpenSansSemiboldItalic'; */ -/* src: url('fonts/OpenSans-SemiboldItalic-webfont.eot'); */ -/* src: url('fonts/OpenSans-SemiboldItalic-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/OpenSans-SemiboldItalic-webfont.woff') format('woff'), url('fonts/OpenSans-SemiboldItalic-webfont.ttf') format('truetype'), url('fonts/OpenSans-SemiboldItalic-webfont.svg#OpenSansSemiboldItalic') format('svg'); */ -/* font-weight: normal; */ -/* font-style: normal; */ - -/* } */ - -@font-face { - font-family: 'OpenSansBold'; - src: url('fonts/OpenSans-Bold-webfont.eot'); - src: url('fonts/OpenSans-Bold-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/OpenSans-Bold-webfont.woff') format('woff'), url('fonts/OpenSans-Bold-webfont.ttf') format('truetype'), url('fonts/OpenSans-Bold-webfont.svg#OpenSansBold') format('svg'); - font-weight: normal; - font-style: normal; - -} - -/* @font-face { */ -/* font-family: 'OpenSansBoldItalic'; */ -/* src: url('fonts/OpenSans-BoldItalic-webfont.eot'); */ -/* src: url('fonts/OpenSans-BoldItalic-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/OpenSans-BoldItalic-webfont.woff') format('woff'), url('fonts/OpenSans-BoldItalic-webfont.ttf') format('truetype'), url('fonts/OpenSans-BoldItalic-webfont.svg#OpenSansBoldItalic') format('svg'); */ -/* font-weight: normal; */ -/* font-style: normal; */ - -/* } */ - -/* @font-face { */ -/* font-family: 'OpenSansExtrabold'; */ -/* src: url('fonts/OpenSans-ExtraBold-webfont.eot'); */ -/* src: url('fonts/OpenSans-ExtraBold-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/OpenSans-ExtraBold-webfont.woff') format('woff'), url('fonts/OpenSans-ExtraBold-webfont.ttf') format('truetype'), url('fonts/OpenSans-ExtraBold-webfont.svg#OpenSansExtrabold') format('svg'); */ -/* font-weight: normal; */ -/* font-style: normal; */ - -/* } */ - -/* @font-face { */ -/* font-family: 'OpenSansExtraboldItalic'; */ -/* src: url('fonts/OpenSans-ExtraBoldItalic-webfont.eot'); */ -/* src: url('fonts/OpenSans-ExtraBoldItalic-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/OpenSans-ExtraBoldItalic-webfont.woff') format('woff'), url('fonts/OpenSans-ExtraBoldItalic-webfont.ttf') format('truetype'), url('fonts/OpenSans-ExtraBoldItalic-webfont.svg#OpenSansExtraboldItalic') format('svg'); */ -/* font-weight: normal; */ -/* font-style: normal; */ - -/* } */ - -/* @font-face { */ -/* font-family: 'OpenSansCondensedLight'; */ -/* src: url('fonts/OpenSans-CondLight-webfont.eot'); */ -/* src: url('fonts/OpenSans-CondLight-webfont.eot?#iefix') format('embedded-opentype'), */ -/* url('fonts/OpenSans-CondLight-webfont.woff') format('woff'), */ -/* url('fonts/OpenSans-CondLight-webfont.ttf') format('truetype'); */ -/* font-weight: normal; */ -/* font-style: normal; */ - -/* } */ - -/* @font-face { */ -/* font-family: 'OpenSansCondensedLightItalic'; */ -/* src: url('fonts/OpenSans-CondLightItalic-webfont.eot'); */ -/* src: url('fonts/OpenSans-CondLightItalic-webfont.eot?#iefix') format('embedded-opentype'), */ -/* url('fonts/OpenSans-CondLightItalic-webfont.woff') format('woff'), */ -/* url('fonts/OpenSans-CondLightItalic-webfont.ttf') format('truetype'); */ -/* font-weight: normal; */ -/* font-style: normal; */ - -/* } */ - -/* @font-face { */ -/* font-family: 'OpenSansCondensedBold'; */ -/* src: url('fonts/OpenSans-CondBold-webfont.eot'); */ -/* src: url('fonts/OpenSans-CondBold-webfont.eot?#iefix') format('embedded-opentype'), */ -/* url('fonts/OpenSans-CondBold-webfont.woff') format('woff'), */ -/* url('fonts/OpenSans-CondBold-webfont.ttf') format('truetype'); */ -/* font-weight: normal; */ -/* font-style: normal; */ - -/* } */ diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/Ribstyle.css b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/Ribstyle.css index d472d3887f2..14b4df0e958 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/Ribstyle.css +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/Ribstyle.css @@ -1,4 +1,3 @@ -@import url(fontface.css); .bar { height: 100%; @@ -6,7 +5,7 @@ line-height: 15pt; vertical-align: middle; font-size: 15pt; - font-family: 'OpenSansRegular', Arial, Verdana, sans-serif; + font-family: 'Open Sans', Arial, Verdana, sans-serif; width: 100%; text-align: center; font-weight: bold; @@ -67,7 +66,7 @@ line-height: 25pt; vertical-align: middle; font-size: 15pt; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; width: 100%; text-align: center; font-weight: bold; @@ -165,7 +164,7 @@ margin-top: 0pt; vertical-align: middle; font-size: 12pt; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; width: 100%; text-align: center; } @@ -178,7 +177,7 @@ margin-top: 0pt; vertical-align: middle; font-size: 12pt; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; width: 100%; text-align: center; } @@ -312,7 +311,7 @@ windchartcontainer { margin-top: 0pt; vertical-align: middle; font-size: 12pt; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; width: 100%; text-align: center; top: 50%; diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/popups/PopupWithMessageAndImage.css b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/popups/PopupWithMessageAndImage.css index 423d17e5c25..a84dd94f1bf 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/popups/PopupWithMessageAndImage.css +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/popups/PopupWithMessageAndImage.css @@ -61,6 +61,7 @@ padding: 0px; margin-top: 5pt; margin-left: 0px; + font-family: 'Open Sans', Arial, Verdana, sans-serif; } .popup_button:active { @@ -76,7 +77,7 @@ font-weight: bold; font-size: 15px; color: grey; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; } .blurred { diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysis.css b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysis.css index f1229de3a4e..01b8e89e2c3 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysis.css +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysis.css @@ -16,7 +16,7 @@ line-height: 30pt; vertical-align: middle; font-size: 15pt; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; width: 100%; text-align: center; font-weight: bold; @@ -91,7 +91,7 @@ line-height: 25pt; vertical-align: middle; font-size: 11pt; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; text-align: center; } @@ -113,7 +113,7 @@ color: white; line-height: 25pt; font-size: 11pt; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; z-index: 1; } diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.css b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.css index 3449c35582d..ba870375496 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.css +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.css @@ -21,7 +21,7 @@ line-height: 15pt; vertical-align: middle; font-size: 12.5pt; - font-family: "Arial; + font-family: 'Open Sans', Arial, Verdana, sans-serif; width: 100%; text-align: center; overflow: visible; @@ -67,7 +67,7 @@ width: 100%; height: 90%; text-align: center; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; font-weight: bolder; } @@ -78,7 +78,7 @@ text-align: center; font-size: 12pt; color: grey; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; } .liveAverageCompoment_liveLabelContainer { diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/windchart/VerticalWindChartStyle.css b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/windchart/VerticalWindChartStyle.css index e222fb0b733..5f192987e9c 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/windchart/VerticalWindChartStyle.css +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/windchart/VerticalWindChartStyle.css @@ -29,7 +29,7 @@ line-height: 35px; vertical-align: middle; font-size: 12px; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; text-align: center; color: black; } @@ -53,7 +53,7 @@ margin-top: 0pt; vertical-align: middle; font-size: 12pt; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; width: 100%; text-align: center; top: 50%; diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/windchart/WindBotComponentStyle.css b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/windchart/WindBotComponentStyle.css index 22ff8fe345b..90bfd8f5188 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/windchart/WindBotComponentStyle.css +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/windchart/WindBotComponentStyle.css @@ -12,7 +12,7 @@ line-height: 45pt; vertical-align: middle; font-size: 15pt; - font-family: "Arial"; + font-family: 'Open Sans', Arial, Verdana, sans-serif; width: 100%; text-align: center; font-weight: bold; diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/windchart/compass/LocationPointerCompass.css b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/windchart/compass/LocationPointerCompass.css index 8dd041bad7c..4db1b4107b7 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/windchart/compass/LocationPointerCompass.css +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/windchart/compass/LocationPointerCompass.css @@ -22,6 +22,7 @@ top: -5pt; text-align: center; vertical-align: middle; + font-family: 'Open Sans', Arial, Verdana, sans-serif; font-size: 9pt; font-weight: bold; color: white; @@ -34,6 +35,7 @@ bottom: -17pt; text-align: center; vertical-align: middle; + font-family: 'Open Sans', Arial, Verdana, sans-serif; line-height: 10pt; font-weight: bold; font-size: 9pt; From 46e5cedf7dbd231c170ac2426a41fd70829eef4a Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 26 May 2015 14:22:04 +0200 Subject: [PATCH 29/85] removed fontface.css from dashboard bundle build properties --- java/com.sap.sailing.dashboards.gwt/build.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/java/com.sap.sailing.dashboards.gwt/build.properties b/java/com.sap.sailing.dashboards.gwt/build.properties index 2632144a33f..bd2c38b4b7d 100644 --- a/java/com.sap.sailing.dashboards.gwt/build.properties +++ b/java/com.sap.sailing.dashboards.gwt/build.properties @@ -11,7 +11,6 @@ bin.includes = META-INF/,\ WEB-INF/web.xml,\ js/,\ WEB-INF/lib/gwt-ajaxloader.jar,\ - fonts/,\ - fontface.css + fonts/ output.. = WEB-INF/classes/ bin.excludes = WEB-INF/lib/ From 82d53ac8acea8da88a70d8f44f2a629e0610cc67 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 26 May 2015 17:22:23 +0200 Subject: [PATCH 30/85] turned AbstractRaceColumnListener into an interface with default method implementations --- .../domain/base/impl/AbstractRaceColumn.java | 3 -- ... RaceColumnListenerWithDefaultAction.java} | 37 ++++++++----------- .../sailing/domain/base/impl/RegattaImpl.java | 32 +++------------- .../impl/FlexibleLeaderboardImpl.java | 27 ++------------ 4 files changed, 25 insertions(+), 74 deletions(-) rename java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/{AbstractRaceColumnListener.java => RaceColumnListenerWithDefaultAction.java} (59%) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index e7f669542e7..1fbeaac0571 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -15,7 +15,6 @@ import com.sap.sailing.domain.racelog.RaceLogIdentifier; import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.racelog.impl.RaceLogIdentifierImpl; import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier; -import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sse.common.Util; @@ -199,6 +198,4 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem public void setMasterDataExportOngoingThreadFlag(boolean flagValue) { trackedRaces.setMasterDataExportOngoingThreadFlag(flagValue); } - - public abstract RaceExecutionOrderProvider getRaceExecutionOrderProvider(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnListenerWithDefaultAction.java similarity index 59% rename from java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java rename to java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnListenerWithDefaultAction.java index 47d57dba115..2db919863ad 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumnListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnListenerWithDefaultAction.java @@ -18,89 +18,84 @@ import com.sap.sailing.domain.tracking.TrackedRace; * @author Alexander Ries (D062114) * */ -public abstract class AbstractRaceColumnListener implements RaceColumnListener { - - private static final long serialVersionUID = -6210815580399401162L; - +public interface RaceColumnListenerWithDefaultAction extends RaceColumnListener { /** * This implementation of the default action to which all other operations delegate does nothing. Subclasses can * choose to override this method to provide this as the default behavior for all other methods and then still * override individual {@link RaceColumnListener} methods, or they can leave the default action empty and just * override {@link RaceColumnListener} methods. */ - protected void defaultAction() { - // Does nothing - } + void defaultAction(); @Override - public void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + default void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { defaultAction(); } @Override - public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { + default void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { defaultAction(); } @Override - public void isMedalRaceChanged(RaceColumn raceColumn, boolean newIsMedalRace) { + default void isMedalRaceChanged(RaceColumn raceColumn, boolean newIsMedalRace) { defaultAction(); } @Override - public void isStartsWithZeroScoreChanged(RaceColumn raceColumn, boolean newIsStartsWithZeroScore) { + default void isStartsWithZeroScoreChanged(RaceColumn raceColumn, boolean newIsStartsWithZeroScore) { defaultAction(); } @Override - public void isFirstColumnIsNonDiscardableCarryForwardChanged(RaceColumn raceColumn, + default void isFirstColumnIsNonDiscardableCarryForwardChanged(RaceColumn raceColumn, boolean firstColumnIsNonDiscardableCarryForward) { defaultAction(); } @Override - public void hasSplitFleetContiguousScoringChanged(RaceColumn raceColumn, boolean hasSplitFleetContiguousScoring) { + default void hasSplitFleetContiguousScoringChanged(RaceColumn raceColumn, boolean hasSplitFleetContiguousScoring) { defaultAction(); } @Override - public void raceColumnAddedToContainer(RaceColumn raceColumn) { + default void raceColumnAddedToContainer(RaceColumn raceColumn) { defaultAction(); } @Override - public void raceColumnRemovedFromContainer(RaceColumn raceColumn) { + default void raceColumnRemovedFromContainer(RaceColumn raceColumn) { defaultAction(); } @Override - public void raceColumnMoved(RaceColumn raceColumn, int newIndex) { + default void raceColumnMoved(RaceColumn raceColumn, int newIndex) { defaultAction(); } @Override - public void factorChanged(RaceColumn raceColumn, Double oldFactor, Double newFactor) { + default void factorChanged(RaceColumn raceColumn, Double oldFactor, Double newFactor) { defaultAction(); } @Override - public void competitorDisplayNameChanged(Competitor competitor, String oldDisplayName, String displayName) { + default void competitorDisplayNameChanged(Competitor competitor, String oldDisplayName, String displayName) { defaultAction(); } @Override - public void resultDiscardingRuleChanged(ResultDiscardingRule oldDiscardingRule, + default void resultDiscardingRuleChanged(ResultDiscardingRule oldDiscardingRule, ResultDiscardingRule newDiscardingRule) { defaultAction(); } @Override - public void raceLogEventAdded(RaceColumn raceColumn, RaceLogIdentifier raceLogIdentifier, RaceLogEvent event) { + default void raceLogEventAdded(RaceColumn raceColumn, RaceLogIdentifier raceLogIdentifier, RaceLogEvent event) { defaultAction(); } @Override - public boolean isTransient() { + default boolean isTransient() { return false; } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index 6c87000a711..8ab1cdda403 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -598,7 +598,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene return raceExecutionOrderCache; } - private class RaceExecutionOrderCache extends AbstractRaceColumnListener implements RaceExecutionOrderProvider { + private class RaceExecutionOrderCache implements RaceExecutionOrderProvider, RaceColumnListenerWithDefaultAction { private static final long serialVersionUID = 4795731834688229568L; private transient SmartFutureCache, EmptyUpdateInterval> racesOrderCache; @@ -611,37 +611,17 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene addRaceColumnListener(this); } + @Override + public void defaultAction() { + racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + } + public List getRacesInExecutionOrder() { List result; result = racesOrderCache.get(RACES_ORDER_LIST_CACHE_KEY,/*waitForLatest*/ true); return result; } - @Override - public void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - @Override - public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - @Override - public void raceColumnAddedToContainer(RaceColumn raceColumn) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - @Override - public void raceColumnRemovedFromContainer(RaceColumn raceColumn) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - @Override - public void raceColumnMoved(RaceColumn raceColumn, int newIndex) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - private List reloadRacesInExecutionOrder() { List raceIdListInExecutionOrder = new ArrayList(); if (getSeries() != null) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java index 6da0cbd244d..25dfd99faf6 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java @@ -20,7 +20,7 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnListener; -import com.sap.sailing.domain.base.impl.AbstractRaceColumnListener; +import com.sap.sailing.domain.base.impl.RaceColumnListenerWithDefaultAction; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn; import com.sap.sailing.domain.leaderboard.ScoringScheme; @@ -306,8 +306,7 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements return result; } - private class RaceExecutionOrderCache extends AbstractRaceColumnListener implements RaceExecutionOrderProvider { - + private class RaceExecutionOrderCache implements RaceExecutionOrderProvider, RaceColumnListenerWithDefaultAction { private transient SmartFutureCache, EmptyUpdateInterval> racesOrderCache; private final String RACES_ORDER_LIST_CACHE_KEY = "racesOrderCacheKey"; private final String RACES_ORDER_LIST_LOCKS_NAME = getClass().getName(); @@ -326,27 +325,7 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements } @Override - public void trackedRaceLinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - @Override - public void trackedRaceUnlinked(RaceColumn raceColumn, Fleet fleet, TrackedRace trackedRace) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - @Override - public void raceColumnAddedToContainer(RaceColumn raceColumn) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - @Override - public void raceColumnRemovedFromContainer(RaceColumn raceColumn) { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - @Override - public void raceColumnMoved(RaceColumn raceColumn, int newIndex) { + public void defaultAction() { racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); } From 8470c0b8d116cfcbd633cdea224d8c7d3f0f3c31 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 26 May 2015 18:37:43 +0200 Subject: [PATCH 31/85] refactored RaceExecutionOrderProvider --- .../domain/test/mock/MockedTrackedRace.java | 4 +- ...ockedTrackedRaceWithStartTimeAndRanks.java | 4 +- .../sailing/domain/base/impl/RegattaImpl.java | 98 +++--------------- .../sailing/domain/base/impl/SeriesImpl.java | 5 +- .../impl/FlexibleLeaderboardImpl.java | 99 ++----------------- .../tracking/RaceExecutionOrderProvider.java | 13 ++- .../sailing/domain/tracking/TrackedRace.java | 6 +- .../tracking/impl/DynamicTrackedRaceImpl.java | 48 ++++----- .../domain/tracking/impl/TrackedRaceImpl.java | 7 +- .../gwt/ui/test/MockedTrackedRace.java | 4 +- .../server/masterdata/DummyTrackedRace.java | 4 +- 11 files changed, 70 insertions(+), 222 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index 1d22b949e1a..fd70932991a 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -930,11 +930,11 @@ public class MockedTrackedRace implements DynamicTrackedRace { } @Override - public void detachRaceExecutionOrderProvider(Serializable identifier) { + public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } @Override - public TrackedRace getPreviousRaceFromAttachedRaceExecutionOrderProviders() { + public Set getPreviousRacesFromAttachedRaceExecutionOrderProviders() { return null; } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index 8c5c1e8263c..bc32e5a019b 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -629,11 +629,11 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { } @Override - public void detachRaceExecutionOrderProvider(Serializable identifier) { + public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } @Override - public TrackedRace getPreviousRaceFromAttachedRaceExecutionOrderProviders() { + public Set getPreviousRacesFromAttachedRaceExecutionOrderProviders() { return null; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index 8ab1cdda403..c4103d62e11 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -5,9 +5,10 @@ import java.io.ObjectInputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.logging.Logger; @@ -53,10 +54,6 @@ import com.sap.sailing.util.impl.RaceColumnListeners; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.NamedImpl; -import com.sap.sse.util.SmartFutureCache; -import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; - -import difflib.PatchFailedException; public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListener { @@ -598,95 +595,30 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene return raceExecutionOrderCache; } - private class RaceExecutionOrderCache implements RaceExecutionOrderProvider, RaceColumnListenerWithDefaultAction { - - private static final long serialVersionUID = 4795731834688229568L; - private transient SmartFutureCache, EmptyUpdateInterval> racesOrderCache; - private final String RACES_ORDER_LIST_CACHE_KEY = "racesOrderCacheKey"; - private final String RACES_ORDER_LIST_LOCKS_NAME = getClass().getName(); + private class RaceExecutionOrderCache extends AbstractRaceExecutionOrderProvider { + private static final long serialVersionUID = 1658153438012186894L; public RaceExecutionOrderCache() { - racesOrderCache = createRacesOrderCache(); - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + super(); addRaceColumnListener(this); } @Override - public void defaultAction() { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - public List getRacesInExecutionOrder() { - List result; - result = racesOrderCache.get(RACES_ORDER_LIST_CACHE_KEY,/*waitForLatest*/ true); - return result; - } - - private List reloadRacesInExecutionOrder() { - List raceIdListInExecutionOrder = new ArrayList(); - if (getSeries() != null) { - Iterator seriesInRegatta = getSeries().iterator(); - while (seriesInRegatta.hasNext()) { - Series currentSeries = seriesInRegatta.next(); - if (currentSeries.getRaceColumns() != null) { - Iterator raceColumns = currentSeries.getRaceColumns().iterator(); - while (raceColumns.hasNext()) { - RaceColumn currentRaceColumn = raceColumns.next(); - if (currentRaceColumn.getFleets() != null) { - Iterator fleetsInRaceColumn = currentRaceColumn.getFleets().iterator(); - while (fleetsInRaceColumn.hasNext()) { - TrackedRace trackedRaceInColumnForFleet = currentRaceColumn - .getTrackedRace(fleetsInRaceColumn.next()); - if (trackedRaceInColumnForFleet != null) { - raceIdListInExecutionOrder.add(trackedRaceInColumnForFleet); - } - } + protected Map> getRaceColumnsOfSeries() { + final Map> result = new HashMap<>(); + final Iterable mySeries = getSeries(); + if (mySeries != null) { + for (Series currentSeries : mySeries) { + if (currentSeries.getFleets() != null) { + for (Fleet fleet : currentSeries.getFleets()) { + if (currentSeries.getRaceColumns() != null) { + result.put(fleet, currentSeries.getRaceColumns()); } } } } } - return raceIdListInExecutionOrder; - } - - private SmartFutureCache, EmptyUpdateInterval> createRacesOrderCache() { - return new SmartFutureCache, SmartFutureCache.EmptyUpdateInterval>( - new SmartFutureCache.AbstractCacheUpdater, SmartFutureCache.EmptyUpdateInterval>() { - - @Override - public List computeCacheUpdate(String key, - EmptyUpdateInterval updateInterval) throws Exception { - if (key.equals(RACES_ORDER_LIST_CACHE_KEY)) { - return reloadRacesInExecutionOrder(); - } else { - List emptyList = new ArrayList(); - return emptyList; - } - } - }, RACES_ORDER_LIST_LOCKS_NAME); - } - - private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException, PatchFailedException { - ois.defaultReadObject(); - racesOrderCache = createRacesOrderCache(); - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - @Override - public TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race) { - List racesInOrder = getRacesInExecutionOrder(); - if (racesInOrder != null) { - int indexOfRace = racesInOrder.indexOf(race); - if (indexOfRace != -1 && indexOfRace != 0) { - return racesInOrder.get(indexOfRace - 1); - } - } - return null; - } - - @Override - public Serializable getId() { - return serialVersionUID; + return result; } } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java index 5f13b207de9..5cc78bb5360 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java @@ -84,8 +84,7 @@ public class SeriesImpl extends RenamableImpl implements Series, RaceColumnListe fleetsInAscendingOrder = new ArrayList(); Util.addAll(fleets, fleetsInAscendingOrder); Collections.sort(fleetsInAscendingOrder); - List myRaceColumns = new ArrayList(); - this.raceColumns = myRaceColumns; + this.raceColumns = new ArrayList(); this.isMedal = isMedal; this.raceColumnListeners = new RaceColumnListeners(); for (String raceColumnName : raceColumnNames) { @@ -184,7 +183,7 @@ public class SeriesImpl extends RenamableImpl implements Series, RaceColumnListe for (Fleet fleet : raceColumnInSeries.getFleets()) { TrackedRace trackedRace = raceColumnInSeries.getTrackedRace(fleet); if (trackedRace != null && regatta != null && regatta.getRaceExecutionOrderProvider() != null) { - trackedRace.detachRaceExecutionOrderProvider(regatta.getRaceExecutionOrderProvider().getId()); + trackedRace.detachRaceExecutionOrderProvider(regatta.getRaceExecutionOrderProvider()); } } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java index 25dfd99faf6..01609f875a5 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java @@ -3,13 +3,13 @@ package com.sap.sailing.domain.leaderboard.impl; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; -import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.logging.Logger; @@ -20,7 +20,7 @@ import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnListener; -import com.sap.sailing.domain.base.impl.RaceColumnListenerWithDefaultAction; +import com.sap.sailing.domain.base.impl.AbstractRaceExecutionOrderProvider; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn; import com.sap.sailing.domain.leaderboard.ScoringScheme; @@ -36,10 +36,6 @@ import com.sap.sailing.domain.regattalog.RegattaLogStore; import com.sap.sailing.domain.regattalog.impl.EmptyRegattaLogStore; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.TrackedRace; -import com.sap.sse.util.SmartFutureCache; -import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; - -import difflib.PatchFailedException; /** * A leaderboard implementation that allows users to flexibly configure which columns exist. No constraints need to be observed regarding @@ -306,94 +302,19 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements return result; } - private class RaceExecutionOrderCache implements RaceExecutionOrderProvider, RaceColumnListenerWithDefaultAction { - private transient SmartFutureCache, EmptyUpdateInterval> racesOrderCache; - private final String RACES_ORDER_LIST_CACHE_KEY = "racesOrderCacheKey"; - private final String RACES_ORDER_LIST_LOCKS_NAME = getClass().getName(); - private static final long serialVersionUID = -1016823551825618490L; + private class RaceExecutionOrderCache extends AbstractRaceExecutionOrderProvider { + private static final long serialVersionUID = 652833386555762661L; public RaceExecutionOrderCache() { - racesOrderCache = createRacesOrderCache(); - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); + super(); addRaceColumnListener(this); } - public List getRacesInExecutionOrder() { - List result; - result = racesOrderCache.get(RACES_ORDER_LIST_CACHE_KEY,/*waitForLatest*/ true); + @Override + protected Map> getRaceColumnsOfSeries() { + final Map> result = new HashMap<>(); + result.put(FlexibleLeaderboardImpl.defaultFleet, getRaceColumns()); return result; } - - @Override - public void defaultAction() { - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - private List reloadRacesInExecutionOrder() { - List raceIdListInExecutionOrder = new ArrayList(); - if (getRaceColumns() != null) { - Iterator raceColumns = getRaceColumns().iterator(); - if (raceColumns != null) { - while (raceColumns.hasNext()) { - RaceColumn currentRaceColumn = raceColumns.next(); - if (currentRaceColumn.getFleets() != null) { - Iterator fleetsInRaceColumn = currentRaceColumn.getFleets().iterator(); - if (fleetsInRaceColumn != null) { - while (fleetsInRaceColumn.hasNext()) { - TrackedRace trackedRaceInColumnForFleet = currentRaceColumn - .getTrackedRace(fleetsInRaceColumn.next()); - if (trackedRaceInColumnForFleet != null) { - raceIdListInExecutionOrder.add(trackedRaceInColumnForFleet); - } - } - } - } - } - } - } - return raceIdListInExecutionOrder; - } - - - - private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException, PatchFailedException { - ois.defaultReadObject(); - racesOrderCache = createRacesOrderCache(); - racesOrderCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/*update interval*/ null); - } - - private SmartFutureCache, EmptyUpdateInterval> createRacesOrderCache() { - return new SmartFutureCache, SmartFutureCache.EmptyUpdateInterval>( - new SmartFutureCache.AbstractCacheUpdater, SmartFutureCache.EmptyUpdateInterval>() { - - @Override - public List computeCacheUpdate(String key, - EmptyUpdateInterval updateInterval) throws Exception { - if (key.equals(RACES_ORDER_LIST_CACHE_KEY)) { - return reloadRacesInExecutionOrder(); - } else { - List emptyList = new ArrayList(); - return emptyList; - } - } - }, RACES_ORDER_LIST_LOCKS_NAME); - } - - @Override - public TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race) { - List racesInOrder = getRacesInExecutionOrder(); - if (racesInOrder != null) { - int indexOfRace = racesInOrder.indexOf(race); - if (indexOfRace != -1 && indexOfRace != 0) { - return racesInOrder.get(indexOfRace - 1); - } - } - return null; - } - - @Override - public Serializable getId() { - return serialVersionUID; - } } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java index 1e13bee9580..ec8f7c18217 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java @@ -1,16 +1,19 @@ package com.sap.sailing.domain.tracking; +import java.util.Set; + import com.sap.sailing.domain.base.Regatta; -import com.sap.sse.common.WithID; /** * @author Alexander Ries (D062114) * */ -public interface RaceExecutionOrderProvider extends WithID{ +public interface RaceExecutionOrderProvider { /** - * Parameter race is a {@link TrackedRace} from which the method returns the previous {@link TrackedRace} in the execution order of a {@link Regatta}. - * */ - TrackedRace getPreviousRaceInExecutionOrder(TrackedRace race); + * Parameter race is a {@link TrackedRace} from which the method returns the previous + * {@link TrackedRace}s in the execution order of a {@link Regatta}. This expresses the fact that the races returned + * by this method must all have been finished before race can start. + */ + Set getPreviousRaceInExecutionOrder(TrackedRace race); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 7273ea272a3..b74972f5287 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -618,9 +618,9 @@ public interface TrackedRace extends Serializable { void detachRaceLog(Serializable identifier); /** - * Detaches the link {@link RaceExecutionOrderProvider} with this identifier. + * Detaches the link {@link RaceExecutionOrderProvider} */ - void detachRaceExecutionOrderProvider(Serializable identifier); + void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider); /** * Detaches all {@link RaceLog} instances from this race @@ -795,5 +795,5 @@ public interface TrackedRace extends Serializable { void setPolarDataService(PolarDataService polarDataService); - TrackedRace getPreviousRaceFromAttachedRaceExecutionOrderProviders(); + Set getPreviousRacesFromAttachedRaceExecutionOrderProviders(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index af578e4f32b..470161d4d0f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; import java.util.Collection; +import java.util.Collections; import java.util.ConcurrentModificationException; import java.util.HashMap; import java.util.HashSet; @@ -51,6 +52,7 @@ import com.sap.sailing.domain.tracking.TrackedRaceStatus; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTrack; +import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -661,9 +663,9 @@ DynamicTrackedRace, GPSTrackListener { TimePoint startOfTracking = getStartOfTracking(); TimePoint endOfRace = getEndOfRace(); TimePoint endOfTracking = getEndOfTracking(); - long conditional_time_before_start_to_track_wind = getConditionalTimeBeforeStartToTrackWind(); - if ((startOfTracking == null || !startOfTracking.minus(conditional_time_before_start_to_track_wind).after(wind.getTimePoint()) || - (startOfRace != null && !startOfRace.minus(conditional_time_before_start_to_track_wind).after(wind.getTimePoint()))) + final Duration conditionalTimeBeforeStartToTrackWind = getConditionalTimeBeforeStartToTrackWind(); + if ((startOfTracking == null || !startOfTracking.minus(conditionalTimeBeforeStartToTrackWind).after(wind.getTimePoint()) || + (startOfRace != null && !startOfRace.minus(conditionalTimeBeforeStartToTrackWind).after(wind.getTimePoint()))) && // Caution: don't add to endOfTracking; it may be the end of time, leading to a wrap-around / overflow (endOfTracking == null || endOfTracking.after(wind.getTimePoint().minus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS)) || @@ -678,9 +680,9 @@ DynamicTrackedRace, GPSTrackListener { return result; } - private long getConditionalTimeBeforeStartToTrackWind(){ - TrackedRace previosRaceInExecutionOrder = getPreviousRaceFromAttachedRaceExecutionOrderProviders(); - if (previosRaceInExecutionOrder == null || previosRaceInExecutionOrder.getEndOfTracking() != null || !previosRaceInExecutionOrder.hasWindData()) { + private Duration getConditionalTimeBeforeStartToTrackWind(){ + Set previosRaceInExecutionOrder = getPreviousRacesFromAttachedRaceExecutionOrderProviders(); + if (previosRaceInExecutionOrder == null || !previosRaceInExecutionOrder.stream().filter(tr->tr.getEndOfTracking() != null).findAny().isPresent()) { return EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; } else { return TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; @@ -770,15 +772,15 @@ DynamicTrackedRace, GPSTrackListener { @Override public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { - if (raceExecutionOrderProvider != null && raceExecutionOrderProvider.getId() != null && !super.attachedRaceExecutionOrderProvider.containsKey(raceExecutionOrderProvider.getId())) { - super.attachedRaceExecutionOrderProvider.put(raceExecutionOrderProvider.getId(), raceExecutionOrderProvider); + if (raceExecutionOrderProvider != null && !super.attachedRaceExecutionOrderProvider.containsKey(raceExecutionOrderProvider)) { + super.attachedRaceExecutionOrderProvider.put(raceExecutionOrderProvider, raceExecutionOrderProvider); } } @Override - public void detachRaceExecutionOrderProvider(Serializable identifier) { - if (identifier != null) { - super.attachedRaceExecutionOrderProvider.remove(identifier); + public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { + if (raceExecutionOrderProvider != null) { + super.attachedRaceExecutionOrderProvider.remove(raceExecutionOrderProvider); } } @@ -842,24 +844,14 @@ DynamicTrackedRace, GPSTrackListener { } @Override - public TrackedRace getPreviousRaceFromAttachedRaceExecutionOrderProviders() { - if (attachedRaceExecutionOrderProvider != null && attachedRaceExecutionOrderProvider.values() != null) { - if (attachedRaceExecutionOrderProvider.values().isEmpty()) { - return null; - } else { - Iterator raceExecutionOrderProviders = attachedRaceExecutionOrderProvider.values().iterator(); - TrackedRace firstPreviousRaceInExecutionOrder = raceExecutionOrderProviders.next().getPreviousRaceInExecutionOrder(this); - while (raceExecutionOrderProviders.hasNext()) { - RaceExecutionOrderProvider raceExecutionOrderProvider = raceExecutionOrderProviders.next(); - TrackedRace currentPreviousRaceInExecutionOrder = raceExecutionOrderProvider.getPreviousRaceInExecutionOrder(this); - if (currentPreviousRaceInExecutionOrder == null || !currentPreviousRaceInExecutionOrder.equals(firstPreviousRaceInExecutionOrder)) { - return null; - } - } - return firstPreviousRaceInExecutionOrder; - } + public Set getPreviousRacesFromAttachedRaceExecutionOrderProviders() { + final Set result; + if (attachedRaceExecutionOrderProvider != null) { + result = attachedRaceExecutionOrderProvider.values().stream().map(reop->reop.getPreviousRaceInExecutionOrder(this)).collect(HashSet::new, (r, e)->r.addAll(e), (r, e)->r.addAll(e)); + } else { + result = Collections.emptySet(); } - return null; + return result; } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index b138ec7b69c..21bf5889faa 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -152,9 +152,9 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl // TODO make this variable private static final long DELAY_FOR_CACHE_CLEARING_IN_MILLISECONDS = 7500; - public static final long TIME_BEFORE_START_TO_TRACK_WIND_MILLIS = 4 * 60 * 1000l; // let wind start four minutes before race + public static final Duration TIME_BEFORE_START_TO_TRACK_WIND_MILLIS = Duration.ONE_MINUTE.times(4); // let wind start four minutes before race - public static final long EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS = 60 * 60 * 1000l; + public static final Duration EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS = Duration.ONE_HOUR; private TrackedRaceStatus status; @@ -276,7 +276,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl protected transient ConcurrentHashMap attachedRegattaLogs; - protected transient ConcurrentHashMap attachedRaceExecutionOrderProvider; + protected transient ConcurrentHashMap attachedRaceExecutionOrderProvider; /** * The time delay to the current point in time in milliseconds. @@ -531,6 +531,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl ois.defaultReadObject(); raceStates = new WeakHashMap<>(); attachedRaceLogs = new ConcurrentHashMap<>(); + attachedRaceExecutionOrderProvider = new ConcurrentHashMap<>(); markPassingsTimes = new ArrayList>>(); // The short time wind cache needs to be there before operations such as maneuver recalculation try to access it shortTimeWindCache = new ShortTimeWindCache(this, millisecondsOverWhichToAverageWind / 2); diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index da5a6db7ca7..5ecce741ec0 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -928,11 +928,11 @@ public class MockedTrackedRace implements DynamicTrackedRace { } @Override - public void detachRaceExecutionOrderProvider(Serializable identifier) { + public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } @Override - public TrackedRace getPreviousRaceFromAttachedRaceExecutionOrderProviders() { + public Set getPreviousRacesFromAttachedRaceExecutionOrderProviders() { return null; } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java index 76f5a67e905..da4b289d8cd 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java @@ -605,11 +605,11 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { } @Override - public void detachRaceExecutionOrderProvider(Serializable identifier) { + public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } @Override - public TrackedRace getPreviousRaceFromAttachedRaceExecutionOrderProviders() { + public Set getPreviousRacesFromAttachedRaceExecutionOrderProviders() { return null; } } From 7fcc63a8cb3b06882baf17454221632fff0c0e48 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 26 May 2015 18:38:42 +0200 Subject: [PATCH 32/85] added missing class AbstractRaceExecutionOrderProvider --- .../AbstractRaceExecutionOrderProvider.java | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100755 java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java new file mode 100755 index 00000000000..40cca2f4635 --- /dev/null +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java @@ -0,0 +1,101 @@ +package com.sap.sailing.domain.base.impl; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; +import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sse.util.SmartFutureCache; +import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; + +import difflib.PatchFailedException; + +public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutionOrderProvider, RaceColumnListenerWithDefaultAction { + private static final long serialVersionUID = 4795731834688229568L; + private transient SmartFutureCache>, EmptyUpdateInterval> raceOrderCacheMappingRaceToItsPredecessor; + private final String RACES_ORDER_LIST_CACHE_KEY = "racesOrderCacheKey"; + private final String RACES_ORDER_LIST_LOCKS_NAME = getClass().getName(); + + public AbstractRaceExecutionOrderProvider() { + raceOrderCacheMappingRaceToItsPredecessor = createRacesOrderCache(); + raceOrderCacheMappingRaceToItsPredecessor.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, /* update interval */null); + } + + @Override + public void defaultAction() { + raceOrderCacheMappingRaceToItsPredecessor.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, /* update interval */null); + } + + private Map> getPredecessorsMap() { + return raceOrderCacheMappingRaceToItsPredecessor.get(RACES_ORDER_LIST_CACHE_KEY, /* waitForLatest */true); + } + + protected abstract Map> getRaceColumnsOfSeries(); + + private Map> reloadRacesInExecutionOrder() { + final Map> raceIdListInExecutionOrder = new HashMap<>(); + for (Entry> raceColumnsInSeries : getRaceColumnsOfSeries().entrySet()) { + addPredecessors(raceIdListInExecutionOrder, raceColumnsInSeries.getKey(), raceColumnsInSeries.getValue()); + } + return raceIdListInExecutionOrder; + } + + protected void addPredecessors(final Map> raceIdListInExecutionOrder, Fleet fleet, + final Iterable raceColumns) { + TrackedRace predecessor = null; + for (RaceColumn currentRaceColumn : raceColumns) { + final TrackedRace trackedRaceInColumnForFleet = currentRaceColumn.getTrackedRace(fleet); + if (trackedRaceInColumnForFleet != null) { + Set predecessors = raceIdListInExecutionOrder.get(trackedRaceInColumnForFleet); + if (predecessors == null) { + predecessors = new HashSet<>(); + raceIdListInExecutionOrder.put(trackedRaceInColumnForFleet, predecessors); + } + predecessors.add(predecessor); + predecessor = trackedRaceInColumnForFleet; + } + } + } + + private SmartFutureCache>, EmptyUpdateInterval> createRacesOrderCache() { + return new SmartFutureCache>, SmartFutureCache.EmptyUpdateInterval>( + new SmartFutureCache.AbstractCacheUpdater>, SmartFutureCache.EmptyUpdateInterval>() { + @Override + public Map> computeCacheUpdate(String key, + EmptyUpdateInterval updateInterval) throws Exception { + if (key.equals(RACES_ORDER_LIST_CACHE_KEY)) { + return reloadRacesInExecutionOrder(); + } else { + final Map> emptyMap = Collections.emptyMap(); + return emptyMap; + } + } + }, RACES_ORDER_LIST_LOCKS_NAME); + } + + private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException, PatchFailedException { + ois.defaultReadObject(); + raceOrderCacheMappingRaceToItsPredecessor = createRacesOrderCache(); + raceOrderCacheMappingRaceToItsPredecessor.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/* update interval */null); + } + + @Override + public Set getPreviousRaceInExecutionOrder(TrackedRace race) { + final Set result; + final Map> predecessorMap = getPredecessorsMap(); + if (predecessorMap != null) { + result = predecessorMap.get(race); + } else { + result = null; + } + return result; + } +} From c236a3d0bf82f0de47d57a1638626d5e5c11606d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 27 May 2015 11:06:03 +0200 Subject: [PATCH 33/85] fixed initialization problem by using readResolve() on owners of race execution order caches (RegattaImpl and FlexibleLeaderboardImpl) --- .../AbstractRaceExecutionOrderProvider.java | 23 ++++++++++++------- .../sailing/domain/base/impl/RegattaImpl.java | 6 +++++ .../impl/FlexibleLeaderboardImpl.java | 8 ++++++- .../tracking/RaceExecutionOrderProvider.java | 8 +++++++ .../tracking/impl/DynamicTrackedRaceImpl.java | 4 ++-- .../tracking/impl/TrackedRegattaImpl.java | 4 +++- .../jaxrs/api/LeaderboardsResource.java | 4 ++-- 7 files changed, 43 insertions(+), 14 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java index 40cca2f4635..ad164278a5f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java @@ -16,8 +16,6 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sse.util.SmartFutureCache; import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; -import difflib.PatchFailedException; - public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutionOrderProvider, RaceColumnListenerWithDefaultAction { private static final long serialVersionUID = 4795731834688229568L; private transient SmartFutureCache>, EmptyUpdateInterval> raceOrderCacheMappingRaceToItsPredecessor; @@ -26,11 +24,16 @@ public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutio public AbstractRaceExecutionOrderProvider() { raceOrderCacheMappingRaceToItsPredecessor = createRacesOrderCache(); - raceOrderCacheMappingRaceToItsPredecessor.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, /* update interval */null); + triggerUpdate(); } @Override public void defaultAction() { + triggerUpdate(); + } + + @Override + public void triggerUpdate() { raceOrderCacheMappingRaceToItsPredecessor.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, /* update interval */null); } @@ -59,7 +62,9 @@ public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutio predecessors = new HashSet<>(); raceIdListInExecutionOrder.put(trackedRaceInColumnForFleet, predecessors); } - predecessors.add(predecessor); + if (predecessor != null) { + predecessors.add(predecessor); + } predecessor = trackedRaceInColumnForFleet; } } @@ -80,11 +85,13 @@ public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutio } }, RACES_ORDER_LIST_LOCKS_NAME); } - - private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException, PatchFailedException { + + private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); - raceOrderCacheMappingRaceToItsPredecessor = createRacesOrderCache(); - raceOrderCacheMappingRaceToItsPredecessor.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY,/* update interval */null); + this.raceOrderCacheMappingRaceToItsPredecessor = createRacesOrderCache(); + // don't call triggerUpdate() as of now because the cache's owner may not yet be fully initialized, + // so the getRaceColumnsOfSeries() method may not yet be able to do its work. The owner must call + // triggerUpdate when fully initialized. } @Override diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index c4103d62e11..7d76f9c4550 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -2,6 +2,7 @@ package com.sap.sailing.domain.base.impl; import java.io.IOException; import java.io.ObjectInputStream; +import java.io.ObjectStreamException; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; @@ -209,6 +210,11 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene } } + protected Object readResolve() throws ObjectStreamException { + raceExecutionOrderCache.triggerUpdate(); // now we're fully initialized and the cache can do its job + return this; + } + /** * {@link RaceColumnListeners} may not be de-serialized (yet) when the regatta * is de-serialized. Do avoid re-registering empty objects most probably leading diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java index 01609f875a5..07ae3f3b757 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java @@ -3,6 +3,7 @@ package com.sap.sailing.domain.leaderboard.impl; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.io.ObjectStreamException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -79,7 +80,7 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements throw new IllegalArgumentException("A leaderboard's name must not be null"); } this.name = name; - this.races = new ArrayList(); + this.races = new ArrayList<>(); this.raceLogStore = raceLogStore; this.courseArea = courseArea; this.regattaLikeHelper = new BaseRegattaLikeImpl(new FlexibleLeaderboardAsRegattaLikeIdentifier(this), regattaLogStore); @@ -99,6 +100,11 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements column.setRaceLogInformation(raceLogStore, new FlexibleLeaderboardAsRegattaLikeIdentifier(this)); } } + + protected Object readResolve() throws ObjectStreamException { + raceExecutionOrderProvider.triggerUpdate(); + return this; + } @Override public String getName() { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java index ec8f7c18217..7da38208ad6 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java @@ -16,4 +16,12 @@ public interface RaceExecutionOrderProvider { * by this method must all have been finished before race can start. */ Set getPreviousRaceInExecutionOrder(TrackedRace race); + + /** + * When the owner of this cache-like provider has initialized all its structures that this cache requires + * it shall call this method. This applies in particular after de-serializing the owner because during de-serialization, + * even during the readObject method, the owner's fields may not all be initialized. The + * readResolve() method is usually a good place to do so. + */ + void triggerUpdate(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 470161d4d0f..7222c81cb88 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -681,8 +681,8 @@ DynamicTrackedRace, GPSTrackListener { } private Duration getConditionalTimeBeforeStartToTrackWind(){ - Set previosRaceInExecutionOrder = getPreviousRacesFromAttachedRaceExecutionOrderProviders(); - if (previosRaceInExecutionOrder == null || !previosRaceInExecutionOrder.stream().filter(tr->tr.getEndOfTracking() != null).findAny().isPresent()) { + Set previosRacesInExecutionOrder = getPreviousRacesFromAttachedRaceExecutionOrderProviders(); + if (previosRacesInExecutionOrder == null || !previosRacesInExecutionOrder.stream().filter(tr->tr.getEndOfTracking() != null).findAny().isPresent()) { return EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; } else { return TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java index 32532ee476e..311193a7e8d 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java @@ -3,6 +3,7 @@ package com.sap.sailing.domain.tracking.impl; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.io.ObjectStreamException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -55,11 +56,12 @@ public class TrackedRegattaImpl implements TrackedRegatta { oos.defaultWriteObject(); } } + /** * Resolving replaces this de-serialized object (which has a null {@link #raceListeners} collection) by * a new one into which all other collection contents are copied. */ - private Object readResolve() { + private Object readResolve() throws ObjectStreamException { TrackedRegattaImpl result = new TrackedRegattaImpl(this.regatta); result.trackedRaces.putAll(this.trackedRaces); result.trackedRacesByBoatClass.putAll(this.trackedRacesByBoatClass); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index dbef3735dcc..89587544b76 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -106,10 +106,10 @@ public class LeaderboardsResource extends AbstractSailingServerResource { JSONArray jsonLeaderboards = new JSONArray(); Map leaderboards = getService().getLeaderboards(); for (String leaderboardName : leaderboards.keySet()) { - if (!leaderboardName.equals(LeaderboardNameConstants.DEFAULT_LEADERBOARD_NAME)) + if (!leaderboardName.equals(LeaderboardNameConstants.DEFAULT_LEADERBOARD_NAME)) { jsonLeaderboards.add(leaderboardName); + } } - String json = jsonLeaderboards.toJSONString(); return Response.ok(json, MediaType.APPLICATION_JSON).build(); } From 5356f59bdb198f742dca55ade842122ebb0375c3 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Thu, 28 May 2015 10:55:14 +0200 Subject: [PATCH 34/85] return empty list instead of null if no values in getPrevousRacesInExecutionOrder() --- .../base/impl/AbstractRaceExecutionOrderProvider.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java index ad164278a5f..da9d1a6681a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java @@ -96,13 +96,11 @@ public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutio @Override public Set getPreviousRaceInExecutionOrder(TrackedRace race) { - final Set result; + Set result = Collections.emptySet(); final Map> predecessorMap = getPredecessorsMap(); if (predecessorMap != null) { result = predecessorMap.get(race); - } else { - result = null; - } + } return result; } } From 94b59f98a333ebde3c60a05f1c7066ac23363399 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 2 Jun 2015 13:10:21 +0200 Subject: [PATCH 35/85] Set MockedTrackedRace back to last commit from master and adapted it to changed interfaces from dashboard --- .../gwt/ui/test/MockedTrackedRace.java | 211 +----------------- 1 file changed, 9 insertions(+), 202 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index 9d5d48f9d53..c4474c0419f 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -1,5 +1,8 @@ package com.sap.sailing.gwt.ui.test; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import java.io.Serializable; import java.util.List; import java.util.NavigableSet; @@ -9,25 +12,18 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.regatta.RegattaLog; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; -import com.sap.sailing.domain.base.EventFetcher; import com.sap.sailing.domain.base.Leg; import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.base.RaceColumnListener; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; -import com.sap.sailing.domain.base.RegattaListener; -import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.Sideline; import com.sap.sailing.domain.base.SpeedWithConfidence; import com.sap.sailing.domain.base.Waypoint; -import com.sap.sailing.domain.base.configuration.RegattaConfiguration; import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; -import com.sap.sailing.domain.common.RegattaIdentifier; import com.sap.sailing.domain.common.Speed; import com.sap.sailing.domain.common.SpeedWithBearing; import com.sap.sailing.domain.common.Tack; @@ -37,15 +33,11 @@ import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.tracking.GPSFix; import com.sap.sailing.domain.common.tracking.GPSFixMoving; -import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException; import com.sap.sailing.domain.polars.PolarDataService; import com.sap.sailing.domain.racelog.tracking.GPSFixStore; import com.sap.sailing.domain.ranking.RankingMetric; import com.sap.sailing.domain.ranking.RankingMetric.RankingInfo; -import com.sap.sailing.domain.ranking.RankingMetricConstructor; -import com.sap.sailing.domain.regattalike.RegattaLikeIdentifier; -import com.sap.sailing.domain.regattalike.RegattaLikeListener; import com.sap.sailing.domain.tracking.CourseDesignChangedListener; import com.sap.sailing.domain.tracking.DynamicGPSFixTrack; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; @@ -270,195 +262,10 @@ public class MockedTrackedRace implements DynamicTrackedRace { private static final long serialVersionUID = 2651590861333064588L; @Override - public Regatta getRegatta() { - return new Regatta() { - private static final long serialVersionUID = -4908774269425170811L; - - @Override - public String getName() { - return "A Mocked Test Regatta"; - } - - @Override - public Serializable getId() { - return null; - } - - @Override - public Iterable getAllRaces() { - return null; - } - - @Override - public BoatClass getBoatClass() { - return null; - } - - @Override - public Iterable getAllCompetitors() { - return null; - } - - @Override - public void addRace(RaceDefinition race) { - } - - @Override - public void removeRace(RaceDefinition raceDefinition) { - } - - @Override - public RaceDefinition getRaceByName(String raceName) { - return null; - } - - @Override - public void addRegattaListener(RegattaListener listener) { - } - - @Override - public void removeRegattaListener(RegattaListener listener) { - } - - @Override - public RegattaIdentifier getRegattaIdentifier() { - return null; - } - - @Override - public Iterable getSeries() { - return null; - } - - @Override - public Series getSeriesByName(String seriesName) { - return null; - } - - @Override - public boolean isPersistent() { - return false; - } - - @Override - public void addRaceColumnListener(RaceColumnListener listener) { - - } - - @Override - public void removeRaceColumnListener(RaceColumnListener listener) { - } - - @Override - public ScoringScheme getScoringScheme() { - return null; - } - - @Override - public CourseArea getDefaultCourseArea() { - return null; - } - - @Override - public void setDefaultCourseArea(CourseArea newCourseArea) { - } - - @Override - public boolean definesSeriesDiscardThresholds() { - return false; - } - - @Override - public RegattaAndRaceIdentifier getRaceIdentifier(RaceDefinition race) { - return null; - } - - @Override - public RegattaConfiguration getRegattaConfiguration() { - return null; - } - - @Override - public void setRegattaConfiguration(RegattaConfiguration configuration) { - } - - @Override - public void addSeries(Series series) { - } - - @Override - public boolean useStartTimeInference() { - return false; - } - - @Override - public void removeSeries(Series series) { - } - - @Override - public void setUseStartTimeInference(boolean useStartTimeInference) { - } - - @Override - public RegattaLog getRegattaLog() { - return null; - } - - @Override - public TimePoint getStartDate() { - return null; - } - - @Override - public void setStartDate(TimePoint startDate) { - } - - @Override - public TimePoint getEndDate() { - return null; - } - - @Override - public void setEndDate(TimePoint startDate) { - } - - @Override - public RegattaLikeIdentifier getRegattaLikeIdentifier() { - return null; - } - - @Override - public void addListener(RegattaLikeListener listener) { - } - - @Override - public void removeListener(RegattaLikeListener listener) { - } - - @Override - public void adjustEventToRegattaAssociation(EventFetcher eventFetcher) { - } - - @Override - public Double getTimeOnTimeFactor(Competitor competitor) { - return null; - } - - @Override - public Duration getTimeOnDistanceAllowancePerNauticalMile(Competitor competitor) { - return null; - } - - @Override - public RankingMetricConstructor getRankingMetricConstructor() { - return null; - } - - @Override - public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { - return null; - } - }; + public Regatta getRegatta() { + final Regatta result = mock(Regatta.class); + when(result.getName()).thenReturn("A Mocked Test Regatta"); + return result; } @Override @@ -975,11 +782,11 @@ public class MockedTrackedRace implements DynamicTrackedRace { } @Override - public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { + public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } @Override - public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { + public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } @Override From 280e309602cfda6aaefd6f4428a76fda1ec9899e Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 2 Jun 2015 14:30:15 +0200 Subject: [PATCH 36/85] Changed font to Open Sans for LiveAverageComponent --- .../startanalysis/StartlineAnalysisCard.java | 2 +- .../LiveAverageComponent.css | 8 ++++++++ .../LiveAverageComponent.java | 20 ++++++++++--------- .../LiveAverageComponent.ui.xml | 2 +- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysisCard.java b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysisCard.java index ad19b946bde..034fd34c083 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysisCard.java +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysisCard.java @@ -141,7 +141,7 @@ public class StartlineAnalysisCard extends Composite implements HasWidgets, Star zoomTypes.add(ZoomTypes.BUOYS); } else { timer.setTime(startAnalysisDTO.timeOfStartInMilliSeconds); - zoomTypes.add(ZoomTypes.TAILS); + zoomTypes.add(ZoomTypes.BOATS); } AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor(); RaceTimesInfoProvider raceTimesInfoProvider = new RaceTimesInfoProvider(sailingServiceAsync, diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.css b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.css index ba870375496..5bee6ef9130 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.css +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.css @@ -55,13 +55,21 @@ } .liveAverageCompoment_panel_value_number { + font-family: 'Open Sans', Arial, Verdana, sans-serif; font-size: 27pt; } .liveAverageCompoment_panel_value_unit { + font-family: 'Open Sans', Arial, Verdana, sans-serif; font-size: 12pt; } +.liveAverageCompoment_panel_value_unit_degrees { + position: absolute; + font-size: 20pt; + font-weight: lighter; +} + .liveAverageCompoment_value_panel { margin: 0px; width: 100%; diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.java b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.java index fd378ee94a6..4628cf14334 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.java +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.java @@ -5,9 +5,7 @@ import java.util.Iterator; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.SpanElement; -import com.google.gwt.dom.client.Style; -import com.google.gwt.dom.client.Style.Position; -import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.resources.client.CssResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; @@ -32,6 +30,11 @@ public class LiveAverageComponent extends Composite implements HasWidgets, Verti interface LiveAverageComponentUiBinder extends UiBinder { } + + interface LiveAverageComponentStyle extends CssResource { + + String liveAverageCompoment_panel_value_unit_degrees(); + } @UiField HTMLPanel liveAveragePanel; @@ -65,6 +68,9 @@ public class LiveAverageComponent extends Composite implements HasWidgets, Verti @UiField HTMLPanel averagePanel; + + @UiField + LiveAverageComponentStyle style; private StringMessages stringConstants; public LiveAverageComponent() { @@ -87,12 +93,8 @@ public class LiveAverageComponent extends Composite implements HasWidgets, Verti this.averageUnit.setInnerText(unit); // Lifts the degrees unit string "°". Otherwise it would be too small. if (unit.equals("°")) { - this.liveUnit.getStyle().setFontSize(15, Unit.PT); - this.averageUnit.getStyle().setFontSize(15, Unit.PT); - this.liveUnit.getStyle().setFontWeight(Style.FontWeight.LIGHTER); - this.averageUnit.getStyle().setFontWeight(Style.FontWeight.LIGHTER); - this.liveUnit.getStyle().setPosition(Position.ABSOLUTE); - this.averageUnit.getStyle().setPosition(Position.ABSOLUTE); + this.liveUnit.addClassName(style.liveAverageCompoment_panel_value_unit_degrees()); + this.averageUnit.setClassName(style.liveAverageCompoment_panel_value_unit_degrees()); } this.liveLabel.setInnerHTML(stringConstants.dashboardLiveWind()); this.averageLabel.setInnerHTML(stringConstants.dashboardAverageWind()+"
"+stringConstants.dashboardAverageWindMinutes(15)); diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.ui.xml b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.ui.xml index 9223d82f4f2..49cb75c6be2 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.ui.xml +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.ui.xml @@ -2,7 +2,7 @@ - + From 3b622fced35a57b077f8a7884737fbbad812b706 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 2 Jun 2015 14:33:59 +0200 Subject: [PATCH 37/85] solved stash apply conflicts in LiveAverageComponent --- .../gwt/client/startlineadvantage/LiveAverageComponent.ui.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.ui.xml b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.ui.xml index 49cb75c6be2..fa77bcce139 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.ui.xml +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.ui.xml @@ -13,7 +13,7 @@
- +
@@ -24,7 +24,7 @@
- +
From 60bffc923e6ad11af7fa4e835ce9a3bb54d0fd14 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Mon, 8 Jun 2015 13:21:09 +0200 Subject: [PATCH 38/85] Added javadoc to RaceExecutionOrderProvider --- .../sailing/domain/tracking/RaceExecutionOrderProvider.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java index 7da38208ad6..0cef79a76fb 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java @@ -5,6 +5,11 @@ import java.util.Set; import com.sap.sailing.domain.base.Regatta; /** + * Sometimes {@link TrackedRace}s want to know which {@link TrackedRace} is in front of them in the execution order + * of a {@link Regatta}. This is i.e interesting to know in the {@link DynamicTrackedRace #recordWind(com.sap.sailing.domain.common.Wind, com.sap.sailing.domain.common.WindSource)} + * method, when the race has to decide whether to record the wind. If a previous {@link TrackedRace} + * is null, the current {@link TrackedRace} would save the wind fixes earlier. + * * @author Alexander Ries (D062114) * */ From 223d3120a61c993b89437e498261a8869d483ad0 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Mon, 8 Jun 2015 15:52:54 +0200 Subject: [PATCH 39/85] Refacoring with Axel --- .../domain/test/mock/MockedTrackedRace.java | 11 ------ ...ockedTrackedRaceWithStartTimeAndRanks.java | 10 ------ .../domain/base/impl/AbstractRaceColumn.java | 1 + .../AbstractRaceExecutionOrderProvider.java | 2 +- .../base/impl/RaceColumnInSeriesImpl.java | 6 ++-- .../sailing/domain/base/impl/RegattaImpl.java | 6 ++-- .../sailing/domain/base/impl/SeriesImpl.java | 11 +++--- .../impl/FlexibleLeaderboardImpl.java | 6 ++-- .../leaderboard/impl/RaceColumnImpl.java | 2 +- .../sailing/domain/tracking/TrackedRace.java | 7 ---- .../tracking/impl/DynamicTrackedRaceImpl.java | 35 +++---------------- .../domain/tracking/impl/TrackedRaceImpl.java | 31 ++++++++++++---- .../gwt/ui/test/MockedTrackedRace.java | 9 ----- .../server/masterdata/DummyTrackedRace.java | 10 ------ 14 files changed, 51 insertions(+), 96 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index d3d6e667464..481323374f0 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -789,10 +789,6 @@ public class MockedTrackedRace implements DynamicTrackedRace { return null; } - @Override - public void detachAllRaceLogs() { - } - @Override public void invalidateStartTime() { } @@ -904,7 +900,6 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public boolean isUsingMarkPassingCalculator() { - // TODO Auto-generated method stub return false; } @@ -953,7 +948,6 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public Duration getEstimatedTimeToComplete(TimePoint timepoint) throws NotEnoughDataHasBeenAddedException, NoWindException { - // TODO Auto-generated method stub return null; } @@ -965,11 +959,6 @@ public class MockedTrackedRace implements DynamicTrackedRace { public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } - @Override - public Set getPreviousRacesFromAttachedRaceExecutionOrderProviders() { - return null; - } - @Override public Distance getWindwardDistanceToCompetitorFarthestAhead(Competitor competitor, TimePoint timePoint, WindPositionMode windPositionMode, RankingInfo rankingInfo, WindLegTypeAndLegBearingCache cache) { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index ce33e39fd5f..fa79bf1f374 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -471,10 +471,6 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { return null; } - @Override - public void detachAllRaceLogs() { - } - @Override public boolean isLive(TimePoint at) { return false; @@ -651,10 +647,4 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { @Override public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } - - @Override - public Set getPreviousRacesFromAttachedRaceExecutionOrderProviders() { - return null; - } - } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 1fbeaac0571..995c0e715a7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -99,6 +99,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem if (previouslyLinkedRace != null && regattaLikeParent != null) { RaceLogIdentifier identifier = getRaceLogIdentifier(fleet); previouslyLinkedRace.detachRaceLog(identifier.getIdentifier()); + previouslyLinkedRace.detachRaceExecutionOrderProvider(getRaceExecutionOrderProvider()); getRaceColumnListeners().notifyListenersAboutTrackedRaceUnlinked(this, fleet, previouslyLinkedRace); } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java index da9d1a6681a..83e70e64a15 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java @@ -51,7 +51,7 @@ public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutio return raceIdListInExecutionOrder; } - protected void addPredecessors(final Map> raceIdListInExecutionOrder, Fleet fleet, + private void addPredecessors(final Map> raceIdListInExecutionOrder, Fleet fleet, final Iterable raceColumns) { TrackedRace predecessor = null; for (RaceColumn currentRaceColumn : raceColumns) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java index 3400997f591..2554e5d157d 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceColumnInSeriesImpl.java @@ -123,10 +123,12 @@ public class RaceColumnInSeriesImpl extends AbstractRaceColumn implements RaceCo @Override public RaceExecutionOrderProvider getRaceExecutionOrderProvider() { + final RaceExecutionOrderProvider result; if (getRegatta() != null) { - return getRegatta().getRaceExecutionOrderProvider(); + result = getRegatta().getRaceExecutionOrderProvider(); } else { - return null; + result = null; } + return result; } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java index 9e60808e8bb..8033594b11f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java @@ -274,11 +274,13 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene @Override public Iterable getSeries() { + final Iterable result; if (series != null) { - return Collections.unmodifiableCollection(series); + result = Collections.unmodifiableCollection(series); } else { - return null; + result = null; } + return result; } @Override diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java index bfc97fa9826..e8cd4ce23b8 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java @@ -109,11 +109,14 @@ public class SeriesImpl extends RenamableImpl implements Series, RaceColumnListe @Override public void setRegatta(Regatta regatta) { + if (this.regatta != null) { + detachRaceExecutionOrderProviderFromTrackedRacesInRaceColumns(); + } this.regatta = regatta; if (this.regatta != null) { - attachRaceExecutionOrderProviderToTrackedRacesInRaceCollumns(); + attachRaceExecutionOrderProviderToTrackedRacesInRaceColumns(); } else { - detachRaceExecutionOrderProviderFromTrackedRacesInRaceCollumns(); + detachRaceExecutionOrderProviderFromTrackedRacesInRaceColumns(); } } @@ -172,7 +175,7 @@ public class SeriesImpl extends RenamableImpl implements Series, RaceColumnListe trackedRegattaRegistry); } - private void attachRaceExecutionOrderProviderToTrackedRacesInRaceCollumns(){ + private void attachRaceExecutionOrderProviderToTrackedRacesInRaceColumns() { for (RaceColumnInSeries raceColumnInSeries : raceColumns) { for (Fleet fleet : raceColumnInSeries.getFleets()) { TrackedRace trackedRace = raceColumnInSeries.getTrackedRace(fleet); @@ -183,7 +186,7 @@ public class SeriesImpl extends RenamableImpl implements Series, RaceColumnListe } } - private void detachRaceExecutionOrderProviderFromTrackedRacesInRaceCollumns() { + private void detachRaceExecutionOrderProviderFromTrackedRacesInRaceColumns() { for (RaceColumnInSeries raceColumnInSeries : raceColumns) { for (Fleet fleet : raceColumnInSeries.getFleets()) { TrackedRace trackedRace = raceColumnInSeries.getTrackedRace(fleet); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java index 6dc250e15e6..3008b1f570c 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java @@ -181,11 +181,13 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements @Override public Iterable getRaceColumns() { + final Iterable result; if (races != null) { - return Collections.unmodifiableCollection(new ArrayList(races)); + result = Collections.unmodifiableCollection(new ArrayList(races)); } else { - return null; + result = null; } + return result; } protected RaceColumnImpl createRaceColumn(String column, boolean medalRace) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java index fa25b1c9e24..12709513ea8 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java @@ -12,7 +12,7 @@ public class RaceColumnImpl extends AbstractRaceColumn implements FlexibleRaceCo private String name; private boolean medalRace; - private RaceExecutionOrderProvider raceExecutionOrderProvider; + private final RaceExecutionOrderProvider raceExecutionOrderProvider; public RaceColumnImpl(String name, boolean medalRace, RaceExecutionOrderProvider raceExecutionOrderProvider) { super(); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 850a482d459..1a3e02a58df 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -656,11 +656,6 @@ public interface TrackedRace extends Serializable { */ void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider); - /** - * Detaches all {@link RaceLog} instances from this race - */ - void detachAllRaceLogs(); - /** * Attaches the passed race log with this {@link TrackedRace}. * This causes fixes from the {@link GPSFixStore} to be loaded for such {@link DeviceMappingEvent}s @@ -835,6 +830,4 @@ public interface TrackedRace extends Serializable { void setPolarDataService(PolarDataService polarDataService); - Set getPreviousRacesFromAttachedRaceExecutionOrderProviders(); - } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 5eec85ff78f..6bbe9121181 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; import java.util.Collection; -import java.util.Collections; import java.util.ConcurrentModificationException; import java.util.HashMap; import java.util.HashSet; @@ -45,7 +44,6 @@ import com.sap.sailing.domain.tracking.GPSTrackListener; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.RaceAbortedListener; import com.sap.sailing.domain.tracking.RaceChangeListener; -import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.StartTimeChangedListener; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedRace; @@ -667,7 +665,7 @@ DynamicTrackedRace, GPSTrackListener { TimePoint startOfTracking = getStartOfTracking(); TimePoint endOfRace = getEndOfRace(); TimePoint endOfTracking = getEndOfTracking(); - final Duration conditionalTimeBeforeStartToTrackWind = getConditionalTimeBeforeStartToTrackWind(); + final Duration conditionalTimeBeforeStartToTrackWind = getConditionalTimeBeforeStartToTrackWind(wind.getTimePoint()); if ((startOfTracking == null || !startOfTracking.minus(conditionalTimeBeforeStartToTrackWind).after(wind.getTimePoint()) || (startOfRace != null && !startOfRace.minus(conditionalTimeBeforeStartToTrackWind).after(wind.getTimePoint()))) && @@ -684,9 +682,9 @@ DynamicTrackedRace, GPSTrackListener { return result; } - private Duration getConditionalTimeBeforeStartToTrackWind(){ - Set previosRacesInExecutionOrder = getPreviousRacesFromAttachedRaceExecutionOrderProviders(); - if (previosRacesInExecutionOrder == null || !previosRacesInExecutionOrder.stream().filter(tr->tr.getEndOfTracking() != null).findAny().isPresent()) { + private Duration getConditionalTimeBeforeStartToTrackWind(TimePoint timePointOfWindFix) { + Set previousRacesInExecutionOrder = getPreviousRacesFromAttachedRaceExecutionOrderProviders(); + if (previousRacesInExecutionOrder == null || !previousRacesInExecutionOrder.stream().filter(tr->tr.getEndOfTracking() != null).findAny().isPresent()) { return EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; } else { return TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; @@ -774,20 +772,6 @@ DynamicTrackedRace, GPSTrackListener { super.detachRaceLog(identifier); } - @Override - public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { - if (raceExecutionOrderProvider != null && !super.attachedRaceExecutionOrderProvider.containsKey(raceExecutionOrderProvider)) { - super.attachedRaceExecutionOrderProvider.put(raceExecutionOrderProvider, raceExecutionOrderProvider); - } - } - - @Override - public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { - if (raceExecutionOrderProvider != null) { - super.attachedRaceExecutionOrderProvider.remove(raceExecutionOrderProvider); - } - } - @Override public void addCourseDesignChangedListener(CourseDesignChangedListener listener) { this.courseDesignChangedListeners.add(listener); @@ -847,15 +831,4 @@ DynamicTrackedRace, GPSTrackListener { return (DynamicGPSFixTrack) super.getTrack(mark); } - @Override - public Set getPreviousRacesFromAttachedRaceExecutionOrderProviders() { - final Set result; - if (attachedRaceExecutionOrderProvider != null) { - result = attachedRaceExecutionOrderProvider.values().stream().map(reop->reop.getPreviousRaceInExecutionOrder(this)).collect(HashSet::new, (r, e)->r.addAll(e), (r, e)->r.addAll(e)); - } else { - result = Collections.emptySet(); - } - return result; - } - } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 50713c838a2..17124fb4292 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -286,7 +286,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl */ protected transient ConcurrentHashMap attachedRegattaLogs; - protected transient ConcurrentHashMap attachedRaceExecutionOrderProvider; + private transient ConcurrentHashMap attachedRaceExecutionOrderProvider; /** * The time delay to the current point in time in milliseconds. @@ -3051,7 +3051,31 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl public void attachRaceLog(final RaceLog raceLog) { loadFixesForLog(raceLog, attachedRaceLogs); } + + @Override + public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { + if (raceExecutionOrderProvider != null && !attachedRaceExecutionOrderProvider.containsKey(raceExecutionOrderProvider)) { + attachedRaceExecutionOrderProvider.put(raceExecutionOrderProvider, raceExecutionOrderProvider); + } + } + + protected Set getPreviousRacesFromAttachedRaceExecutionOrderProviders() { + final Set result; + if (attachedRaceExecutionOrderProvider != null) { + result = attachedRaceExecutionOrderProvider.values().stream().map(reop->reop.getPreviousRaceInExecutionOrder(this)).collect(HashSet::new, (r, e)->r.addAll(e), (r, e)->r.addAll(e)); + } else { + result = Collections.emptySet(); + } + return result; + } + @Override + public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { + if (raceExecutionOrderProvider != null) { + attachedRaceExecutionOrderProvider.remove(raceExecutionOrderProvider); + } + } + private ReadonlyRaceState getRaceState(RaceLog raceLog) { ReadonlyRaceState result; synchronized (raceStates) { @@ -3073,11 +3097,6 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl public void detachRaceLog(Serializable identifier) { this.attachedRaceLogs.remove(identifier); } - - @Override - public void detachAllRaceLogs() { - this.attachedRaceLogs.clear(); - } @Override public RaceLog getRaceLog(Serializable identifier) { diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index c4474c0419f..9eca28dba48 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -591,10 +591,6 @@ public class MockedTrackedRace implements DynamicTrackedRace { return null; } - @Override - public void detachAllRaceLogs() { - } - @Override public void invalidateStartTime() { } @@ -788,9 +784,4 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } - - @Override - public Set getPreviousRacesFromAttachedRaceExecutionOrderProviders() { - return null; - } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java index d3514de4215..370826f1ecd 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java @@ -46,7 +46,6 @@ import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.StartTimeChangedListener; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; -import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRaceStatus; import com.sap.sailing.domain.tracking.TrackedRaceWithWindEssentials; import com.sap.sailing.domain.tracking.TrackedRegatta; @@ -440,10 +439,6 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { public void detachRaceLog(Serializable identifier) { } - @Override - public void detachAllRaceLogs() { - } - @Override public void attachRaceLog(RaceLog raceLog) { } @@ -626,9 +621,4 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { @Override public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } - - @Override - public Set getPreviousRacesFromAttachedRaceExecutionOrderProviders() { - return null; - } } From 4abcc4f907eee66b396111b8dfb79a1bba2f49e9 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Sun, 14 Jun 2015 18:39:02 +0200 Subject: [PATCH 40/85] added methods for TimePoint handling to com.sap.sse.comm Util --- .../src/com/sap/sse/common/Util.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/Util.java b/java/com.sap.sse.common/src/com/sap/sse/common/Util.java index 6a56acbdfbe..9121dfc30e2 100755 --- a/java/com.sap.sse.common/src/com/sap/sse/common/Util.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/Util.java @@ -362,4 +362,42 @@ public class Util { } return null; } + + /** + * Returns the earlier {@link TimePoint} of a and b. If one of them is null and the other + * !null, the TimePoint that is not !null gets returned. If both are null, + * null is the result. + * */ + public static TimePoint getEarliestOfTimePoints(TimePoint a, TimePoint b){ + TimePoint result = null; + if (a != null && b != null) { + result = a.before(b) ? a : b; + } else { + result = (a != null && b == null) ? a : (a == null && b != null) ? b : null; + } + return result; + } + + /** + * Returns the latest {@link TimePoint} of a and b. If one of them is null and the other + * !null, the TimePoint that is not !null gets returned. If both are null, + * null is the result. + * */ + public static TimePoint getLatestOfTimePoints(TimePoint a, TimePoint b) { + TimePoint result = null; + if (a != null && b != null) { + result = a.after(b) ? a : b; + } else { + result = (a != null && b == null) ? a : (a == null && b != null) ? b : null; + } + return result; + } + + public static boolean isTimePointInRangeOfTimePointsAandB(TimePoint timePoint, TimePoint a, TimePoint b){ + boolean result = false; + if(timePoint != null && a != null && b != null){ + result = timePoint.after(a) && timePoint.before(b); + } + return result; + } } \ No newline at end of file From cbaf85766d59459a4a82527db62f4a6b2d8ad8cd Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Sun, 14 Jun 2015 18:43:17 +0200 Subject: [PATCH 41/85] added boolean takesWind(Wind wind) Method to TrackedRace and did some renaming --- .../domain/test/mock/MockedTrackedRace.java | 5 ++ ...ockedTrackedRaceWithStartTimeAndRanks.java | 6 ++- .../AbstractRaceExecutionOrderProvider.java | 48 +++++++++---------- .../tracking/RaceExecutionOrderProvider.java | 4 +- .../sailing/domain/tracking/TrackedRace.java | 5 ++ .../tracking/impl/DynamicTrackedRaceImpl.java | 25 +--------- .../domain/tracking/impl/TrackedRaceImpl.java | 34 +++++++++---- .../gwt/ui/test/MockedTrackedRace.java | 5 ++ .../server/masterdata/DummyTrackedRace.java | 5 ++ 9 files changed, 78 insertions(+), 59 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index 481323374f0..f97aef67781 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -979,4 +979,9 @@ public class MockedTrackedRace implements DynamicTrackedRace { public RankingMetric getRankingMetric() { return null; } + + @Override + public boolean takesWindFix(Wind wind) { + return false; + } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index fa79bf1f374..21b080e433b 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -636,7 +636,6 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { @Override public Duration getEstimatedTimeToComplete(TimePoint timepoint) throws NotEnoughDataHasBeenAddedException, NoWindException { - // TODO Auto-generated method stub return null; } @@ -647,4 +646,9 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { @Override public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } + + @Override + public boolean takesWindFix(Wind wind) { + return false; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java index 83e70e64a15..07da1de7bed 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceExecutionOrderProvider.java @@ -18,12 +18,12 @@ import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval; public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutionOrderProvider, RaceColumnListenerWithDefaultAction { private static final long serialVersionUID = 4795731834688229568L; - private transient SmartFutureCache>, EmptyUpdateInterval> raceOrderCacheMappingRaceToItsPredecessor; + private transient SmartFutureCache>, EmptyUpdateInterval> previousRacesByRaceCache; private final String RACES_ORDER_LIST_CACHE_KEY = "racesOrderCacheKey"; private final String RACES_ORDER_LIST_LOCKS_NAME = getClass().getName(); public AbstractRaceExecutionOrderProvider() { - raceOrderCacheMappingRaceToItsPredecessor = createRacesOrderCache(); + previousRacesByRaceCache = createRacesOrderCache(); triggerUpdate(); } @@ -34,38 +34,38 @@ public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutio @Override public void triggerUpdate() { - raceOrderCacheMappingRaceToItsPredecessor.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, /* update interval */null); + previousRacesByRaceCache.triggerUpdate(RACES_ORDER_LIST_CACHE_KEY, /* update interval */null); } - private Map> getPredecessorsMap() { - return raceOrderCacheMappingRaceToItsPredecessor.get(RACES_ORDER_LIST_CACHE_KEY, /* waitForLatest */true); + private Map> getPreviousRacesByRace() { + return previousRacesByRaceCache.get(RACES_ORDER_LIST_CACHE_KEY, /* waitForLatest */true); } protected abstract Map> getRaceColumnsOfSeries(); - private Map> reloadRacesInExecutionOrder() { - final Map> raceIdListInExecutionOrder = new HashMap<>(); + private Map> reloadAndGetPreviousRacesByRace() { + final Map> previousRacesByRace = new HashMap<>(); for (Entry> raceColumnsInSeries : getRaceColumnsOfSeries().entrySet()) { - addPredecessors(raceIdListInExecutionOrder, raceColumnsInSeries.getKey(), raceColumnsInSeries.getValue()); + addPreviousRaces(previousRacesByRace, raceColumnsInSeries.getKey(), raceColumnsInSeries.getValue()); } - return raceIdListInExecutionOrder; + return previousRacesByRace; } - private void addPredecessors(final Map> raceIdListInExecutionOrder, Fleet fleet, + private void addPreviousRaces(final Map> previousRacesByRace, Fleet fleet, final Iterable raceColumns) { - TrackedRace predecessor = null; + TrackedRace previousRace = null; for (RaceColumn currentRaceColumn : raceColumns) { final TrackedRace trackedRaceInColumnForFleet = currentRaceColumn.getTrackedRace(fleet); if (trackedRaceInColumnForFleet != null) { - Set predecessors = raceIdListInExecutionOrder.get(trackedRaceInColumnForFleet); - if (predecessors == null) { - predecessors = new HashSet<>(); - raceIdListInExecutionOrder.put(trackedRaceInColumnForFleet, predecessors); + Set previousRaces = previousRacesByRace.get(trackedRaceInColumnForFleet); + if (previousRaces == null) { + previousRaces = new HashSet<>(); + previousRacesByRace.put(trackedRaceInColumnForFleet, previousRaces); } - if (predecessor != null) { - predecessors.add(predecessor); + if (previousRace != null) { + previousRaces.add(previousRace); } - predecessor = trackedRaceInColumnForFleet; + previousRace = trackedRaceInColumnForFleet; } } } @@ -77,7 +77,7 @@ public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutio public Map> computeCacheUpdate(String key, EmptyUpdateInterval updateInterval) throws Exception { if (key.equals(RACES_ORDER_LIST_CACHE_KEY)) { - return reloadRacesInExecutionOrder(); + return reloadAndGetPreviousRacesByRace(); } else { final Map> emptyMap = Collections.emptyMap(); return emptyMap; @@ -88,18 +88,18 @@ public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutio private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); - this.raceOrderCacheMappingRaceToItsPredecessor = createRacesOrderCache(); + this.previousRacesByRaceCache = createRacesOrderCache(); // don't call triggerUpdate() as of now because the cache's owner may not yet be fully initialized, // so the getRaceColumnsOfSeries() method may not yet be able to do its work. The owner must call // triggerUpdate when fully initialized. } @Override - public Set getPreviousRaceInExecutionOrder(TrackedRace race) { + public Set getPreviousRacesInExecutionOrder(TrackedRace race) { Set result = Collections.emptySet(); - final Map> predecessorMap = getPredecessorsMap(); - if (predecessorMap != null) { - result = predecessorMap.get(race); + final Map> previousRacesByRace = getPreviousRacesByRace(); + if (previousRacesByRace != null) { + result = previousRacesByRace.get(race); } return result; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java index 0cef79a76fb..0de22b6c5c8 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceExecutionOrderProvider.java @@ -5,7 +5,7 @@ import java.util.Set; import com.sap.sailing.domain.base.Regatta; /** - * Sometimes {@link TrackedRace}s want to know which {@link TrackedRace} is in front of them in the execution order + * Sometimes {@link TrackedRace}s want to know which {@link DynamicTrackedRace} is in front of them in the execution order * of a {@link Regatta}. This is i.e interesting to know in the {@link DynamicTrackedRace #recordWind(com.sap.sailing.domain.common.Wind, com.sap.sailing.domain.common.WindSource)} * method, when the race has to decide whether to record the wind. If a previous {@link TrackedRace} * is null, the current {@link TrackedRace} would save the wind fixes earlier. @@ -20,7 +20,7 @@ public interface RaceExecutionOrderProvider { * {@link TrackedRace}s in the execution order of a {@link Regatta}. This expresses the fact that the races returned * by this method must all have been finished before race can start. */ - Set getPreviousRaceInExecutionOrder(TrackedRace race); + Set getPreviousRacesInExecutionOrder(TrackedRace race); /** * When the owner of this cache-like provider has initialized all its structures that this cache requires diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 1a3e02a58df..0c307b2cfb6 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -275,6 +275,11 @@ public interface TrackedRace extends Serializable { * is returned. Otherwise, the center of gravity between the mark positions is computed and returned. */ Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint); + + /** + * Checks whether the {@link Wind#getTimePoint()} is in range of start and end {@link TimePoint}s plus extra time for wind recording. + */ + boolean takesWindFix(Wind wind); /** * Same as {@link #getWind(Position, TimePoint, Set) getWind(p, at, Collections.emptyList())} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 6bbe9121181..9716456e1ce 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -24,7 +24,6 @@ import com.sap.sailing.domain.base.Mark; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Sideline; import com.sap.sailing.domain.base.Waypoint; -import com.sap.sailing.domain.common.TimingConstants; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; @@ -46,12 +45,10 @@ import com.sap.sailing.domain.tracking.RaceAbortedListener; import com.sap.sailing.domain.tracking.RaceChangeListener; import com.sap.sailing.domain.tracking.StartTimeChangedListener; import com.sap.sailing.domain.tracking.TrackedLeg; -import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRaceStatus; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTrack; -import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -660,18 +657,7 @@ DynamicTrackedRace, GPSTrackListener { @Override public boolean recordWind(Wind wind, WindSource windSource) { final boolean result; - // TODO check what a good filter is; remember that start/end of tracking may change over time; what if we have discarded valuable wind fixes? - TimePoint startOfRace = getStartOfRace(); - TimePoint startOfTracking = getStartOfTracking(); - TimePoint endOfRace = getEndOfRace(); - TimePoint endOfTracking = getEndOfTracking(); - final Duration conditionalTimeBeforeStartToTrackWind = getConditionalTimeBeforeStartToTrackWind(wind.getTimePoint()); - if ((startOfTracking == null || !startOfTracking.minus(conditionalTimeBeforeStartToTrackWind).after(wind.getTimePoint()) || - (startOfRace != null && !startOfRace.minus(conditionalTimeBeforeStartToTrackWind).after(wind.getTimePoint()))) - && - // Caution: don't add to endOfTracking; it may be the end of time, leading to a wrap-around / overflow - (endOfTracking == null || endOfTracking.after(wind.getTimePoint().minus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS)) || - (endOfRace != null && endOfRace.plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS).after(wind.getTimePoint())))) { + if(takesWindFix(wind)){ result = getOrCreateWindTrack(windSource).add(wind); updated(/* time point */null); // wind events shouldn't advance race time triggerManeuverCacheRecalculationForAllCompetitors(); @@ -681,15 +667,6 @@ DynamicTrackedRace, GPSTrackListener { } return result; } - - private Duration getConditionalTimeBeforeStartToTrackWind(TimePoint timePointOfWindFix) { - Set previousRacesInExecutionOrder = getPreviousRacesFromAttachedRaceExecutionOrderProviders(); - if (previousRacesInExecutionOrder == null || !previousRacesInExecutionOrder.stream().filter(tr->tr.getEndOfTracking() != null).findAny().isPresent()) { - return EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; - } else { - return TIME_BEFORE_START_TO_TRACK_WIND_MILLIS; - } - } @Override public void removeWind(Wind wind, WindSource windSource) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 17124fb4292..919c168049a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -286,7 +286,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl */ protected transient ConcurrentHashMap attachedRegattaLogs; - private transient ConcurrentHashMap attachedRaceExecutionOrderProvider; + private transient ConcurrentHashMap attachedRaceExecutionOrderProviders; /** * The time delay to the current point in time in milliseconds. @@ -380,7 +380,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl locksForMarkPassings = new IdentityHashMap<>(); attachedRaceLogs = new ConcurrentHashMap<>(); attachedRegattaLogs = new ConcurrentHashMap<>(); - attachedRaceExecutionOrderProvider = new ConcurrentHashMap<>(); + attachedRaceExecutionOrderProviders = new ConcurrentHashMap<>(); this.status = new TrackedRaceStatusImpl(TrackedRaceStatusEnum.PREPARED, 0.0); this.statusNotifier = new Object[0]; this.loadingFromWindStoreLock = new NamedReentrantReadWriteLock("Loading from wind store lock for tracked race " @@ -578,7 +578,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl ois.defaultReadObject(); raceStates = new WeakHashMap<>(); attachedRaceLogs = new ConcurrentHashMap<>(); - attachedRaceExecutionOrderProvider = new ConcurrentHashMap<>(); + attachedRaceExecutionOrderProviders = new ConcurrentHashMap<>(); markPassingsTimes = new ArrayList>>(); // The short time wind cache needs to be there before operations such as maneuver recalculation try to access it shortTimeWindCache = new ShortTimeWindCache(this, millisecondsOverWhichToAverageWind / 2); @@ -1495,6 +1495,24 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl } return result; } + + @Override + public boolean takesWindFix(Wind wind) { + boolean result = false; + TimePoint earliestStartTimePoint = Util.getEarliestOfTimePoints(getStartOfRace(), getStartOfTracking()); + TimePoint latestEndTimePoint = Util.getLatestOfTimePoints(getStartOfRace(), getStartOfTracking()); + if (earliestStartTimePoint != null && latestEndTimePoint != null) { + TimePoint earliestStartTimePointMinusExtra = earliestStartTimePoint.minus(EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS); + TimePoint latestEndTimePointPlusExtra = latestEndTimePoint.plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS); + if (Util.isTimePointInRangeOfTimePointsAandB(wind.getTimePoint(), /* a */earliestStartTimePointMinusExtra, /* b */latestEndTimePointPlusExtra)) { + Set previousRacesInExecutionOrder = getPreviousRacesFromAttachedRaceExecutionOrderProviders(); + if(previousRacesInExecutionOrder == null || !previousRacesInExecutionOrder.stream().filter(tr->tr.takesWindFix(wind) == true).findAny().isPresent()){ + result = true; + } + } + } + return result; + } @Override public Wind getWind(Position p, TimePoint at) { @@ -3054,15 +3072,15 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl @Override public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { - if (raceExecutionOrderProvider != null && !attachedRaceExecutionOrderProvider.containsKey(raceExecutionOrderProvider)) { - attachedRaceExecutionOrderProvider.put(raceExecutionOrderProvider, raceExecutionOrderProvider); + if (raceExecutionOrderProvider != null && !attachedRaceExecutionOrderProviders.containsKey(raceExecutionOrderProvider)) { + attachedRaceExecutionOrderProviders.put(raceExecutionOrderProvider, raceExecutionOrderProvider); } } protected Set getPreviousRacesFromAttachedRaceExecutionOrderProviders() { final Set result; - if (attachedRaceExecutionOrderProvider != null) { - result = attachedRaceExecutionOrderProvider.values().stream().map(reop->reop.getPreviousRaceInExecutionOrder(this)).collect(HashSet::new, (r, e)->r.addAll(e), (r, e)->r.addAll(e)); + if (attachedRaceExecutionOrderProviders != null) { + result = attachedRaceExecutionOrderProviders.values().stream().map(reop->reop.getPreviousRacesInExecutionOrder(this)).collect(HashSet::new, (r, e)->r.addAll(e), (r, e)->r.addAll(e)); } else { result = Collections.emptySet(); } @@ -3072,7 +3090,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl @Override public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { if (raceExecutionOrderProvider != null) { - attachedRaceExecutionOrderProvider.remove(raceExecutionOrderProvider); + attachedRaceExecutionOrderProviders.remove(raceExecutionOrderProvider); } } diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index 9eca28dba48..4831e0d2231 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -784,4 +784,9 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } + + @Override + public boolean takesWindFix(Wind wind) { + return false; + } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java index 370826f1ecd..c4231e9c5bb 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java @@ -621,4 +621,9 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { @Override public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } + + @Override + public boolean takesWindFix(Wind wind) { + return false; + } } From 12b858626a4f88b3e6fa270df41d7176768bbb72 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Mon, 15 Jun 2015 11:25:32 +0200 Subject: [PATCH 42/85] added start and end time of race to trackedRace created in TrackedBasedTest#createTestTrackedRace() --- .../src/com/sap/sailing/domain/test/TrackBasedTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java index 84aa1415a54..0f8e8e18e64 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java @@ -122,7 +122,9 @@ public abstract class TrackBasedTest { OneDesignRankingMetric::new); // in this simplified artificial course, the top mark is exactly north of the right leeward gate DegreePosition topPosition = new DegreePosition(54.48, 10.24); - TimePoint afterTheRace = new MillisecondsTimePoint(timePointForFixes.asMillis() + 36000000); // 10h after the fix time + TimePoint afterTheRace = new MillisecondsTimePoint(timePointForFixes.asMillis() + 36000000); // 10h after the fix timed + trackedRace.setStartOfTrackingReceived(timePointForFixes); + trackedRace.setEndOfTrackingReceived(timePointForFixes); trackedRace.getOrCreateTrack(left).addGPSFix(new GPSFixImpl(new DegreePosition(54.4680424, 10.234451), new MillisecondsTimePoint(0))); trackedRace.getOrCreateTrack(right).addGPSFix(new GPSFixImpl(new DegreePosition(54.4680424, 10.24), new MillisecondsTimePoint(0))); trackedRace.getOrCreateTrack(windwardMark).addGPSFix(new GPSFixImpl(topPosition, new MillisecondsTimePoint(0))); From c2576fd985ae756cd309bb71699d8857b769593a Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Mon, 15 Jun 2015 14:13:52 +0200 Subject: [PATCH 43/85] fixed dashboard icon reference problem in dev mode --- java/com.sap.sailing.dashboards.gwt/RibDashboard.html | 3 ++- java/com.sap.sailing.dashboards.gwt/build.properties | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.dashboards.gwt/RibDashboard.html b/java/com.sap.sailing.dashboards.gwt/RibDashboard.html index f74c19632da..eb761aa4f82 100644 --- a/java/com.sap.sailing.dashboards.gwt/RibDashboard.html +++ b/java/com.sap.sailing.dashboards.gwt/RibDashboard.html @@ -10,7 +10,8 @@ - + + diff --git a/java/com.sap.sailing.dashboards.gwt/build.properties b/java/com.sap.sailing.dashboards.gwt/build.properties index bd2c38b4b7d..f5f5657c7a4 100644 --- a/java/com.sap.sailing.dashboards.gwt/build.properties +++ b/java/com.sap.sailing.dashboards.gwt/build.properties @@ -11,6 +11,7 @@ bin.includes = META-INF/,\ WEB-INF/web.xml,\ js/,\ WEB-INF/lib/gwt-ajaxloader.jar,\ - fonts/ + fonts/,\ + images/ output.. = WEB-INF/classes/ bin.excludes = WEB-INF/lib/ From 6d8b8f25ebf7ba3eebee805e870d6fdc2c49519a Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 16 Jun 2015 10:28:23 +0200 Subject: [PATCH 44/85] race now record wind if there is only startOfRace or startOfTracking set and no previous race records the wind --- .../tracking/impl/DynamicTrackedRaceImpl.java | 2 +- .../domain/tracking/impl/TrackedRaceImpl.java | 26 ++++++++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index 9716456e1ce..e1463636149 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -657,7 +657,7 @@ DynamicTrackedRace, GPSTrackListener { @Override public boolean recordWind(Wind wind, WindSource windSource) { final boolean result; - if(takesWindFix(wind)){ + if (takesWindFix(wind)) { result = getOrCreateWindTrack(windSource).add(wind); updated(/* time point */null); // wind events shouldn't advance race time triggerManeuverCacheRecalculationForAllCompetitors(); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 919c168049a..c8e6e7df195 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -1501,15 +1501,27 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl boolean result = false; TimePoint earliestStartTimePoint = Util.getEarliestOfTimePoints(getStartOfRace(), getStartOfTracking()); TimePoint latestEndTimePoint = Util.getLatestOfTimePoints(getStartOfRace(), getStartOfTracking()); - if (earliestStartTimePoint != null && latestEndTimePoint != null) { + if (earliestStartTimePoint != null) { TimePoint earliestStartTimePointMinusExtra = earliestStartTimePoint.minus(EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS); - TimePoint latestEndTimePointPlusExtra = latestEndTimePoint.plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS); - if (Util.isTimePointInRangeOfTimePointsAandB(wind.getTimePoint(), /* a */earliestStartTimePointMinusExtra, /* b */latestEndTimePointPlusExtra)) { - Set previousRacesInExecutionOrder = getPreviousRacesFromAttachedRaceExecutionOrderProviders(); - if(previousRacesInExecutionOrder == null || !previousRacesInExecutionOrder.stream().filter(tr->tr.takesWindFix(wind) == true).findAny().isPresent()){ - result = true; + if (latestEndTimePoint != null) { + TimePoint latestEndTimePointPlusExtra = latestEndTimePoint.plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS); + if (Util.isTimePointInRangeOfTimePointsAandB(wind.getTimePoint(), /* a */earliestStartTimePointMinusExtra, /* b */latestEndTimePointPlusExtra)) { + result = takesNoPreviousRaceWind(wind); } - } + } else if (latestEndTimePoint == null){ + if (wind.getTimePoint().after(earliestStartTimePointMinusExtra)){ + result = takesNoPreviousRaceWind(wind); + } + } + } + return result; + } + + private boolean takesNoPreviousRaceWind(Wind wind) { + boolean result = false; + Set previousRacesInExecutionOrder = getPreviousRacesFromAttachedRaceExecutionOrderProviders(); + if (previousRacesInExecutionOrder == null || !previousRacesInExecutionOrder.stream().filter(tr -> tr.takesWindFix(wind) == true).findAny().isPresent()) { + result = true; } return result; } From 65c896a85bdc6e2df330021a684e45b2ba6004d6 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 16 Jun 2015 15:20:20 +0200 Subject: [PATCH 45/85] added javadoc to Util.isTimePointInRangeOfTimePointsAandB() --- ...ecutionOrderProvdiderAttachDetachTest.java | 105 ++++++++++++++++++ .../src/com/sap/sse/common/Util.java | 14 ++- 2 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java new file mode 100644 index 00000000000..e61b6858006 --- /dev/null +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java @@ -0,0 +1,105 @@ +package com.sap.sailing.domain.test; + +import static org.mockito.Mockito.mock; + +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import org.junit.Before; +import org.junit.Test; + +import com.sap.sailing.domain.base.BoatClass; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.base.RaceColumnInSeries; +import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.base.Series; +import com.sap.sailing.domain.base.impl.AbstractRaceExecutionOrderProvider; +import com.sap.sailing.domain.base.impl.BoatClassImpl; +import com.sap.sailing.domain.base.impl.FleetImpl; +import com.sap.sailing.domain.base.impl.RegattaImpl; +import com.sap.sailing.domain.base.impl.SeriesImpl; +import com.sap.sailing.domain.leaderboard.ScoringScheme; +import com.sap.sailing.domain.leaderboard.impl.LowPoint; +import com.sap.sailing.domain.ranking.OneDesignRankingMetric; +import com.sap.sailing.domain.tracking.DynamicTrackedRace; +import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; +import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; +import com.sap.sse.common.TimePoint; +import com.sap.sse.common.impl.MillisecondsTimePoint; + +/** + * @author Alexander Ries (D062114) + * + */ +public class RaceExecutionOrderProvdiderAttachDetachTest extends TrackBasedTest { + + RaceColumn raceColumn; + Series series; + Fleet fleet; + RaceColumnInSeries raceColumnInSeries; + Regatta regatta; + DynamicTrackedRace dynamicTackedRace; + RaceExecutionOrderProvider raceExecutionOrderProvider; + + @Before + public void setUp() { + final List emptyCompetitorList = Collections.emptyList(); + TimePoint now = MillisecondsTimePoint.now(); + dynamicTackedRace = createTestTrackedRace("TestRegatta", "TestRace", "TestBoatClass", emptyCompetitorList, now); + raceExecutionOrderProvider = new AbstractRaceExecutionOrderProvider() { + + private static final long serialVersionUID = 1L; + + @Override + protected Map> getRaceColumnsOfSeries() { + return null; + } + }; + TrackedRegattaRegistry trackedRegattaRegistry = mock(TrackedRegattaRegistry.class); + fleet = new FleetImpl("TestFleet"); + Series series = createSeries(trackedRegattaRegistry, fleet); + Set seriesSet = new HashSet<>(); + seriesSet.add(series); + BoatClass boatClass = new BoatClassImpl("TestClass", true); + String raceColumnName = "TestRace"; + raceColumnInSeries = series.addRaceColumn(raceColumnName, trackedRegattaRegistry); + ScoringScheme scoringScheme = new LowPoint(); + regatta = new RegattaImpl(RegattaImpl.getDefaultName("TestRegatta", boatClass.getName()), boatClass, + /* startDate */null, /* endDate */null, seriesSet, false, scoringScheme, UUID.randomUUID(), + mock(CourseArea.class), OneDesignRankingMetric::new); + } + +// @Test +// public void testRaceExecutionOrderProviderAttachWhenSettingTrackedRaceToRaceCollumn() { +// +// } +// +// @Test +// public void testRaceExecutionOrderProviderDetachWhenReleasingTrackedRaceFromRaceCollumn() { +// +// } + + @Test + public void testRaceExecutionOrderProviderAttachWhenSettingTrackedRaceToRaceCollumnInSeries() { + raceColumnInSeries.setTrackedRace(fleet, dynamicTackedRace); + } + + @Test + public void testRaceExecutionOrderProviderDetachWhenReleasingTrackedRaceFromRaceCollumnInSeries() { + raceColumnInSeries.releaseTrackedRace(fleet); + } + + private Series createSeries(TrackedRegattaRegistry trackedRegattaRegistry, Fleet fleet) { + Set fleets = new HashSet<>(); + fleets.add(fleet); + Series series = new SeriesImpl("TestSeries", false, fleets, new HashSet(), trackedRegattaRegistry); + return series; + } +} diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/Util.java b/java/com.sap.sse.common/src/com/sap/sse/common/Util.java index 9121dfc30e2..3c1d8d300fc 100755 --- a/java/com.sap.sse.common/src/com/sap/sse/common/Util.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/Util.java @@ -367,8 +367,8 @@ public class Util { * Returns the earlier {@link TimePoint} of a and b. If one of them is null and the other * !null, the TimePoint that is not !null gets returned. If both are null, * null is the result. - * */ - public static TimePoint getEarliestOfTimePoints(TimePoint a, TimePoint b){ + */ + public static TimePoint getEarliestOfTimePoints(TimePoint a, TimePoint b) { TimePoint result = null; if (a != null && b != null) { result = a.before(b) ? a : b; @@ -382,7 +382,7 @@ public class Util { * Returns the latest {@link TimePoint} of a and b. If one of them is null and the other * !null, the TimePoint that is not !null gets returned. If both are null, * null is the result. - * */ + */ public static TimePoint getLatestOfTimePoints(TimePoint a, TimePoint b) { TimePoint result = null; if (a != null && b != null) { @@ -393,9 +393,13 @@ public class Util { return result; } - public static boolean isTimePointInRangeOfTimePointsAandB(TimePoint timePoint, TimePoint a, TimePoint b){ + /** + * Returns true if timePoint is after a an before b. + * If one of the parameters is null the method returns false. + */ + public static boolean isTimePointInRangeOfTimePointsAandB(TimePoint timePoint, TimePoint a, TimePoint b) { boolean result = false; - if(timePoint != null && a != null && b != null){ + if (timePoint != null && a != null && b != null) { result = timePoint.after(a) && timePoint.before(b); } return result; From 522952a9d087d19d4a943c70946559159e4ab941 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 16 Jun 2015 15:24:52 +0200 Subject: [PATCH 46/85] endOfTracking does not get set anymore at TrackedRace creation in TrackedBasedTest --- .../src/com/sap/sailing/domain/test/TrackBasedTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java index 0f8e8e18e64..ac5a08d55fc 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java @@ -124,7 +124,6 @@ public abstract class TrackBasedTest { DegreePosition topPosition = new DegreePosition(54.48, 10.24); TimePoint afterTheRace = new MillisecondsTimePoint(timePointForFixes.asMillis() + 36000000); // 10h after the fix timed trackedRace.setStartOfTrackingReceived(timePointForFixes); - trackedRace.setEndOfTrackingReceived(timePointForFixes); trackedRace.getOrCreateTrack(left).addGPSFix(new GPSFixImpl(new DegreePosition(54.4680424, 10.234451), new MillisecondsTimePoint(0))); trackedRace.getOrCreateTrack(right).addGPSFix(new GPSFixImpl(new DegreePosition(54.4680424, 10.24), new MillisecondsTimePoint(0))); trackedRace.getOrCreateTrack(windwardMark).addGPSFix(new GPSFixImpl(topPosition, new MillisecondsTimePoint(0))); From a110ff1102f524c758f2704c1d3c7d7031b38423 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 16 Jun 2015 15:51:18 +0200 Subject: [PATCH 47/85] added getRaceExecutionOrderProvider() to TrackedRace --- .../RaceExecutionOrderProvdiderAttachDetachTest.java | 10 ++++++---- .../sailing/domain/test/mock/MockedTrackedRace.java | 6 ++++++ .../mock/MockedTrackedRaceWithStartTimeAndRanks.java | 6 ++++++ .../com/sap/sailing/domain/tracking/TrackedRace.java | 6 ++++++ .../sailing/domain/tracking/impl/TrackedRaceImpl.java | 6 ++++++ .../domain/tracking/impl/TrackedRegattaImpl.java | 2 ++ .../com/sap/sailing/gwt/ui/test/MockedTrackedRace.java | 6 ++++++ .../sailing/server/masterdata/DummyTrackedRace.java | 5 +++++ 8 files changed, 43 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java index e61b6858006..ccd59697d42 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java @@ -25,6 +25,7 @@ import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; +import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; @@ -40,11 +41,12 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; */ public class RaceExecutionOrderProvdiderAttachDetachTest extends TrackBasedTest { - RaceColumn raceColumn; - Series series; - Fleet fleet; - RaceColumnInSeries raceColumnInSeries; Regatta regatta; + Series series; + RaceColumnInSeries raceColumnInSeries; + RaceColumn raceColumn; + Fleet fleet; + FlexibleLeaderboard flexibleLeaderboard; DynamicTrackedRace dynamicTackedRace; RaceExecutionOrderProvider raceExecutionOrderProvider; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index f97aef67781..bdfedd0aa74 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -984,4 +984,10 @@ public class MockedTrackedRace implements DynamicTrackedRace { public boolean takesWindFix(Wind wind) { return false; } + + @Override + public RaceExecutionOrderProvider getRaceExecutionOrderProvider( + RaceExecutionOrderProvider raceExecutionOrderProvider) { + return null; + } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index 21b080e433b..3677098d204 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -651,4 +651,10 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { public boolean takesWindFix(Wind wind) { return false; } + + @Override + public RaceExecutionOrderProvider getRaceExecutionOrderProvider( + RaceExecutionOrderProvider raceExecutionOrderProvider) { + return null; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 0c307b2cfb6..81349d93898 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -691,6 +691,12 @@ public interface TrackedRace extends Serializable { */ RaceLog getRaceLog(Serializable identifier); + /** + * Returns the attached raceExecutionOrderProvider. + * Otherwise null. + */ + RaceExecutionOrderProvider getRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider); + /** * A setter for the listener on course design changes suggested by one of the {@link RaceLog}s attached to this * race. The listener is mostly part of the tracking provider adapter. diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index c8e6e7df195..82863cd93f8 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -3133,6 +3133,12 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl return attachedRaceLogs.get(identifier); } + + @Override + public RaceExecutionOrderProvider getRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { + return attachedRaceExecutionOrderProviders.get(raceExecutionOrderProvider); + } + @Override public Distance getDistanceToStartLine(Competitor competitor, long millisecondsBeforeRaceStart) { final Distance result; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java index 442ca68ede2..3a601cd8ad7 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java @@ -29,6 +29,7 @@ import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; +import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.concurrent.LockUtil; import com.sap.sse.concurrent.NamedReentrantReadWriteLock; @@ -255,6 +256,7 @@ public class TrackedRegattaImpl implements TrackedRegatta { if (raceDefinitionSetToUpdate != null) { raceDefinitionSetToUpdate.addRaceDefinition(raceDefinition, result); } + result.setStartOfTrackingReceived(MillisecondsTimePoint.now()); addTrackedRace(result); return result; } diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index 4831e0d2231..a82adf4342f 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -789,4 +789,10 @@ public class MockedTrackedRace implements DynamicTrackedRace { public boolean takesWindFix(Wind wind) { return false; } + + @Override + public RaceExecutionOrderProvider getRaceExecutionOrderProvider( + RaceExecutionOrderProvider raceExecutionOrderProvider) { + return null; + } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java index c4231e9c5bb..420365af1a7 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java @@ -626,4 +626,9 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { public boolean takesWindFix(Wind wind) { return false; } + + @Override + public RaceExecutionOrderProvider getRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { + return null; + } } From 21b67b077e92fef4ba924e79324e424ebce9bd26 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 16 Jun 2015 16:37:43 +0200 Subject: [PATCH 48/85] RaceExecutionOrderProvder get removed from race if racecolumn get removed from flexibleleaderboardImpl --- .../sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java index 3008b1f570c..a786f924e26 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java @@ -172,6 +172,7 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements if (raceColumn != null) { for (Fleet fleet : raceColumn.getFleets()) { raceLogStore.removeRaceLog(raceColumn.getRaceLogIdentifier(fleet)); + raceColumn.getTrackedRace(fleet).detachRaceExecutionOrderProvider(raceExecutionOrderProvider); } races.remove(raceColumn); getRaceColumnListeners().notifyListenersAboutRaceColumnRemovedFromContainer(raceColumn); From d01cc74c755c8ea5c5343a81a2c02f1298ac7813 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 16 Jun 2015 17:42:08 +0200 Subject: [PATCH 49/85] removed getRaceExecutionOrderProvider() from TrackedRace interface --- .../com/sap/sailing/domain/test/mock/MockedTrackedRace.java | 5 ----- .../test/mock/MockedTrackedRaceWithStartTimeAndRanks.java | 5 ----- .../src/com/sap/sailing/domain/tracking/TrackedRace.java | 6 ------ .../sap/sailing/domain/tracking/impl/TrackedRaceImpl.java | 6 ------ .../src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java | 5 ----- .../com/sap/sailing/server/masterdata/DummyTrackedRace.java | 4 ---- 6 files changed, 31 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index bdfedd0aa74..ed170472da5 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -985,9 +985,4 @@ public class MockedTrackedRace implements DynamicTrackedRace { return false; } - @Override - public RaceExecutionOrderProvider getRaceExecutionOrderProvider( - RaceExecutionOrderProvider raceExecutionOrderProvider) { - return null; - } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index 3677098d204..a19b6edf030 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -652,9 +652,4 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { return false; } - @Override - public RaceExecutionOrderProvider getRaceExecutionOrderProvider( - RaceExecutionOrderProvider raceExecutionOrderProvider) { - return null; - } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 81349d93898..0c307b2cfb6 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -691,12 +691,6 @@ public interface TrackedRace extends Serializable { */ RaceLog getRaceLog(Serializable identifier); - /** - * Returns the attached raceExecutionOrderProvider. - * Otherwise null. - */ - RaceExecutionOrderProvider getRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider); - /** * A setter for the listener on course design changes suggested by one of the {@link RaceLog}s attached to this * race. The listener is mostly part of the tracking provider adapter. diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 82863cd93f8..c8e6e7df195 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -3133,12 +3133,6 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl return attachedRaceLogs.get(identifier); } - - @Override - public RaceExecutionOrderProvider getRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { - return attachedRaceExecutionOrderProviders.get(raceExecutionOrderProvider); - } - @Override public Distance getDistanceToStartLine(Competitor competitor, long millisecondsBeforeRaceStart) { final Distance result; diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index a82adf4342f..6e49820cad8 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -790,9 +790,4 @@ public class MockedTrackedRace implements DynamicTrackedRace { return false; } - @Override - public RaceExecutionOrderProvider getRaceExecutionOrderProvider( - RaceExecutionOrderProvider raceExecutionOrderProvider) { - return null; - } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java index 420365af1a7..12e2acc3d02 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java @@ -627,8 +627,4 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { return false; } - @Override - public RaceExecutionOrderProvider getRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { - return null; - } } From 50e1dfd5baaf9c708ea1ddea1db5b3c5c27ad0a2 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 16 Jun 2015 17:51:38 +0200 Subject: [PATCH 50/85] added hasRaceExecutionOrdersAttached() to TrackedRaceImpl --- ...ecutionOrderProvdiderAttachDetachTest.java | 113 +++++++++++------- .../domain/tracking/impl/TrackedRaceImpl.java | 4 + 2 files changed, 74 insertions(+), 43 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java index ccd59697d42..29e3b5ff96a 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java @@ -1,6 +1,6 @@ package com.sap.sailing.domain.test; -import static org.mockito.Mockito.mock; +import static org.junit.Assert.*; import java.util.Collections; import java.util.HashSet; @@ -14,7 +14,6 @@ import org.junit.Test; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnInSeries; @@ -26,12 +25,15 @@ import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; +import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn; import com.sap.sailing.domain.leaderboard.ScoringScheme; +import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LowPoint; +import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; -import com.sap.sailing.domain.tracking.DynamicTrackedRace; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; +import com.sap.sailing.domain.tracking.impl.TrackedRaceImpl; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -40,62 +42,87 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; * */ public class RaceExecutionOrderProvdiderAttachDetachTest extends TrackBasedTest { + + RaceExecutionOrderProvider raceExecutionOrderProvider; + FlexibleLeaderboard flexibleLeaderboard; + RaceColumnInSeries raceColumnInSeries; + FlexibleRaceColumn raceColumnFlexibleLeaderboard; + Fleet fleet; + + TrackedRaceImpl trackedRace; Regatta regatta; Series series; - RaceColumnInSeries raceColumnInSeries; - RaceColumn raceColumn; - Fleet fleet; - FlexibleLeaderboard flexibleLeaderboard; - DynamicTrackedRace dynamicTackedRace; - RaceExecutionOrderProvider raceExecutionOrderProvider; + private final String REGATTA = "TestRegatta"; + private final String RACE = "TestRace"; + private final String FLEET = "TestFleet"; + private final String BOATCLASS = "49er"; + private final String RACECOLUMN_SERIES = "SeriesRaceColumn"; + private final String RACECOLUMN_FLEXIBLELEADERBOARD = "FlexibleLeadrboarRaceColumn"; @Before public void setUp() { - final List emptyCompetitorList = Collections.emptyList(); - TimePoint now = MillisecondsTimePoint.now(); - dynamicTackedRace = createTestTrackedRace("TestRegatta", "TestRace", "TestBoatClass", emptyCompetitorList, now); - raceExecutionOrderProvider = new AbstractRaceExecutionOrderProvider() { - - private static final long serialVersionUID = 1L; - - @Override - protected Map> getRaceColumnsOfSeries() { - return null; - } - }; - TrackedRegattaRegistry trackedRegattaRegistry = mock(TrackedRegattaRegistry.class); - fleet = new FleetImpl("TestFleet"); - Series series = createSeries(trackedRegattaRegistry, fleet); - Set seriesSet = new HashSet<>(); - seriesSet.add(series); - BoatClass boatClass = new BoatClassImpl("TestClass", true); - String raceColumnName = "TestRace"; - raceColumnInSeries = series.addRaceColumn(raceColumnName, trackedRegattaRegistry); - ScoringScheme scoringScheme = new LowPoint(); - regatta = new RegattaImpl(RegattaImpl.getDefaultName("TestRegatta", boatClass.getName()), boatClass, - /* startDate */null, /* endDate */null, seriesSet, false, scoringScheme, UUID.randomUUID(), - mock(CourseArea.class), OneDesignRankingMetric::new); + setUpForAllTestCases(); + setUpForFlexibleLeaderboardRaceColumnsTests(); + setUpRaceColumnInSeriesTest(); } -// @Test -// public void testRaceExecutionOrderProviderAttachWhenSettingTrackedRaceToRaceCollumn() { -// -// } -// -// @Test -// public void testRaceExecutionOrderProviderDetachWhenReleasingTrackedRaceFromRaceCollumn() { -// -// } + @Test + public void testRaceExecutionOrderProviderAttachWhenSettingTrackedRaceToRaceCollumn() { + flexibleLeaderboard.addRace(trackedRace, RACECOLUMN_FLEXIBLELEADERBOARD, false); + System.out.println(""+trackedRace.hasRaceExecutionOrderProvidersAttached()); + assertTrue(trackedRace.hasRaceExecutionOrderProvidersAttached()); + } + + @Test + public void testRaceExecutionOrderProviderDetachWhenReleasingTrackedRaceFromRaceCollumn() { + flexibleLeaderboard.removeRaceColumn(RACECOLUMN_FLEXIBLELEADERBOARD); + assertFalse(trackedRace.hasRaceExecutionOrderProvidersAttached()); + } @Test public void testRaceExecutionOrderProviderAttachWhenSettingTrackedRaceToRaceCollumnInSeries() { - raceColumnInSeries.setTrackedRace(fleet, dynamicTackedRace); + raceColumnInSeries.setTrackedRace(fleet, trackedRace); + assertTrue(trackedRace.hasRaceExecutionOrderProvidersAttached()); } @Test public void testRaceExecutionOrderProviderDetachWhenReleasingTrackedRaceFromRaceCollumnInSeries() { raceColumnInSeries.releaseTrackedRace(fleet); + assertFalse(trackedRace.hasRaceExecutionOrderProvidersAttached()); + } + + private void setUpForAllTestCases(){ + final List emptyCompetitorList = Collections.emptyList(); + TimePoint now = MillisecondsTimePoint.now(); + trackedRace = createTestTrackedRace(REGATTA, RACE, BOATCLASS, emptyCompetitorList, now); + raceExecutionOrderProvider = new AbstractRaceExecutionOrderProvider() { + private static final long serialVersionUID = 1L; + + @Override + protected Map> getRaceColumnsOfSeries() { + return Collections.>emptyMap(); + } + }; + } + + private void setUpForFlexibleLeaderboardRaceColumnsTests(){ + flexibleLeaderboard = new FlexibleLeaderboardImpl("Kiel Week 2011 505s", new ThresholdBasedResultDiscardingRuleImpl(new int[] { 3, 6 }), + new LowPoint(), null); + } + + private void setUpRaceColumnInSeriesTest(){ + fleet = new FleetImpl(FLEET); + series = createSeries(null, fleet); + Set seriesSet = new HashSet<>(); + seriesSet.add(series); + BoatClass boatClass = new BoatClassImpl(BOATCLASS, true); + String raceColumnName = RACECOLUMN_SERIES; + raceColumnInSeries = series.addRaceColumn(raceColumnName, null); + ScoringScheme scoringScheme = new LowPoint(); + regatta = new RegattaImpl(RegattaImpl.getDefaultName(REGATTA, boatClass.getName()), boatClass, + /* startDate */null, /* endDate */null, seriesSet, false, scoringScheme, UUID.randomUUID(), + null, OneDesignRankingMetric::new); } private Series createSeries(TrackedRegattaRegistry trackedRegattaRegistry, Fleet fleet) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index c8e6e7df195..87ca228124a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -3105,6 +3105,10 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl attachedRaceExecutionOrderProviders.remove(raceExecutionOrderProvider); } } + + public boolean hasRaceExecutionOrderProvidersAttached(){ + return !attachedRaceExecutionOrderProviders.isEmpty(); + } private ReadonlyRaceState getRaceState(RaceLog raceLog) { ReadonlyRaceState result; From 0100abaa73877daf6cd188371c8d2dcc49eb4aa5 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 16 Jun 2015 21:53:18 +0200 Subject: [PATCH 51/85] added javadoc to RaceExecutionOrderProvdiderAttachDetachTest and made the code more clean --- ...ecutionOrderProvdiderAttachDetachTest.java | 121 +++++++----------- 1 file changed, 48 insertions(+), 73 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java index 29e3b5ff96a..abe1d3253fa 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java @@ -1,15 +1,13 @@ package com.sap.sailing.domain.test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import java.util.Collections; import java.util.HashSet; -import java.util.List; -import java.util.Map; import java.util.Set; import java.util.UUID; -import org.junit.Before; import org.junit.Test; import com.sap.sailing.domain.base.BoatClass; @@ -19,116 +17,93 @@ import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.RaceColumnInSeries; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Series; -import com.sap.sailing.domain.base.impl.AbstractRaceExecutionOrderProvider; import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; -import com.sap.sailing.domain.leaderboard.FlexibleRaceColumn; import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; -import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.impl.TrackedRaceImpl; -import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; /** + * Covers the linking and unlinking between {@link RaceColumn}s and {@link TrackedRaces}s + * and tests whether {@link RaceExecutionOrderProvider}s get correctly attached and detached. Also tests + * late attaching and detaching of {@link RaceExecutionOrderProvider}s in case the {@link RaceExecutionOrderProvider} + * was null when {@link RaceColumn} was linked to {@link TrackedRace}. + * * @author Alexander Ries (D062114) * */ public class RaceExecutionOrderProvdiderAttachDetachTest extends TrackBasedTest { - - RaceExecutionOrderProvider raceExecutionOrderProvider; - FlexibleLeaderboard flexibleLeaderboard; + private FlexibleLeaderboard flexibleLeaderboard; + private RaceColumnInSeries raceColumnInSeries; + private Fleet fleet; + private TrackedRaceImpl trackedRace; + private Regatta regatta; + private Series series; - RaceColumnInSeries raceColumnInSeries; - FlexibleRaceColumn raceColumnFlexibleLeaderboard; - Fleet fleet; - - TrackedRaceImpl trackedRace; - Regatta regatta; - Series series; private final String REGATTA = "TestRegatta"; private final String RACE = "TestRace"; private final String FLEET = "TestFleet"; - private final String BOATCLASS = "49er"; - private final String RACECOLUMN_SERIES = "SeriesRaceColumn"; - private final String RACECOLUMN_FLEXIBLELEADERBOARD = "FlexibleLeadrboarRaceColumn"; - - @Before - public void setUp() { - setUpForAllTestCases(); - setUpForFlexibleLeaderboardRaceColumnsTests(); - setUpRaceColumnInSeriesTest(); - } + private final String BOATCLASS = "TestClass"; + private final String SERIES = "TestSeries"; + private final String FLEXIBLELEADERBOARD = "TestFlexibleLeaderboard"; + private final String RACECOLUMN_SERIES = "TestSeriesRaceColumn"; + private final String RACECOLUMN_FLEXIBLELEADERBOARD = "TestFlexibleLeadrboarRaceColumn"; @Test - public void testRaceExecutionOrderProviderAttachWhenSettingTrackedRaceToRaceCollumn() { + public void testRaceExecutionOrderProviderAttachDetachWithRaceCollumn() { + trackedRace = createTestTrackedRace(REGATTA, RACE, BOATCLASS, Collections. emptyList(), + MillisecondsTimePoint.now()); + flexibleLeaderboard = new FlexibleLeaderboardImpl(FLEXIBLELEADERBOARD, + new ThresholdBasedResultDiscardingRuleImpl(new int[] { 3, 6 }), new LowPoint(), null); flexibleLeaderboard.addRace(trackedRace, RACECOLUMN_FLEXIBLELEADERBOARD, false); - System.out.println(""+trackedRace.hasRaceExecutionOrderProvidersAttached()); assertTrue(trackedRace.hasRaceExecutionOrderProvidersAttached()); - } - - @Test - public void testRaceExecutionOrderProviderDetachWhenReleasingTrackedRaceFromRaceCollumn() { flexibleLeaderboard.removeRaceColumn(RACECOLUMN_FLEXIBLELEADERBOARD); assertFalse(trackedRace.hasRaceExecutionOrderProvidersAttached()); } @Test - public void testRaceExecutionOrderProviderAttachWhenSettingTrackedRaceToRaceCollumnInSeries() { + public void testRaceExecutionOrderProviderAttachDetachWithRaceCollumnInSeries() { + createTestSetupWithRegattaAndSeries(/* linkSeriesToRegatta */true); raceColumnInSeries.setTrackedRace(fleet, trackedRace); assertTrue(trackedRace.hasRaceExecutionOrderProvidersAttached()); - } - - @Test - public void testRaceExecutionOrderProviderDetachWhenReleasingTrackedRaceFromRaceCollumnInSeries() { raceColumnInSeries.releaseTrackedRace(fleet); assertFalse(trackedRace.hasRaceExecutionOrderProvidersAttached()); } - - private void setUpForAllTestCases(){ - final List emptyCompetitorList = Collections.emptyList(); - TimePoint now = MillisecondsTimePoint.now(); - trackedRace = createTestTrackedRace(REGATTA, RACE, BOATCLASS, emptyCompetitorList, now); - raceExecutionOrderProvider = new AbstractRaceExecutionOrderProvider() { - private static final long serialVersionUID = 1L; - @Override - protected Map> getRaceColumnsOfSeries() { - return Collections.>emptyMap(); - } - }; - } - - private void setUpForFlexibleLeaderboardRaceColumnsTests(){ - flexibleLeaderboard = new FlexibleLeaderboardImpl("Kiel Week 2011 505s", new ThresholdBasedResultDiscardingRuleImpl(new int[] { 3, 6 }), - new LowPoint(), null); - } - - private void setUpRaceColumnInSeriesTest(){ - fleet = new FleetImpl(FLEET); - series = createSeries(null, fleet); - Set seriesSet = new HashSet<>(); - seriesSet.add(series); - BoatClass boatClass = new BoatClassImpl(BOATCLASS, true); - String raceColumnName = RACECOLUMN_SERIES; - raceColumnInSeries = series.addRaceColumn(raceColumnName, null); - ScoringScheme scoringScheme = new LowPoint(); - regatta = new RegattaImpl(RegattaImpl.getDefaultName(REGATTA, boatClass.getName()), boatClass, - /* startDate */null, /* endDate */null, seriesSet, false, scoringScheme, UUID.randomUUID(), - null, OneDesignRankingMetric::new); + @Test + public void testRaceExecutionOrderProviderAttachDetachWhenSeriesRegattaIsSetAndRemovedAfterTrackedRaceHaveBeenSetToRaceColumns() { + createTestSetupWithRegattaAndSeries(/* linkSeriesToRegatta */false); + raceColumnInSeries.setTrackedRace(fleet, trackedRace); + assertFalse(trackedRace.hasRaceExecutionOrderProvidersAttached()); + series.setRegatta(regatta); + assertTrue(trackedRace.hasRaceExecutionOrderProvidersAttached()); + series.setRegatta(null); + assertFalse(trackedRace.hasRaceExecutionOrderProvidersAttached()); } - private Series createSeries(TrackedRegattaRegistry trackedRegattaRegistry, Fleet fleet) { + private void createTestSetupWithRegattaAndSeries(boolean linkSeriesToRegatta) { + trackedRace = createTestTrackedRace(null, null, null, Collections. emptyList(), + MillisecondsTimePoint.now()); + fleet = new FleetImpl(FLEET); Set fleets = new HashSet<>(); fleets.add(fleet); - Series series = new SeriesImpl("TestSeries", false, fleets, new HashSet(), trackedRegattaRegistry); - return series; + series = new SeriesImpl(SERIES, false, fleets, new HashSet(), null); + Set seriesSet = new HashSet<>(); + if (linkSeriesToRegatta) + seriesSet.add(series); + BoatClass boatClass = new BoatClassImpl(BOATCLASS, true); + raceColumnInSeries = series.addRaceColumn(RACECOLUMN_SERIES, null); + ScoringScheme scoringScheme = new LowPoint(); + regatta = new RegattaImpl(RegattaImpl.getDefaultName(REGATTA, boatClass.getName()), boatClass, + /* startDate */null, /* endDate */null, seriesSet, false, scoringScheme, UUID.randomUUID(), null, + OneDesignRankingMetric::new); } } From 719179fbcfde59681b87eae17464a83edaced127 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Tue, 16 Jun 2015 22:45:13 +0200 Subject: [PATCH 52/85] formatted parts of EventLogo --- .../sap/sailing/dashboards/gwt/client/eventlogo/EventLogo.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/eventlogo/EventLogo.java b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/eventlogo/EventLogo.java index 5eb4044e2d3..b797aeb3568 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/eventlogo/EventLogo.java +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/eventlogo/EventLogo.java @@ -35,7 +35,6 @@ public class EventLogo extends Image { Window.setTitle(event.getName() + " Dashboard"); } } - } @Override From be21942b1587476af468080a249b78c64915b463 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Wed, 17 Jun 2015 09:06:17 +0200 Subject: [PATCH 53/85] hand over strings an no null values as trackedBasedTest createTestTrackedRace in RaceExecutionOrderTests --- .../test/RaceExecutionOrderProvdiderAttachDetachTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java index abe1d3253fa..3a532666c67 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java @@ -90,7 +90,7 @@ public class RaceExecutionOrderProvdiderAttachDetachTest extends TrackBasedTest } private void createTestSetupWithRegattaAndSeries(boolean linkSeriesToRegatta) { - trackedRace = createTestTrackedRace(null, null, null, Collections. emptyList(), + trackedRace = createTestTrackedRace(REGATTA, RACE, BOATCLASS, Collections. emptyList(), MillisecondsTimePoint.now()); fleet = new FleetImpl(FLEET); Set fleets = new HashSet<>(); From a1ebe9d79c614942cd4e1f746404018268d2bc53 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Wed, 17 Jun 2015 10:42:11 +0200 Subject: [PATCH 54/85] changed size of LiveAveragePanel unit field --- .../gwt/client/startlineadvantage/LiveAverageComponent.ui.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.ui.xml b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.ui.xml index fa77bcce139..49cb75c6be2 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.ui.xml +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/LiveAverageComponent.ui.xml @@ -13,7 +13,7 @@
- +
@@ -24,7 +24,7 @@
- +
From a0000140f68135dad23f1f1ea38370b91b7a6050 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Wed, 17 Jun 2015 10:45:27 +0200 Subject: [PATCH 55/85] changed text of startline advantage widget --- .../startlineadvantage/StartLineAdvantageComponent.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/StartLineAdvantageComponent.java b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/StartLineAdvantageComponent.java index 03ebbcb4ae7..df70c920c0a 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/StartLineAdvantageComponent.java +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startlineadvantage/StartLineAdvantageComponent.java @@ -22,14 +22,12 @@ public class StartLineAdvantageComponent extends LiveAverageComponent implements private StartLineAdvantageComponentState startLineAdvantageComponentState; private StartLineAdvantageComponentStateShowsAdvantageByWind startLineAdvantageComponentStateShowsAdvantageByWind; private StartLineAdvantageComponentStateShowsAdvantageByGeometry startLineAdvantageComponentStateShowsAdvantageByGeometry; - private StringMessages stringConstants; + private static StringMessages stringConstants = StringMessages.INSTANCE; public StartLineAdvantageComponent(RibDashboardDataRetriever ribDashboardDataRetriever) { - super(); - stringConstants = StringMessages.INSTANCE; + super(stringConstants.dashboardStartlineAdvantageByWind(), "m"); initAndSetStartLineAdvantageStates(); StartLineAdvantageComponentRessources.INSTANCE.css().ensureInjected(); - this.header.setInnerText(stringConstants.dashboardStartlineAdvantageByWind()); this.header.addClassName(StartLineAdvantageComponentRessources.INSTANCE.css() .startLineAdvantageComponent_header()); liveAveragePanel.getElement().addClassName( From 2d7fbc72d69641f439d34c9c7f63e63cb0c2a45b Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Wed, 17 Jun 2015 11:12:36 +0200 Subject: [PATCH 56/85] added trackedrace null check in Flexibleleaderboard remove racecolumn before detaching raceexecutionprovderfrom tracked race --- .../domain/leaderboard/impl/FlexibleLeaderboardImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java index a786f924e26..ff6ee36db55 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java @@ -172,7 +172,9 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements if (raceColumn != null) { for (Fleet fleet : raceColumn.getFleets()) { raceLogStore.removeRaceLog(raceColumn.getRaceLogIdentifier(fleet)); + if (raceColumn.getTrackedRace(fleet) != null) { raceColumn.getTrackedRace(fleet).detachRaceExecutionOrderProvider(raceExecutionOrderProvider); + } } races.remove(raceColumn); getRaceColumnListeners().notifyListenersAboutRaceColumnRemovedFromContainer(raceColumn); From 0f9d156fd6d9a3300a898bdc10013000a9fd7704 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Wed, 17 Jun 2015 18:09:46 +0200 Subject: [PATCH 57/85] removed line that sets startOfTrackingReceived at the creation of trackedRace in TrackedRegattaImpl --- .../com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java index 3a601cd8ad7..89cd40e6d68 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java @@ -256,7 +256,6 @@ public class TrackedRegattaImpl implements TrackedRegatta { if (raceDefinitionSetToUpdate != null) { raceDefinitionSetToUpdate.addRaceDefinition(raceDefinition, result); } - result.setStartOfTrackingReceived(MillisecondsTimePoint.now()); addTrackedRace(result); return result; } From f025294bc9e980698e56f9b0c1f63cf7615b271f Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Wed, 17 Jun 2015 18:31:26 +0200 Subject: [PATCH 58/85] fixed WindByRaceLogTest by adding setting startOfTracking of local test trackedRace to now --- .../src/com/sap/sailing/server/test/WindByRaceLogTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java index eafaf3b1e0a..e9f8e91e88c 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java @@ -101,6 +101,7 @@ public class WindByRaceLogTest { service.apply(new TrackRegatta(raceIdentifier)); trackedRace = (DynamicTrackedRace) service.apply(new CreateTrackedRace(raceIdentifier, EmptyWindStore.INSTANCE, EmptyGPSFixStore.INSTANCE,/* delayToLiveInMillis */ 5000, /* millisecondsOverWhichToAverageWind */ 10000, /* millisecondsOverWhichToAverageSpeed */10000)); + trackedRace.setStartOfTrackingReceived(MillisecondsTimePoint.now()); defaultFleet = Util.get(raceColumn.getFleets(), 0); } From 674443c2ed7a9a789e274a2027c4b0e08eb3bc2e Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Thu, 18 Jun 2015 08:38:37 +0200 Subject: [PATCH 59/85] set startOfTracking to now on local created trackedrace in InitialLoadReplicationObjectIdentityTest --- .../test/InitialLoadReplicationObjectIdentityTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/InitialLoadReplicationObjectIdentityTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/InitialLoadReplicationObjectIdentityTest.java index 48a8ddd7da4..0aff92a2f88 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/InitialLoadReplicationObjectIdentityTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/InitialLoadReplicationObjectIdentityTest.java @@ -135,7 +135,7 @@ public class InitialLoadReplicationObjectIdentityTest extends AbstractServerRepl DynamicTrackedRace masterTrackedRace = master.createTrackedRace(new RegattaNameAndRaceName(masterRegatta.getName(), masterRace.getName()), master.getWindStore(), master.getGPSFixStore(), /* delayToLiveInMillis */ 3000, /* millisecondsOverWhichToAverageWind */ 15000, /* millisecondsOverWhichToAverageSpeed */ 10000, /*ignoreTracTracMarkPassings*/ false); - + masterTrackedRace.setStartOfTrackingReceived(MillisecondsTimePoint.now()); /* Leaderboard */ final String leaderboardName = "Great Leaderboard"; final int[] discardThresholds = new int[] { 17, 23 }; From cdc9301344d8edd13a9fdb3bf10f79c3249062d2 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Thu, 18 Jun 2015 08:44:43 +0200 Subject: [PATCH 60/85] set startOfTracking to now on local created trackedRace in TrackedRaceContentsReplicationTest --- .../replication/test/TrackedRaceContentsReplicationTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java index 8467de586e4..3c46ed6c98c 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java @@ -96,6 +96,7 @@ public class TrackedRaceContentsReplicationTest extends AbstractServerReplicatio MongoWindStoreFactory.INSTANCE.getMongoWindStore(PersistenceFactory.INSTANCE.getDefaultMongoObjectFactory(), PersistenceFactory.INSTANCE.getDefaultDomainObjectFactory()), EmptyGPSFixStore.INSTANCE, /* delayToLiveInMillis */ 5000, /* millisecondsOverWhichToAverageWind */ 10000, /* millisecondsOverWhichToAverageSpeed */10000)); + trackedRace.setStartOfTrackingReceived(MillisecondsTimePoint.now()); trackedRace.waitUntilLoadingFromWindStoreComplete(); } From de64ca4de9cd683f1ee553e387734bc35e8f9f18 Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Thu, 18 Jun 2015 09:44:39 +0200 Subject: [PATCH 61/85] Bug 2900 - In-App update brings crash --- .../app/utils/autoupdate/AutoUpdater.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/autoupdate/AutoUpdater.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/autoupdate/AutoUpdater.java index 128ade4f94e..55940938aee 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/autoupdate/AutoUpdater.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/autoupdate/AutoUpdater.java @@ -1,10 +1,5 @@ package com.sap.sailing.racecommittee.app.utils.autoupdate; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; - import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; @@ -12,14 +7,18 @@ import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.support.v7.app.AlertDialog; - import com.sap.sailing.android.shared.logging.ExLog; import com.sap.sailing.android.shared.util.FileHandlerUtils; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.R; -import com.sap.sailing.racecommittee.app.ui.activities.SettingsActivity; +import com.sap.sailing.racecommittee.app.ui.activities.PreferenceActivity; import com.sap.sailing.racecommittee.app.ui.fragments.preference.GeneralPreferenceFragment; +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; + public class AutoUpdater { private static final String TAG = AutoUpdater.class.getName(); @@ -70,8 +69,8 @@ public class AutoUpdater { OnClickListener okListener = new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - Intent intent = new Intent(context, SettingsActivity.class); - intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, GeneralPreferenceFragment.class.getName()); + Intent intent = new Intent(context, PreferenceActivity.class); + intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, GeneralPreferenceFragment.class.getName()); context.startActivity(intent); dialog.dismiss(); } From 7e33666c6c00ed83f31a27acca9954a240d048f4 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Thu, 18 Jun 2015 13:37:59 +0200 Subject: [PATCH 62/85] Revert "set startOfTracking to now on local created trackedRace in TrackedRaceContentsReplicationTest" This reverts commit cdc9301344d8edd13a9fdb3bf10f79c3249062d2. --- .../replication/test/TrackedRaceContentsReplicationTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java index 3c46ed6c98c..8467de586e4 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java @@ -96,7 +96,6 @@ public class TrackedRaceContentsReplicationTest extends AbstractServerReplicatio MongoWindStoreFactory.INSTANCE.getMongoWindStore(PersistenceFactory.INSTANCE.getDefaultMongoObjectFactory(), PersistenceFactory.INSTANCE.getDefaultDomainObjectFactory()), EmptyGPSFixStore.INSTANCE, /* delayToLiveInMillis */ 5000, /* millisecondsOverWhichToAverageWind */ 10000, /* millisecondsOverWhichToAverageSpeed */10000)); - trackedRace.setStartOfTrackingReceived(MillisecondsTimePoint.now()); trackedRace.waitUntilLoadingFromWindStoreComplete(); } From 6e319adb9e147c315ee6b1c956b58d7d4baefb89 Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Thu, 18 Jun 2015 13:46:59 +0200 Subject: [PATCH 63/85] fixed testWindAdditionReplication by adding startOfTrackingReceived to local trackedrace used there --- .../replication/test/TrackedRaceContentsReplicationTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java index 8467de586e4..3377c36ea77 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java @@ -55,6 +55,7 @@ import com.sap.sailing.server.operationaltransformation.AddRaceDefinition; import com.sap.sailing.server.operationaltransformation.CreateTrackedRace; import com.sap.sailing.server.operationaltransformation.TrackRegatta; import com.sap.sse.common.Color; +import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -142,9 +143,11 @@ public class TrackedRaceContentsReplicationTest extends AbstractServerReplicatio @Test public void testWindAdditionReplication() throws InterruptedException { - final Wind wind = new WindImpl(new DegreePosition(2, 3), new MillisecondsTimePoint(3456), + final TimePoint now = MillisecondsTimePoint.now(); + final Wind wind = new WindImpl(new DegreePosition(2, 3), now, new KnotSpeedWithBearingImpl(13, new DegreeBearingImpl(234))); WindSource webWindSource = new WindSourceImpl(WindSourceType.WEB); + trackedRace.setStartOfTrackingReceived(now); trackedRace.recordWind(wind, webWindSource); Thread.sleep(1000); TrackedRace replicaTrackedRace = replica.getTrackedRace(raceIdentifier); From ea599be9d19b7601e5c1714f6e63aa57ad69ffbb Mon Sep 17 00:00:00 2001 From: Alexander Ries Date: Thu, 18 Jun 2015 16:15:45 +0200 Subject: [PATCH 64/85] testReplicationOfLoadingOfStoredWindTrack test is green again, after adding a starttimereceived to the trackedrace used and adding similar timepoints to test wind --- .../test/TrackedRaceContentsReplicationTest.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java index 3377c36ea77..1c3728ba8cb 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/TrackedRaceContentsReplicationTest.java @@ -143,11 +143,11 @@ public class TrackedRaceContentsReplicationTest extends AbstractServerReplicatio @Test public void testWindAdditionReplication() throws InterruptedException { - final TimePoint now = MillisecondsTimePoint.now(); - final Wind wind = new WindImpl(new DegreePosition(2, 3), now, + TimePoint now = MillisecondsTimePoint.now(); + trackedRace.setStartOfTrackingReceived(now); + final Wind wind = new WindImpl(new DegreePosition(2, 3), new MillisecondsTimePoint(now.asMillis()+1234), new KnotSpeedWithBearingImpl(13, new DegreeBearingImpl(234))); WindSource webWindSource = new WindSourceImpl(WindSourceType.WEB); - trackedRace.setStartOfTrackingReceived(now); trackedRace.recordWind(wind, webWindSource); Thread.sleep(1000); TrackedRace replicaTrackedRace = replica.getTrackedRace(raceIdentifier); @@ -193,12 +193,14 @@ public class TrackedRaceContentsReplicationTest extends AbstractServerReplicatio @Test public void testReplicationOfLoadingOfStoredWindTrack() throws UnknownHostException, MongoException, InterruptedException { + TimePoint now = MillisecondsTimePoint.now(); + trackedRace.setStartOfTrackingReceived(now); MongoWindStore windStore = MongoWindStoreFactory.INSTANCE.getMongoWindStore(PersistenceFactory.INSTANCE.getDefaultMongoObjectFactory(), PersistenceFactory.INSTANCE.getDefaultDomainObjectFactory()); WindSource webWindSource = new WindSourceImpl(WindSourceType.WEB); WindTrack windTrack = windStore.getWindTrack(trackedRegatta.getRegatta().getName(), trackedRace, webWindSource, /* millisecondsOverWhichToAverage */ 10000, /* delayForWindEstimationCacheInvalidation */ 10000); - final Wind wind = new WindImpl(new DegreePosition(2, 3), new MillisecondsTimePoint(3456), + final Wind wind = new WindImpl(new DegreePosition(2, 3), new MillisecondsTimePoint(now.asMillis()+1234), new KnotSpeedWithBearingImpl(13, new DegreeBearingImpl(234))); windTrack.add(wind); Thread.sleep(1000); // give MongoDB time to read its own writes in a separate session From 92191ea00ea9def0e96af615f1f295f58b681a7e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 18 Jun 2015 22:54:00 +0200 Subject: [PATCH 65/85] organized import to avoid warning --- .../com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java index 89cd40e6d68..442ca68ede2 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaImpl.java @@ -29,7 +29,6 @@ import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; -import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.concurrent.LockUtil; import com.sap.sse.concurrent.NamedReentrantReadWriteLock; From 99c02aac2ce30d592c310a9bbf60c817231f5c09 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 18 Jun 2015 23:14:37 +0200 Subject: [PATCH 66/85] fixed indentation --- .../domain/leaderboard/impl/FlexibleLeaderboardImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java index ff6ee36db55..3ebbe1e7727 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java @@ -173,7 +173,7 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements for (Fleet fleet : raceColumn.getFleets()) { raceLogStore.removeRaceLog(raceColumn.getRaceLogIdentifier(fleet)); if (raceColumn.getTrackedRace(fleet) != null) { - raceColumn.getTrackedRace(fleet).detachRaceExecutionOrderProvider(raceExecutionOrderProvider); + raceColumn.getTrackedRace(fleet).detachRaceExecutionOrderProvider(raceExecutionOrderProvider); } } races.remove(raceColumn); From b53c5ac5ad69138c90586756de84fdd4b41e4de9 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 18 Jun 2015 23:24:42 +0200 Subject: [PATCH 67/85] method rename and Javadoc --- .../com/sap/sailing/domain/tracking/TrackedRace.java | 9 ++++++++- .../domain/tracking/impl/TrackedRaceImpl.java | 12 ++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 0c307b2cfb6..858954f9e9b 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -277,7 +277,14 @@ public interface TrackedRace extends Serializable { Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint); /** - * Checks whether the {@link Wind#getTimePoint()} is in range of start and end {@link TimePoint}s plus extra time for wind recording. + * Checks whether the {@link Wind#getTimePoint()} is in range of start and end {@link TimePoint}s plus extra time + * for wind recording. If, based on a {@link RaceExecutionOrderProvider}, there is no previous race that takes the + * wind fix, an extended time range lead (see {@link TrackedRaceImpl#EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS}) + * is used to record wind even a long time before the race start.

+ * + * A race does not record wind when both, {@link #getStartOfTracking()} and {@link #getStartOfRace()} are null. + * Wind is not recorded when it is after the later of {@link #getEndOfRace()} and {@link #getEndOfTracking()} and one of the + * two is not null. */ boolean takesWindFix(Wind wind); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index e12d5c79e67..39132edbda0 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -1506,18 +1506,18 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl if (latestEndTimePoint != null) { TimePoint latestEndTimePointPlusExtra = latestEndTimePoint.plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS); if (Util.isTimePointInRangeOfTimePointsAandB(wind.getTimePoint(), /* a */earliestStartTimePointMinusExtra, /* b */latestEndTimePointPlusExtra)) { - result = takesNoPreviousRaceWind(wind); + result = noPreviousRaceTakesWind(wind); } - } else if (latestEndTimePoint == null){ - if (wind.getTimePoint().after(earliestStartTimePointMinusExtra)){ - result = takesNoPreviousRaceWind(wind); + } else if (latestEndTimePoint == null) { + if (wind.getTimePoint().after(earliestStartTimePointMinusExtra)) { + result = noPreviousRaceTakesWind(wind); } - } + } } return result; } - private boolean takesNoPreviousRaceWind(Wind wind) { + private boolean noPreviousRaceTakesWind(Wind wind) { boolean result = false; Set previousRacesInExecutionOrder = getPreviousRacesFromAttachedRaceExecutionOrderProviders(); if (previousRacesInExecutionOrder == null || !previousRacesInExecutionOrder.stream().filter(tr -> tr.takesWindFix(wind) == true).findAny().isPresent()) { From 909978f345d68d6b6f918d10878223c6ef612eea Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 18 Jun 2015 23:39:38 +0200 Subject: [PATCH 68/85] code formatting --- .../test/RaceExecutionOrderProvdiderAttachDetachTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java index 3a532666c67..1563fedfc80 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java @@ -97,13 +97,14 @@ public class RaceExecutionOrderProvdiderAttachDetachTest extends TrackBasedTest fleets.add(fleet); series = new SeriesImpl(SERIES, false, fleets, new HashSet(), null); Set seriesSet = new HashSet<>(); - if (linkSeriesToRegatta) + if (linkSeriesToRegatta) { seriesSet.add(series); + } BoatClass boatClass = new BoatClassImpl(BOATCLASS, true); raceColumnInSeries = series.addRaceColumn(RACECOLUMN_SERIES, null); ScoringScheme scoringScheme = new LowPoint(); regatta = new RegattaImpl(RegattaImpl.getDefaultName(REGATTA, boatClass.getName()), boatClass, - /* startDate */null, /* endDate */null, seriesSet, false, scoringScheme, UUID.randomUUID(), null, + /* startDate */null, /* endDate */null, seriesSet, false, scoringScheme, UUID.randomUUID(), null, OneDesignRankingMetric::new); } } From c58cd9ae2131ea4afd98243c4b1b367f33941256 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 18 Jun 2015 23:51:05 +0200 Subject: [PATCH 69/85] added failing test case for takesWindFix --- ...ecutionOrderProvdiderAttachDetachTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java index 1563fedfc80..a58982e7c2e 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java @@ -21,6 +21,12 @@ import com.sap.sailing.domain.base.impl.BoatClassImpl; import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; +import com.sap.sailing.domain.base.impl.TrackedRaces; +import com.sap.sailing.domain.common.Wind; +import com.sap.sailing.domain.common.impl.DegreeBearingImpl; +import com.sap.sailing.domain.common.impl.DegreePosition; +import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; +import com.sap.sailing.domain.common.impl.WindImpl; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; @@ -28,7 +34,11 @@ import com.sap.sailing.domain.leaderboard.impl.LowPoint; import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.ranking.OneDesignRankingMetric; import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider; +import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl; import com.sap.sailing.domain.tracking.impl.TrackedRaceImpl; +import com.sap.sse.common.Duration; +import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; /** @@ -69,6 +79,23 @@ public class RaceExecutionOrderProvdiderAttachDetachTest extends TrackBasedTest assertFalse(trackedRace.hasRaceExecutionOrderProvidersAttached()); } + @Test + public void testWindInRegularIntervalWithPreviousRaceStillTracking() { + final TimePoint startOfFirstRace = MillisecondsTimePoint.now(); + final TimePoint startOfSecondRace = startOfFirstRace.plus(Duration.ONE_MINUTE.times(5)); + DynamicTrackedRaceImpl previousTrackedRace = createTestTrackedRace(REGATTA, RACE, BOATCLASS, Collections. emptyList(), startOfFirstRace); + previousTrackedRace.setStartOfTrackingReceived(startOfFirstRace); + trackedRace = createTestTrackedRace(REGATTA, "TestRace2", BOATCLASS, Collections. emptyList(), startOfSecondRace); + flexibleLeaderboard = new FlexibleLeaderboardImpl(FLEXIBLELEADERBOARD, + new ThresholdBasedResultDiscardingRuleImpl(new int[] { 3, 6 }), new LowPoint(), null); + flexibleLeaderboard.addRace(previousTrackedRace, RACECOLUMN_FLEXIBLELEADERBOARD, false); + flexibleLeaderboard.addRace(trackedRace, RACECOLUMN_FLEXIBLELEADERBOARD, false); + Wind wind = new WindImpl(new DegreePosition(12, 13), startOfSecondRace.plus(Duration.ONE_MINUTE), new KnotSpeedWithBearingImpl( + /* speedInKnots */18, new DegreeBearingImpl(185))); + assertTrue(previousTrackedRace.takesWindFix(wind)); // previous race has tracking still open and takes the fix + assertTrue(trackedRace.takesWindFix(wind)); // tracked race also needs to take the fix as it falls into the regular tracking interval + } + @Test public void testRaceExecutionOrderProviderAttachDetachWithRaceCollumnInSeries() { createTestSetupWithRegattaAndSeries(/* linkSeriesToRegatta */true); From 87a9dce9dcb2bc5fbc29bcb98372c0f1869538ef Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 18 Jun 2015 23:52:24 +0200 Subject: [PATCH 70/85] fixed calculation of latestEndTimePoint in TrackedRaceImpl.takesWindFix and made variables final where possible --- .../com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 39132edbda0..74cf0cfb1b1 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -1499,8 +1499,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl @Override public boolean takesWindFix(Wind wind) { boolean result = false; - TimePoint earliestStartTimePoint = Util.getEarliestOfTimePoints(getStartOfRace(), getStartOfTracking()); - TimePoint latestEndTimePoint = Util.getLatestOfTimePoints(getStartOfRace(), getStartOfTracking()); + final TimePoint earliestStartTimePoint = Util.getEarliestOfTimePoints(getStartOfRace(), getStartOfTracking()); + final TimePoint latestEndTimePoint = Util.getLatestOfTimePoints(getEndOfRace(), getEndOfTracking()); if (earliestStartTimePoint != null) { TimePoint earliestStartTimePointMinusExtra = earliestStartTimePoint.minus(EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS); if (latestEndTimePoint != null) { From 71432db23f9921b02d08fe59ab00bedfcbf68eab Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 18 Jun 2015 23:54:07 +0200 Subject: [PATCH 71/85] removed redundant else / if clause --- .../com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 74cf0cfb1b1..f0c60a60f7e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -1508,7 +1508,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl if (Util.isTimePointInRangeOfTimePointsAandB(wind.getTimePoint(), /* a */earliestStartTimePointMinusExtra, /* b */latestEndTimePointPlusExtra)) { result = noPreviousRaceTakesWind(wind); } - } else if (latestEndTimePoint == null) { + } else { if (wind.getTimePoint().after(earliestStartTimePointMinusExtra)) { result = noPreviousRaceTakesWind(wind); } From 03c89e4b7cb5b46a57ccce90206ab58c45a56447 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jun 2015 00:06:02 +0200 Subject: [PATCH 72/85] fixed typo on string constant --- .../test/RaceExecutionOrderProvdiderAttachDetachTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java index a58982e7c2e..f21ba6ca967 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java @@ -65,7 +65,7 @@ public class RaceExecutionOrderProvdiderAttachDetachTest extends TrackBasedTest private final String SERIES = "TestSeries"; private final String FLEXIBLELEADERBOARD = "TestFlexibleLeaderboard"; private final String RACECOLUMN_SERIES = "TestSeriesRaceColumn"; - private final String RACECOLUMN_FLEXIBLELEADERBOARD = "TestFlexibleLeadrboarRaceColumn"; + private final String RACECOLUMN_FLEXIBLELEADERBOARD = "TestFlexibleLeaderboardRaceColumn"; @Test public void testRaceExecutionOrderProviderAttachDetachWithRaceCollumn() { From dcd826dd91e1ad027894d6241c47baf2582d8eca Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jun 2015 00:19:24 +0200 Subject: [PATCH 73/85] fixed test case construction: use two differently-named leaderboard columns --- .../test/RaceExecutionOrderProvdiderAttachDetachTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java index f21ba6ca967..7c0ceac1fd0 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java @@ -88,8 +88,8 @@ public class RaceExecutionOrderProvdiderAttachDetachTest extends TrackBasedTest trackedRace = createTestTrackedRace(REGATTA, "TestRace2", BOATCLASS, Collections. emptyList(), startOfSecondRace); flexibleLeaderboard = new FlexibleLeaderboardImpl(FLEXIBLELEADERBOARD, new ThresholdBasedResultDiscardingRuleImpl(new int[] { 3, 6 }), new LowPoint(), null); - flexibleLeaderboard.addRace(previousTrackedRace, RACECOLUMN_FLEXIBLELEADERBOARD, false); - flexibleLeaderboard.addRace(trackedRace, RACECOLUMN_FLEXIBLELEADERBOARD, false); + flexibleLeaderboard.addRace(previousTrackedRace, RACECOLUMN_FLEXIBLELEADERBOARD+"1", false); + flexibleLeaderboard.addRace(trackedRace, RACECOLUMN_FLEXIBLELEADERBOARD+"2", false); Wind wind = new WindImpl(new DegreePosition(12, 13), startOfSecondRace.plus(Duration.ONE_MINUTE), new KnotSpeedWithBearingImpl( /* speedInKnots */18, new DegreeBearingImpl(185))); assertTrue(previousTrackedRace.takesWindFix(wind)); // previous race has tracking still open and takes the fix From e7604d2eab30f1ceaa79be6707b199221950117a Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jun 2015 00:33:43 +0200 Subject: [PATCH 74/85] fixed the implementation of TrackedRaceImpl.takesWindFix to let previously failing test case pass --- .../domain/tracking/impl/TrackedRaceImpl.java | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index f0c60a60f7e..d1bdaadbed1 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -1498,30 +1498,46 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl @Override public boolean takesWindFix(Wind wind) { - boolean result = false; + final boolean result; final TimePoint earliestStartTimePoint = Util.getEarliestOfTimePoints(getStartOfRace(), getStartOfTracking()); final TimePoint latestEndTimePoint = Util.getLatestOfTimePoints(getEndOfRace(), getEndOfTracking()); if (earliestStartTimePoint != null) { - TimePoint earliestStartTimePointMinusExtra = earliestStartTimePoint.minus(EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS); - if (latestEndTimePoint != null) { - TimePoint latestEndTimePointPlusExtra = latestEndTimePoint.plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS); - if (Util.isTimePointInRangeOfTimePointsAandB(wind.getTimePoint(), /* a */earliestStartTimePointMinusExtra, /* b */latestEndTimePointPlusExtra)) { - result = noPreviousRaceTakesWind(wind); + // first check if the fix meets the criteria set by the latestEndTimePoint: either the latestEndTimePoint is null, meaning an + // open interval which will continue to accept late wind fixes, or the fix time point is before the latestEndTimePoint plus a grace + // interval: + if (latestEndTimePoint == null || wind.getTimePoint().minus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS).before(latestEndTimePoint)) { + // then check, if fix is accepted anyway because it's after earliestStartTimePoint.minus(TIME_BEFORE_START_TO_TRACK_WIND_MILLIS) + // and before latestEndTimePoint.plus(IS_LIVE_GRACE_PERIOD_IN_MILLIS) or latestEndTimePoint is null. In this case, no expensive + // recursive check whether previous races take the fix are required. + if (wind.getTimePoint().plus(TIME_BEFORE_START_TO_TRACK_WIND_MILLIS).after(earliestStartTimePoint)) { + result = true; + } else { + // if the fix is older than even the extended lead interval would accept, don't accept the fix: + if (wind.getTimePoint().plus(EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS).before(earliestStartTimePoint)) { + result = false; + } else { + // the fix is in the critical interval between EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS and + // TIME_BEFORE_START_TO_TRACK_WIND_MILLIS before the earliestStartTimePoint; the fix shall only be accepted + // if no previous race exists that accepts it + result = noPreviousRaceTakesWind(wind); + } } } else { - if (wind.getTimePoint().after(earliestStartTimePointMinusExtra)) { - result = noPreviousRaceTakesWind(wind); - } + result = false; // don't accept the fix if it's after the latest end time point plus some grace interval } + } else { + result = false; // don't accept a fix if we don't have any start time information about the race } return result; } private boolean noPreviousRaceTakesWind(Wind wind) { - boolean result = false; + final boolean result; Set previousRacesInExecutionOrder = getPreviousRacesFromAttachedRaceExecutionOrderProviders(); if (previousRacesInExecutionOrder == null || !previousRacesInExecutionOrder.stream().filter(tr -> tr.takesWindFix(wind) == true).findAny().isPresent()) { result = true; + } else { + result = false; } return result; } From ba66852b7ff3665d0c416df99e64177a1b6fcb09 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jun 2015 00:47:43 +0200 Subject: [PATCH 75/85] added several test cases for the different constellations of TrackedRace.takesWindFix --- ...ecutionOrderProvdiderAttachDetachTest.java | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java index 7c0ceac1fd0..1d96073f872 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/RaceExecutionOrderProvdiderAttachDetachTest.java @@ -22,6 +22,7 @@ import com.sap.sailing.domain.base.impl.FleetImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.TrackedRaces; +import com.sap.sailing.domain.common.TimingConstants; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreePosition; @@ -96,6 +97,86 @@ public class RaceExecutionOrderProvdiderAttachDetachTest extends TrackBasedTest assertTrue(trackedRace.takesWindFix(wind)); // tracked race also needs to take the fix as it falls into the regular tracking interval } + @Test + public void testWindInExtendedLeadIntervalWithPreviousRaceStillTracking() { + final TimePoint startOfFirstRace = MillisecondsTimePoint.now(); + final TimePoint endOfFirstRace = startOfFirstRace.plus(Duration.ONE_SECOND); + final TimePoint startOfSecondRace = startOfFirstRace.plus(Duration.ONE_HOUR); + DynamicTrackedRaceImpl previousTrackedRace = createTestTrackedRace(REGATTA, RACE, BOATCLASS, Collections. emptyList(), startOfFirstRace); + previousTrackedRace.setStartOfTrackingReceived(startOfFirstRace); + previousTrackedRace.setEndOfTrackingReceived(endOfFirstRace); // a very short race... + trackedRace = createTestTrackedRace(REGATTA, "TestRace2", BOATCLASS, Collections. emptyList(), startOfSecondRace); + flexibleLeaderboard = new FlexibleLeaderboardImpl(FLEXIBLELEADERBOARD, + new ThresholdBasedResultDiscardingRuleImpl(new int[] { 3, 6 }), new LowPoint(), null); + flexibleLeaderboard.addRace(previousTrackedRace, RACECOLUMN_FLEXIBLELEADERBOARD+"1", false); + flexibleLeaderboard.addRace(trackedRace, RACECOLUMN_FLEXIBLELEADERBOARD+"2", false); + // the wind fix is after the grace period of the first race's end, so won't be accepted by it, but within the extended + // time range before the second race, so shall be accepted by it. + Wind wind = new WindImpl(new DegreePosition(12, 13), + endOfFirstRace.plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS).plus(Duration.ONE_MINUTE), // fix is after the grace period + new KnotSpeedWithBearingImpl(/* speedInKnots */18, new DegreeBearingImpl(185))); + assertFalse(previousTrackedRace.takesWindFix(wind)); // previous race has tracking closed one second after it started and doesn't accept the fix + assertTrue(trackedRace.takesWindFix(wind)); // tracked race also needs to take the fix as it falls into the regular tracking interval + } + + @Test + public void testWindInExtendedLeadIntervalWithNoPreviousRace() { + final TimePoint startOfFirstRace = MillisecondsTimePoint.now(); + final TimePoint endOfFirstRace = startOfFirstRace.plus(Duration.ONE_SECOND); + final TimePoint startOfSecondRace = startOfFirstRace.plus(Duration.ONE_HOUR); + trackedRace = createTestTrackedRace(REGATTA, "TestRace2", BOATCLASS, Collections. emptyList(), startOfSecondRace); + flexibleLeaderboard = new FlexibleLeaderboardImpl(FLEXIBLELEADERBOARD, + new ThresholdBasedResultDiscardingRuleImpl(new int[] { 3, 6 }), new LowPoint(), null); + flexibleLeaderboard.addRace(trackedRace, RACECOLUMN_FLEXIBLELEADERBOARD, false); + // the wind fix is within the extended time range before the second race, and there is no previous race, so shall be accepted by it + Wind wind = new WindImpl(new DegreePosition(12, 13), + endOfFirstRace.plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS).plus(Duration.ONE_MINUTE), // fix is after the grace period + new KnotSpeedWithBearingImpl(/* speedInKnots */18, new DegreeBearingImpl(185))); + assertTrue(trackedRace.takesWindFix(wind)); + } + + @Test + public void testWindInExtendedLeadIntervalWithPreviousRaceLongAgo() { + final TimePoint startOfFirstRace = MillisecondsTimePoint.now(); + final TimePoint endOfFirstRace = startOfFirstRace.plus(Duration.ONE_SECOND); + final TimePoint startOfSecondRace = startOfFirstRace.plus(TrackedRaceImpl.EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS.times(2)); + DynamicTrackedRaceImpl previousTrackedRace = createTestTrackedRace(REGATTA, RACE, BOATCLASS, Collections. emptyList(), startOfFirstRace); + previousTrackedRace.setStartOfTrackingReceived(startOfFirstRace); + previousTrackedRace.setEndOfTrackingReceived(endOfFirstRace); // a very short race... + trackedRace = createTestTrackedRace(REGATTA, "TestRace2", BOATCLASS, Collections. emptyList(), startOfSecondRace); + flexibleLeaderboard = new FlexibleLeaderboardImpl(FLEXIBLELEADERBOARD, + new ThresholdBasedResultDiscardingRuleImpl(new int[] { 3, 6 }), new LowPoint(), null); + flexibleLeaderboard.addRace(previousTrackedRace, RACECOLUMN_FLEXIBLELEADERBOARD+"1", false); + flexibleLeaderboard.addRace(trackedRace, RACECOLUMN_FLEXIBLELEADERBOARD+"2", false); + // the wind fix is outside the extended time range before the second race, and the previous race doesn't accept it; shall not be accepted + Wind wind = new WindImpl(new DegreePosition(12, 13), + endOfFirstRace.plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS).plus(Duration.ONE_MINUTE), // fix is after the grace period + new KnotSpeedWithBearingImpl(/* speedInKnots */18, new DegreeBearingImpl(185))); + assertFalse(previousTrackedRace.takesWindFix(wind)); // fix is after first race's end plus grace period + assertFalse(trackedRace.takesWindFix(wind)); + } + + @Test + public void testWindInExtendedLeadIntervalButStillRecordedByPreviousRace() { + final TimePoint startOfFirstRace = MillisecondsTimePoint.now(); + final TimePoint endOfFirstRace = startOfFirstRace.plus(Duration.ONE_SECOND); + final TimePoint startOfSecondRace = startOfFirstRace.plus(TrackedRaceImpl.EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS.divide(2)); + DynamicTrackedRaceImpl previousTrackedRace = createTestTrackedRace(REGATTA, RACE, BOATCLASS, Collections. emptyList(), startOfFirstRace); + previousTrackedRace.setStartOfTrackingReceived(startOfFirstRace); + previousTrackedRace.setEndOfTrackingReceived(endOfFirstRace); // a very short race... + trackedRace = createTestTrackedRace(REGATTA, "TestRace2", BOATCLASS, Collections. emptyList(), startOfSecondRace); + flexibleLeaderboard = new FlexibleLeaderboardImpl(FLEXIBLELEADERBOARD, + new ThresholdBasedResultDiscardingRuleImpl(new int[] { 3, 6 }), new LowPoint(), null); + flexibleLeaderboard.addRace(previousTrackedRace, RACECOLUMN_FLEXIBLELEADERBOARD+"1", false); + flexibleLeaderboard.addRace(trackedRace, RACECOLUMN_FLEXIBLELEADERBOARD+"2", false); + // the wind fix is inside the extended time range before the second race, but the previous race still accepts it; shall not be accepted + Wind wind = new WindImpl(new DegreePosition(12, 13), + startOfFirstRace.plus(Duration.ONE_SECOND), // fix is recorded by previous race + new KnotSpeedWithBearingImpl(/* speedInKnots */18, new DegreeBearingImpl(185))); + assertTrue(previousTrackedRace.takesWindFix(wind)); // fix is after first race's end plus grace period + assertFalse(trackedRace.takesWindFix(wind)); + } + @Test public void testRaceExecutionOrderProviderAttachDetachWithRaceCollumnInSeries() { createTestSetupWithRegattaAndSeries(/* linkSeriesToRegatta */true); From fe2a45ddf721ee59039e715b3561f9082c78a2dc Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jun 2015 00:55:04 +0200 Subject: [PATCH 76/85] use default implementation for TrackedRace.takesWindFix, avoiding new overrides in test mocks --- .../domain/test/mock/MockedTrackedRace.java | 6 ------ ...ockedTrackedRaceWithStartTimeAndRanks.java | 6 ------ .../sailing/domain/tracking/TrackedRace.java | 21 +++++++++++++------ .../domain/tracking/impl/TrackedRaceImpl.java | 10 +++++++++ .../gwt/ui/test/MockedTrackedRace.java | 6 ------ .../server/masterdata/DummyTrackedRace.java | 6 ------ 6 files changed, 25 insertions(+), 30 deletions(-) diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java index ed170472da5..481323374f0 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java @@ -979,10 +979,4 @@ public class MockedTrackedRace implements DynamicTrackedRace { public RankingMetric getRankingMetric() { return null; } - - @Override - public boolean takesWindFix(Wind wind) { - return false; - } - } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java index a19b6edf030..a07b567922f 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java @@ -646,10 +646,4 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { @Override public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } - - @Override - public boolean takesWindFix(Wind wind) { - return false; - } - } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java index 858954f9e9b..2a8c9168b16 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java @@ -279,14 +279,23 @@ public interface TrackedRace extends Serializable { /** * Checks whether the {@link Wind#getTimePoint()} is in range of start and end {@link TimePoint}s plus extra time * for wind recording. If, based on a {@link RaceExecutionOrderProvider}, there is no previous race that takes the - * wind fix, an extended time range lead (see {@link TrackedRaceImpl#EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS}) - * is used to record wind even a long time before the race start.

+ * wind fix, an extended time range lead (see + * {@link TrackedRaceImpl#EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS}) is used to record wind even a long + * time before the race start. + *

* - * A race does not record wind when both, {@link #getStartOfTracking()} and {@link #getStartOfRace()} are null. - * Wind is not recorded when it is after the later of {@link #getEndOfRace()} and {@link #getEndOfTracking()} and one of the - * two is not null. + * A race does not record wind when both, {@link #getStartOfTracking()} and {@link #getStartOfRace()} are + * null. Wind is not recorded when it is after the later of {@link #getEndOfRace()} and + * {@link #getEndOfTracking()} and one of the two is not null. + *

+ * + * This default implementation returns true which may be useful for tests and mocked implementations; however, real + * implementations shall override this and provide a meaningful implementation according to the specification given + * above. */ - boolean takesWindFix(Wind wind); + default boolean takesWindFix(Wind wind) { + return true; + } /** * Same as {@link #getWind(Position, TimePoint, Set) getWind(p, at, Collections.emptyList())} diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index d1bdaadbed1..aa673a61315 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -1496,6 +1496,16 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl return result; } + /** + * Checks whether the {@link Wind#getTimePoint()} is in range of start and end {@link TimePoint}s plus extra time + * for wind recording. If, based on a {@link RaceExecutionOrderProvider}, there is no previous race that takes the + * wind fix, an extended time range lead (see {@link TrackedRaceImpl#EXTRA_LONG_TIME_BEFORE_START_TO_TRACK_WIND_MILLIS}) + * is used to record wind even a long time before the race start.

+ * + * A race does not record wind when both, {@link #getStartOfTracking()} and {@link #getStartOfRace()} are null. + * Wind is not recorded when it is after the later of {@link #getEndOfRace()} and {@link #getEndOfTracking()} and one of the + * two is not null. + */ @Override public boolean takesWindFix(Wind wind) { final boolean result; diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java index 6e49820cad8..9eca28dba48 100755 --- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java @@ -784,10 +784,4 @@ public class MockedTrackedRace implements DynamicTrackedRace { @Override public void attachRaceExecutionProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } - - @Override - public boolean takesWindFix(Wind wind) { - return false; - } - } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java index 12e2acc3d02..370826f1ecd 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/DummyTrackedRace.java @@ -621,10 +621,4 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { @Override public void detachRaceExecutionOrderProvider(RaceExecutionOrderProvider raceExecutionOrderProvider) { } - - @Override - public boolean takesWindFix(Wind wind) { - return false; - } - } From a7a52fbee814843ec85d592f325a66d1111ebedc Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jun 2015 01:56:10 +0200 Subject: [PATCH 77/85] re-consolidating ORC icon stuff into BoatClassMasterdata for now; major refactoring would be required otherwise --- .../domain/common/BoatClassMasterdata.java | 8 ++- .../common/HandicapSystemMasterdata.java | 55 ------------------- .../common/client/BoatClassImageResolver.java | 7 +-- 3 files changed, 10 insertions(+), 60 deletions(-) delete mode 100644 java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/HandicapSystemMasterdata.java diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java index dcd5857ee73..e95c3198a40 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BoatClassMasterdata.java @@ -59,7 +59,13 @@ public enum BoatClassMasterdata { FLYING_DUTCHMAN ("Flying Dutchman", true, 6.10, 1.80, BoatHullType.MONOHULL, true), DYAS("Dyas", true, 7.15, 1.95, BoatHullType.MONOHULL, true), INTERNATIONAL_14("International 14", true, 4.27, 1.83, BoatHullType.MONOHULL, true, "I14"), - OPEN_BIC("O'pen BIC", true, 2.75, 1.14, BoatHullType.MONOHULL, false, "OpenBIC"); + OPEN_BIC("O'pen BIC", true, 2.75, 1.14, BoatHullType.MONOHULL, false, "OpenBIC"), + + // multi-class "boat classes"; to be replaced at some later point in time by something like a RegattaClass + ORC ("ORC", true, 13.83, 3.91, BoatHullType.MONOHULL, true), + ORC_CLUB ("ORC Club", true, 13.83, 3.91, BoatHullType.MONOHULL, true), + ORC_INTERNATIONAL ("ORC International", true, 13.83, 3.91, BoatHullType.MONOHULL, true, "ORC Int."); + private final String displayName; private final String[] alternativeNames; diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/HandicapSystemMasterdata.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/HandicapSystemMasterdata.java deleted file mode 100644 index e496d4d2e40..00000000000 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/HandicapSystemMasterdata.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.sap.sailing.domain.common; - - -/** - * Some masterdata for the different handicap systems - * @author Frank - * - */ -public enum HandicapSystemMasterdata { - ORC ("ORC"), - ORC_CLUB ("ORC Club"), - ORC_INTERNATIONAL ("ORC International", "ORC Int."); - - private final String displayName; - private final String[] alternativeNames; - - private HandicapSystemMasterdata(String displayName, String... alternativeNames) { - this.displayName = displayName; - this.alternativeNames = alternativeNames; - } - - private HandicapSystemMasterdata(String displayName) { - this.displayName = displayName; - this.alternativeNames = null; - } - - public static HandicapSystemMasterdata resolveHandicapSystem(String handicapSystemName) { - String handicapSystemToResolve = unifyHandicapSystemName(handicapSystemName); - for (HandicapSystemMasterdata handicapSystem : values()) { - if (unifyHandicapSystemName(handicapSystem.displayName).equals(handicapSystemToResolve)) { - return handicapSystem; - } else if (handicapSystem.alternativeNames != null) { - for (String name : handicapSystem.alternativeNames) { - if (unifyHandicapSystemName(name).equals(handicapSystemToResolve)) { - return handicapSystem; - } - } - } - } - return null; - } - - public static String unifyHandicapSystemName(String handicapSystemName) { - return handicapSystemName == null ? null : handicapSystemName.toUpperCase().replaceAll("\\s+",""); - } - - public String getDisplayName() { - return displayName; - } - - public String[] getAlternativeNames() { - return alternativeNames == null ? new String[0] : alternativeNames; - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResolver.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResolver.java index 002a9106253..bd4d44f38ba 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResolver.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResolver.java @@ -5,7 +5,6 @@ import java.util.Map; import com.google.gwt.resources.client.ImageResource; import com.sap.sailing.domain.common.BoatClassMasterdata; -import com.sap.sailing.domain.common.HandicapSystemMasterdata; /** * All images are expected to be 140x140px with transparent background. @@ -21,9 +20,9 @@ public class BoatClassImageResolver { boatClassIconsMap = new HashMap(); // handicap sailing icons - boatClassIconsMap.put(HandicapSystemMasterdata.ORC.getDisplayName(), imageResources.ORCIcon()); - boatClassIconsMap.put(HandicapSystemMasterdata.ORC_CLUB.getDisplayName(), imageResources.ORCIcon()); - boatClassIconsMap.put(HandicapSystemMasterdata.ORC_INTERNATIONAL.getDisplayName(), imageResources.ORCIcon()); + boatClassIconsMap.put(BoatClassMasterdata.ORC.getDisplayName(), imageResources.ORCIcon()); + boatClassIconsMap.put(BoatClassMasterdata.ORC_CLUB.getDisplayName(), imageResources.ORCIcon()); + boatClassIconsMap.put(BoatClassMasterdata.ORC_INTERNATIONAL.getDisplayName(), imageResources.ORCIcon()); // one design boat class icons boatClassIconsMap.put(BoatClassMasterdata._12M.getDisplayName(), imageResources._12mRIcon()); From 9b495f9d09d05ba22d92f21c1826f6a9fba3f1ab Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Fri, 19 Jun 2015 10:22:11 +0200 Subject: [PATCH 78/85] fix for RaceStateService --- .../racecommittee/app/domain/impl/FleetIdentifierImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java index 152965cad8c..6e4cae51e97 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java @@ -43,7 +43,7 @@ public class FleetIdentifierImpl implements FleetIdentifier { public static Triple unescape(String escapedId) { int arrayIndex = 0; - StringBuilder[] split = new StringBuilder[3]; + StringBuilder[] split = new StringBuilder[4]; for (int i=0; i(leaderboardName, raceColumnName, fleetName); } From a422fc0ddfbce417a70033c4853378e989478db7 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jun 2015 10:55:44 +0200 Subject: [PATCH 79/85] added Javadoc --- .../racecommittee/app/domain/impl/FleetIdentifierImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java index 6e4cae51e97..0ab155c64b0 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/FleetIdentifierImpl.java @@ -41,6 +41,10 @@ public class FleetIdentifierImpl implements FleetIdentifier { return fragment.replace("\\", "\\\\").replace(".", "\\."); } + /** + * @return a triple consisting of regattaLikeName/raceColumnName/fleetName; note that the series name which is + * encoded in the escapedId in second place (zero-based index 1) is silently ignored + */ public static Triple unescape(String escapedId) { int arrayIndex = 0; StringBuilder[] split = new StringBuilder[4]; From 78817ac60a46ae423892a184f94b77daf4ba7351 Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Fri, 19 Jun 2015 12:08:48 +0200 Subject: [PATCH 80/85] added JVM/Junit testing to RCApp (and renamed the UI test folder) --- build.gradle | 2 +- .../SimpleRaceIdentifierEscapingTest.java | 74 ------------------- .../build.gradle | 23 ++++-- .../SimpleRaceIdentifierEscapingTest.java | 48 ++++++++++++ .../racecommittee/app/ApplicationTest.java | 0 .../app/ui/activities/LoginActivityTest.java | 0 6 files changed, 65 insertions(+), 82 deletions(-) delete mode 100755 java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SimpleRaceIdentifierEscapingTest.java create mode 100755 mobile/com.sap.sailing.racecommittee.app/tests-jvm/src/com/sap/sailing/racecommittee/app/domain/impl/SimpleRaceIdentifierEscapingTest.java rename mobile/com.sap.sailing.racecommittee.app/{tests => tests-ui}/src/com/sap/sailing/racecommittee/app/ApplicationTest.java (100%) rename mobile/com.sap.sailing.racecommittee.app/{tests => tests-ui}/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivityTest.java (100%) diff --git a/build.gradle b/build.gradle index 6a7d068b950..a485afff7b7 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:1.0.0' + classpath 'com.android.tools.build:gradle:1.1.1' } } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SimpleRaceIdentifierEscapingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SimpleRaceIdentifierEscapingTest.java deleted file mode 100755 index 5f149359391..00000000000 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SimpleRaceIdentifierEscapingTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.sap.sailing.domain.test; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; - -import com.sap.sse.common.Util.Triple; - -/** - * This test verifies the algorithm used to escape and unescape SimpleRaceIdentifier components as used in - * FleetIfentifierImpl. - * - * @author Axel Uhl (D043530) - * - */ -public class SimpleRaceIdentifierEscapingTest { - @Test - public void testUnescapingSimpleRaceIdentifier() { - test("Leaderboard with trailing backslash and dot\\.", "raceColumn", "fleet"); - test("Leaderboard\\.with\\.two dots", "raceColumn", "fleet"); - test("Leaderboard with double backslash\\\\", "raceColumn", "fleet"); - test("Leaderboard with double backslash and dot\\\\.", "raceColumn", "fleet"); - test("\\Leaderboard with leading backslash", "raceColumn", "fleet"); - test("\\.Leaderboard with leading backslash and dot", "raceColumn", "fleet"); - test("\\\\.Leaderboard with leading double backslash and dot", "raceColumn", "fleet"); - test("\\\\.Leaderboard with leading double backslash and two dots", "raceColumn", "fleet"); - } - - private void test(String leaderboardName, String raceColumnName, String fleetName) { - final String marshalled = build(leaderboardName, raceColumnName, fleetName); - final Triple parsed = parse(marshalled); - assertEquals(leaderboardName, parsed.getA()); - assertEquals(raceColumnName, parsed.getB()); - assertEquals(fleetName, parsed.getC()); - } - - private Triple parse(String s) { - int arrayIndex = 0; - StringBuilder[] split = new StringBuilder[3]; - for (int i=0; i(leaderboardName, raceColumnName, fleetName); - } - - private String build(String leaderboardName, String raceColumnName, String fleetName) { - return String.format("%s.%s.%s", - escape(leaderboardName), - escape(raceColumnName), - escape(fleetName)); - } - - private String escape(String s) { - return s.replace("\\", "\\\\").replace(".", "\\."); - } -} diff --git a/mobile/com.sap.sailing.racecommittee.app/build.gradle b/mobile/com.sap.sailing.racecommittee.app/build.gradle index 644b342601b..84e5765a0bf 100644 --- a/mobile/com.sap.sailing.racecommittee.app/build.gradle +++ b/mobile/com.sap.sailing.racecommittee.app/build.gradle @@ -29,9 +29,13 @@ android { } androidTest { - java.srcDirs = ["tests/src"] - res.srcDirs = ["tests/res"] - assets.srcDirs = ["tests/assets"] + java.srcDirs = ["tests-ui/src"] + res.srcDirs = ["tests-ui/res"] + assets.srcDirs = ["tests-ui/assets"] + } + + test { + java.srcDirs = ["tests-jvm/src"] } } @@ -83,14 +87,19 @@ dependencies { /* all local jar-libs */ compile fileTree(dir: "libs", include: ["*.jar"]) + /* JVM tests */ + testCompile 'junit:junit:4.12' + testCompile "org.mockito:mockito-core:1.9.5" + /* UI testing with espresso */ + androidTestCompile "com.android.support:support-annotations:22.1.1" androidTestCompile "com.android.support.test:runner:0.2" androidTestCompile "com.android.support.test:rules:0.2" androidTestCompile "com.android.support.test.espresso:espresso-core:2.1" - androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.1') { - exclude group: 'com.android.support', module: 'appcompat' - exclude group: 'com.android.support', module: 'support-v4' - exclude module: 'recyclerview-v7' + androidTestCompile ("com.android.support.test.espresso:espresso-contrib:2.1") { + exclude group: "com.android.support", module: "appcompat" + exclude group: "com.android.support", module: "support-v4" + exclude module: "recyclerview-v7" } } diff --git a/mobile/com.sap.sailing.racecommittee.app/tests-jvm/src/com/sap/sailing/racecommittee/app/domain/impl/SimpleRaceIdentifierEscapingTest.java b/mobile/com.sap.sailing.racecommittee.app/tests-jvm/src/com/sap/sailing/racecommittee/app/domain/impl/SimpleRaceIdentifierEscapingTest.java new file mode 100755 index 00000000000..b9362857150 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/tests-jvm/src/com/sap/sailing/racecommittee/app/domain/impl/SimpleRaceIdentifierEscapingTest.java @@ -0,0 +1,48 @@ +package com.sap.sailing.racecommittee.app.domain.impl; + +import com.sap.sse.common.Util.Triple; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +/** + * This test verifies the algorithm used to escape and unescape SimpleRaceIdentifier components as used in + * FleetIfentifierImpl. + * + * @author Axel Uhl (D043530) + * + */ +public class SimpleRaceIdentifierEscapingTest { + @Test + public void testUnescapingSimpleRaceIdentifier() { + test("Leaderboard with trailing backslash and dot\\.", "empty", "fleet", "raceColumn"); + test("Leaderboard\\.with\\.two dots", "empty", "fleet", "raceColumn"); + test("Leaderboard with double backslash\\\\", "empty", "fleet", "raceColumn"); + test("Leaderboard with double backslash and dot\\\\.", "empty", "fleet", "raceColumn"); + test("\\Leaderboard with leading backslash", "empty", "fleet", "raceColumn"); + test("\\.Leaderboard with leading backslash and dot", "empty", "fleet", "raceColumn"); + test("\\\\.Leaderboard with leading double backslash and dot", "empty", "fleet", "raceColumn"); + test("\\\\.Leaderboard with leading double backslash and two dots", "empty", "fleet", "raceColumn"); + } + + private void test(String leaderboardName, String empty, String fleetName, String raceColumnName) { + final String marshalled = build(leaderboardName, empty, fleetName, raceColumnName); + final Triple parsed = FleetIdentifierImpl.unescape(marshalled); + assertEquals(leaderboardName, parsed.getA()); + assertEquals(raceColumnName, parsed.getB()); + assertEquals(fleetName, parsed.getC()); + } + + private String build(String leaderboardName, String empty, String fleetName, String raceColumnName) { + return String.format("%s.%s.%s.%s", + escape(leaderboardName), + escape(empty), + escape(fleetName), + escape(raceColumnName)); + } + + private String escape(String s) { + return s.replace("\\", "\\\\"); + } +} diff --git a/mobile/com.sap.sailing.racecommittee.app/tests/src/com/sap/sailing/racecommittee/app/ApplicationTest.java b/mobile/com.sap.sailing.racecommittee.app/tests-ui/src/com/sap/sailing/racecommittee/app/ApplicationTest.java similarity index 100% rename from mobile/com.sap.sailing.racecommittee.app/tests/src/com/sap/sailing/racecommittee/app/ApplicationTest.java rename to mobile/com.sap.sailing.racecommittee.app/tests-ui/src/com/sap/sailing/racecommittee/app/ApplicationTest.java diff --git a/mobile/com.sap.sailing.racecommittee.app/tests/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivityTest.java b/mobile/com.sap.sailing.racecommittee.app/tests-ui/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivityTest.java similarity index 100% rename from mobile/com.sap.sailing.racecommittee.app/tests/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivityTest.java rename to mobile/com.sap.sailing.racecommittee.app/tests-ui/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivityTest.java From 9410b6b5578653cf021f12b900b1b1a8fdc69374 Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Fri, 19 Jun 2015 12:37:30 +0200 Subject: [PATCH 81/85] added missing escape sequence --- .../app/domain/impl/SimpleRaceIdentifierEscapingTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/tests-jvm/src/com/sap/sailing/racecommittee/app/domain/impl/SimpleRaceIdentifierEscapingTest.java b/mobile/com.sap.sailing.racecommittee.app/tests-jvm/src/com/sap/sailing/racecommittee/app/domain/impl/SimpleRaceIdentifierEscapingTest.java index b9362857150..4348873c78c 100755 --- a/mobile/com.sap.sailing.racecommittee.app/tests-jvm/src/com/sap/sailing/racecommittee/app/domain/impl/SimpleRaceIdentifierEscapingTest.java +++ b/mobile/com.sap.sailing.racecommittee.app/tests-jvm/src/com/sap/sailing/racecommittee/app/domain/impl/SimpleRaceIdentifierEscapingTest.java @@ -43,6 +43,6 @@ public class SimpleRaceIdentifierEscapingTest { } private String escape(String s) { - return s.replace("\\", "\\\\"); + return s.replace("\\", "\\\\").replace(".", "\\."); } } From 3b5de63375a424f900e1a00abe6d2bf8eea71c23 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jun 2015 13:09:10 +0200 Subject: [PATCH 82/85] construct managed race identifier in test case using ManagedRaceIdentifierImpl --- .../SailingGWT sdm.launch | 9 ++-- .../.classpath | 24 +++++----- .../SimpleRaceIdentifierEscapingTest.java | 47 ++++++++++++++----- 3 files changed, 53 insertions(+), 27 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch index 328b5babf96..a00d6c0ff91 100755 --- a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch @@ -5,12 +5,9 @@ - - - @@ -18,8 +15,12 @@ + + + + @@ -72,7 +73,7 @@ - + diff --git a/mobile/com.sap.sailing.racecommittee.app/.classpath b/mobile/com.sap.sailing.racecommittee.app/.classpath index 361be950b40..b32ef90cb7e 100644 --- a/mobile/com.sap.sailing.racecommittee.app/.classpath +++ b/mobile/com.sap.sailing.racecommittee.app/.classpath @@ -1,11 +1,13 @@ - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/mobile/com.sap.sailing.racecommittee.app/tests-jvm/src/com/sap/sailing/racecommittee/app/domain/impl/SimpleRaceIdentifierEscapingTest.java b/mobile/com.sap.sailing.racecommittee.app/tests-jvm/src/com/sap/sailing/racecommittee/app/domain/impl/SimpleRaceIdentifierEscapingTest.java index 4348873c78c..fbb81c2f423 100755 --- a/mobile/com.sap.sailing.racecommittee.app/tests-jvm/src/com/sap/sailing/racecommittee/app/domain/impl/SimpleRaceIdentifierEscapingTest.java +++ b/mobile/com.sap.sailing.racecommittee.app/tests-jvm/src/com/sap/sailing/racecommittee/app/domain/impl/SimpleRaceIdentifierEscapingTest.java @@ -1,10 +1,16 @@ package com.sap.sailing.racecommittee.app.domain.impl; -import com.sap.sse.common.Util.Triple; +import static org.junit.Assert.assertEquals; + import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.SeriesBase; +import com.sap.sailing.domain.base.impl.FleetImpl; +import com.sap.sailing.domain.base.racegroup.RaceGroup; +import com.sap.sailing.domain.base.racegroup.impl.RaceGroupImpl; +import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier; +import com.sap.sse.common.Util.Triple; /** * This test verifies the algorithm used to escape and unescape SimpleRaceIdentifier components as used in @@ -34,15 +40,32 @@ public class SimpleRaceIdentifierEscapingTest { assertEquals(fleetName, parsed.getC()); } - private String build(String leaderboardName, String empty, String fleetName, String raceColumnName) { - return String.format("%s.%s.%s.%s", - escape(leaderboardName), - escape(empty), - escape(fleetName), - escape(raceColumnName)); - } + private String build(final String leaderboardName, final String seriesName, final String fleetName, final String raceColumnName) { + final Fleet fleet = new FleetImpl(fleetName); + final SeriesBase series = new SeriesBase() { + private static final long serialVersionUID = 1139740910228343375L; - private String escape(String s) { - return s.replace("\\", "\\\\").replace(".", "\\."); + @Override + public String getName() { + return seriesName; + } + + @Override + public void setName(String newName) { + } + + @Override + public boolean isMedal() { + return false; + } + + @Override + public Iterable getFleets() { + return null; + } + }; + RaceGroup raceGroup = new RaceGroupImpl(leaderboardName, /* displayName */ null, /* boatClass */ null, /* courseArea */ null, /* series */ null, /* regattaConfiguration */ null); + ManagedRaceIdentifier identifier = new ManagedRaceIdentifierImpl(raceColumnName, fleet, series, raceGroup); + return identifier.getId(); } } From 6112b16b26e7bcb78ba2d80dfdfbf3df33cbab84 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 19 Jun 2015 13:11:20 +0200 Subject: [PATCH 83/85] checked in launch configuration for RCApp unit tests --- .../SimpleRaceIdentifierEscapingTest.launch | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 mobile/com.sap.sailing.racecommittee.app/SimpleRaceIdentifierEscapingTest.launch diff --git a/mobile/com.sap.sailing.racecommittee.app/SimpleRaceIdentifierEscapingTest.launch b/mobile/com.sap.sailing.racecommittee.app/SimpleRaceIdentifierEscapingTest.launch new file mode 100644 index 00000000000..5dcdc3de012 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/SimpleRaceIdentifierEscapingTest.launch @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + From f72208dd6d722b8466e9c2d10fcb2ba223752401 Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Fri, 19 Jun 2015 13:17:57 +0200 Subject: [PATCH 84/85] Added JUnit tests for Android into build script (rcapp only yet) --- configuration/buildAndUpdateProduct.sh | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/configuration/buildAndUpdateProduct.sh b/configuration/buildAndUpdateProduct.sh index ba468eeeae8..3c405d73557 100755 --- a/configuration/buildAndUpdateProduct.sh +++ b/configuration/buildAndUpdateProduct.sh @@ -619,10 +619,10 @@ if [[ "$@" == "build" ]] || [[ "$@" == "all" ]]; then echo "ANDROID_HOME=$ANDROID_HOME" PATH=$PATH:$ANDROID_HOME/tools PATH=$PATH:$ANDROID_HOME/platform-tools - ANDROID="$ANDROID_HOME/tools/android" - if [ \! -x "$ANDROID" ]; then - ANDROID="$ANDROID_HOME/tools/android.bat" - fi + ANDROID="$ANDROID_HOME/tools/android" + if [ \! -x "$ANDROID" ]; then + ANDROID="$ANDROID_HOME/tools/android.bat" + fi RC_APP_VERSION=`grep "android:versionCode=" mobile/com.sap.$PROJECT_TYPE.racecommittee.app/AndroidManifest.xml | cut -d "\"" -f 2` echo "RC_APP_VERSION=$RC_APP_VERSION" @@ -654,8 +654,12 @@ if [[ "$@" == "build" ]] || [[ "$@" == "all" ]]; then if [[ ${PIPESTATUS[0]} != 0 ]]; then exit 100 fi - # testing deactivated due to errors in hudson if [ $testing -eq 1 ]; then + echo "Starting JUnit tests..." + ./gradlew test | tee -a $START_DIR/build.log + if [[ ${PIPESTATUS[0]} != 0 ]]; then + exit 103 + fi adb emu kill echo "Downloading image (sys-img-${ANDROID_ABI}-android-${TEST_API})..." | tee -a $START_DIR/build.log echo yes | "$ANDROID" update sdk $ANDROID_OPTIONS --filter sys-img-${ANDROID_ABI}-android-${TEST_API} --no-ui --force --all > /dev/null From a7e3ba15a6d998613e7ece48c5e68898d2fea3d0 Mon Sep 17 00:00:00 2001 From: Simon Pamies Date: Fri, 19 Jun 2015 13:21:24 +0100 Subject: [PATCH 85/85] Fixing bug preventing JSON to be parsed --- .../sailing/server/gateway/jaxrs/api/RegattasResource.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java index 6db76168f62..a8efcff988e 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java @@ -889,8 +889,8 @@ public class RegattasResource extends AbstractSailingServerResource { throw re; } } - jsonCompetitorInLeg.put("gapToLeader-s", - trackedLegOfCompetitor.getGapToLeader(timePoint, rankingInfo, WindPositionMode.LEG_MIDDLE)); + Duration gapToLeaderDuration = trackedLegOfCompetitor.getGapToLeader(timePoint, rankingInfo, WindPositionMode.LEG_MIDDLE); + jsonCompetitorInLeg.put("gapToLeader-s", gapToLeaderDuration != null ? gapToLeaderDuration.asSeconds() : 0.0); jsonCompetitorInLeg.put("started", trackedLegOfCompetitor.hasStartedLeg(timePoint)); jsonCompetitorInLeg.put("finished", trackedLegOfCompetitor.hasFinishedLeg(timePoint)); jsonCompetitors.add(jsonCompetitorInLeg);