diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BranchIOConstants.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BranchIOConstants.java index 66a1686828b..c8bfdb36e06 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BranchIOConstants.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/BranchIOConstants.java @@ -1,14 +1,17 @@ package com.sap.sailing.domain.common; public class BranchIOConstants { - public static final String SAILINSIGHT_2_APP_BRANCHIO = "https://sailinsight20-app.sapsailing.com/invite"; public static final String SAILINSIGHT_APP_BRANCHIO = "https://sailinsight-app.sapsailing.com/invite"; + public static final String SAILINSIGHT_2_APP_BRANCHIO = "https://sailinsight20-app.sapsailing.com/invite"; + public static final String SAILINSIGHT_3_APP_BRANCHIO = "https://sailinsight30-app.sapsailing.com/invite"; public static final String SAILINSIGHT_APP_BRANCHIO_PATH = "checkinUrl"; public static final String BUOYPINGER_APP_BRANCHIO = "https://buoypinger-app.sapsailing.com/invite"; public static final String BUOYPINGER_APP_BRANCHIO_PATH = "checkinUrl"; public static final String OPEN_REGATTA_2_APP_BRANCHIO = "https://sailinsight20-app.sapsailing.com/publicInvite"; public static final String OPEN_REGATTA_2_APP_BRANCHIO_PATH = "checkinUrl"; + public static final String OPEN_REGATTA_3_APP_BRANCHIO = "https://sailinsight30-app.sapsailing.com/publicInvite"; + public static final String OPEN_REGATTA_3_APP_BRANCHIO_PATH = "checkinUrl"; private BranchIOConstants() { - }; + } } diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/MailInvitationType.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/MailInvitationType.java index 990c29d9ffb..555332fb6db 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/MailInvitationType.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/MailInvitationType.java @@ -3,7 +3,8 @@ package com.sap.sailing.domain.common; public enum MailInvitationType { LEGACY, SailInsight1, - SailInsight2; + SailInsight2, + SailInsight3; public static final String SYSTEM_PROPERTY_NAME = "com.sap.sailing.domain.tracking.MailInvitationType"; } \ No newline at end of file diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/RaceLogServletConstants.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/RaceLogServletConstants.java index 7c0541fd099..8e3018e2e59 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/RaceLogServletConstants.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/RaceLogServletConstants.java @@ -14,4 +14,5 @@ public interface RaceLogServletConstants { static final String PARAMS_COURSE_AREA_FILTER = "courseArea"; static final String PARAMS_TRACK_WIND = "trackWind"; static final String PARAMS_CORRECT_WIND_DIRECTION_BY_MAGNETIC_DECLINATION = "correctWindDirectionByMagneticDeclination"; + static final String PARAMS_TRACKED_RACE_NAME = "trackedRaceName"; } diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/TrackingConnectorType.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/TrackingConnectorType.java new file mode 100644 index 00000000000..272e15e15c1 --- /dev/null +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/tracking/TrackingConnectorType.java @@ -0,0 +1,18 @@ +package com.sap.sailing.domain.common.tracking; + +/** + * Identifies the tracking technology used for a TrackedRace. + */ +public enum TrackingConnectorType { + TracTrac("https://www.tractrac.com/"), SwissTiming(null), RaceLog(null); + + private final String defaultUrl; + + private TrackingConnectorType(String defaultUrl) { + this.defaultUrl = defaultUrl; + } + + public String getDefaultUrl() { + return defaultUrl; + } +} diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java index 1d08d8649e3..3eb80e7824b 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java @@ -129,7 +129,7 @@ public class AbstractGPSFixStoreTest extends RaceLogTrackingTestHelper { /* endDate */null, null, null, "a", null, /* registrationLinkSecret */ UUID.randomUUID().toString())); return new DynamicTrackedRaceImpl(regatta, raceDefinition, Collections. emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0, /* useMarkPassingCalculator */ false, OneDesignRankingMetric::new, - mock(RaceLogAndTrackedRaceResolver.class), null); + mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); } protected void testNumberOfRawFixes(Track track, long expected) { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/RaceLogFixTrackerManagerTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/RaceLogFixTrackerManagerTest.java index 0f9e0df4712..4cdafbe4dfd 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/RaceLogFixTrackerManagerTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/RaceLogFixTrackerManagerTest.java @@ -108,7 +108,7 @@ public class RaceLogFixTrackerManagerTest { /* registrationLinkSecret */ UUID.randomUUID().toString())); trackedRace = new DynamicTrackedRaceImpl(regatta, race, Collections. emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0, /* useMarkPassingCalculator */ false, OneDesignRankingMetric::new, - mock(RaceLogAndTrackedRaceResolver.class), null); + mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); } /** diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreAndLoadTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreAndLoadTest.java index 20c856cf637..49f7536337f 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreAndLoadTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreAndLoadTest.java @@ -173,7 +173,7 @@ public class SensorFixStoreAndLoadTest { /* registrationLinkSecret */ UUID.randomUUID().toString())); trackedRace = new DynamicTrackedRaceImpl(regatta, race, Collections. emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0, /* useMarkPassingCalculator */ false, OneDesignRankingMetric::new, - mock(RaceLogAndTrackedRaceResolver.class), null); + mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); } private void dropPersistedData() { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceStartTimeInferenceTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceStartTimeInferenceTest.java index 7436165f12c..d8736ef0c28 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceStartTimeInferenceTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceStartTimeInferenceTest.java @@ -84,7 +84,7 @@ public class TrackedRaceStartTimeInferenceTest extends AbstractGPSFixStoreTest { final DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race, Collections. emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0, /* useMarkPassingCalculator */ false, - OneDesignRankingMetric::new, mock(RaceLogAndTrackedRaceResolver.class), null); + OneDesignRankingMetric::new, mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); MillisecondsTimePoint startOfRaceInRaceLog = new MillisecondsTimePoint(10000); MillisecondsTimePoint endOfRaceInRaceLog = new MillisecondsTimePoint(20000); @@ -162,7 +162,7 @@ public class TrackedRaceStartTimeInferenceTest extends AbstractGPSFixStoreTest { final DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race, Collections. emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0, /* useMarkPassingCalculator */ false, - OneDesignRankingMetric::new, mock(RaceLogAndTrackedRaceResolver.class), null); + OneDesignRankingMetric::new, mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); trackedRace.attachRaceLog(raceLog); final TimePoint[] oldAndNewStartTimeNotifiedByRace = new TimePoint[2]; trackedRace.addListener(new AbstractRaceChangeListener() { @@ -206,7 +206,7 @@ public class TrackedRaceStartTimeInferenceTest extends AbstractGPSFixStoreTest { final DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race, Collections. emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0, /* useMarkPassingCalculator */ false, - OneDesignRankingMetric::new, mock(RaceLogAndTrackedRaceResolver.class), null); + OneDesignRankingMetric::new, mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); final TimePoint[] oldAndNewStartTimeNotifiedByRace = new TimePoint[2]; trackedRace.addListener(new AbstractRaceChangeListener() { @Override @@ -254,7 +254,7 @@ public class TrackedRaceStartTimeInferenceTest extends AbstractGPSFixStoreTest { final DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race, Collections. emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0, /* useMarkPassingCalculator */ false, - OneDesignRankingMetric::new, mock(RaceLogAndTrackedRaceResolver.class), null); + OneDesignRankingMetric::new, mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); trackedRace.attachRaceLog(raceLog); trackedRace.attachRegattaLog(regattaLog); final TimePoint[] newStartAndEndOfTrackingNotifiedByRace = new TimePoint[2]; @@ -369,7 +369,7 @@ public class TrackedRaceStartTimeInferenceTest extends AbstractGPSFixStoreTest { final DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race, Collections. emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0, /* useMarkPassingCalculator */ false, - OneDesignRankingMetric::new, mock(RaceLogAndTrackedRaceResolver.class), null); + OneDesignRankingMetric::new, mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); trackedRace.attachRaceLog(raceLog); final TimePoint[] oldAndNewStartTimeNotifiedByRace = new TimePoint[2]; trackedRace.addListener(new AbstractRaceChangeListener() { diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO2RaceLogTrackingInvitationMailBuilder.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO2RaceLogTrackingInvitationMailBuilder.java index c102111dab9..a445a6aaa6d 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO2RaceLogTrackingInvitationMailBuilder.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO2RaceLogTrackingInvitationMailBuilder.java @@ -5,7 +5,6 @@ import java.util.Locale; import com.sap.sailing.domain.common.BranchIOConstants; public class BranchIO2RaceLogTrackingInvitationMailBuilder extends BranchIORaceLogTrackingInvitationMailBuilder { - BranchIO2RaceLogTrackingInvitationMailBuilder(Locale locale) { super(locale); } @@ -20,5 +19,4 @@ public class BranchIO2RaceLogTrackingInvitationMailBuilder extends BranchIORaceL // FIXME the app should in the future at some point also support bouy pinging, replace this then return BranchIOConstants.BUOYPINGER_APP_BRANCHIO; } - } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO3RaceLogTrackingInvitationMailBuilder.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO3RaceLogTrackingInvitationMailBuilder.java new file mode 100644 index 00000000000..135beb4b49d --- /dev/null +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/BranchIO3RaceLogTrackingInvitationMailBuilder.java @@ -0,0 +1,24 @@ +package com.sap.sailing.domain.racelogtracking.impl; + +import java.util.Locale; + +import com.sap.sailing.domain.common.BranchIOConstants; + +public class BranchIO3RaceLogTrackingInvitationMailBuilder extends BranchIORaceLogTrackingInvitationMailBuilder { + + BranchIO3RaceLogTrackingInvitationMailBuilder(Locale locale) { + super(locale); + } + + @Override + protected String getSailInsightBranchIO() { + return BranchIOConstants.SAILINSIGHT_3_APP_BRANCHIO; + } + + @Override + protected String getBouyPingerBranchIO() { + // FIXME the app should in the future at some point also support bouy pinging, replace this then + return BranchIOConstants.BUOYPINGER_APP_BRANCHIO; + } + +} diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index 5223eb208a0..abc1f10faef 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -57,6 +57,7 @@ import com.sap.sailing.domain.common.abstractlog.TimePointSpecificationFoundInLo import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState; import com.sap.sailing.domain.common.racelog.tracking.RaceNotCreatedException; +import com.sap.sailing.domain.common.tracking.TrackingConnectorType; import com.sap.sailing.domain.racelog.RaceLogAndTrackedRaceResolver; import com.sap.sailing.domain.regattalike.IsRegattaLike; import com.sap.sailing.domain.tracking.AbstractRaceTrackerBaseImpl; @@ -68,6 +69,7 @@ import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTrack; +import com.sap.sailing.domain.tracking.impl.TrackingConnectorInfoImpl; import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -86,7 +88,6 @@ import difflib.PatchFailedException; */ public class RaceLogRaceTracker extends AbstractRaceTrackerBaseImpl { - private static final String RACE_LOG = "raceLog"; private static final String LOGGER_AND_LOGAUTHOR_NAME = RaceLogRaceTracker.class.getName(); private static final Logger logger = Logger.getLogger(LOGGER_AND_LOGAUTHOR_NAME); @@ -313,7 +314,8 @@ public class RaceLogRaceTracker extends AbstractRaceTrackerBaseImpl { trackedRace = raceTrackingHandler.createTrackedRace(trackedRegatta, raceDef, sidelines, windStore, params.getDelayToLiveInMillis(), WindTrack.DEFAULT_MILLISECONDS_OVER_WHICH_TO_AVERAGE_WIND, boatClass.getApproximateManeuverDurationInMilliseconds(), null, /*useMarkPassingCalculator*/ true, raceLogResolver, - /* Not needed because the RaceTracker is not active on a replica */ Optional.empty(), RACE_LOG); + /* Not needed because the RaceTracker is not active on a replica */ Optional.empty(), + new TrackingConnectorInfoImpl(TrackingConnectorType.RaceLog, /* webUrl */ null)); notifyRaceCreationListeners(); logger.info(String.format("Started tracking race-log race (%s)", raceLog)); // this wakes up all waiting race handles diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index 93af240a594..1d64ae14dc4 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -362,6 +362,9 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { case SailInsight2: mail = new BranchIO2RaceLogTrackingInvitationMailBuilder(locale); break; + case SailInsight3: + mail = new BranchIO3RaceLogTrackingInvitationMailBuilder(locale); + break; default: throw new IllegalArgumentException("Unhandled mail type"); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/EventBase.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/EventBase.java index cd28bc21058..bb7b126b107 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/EventBase.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/EventBase.java @@ -3,7 +3,9 @@ package com.sap.sailing.domain.base; import java.net.URL; import java.util.Locale; import java.util.Map; +import java.util.Set; +import com.sap.sailing.domain.tracking.TrackingConnectorInfo; import com.sap.sse.common.NamedWithID; import com.sap.sse.common.Renamable; import com.sap.sse.common.TimePoint; @@ -107,9 +109,11 @@ public interface EventBase extends NamedWithID, WithDescription, Renamable, With boolean setMediaURLs(Iterable imageURLs, Iterable sponsorImageURLs, Iterable videoURLs, URL logoImageURL, Map imageSizes); /** - * Determines whether the race is tracked by TracTrac or not - * @return a boolean flag, whether any @TrackedRace in the event is tracked by TracTrac or not + * Gets all TrackingConnectorInfos containing information over what TrackingConnectors are involved in tracking this + * event + * + * @return a Set of {@link TrackingConnectorInfo}; the set returned is never {@code null} and never contains + * {@code null} values, but it may be empty */ - boolean isTrackedByTracTrac(); - + Set getTrackingConnectorInfos(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/EventBaseImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/EventBaseImpl.java index d97e3973076..0269bbc6186 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/EventBaseImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/EventBaseImpl.java @@ -56,6 +56,9 @@ public abstract class EventBaseImpl implements EventBase { */ protected EventBaseImpl(String name, TimePoint startDate, TimePoint endDate, Venue venue, boolean isPublic, UUID id) { assert venue != null; + if (startDate != null && endDate != null && startDate.after(endDate)) { + throw new IllegalArgumentException("Event "+name+" cannot start after it ends. Start: "+startDate+", end: "+endDate); + } this.id = id; this.name = name; this.startDate = startDate; @@ -132,6 +135,9 @@ public abstract class EventBaseImpl implements EventBase { @Override public void setStartDate(TimePoint startDate) { + if (startDate != null && getEndDate() != null && getEndDate().before(startDate)) { + throw new IllegalArgumentException("Event start date ("+startDate+") for event "+this+" must not be after end date "+getEndDate()); + } this.startDate = startDate; } @@ -142,6 +148,9 @@ public abstract class EventBaseImpl implements EventBase { @Override public void setEndDate(TimePoint endDate) { + if (endDate != null && getStartDate() != null && getStartDate().after(endDate)) { + throw new IllegalArgumentException("Event end date ("+endDate+") for event "+this+" must not be before start date "+getStartDate()); + } this.endDate = endDate; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/StrippedEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/StrippedEventImpl.java index f2618155583..8c23cdb602c 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/StrippedEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/StrippedEventImpl.java @@ -1,10 +1,12 @@ package com.sap.sailing.domain.base.impl; +import java.util.Set; import java.util.UUID; import com.sap.sailing.domain.base.EventBase; import com.sap.sailing.domain.base.LeaderboardGroupBase; import com.sap.sailing.domain.base.Venue; +import com.sap.sailing.domain.tracking.TrackingConnectorInfo; import com.sap.sse.common.TimePoint; /** @@ -16,20 +18,21 @@ import com.sap.sse.common.TimePoint; * */ public class StrippedEventImpl extends EventBaseImpl { - private static final long serialVersionUID = -8158306909959745156L; - private final boolean isTrackedByTracTrac; + private static final long serialVersionUID = -4443856327974643859L; + private final Set trackingConnectorInfos; private final Iterable leaderboardGroups; public StrippedEventImpl(String name, TimePoint startDate, TimePoint endDate, String venueName, - boolean isPublic, UUID id, Iterable leaderboardGroups, boolean isTrackedByTracTrac) { - this(name, startDate, endDate, new VenueImpl(venueName), isPublic, id, leaderboardGroups, isTrackedByTracTrac); + boolean isPublic, UUID id, Iterable leaderboardGroups, Set trackingConnectorInfos) { + this(name, startDate, endDate, new VenueImpl(venueName), isPublic, id, leaderboardGroups, trackingConnectorInfos); } public StrippedEventImpl(String name, TimePoint startDate, TimePoint endDate, Venue venue, - boolean isPublic, UUID id, Iterable leaderboardGroups, boolean isTrackedByTracTrac) { + boolean isPublic, UUID id, Iterable leaderboardGroups, Set trackingConnectorInfos) { super(name, startDate, endDate, venue, isPublic, id); this.leaderboardGroups = leaderboardGroups; - this.isTrackedByTracTrac = isTrackedByTracTrac; + assert trackingConnectorInfos != null; + this.trackingConnectorInfos = trackingConnectorInfos; } @Override @@ -38,7 +41,7 @@ public class StrippedEventImpl extends EventBaseImpl { } @Override - public boolean isTrackedByTracTrac() { - return isTrackedByTracTrac; + public Set getTrackingConnectorInfos() { + return trackingConnectorInfos; } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/TrackingConnectorInfo.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/TrackingConnectorInfo.java new file mode 100644 index 00000000000..936bfa77c91 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/TrackingConnectorInfo.java @@ -0,0 +1,24 @@ +package com.sap.sailing.domain.tracking; + +import java.io.Serializable; +import java.net.URL; + +import com.sap.sailing.domain.common.tracking.TrackingConnectorType; + +/** + * Identifies the tracking connector that was used to create a TrackedRace. + * Further the Connector can provide a webUrl, that leads to an event web page. + */ +public interface TrackingConnectorInfo extends Serializable { + + /** + * gets the {@link TrackingConnectorType} associated with the tracking technology used for the Race + */ + TrackingConnectorType getTrackingConnectorType(); + + /** + * gets a {@link URL} representation of the web-URL associated with the Event; + * may be {@code null} if the API of the respective Tracking-Service does not provide a URL; + */ + URL getWebUrl(); +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TrackingConnectorInfoImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TrackingConnectorInfoImpl.java new file mode 100644 index 00000000000..65a8a27434c --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/tracking/impl/TrackingConnectorInfoImpl.java @@ -0,0 +1,57 @@ +package com.sap.sailing.domain.tracking.impl; + +import java.net.URL; + +import com.sap.sailing.domain.common.tracking.TrackingConnectorType; +import com.sap.sailing.domain.tracking.TrackingConnectorInfo; + +public class TrackingConnectorInfoImpl implements TrackingConnectorInfo { + private static final long serialVersionUID = 7970268841592389145L; + private final TrackingConnectorType trackingConnectorType; + private final URL webUrl; + + public TrackingConnectorInfoImpl(TrackingConnectorType trackingConnectorType, URL webUrl) { + super(); + this.trackingConnectorType = trackingConnectorType; + this.webUrl = webUrl; + } + + public TrackingConnectorType getTrackingConnectorType() { + return trackingConnectorType; + } + + public URL getWebUrl() { + return webUrl; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((trackingConnectorType == null) ? 0 : trackingConnectorType.hashCode()); + result = prime * result + ((webUrl == null) ? 0 : webUrl.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + TrackingConnectorInfoImpl other = (TrackingConnectorInfoImpl) obj; + if (trackingConnectorType == null) { + if (other.trackingConnectorType != null) + return false; + } else if (!trackingConnectorType.equals(other.trackingConnectorType)) + return false; + if (webUrl == null) { + if (other.webUrl != null) + return false; + } else if (!webUrl.equals(other.webUrl)) + return false; + return true; + } +} diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java index 3380604a8cf..d1cbad97a41 100644 --- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SwissTimingRaceTrackerImpl.java @@ -35,6 +35,7 @@ import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; import com.sap.sailing.domain.common.impl.WindImpl; import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID; import com.sap.sailing.domain.common.tracking.GPSFixMoving; +import com.sap.sailing.domain.common.tracking.TrackingConnectorType; import com.sap.sailing.domain.racelog.RaceLogAndTrackedRaceResolver; import com.sap.sailing.domain.racelog.RaceLogStore; import com.sap.sailing.domain.regattalog.RegattaLogStore; @@ -65,6 +66,7 @@ import com.sap.sailing.domain.tracking.TrackingDataLoader; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.impl.TrackedRaceStatusImpl; +import com.sap.sailing.domain.tracking.impl.TrackingConnectorInfoImpl; import com.sap.sailing.domain.tracking.impl.UpdateHandler; import com.sap.sse.common.Distance; import com.sap.sse.common.TimePoint; @@ -76,7 +78,6 @@ import difflib.PatchFailedException; public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implements SwissTimingRaceTracker, SailMasterListener, TrackingDataLoader { - private static final String SWISS_TIMING = "swissTiming"; private static final Logger logger = Logger.getLogger(SwissTimingRaceTrackerImpl.class.getName()); @@ -495,7 +496,8 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl assert SwissTimingRaceTrackerImpl.this.race == race; } }, useInternalMarkPassingAlgorithm, raceLogResolver, - /* Not needed because the RaceTracker is not active on a replica */ Optional.empty(), SWISS_TIMING); + /* Not needed because the RaceTracker is not active on a replica */ Optional.empty(), + new TrackingConnectorInfoImpl(TrackingConnectorType.SwissTiming, /*no api connection to query the webUrl*/ null)); addUpdateHandlers(); notifyRaceCreationListeners(); logger.info("Created SwissTiming RaceDefinition and TrackedRace for "+race.getName()); diff --git a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayToDomainAdapter.java b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayToDomainAdapter.java index 19b7ef5e172..b2cd3e7dcf6 100755 --- a/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayToDomainAdapter.java +++ b/java/com.sap.sailing.domain.swisstimingreplayadapter/src/com/sap/sailing/domain/swisstimingreplayadapter/impl/SwissTimingReplayToDomainAdapter.java @@ -36,6 +36,7 @@ import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; import com.sap.sailing.domain.common.impl.WindImpl; import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID; import com.sap.sailing.domain.common.tracking.GPSFixMoving; +import com.sap.sailing.domain.common.tracking.TrackingConnectorType; import com.sap.sailing.domain.common.tracking.impl.GPSFixMovingImpl; import com.sap.sailing.domain.racelog.RaceLogAndTrackedRaceResolver; import com.sap.sailing.domain.racelog.RaceLogStore; @@ -58,6 +59,7 @@ import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.impl.EmptyWindStore; import com.sap.sailing.domain.tracking.impl.MarkPassingImpl; import com.sap.sailing.domain.tracking.impl.TrackedRaceStatusImpl; +import com.sap.sailing.domain.tracking.impl.TrackingConnectorInfoImpl; import com.sap.sse.common.Bearing; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; @@ -79,7 +81,6 @@ import difflib.PatchFailedException; * */ public class SwissTimingReplayToDomainAdapter extends SwissTimingReplayAdapter implements TrackingDataLoader { - private static final String SWISS_TIMING = "swissTiming"; private static final int THRESHOLD_FOR_EARLIEST_MARK_PASSING_BEFORE_START_IN_MILLIS = 30000; @@ -410,10 +411,11 @@ public class SwissTimingReplayToDomainAdapter extends SwissTimingReplayAdapter i DynamicTrackedRace trackedRace = raceTrackingHandler.createTrackedRace(getTrackedRegatta(), race, Collections. emptyList(), EmptyWindStore.INSTANCE, TrackedRace.DEFAULT_LIVE_DELAY_IN_MILLISECONDS, - WindTrack.DEFAULT_MILLISECONDS_OVER_WHICH_TO_AVERAGE_WIND, + WindTrack.DEFAULT_MILLISECONDS_OVER_WHICH_TO_AVERAGE_WIND, /* time over which to average speed: */ race.getBoatClass().getApproximateManeuverDurationInMilliseconds(), /* raceDefinitionSetToUpdate */ null, useInternalMarkPassingAlgorithm, raceLogResolver, - /* Not needed because the RaceTracker is not active on a replica */ Optional.empty(), SWISS_TIMING); + /* Not needed because the RaceTracker is not active on a replica */ Optional.empty(), + new TrackingConnectorInfoImpl(TrackingConnectorType.SwissTiming, /*no api connection to query the webUrl*/ null)); trackedRace.onStatusChanged(this, new TrackedRaceStatusImpl(TrackedRaceStatusEnum.LOADING, 0)); TimePoint bestStartTimeKnownSoFar = bestStartTimePerRaceID.get(currentRaceID); if (bestStartTimeKnownSoFar != null) { diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCCertificateImporterJSON.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCCertificateImporterJSON.java index aa5d0347995..59dfc372fee 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCCertificateImporterJSON.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCCertificateImporterJSON.java @@ -9,6 +9,7 @@ import java.io.IOException; import java.net.URL; import org.json.simple.parser.ParseException; +import org.junit.Ignore; import org.junit.Test; import com.sap.sailing.domain.common.orc.ORCCertificate; @@ -26,6 +27,7 @@ public class TestORCCertificateImporterJSON { assertNotNull(milan); } + @Ignore("Certificate used for testing no longer valid after 2019") @Test public void testSimpleOnlineJSONFileRead() throws IOException, ParseException { ORCCertificatesCollection importer = ORCCertificatesImporter.INSTANCE.read(new URL("https://data.orc.org/public/WPub.dll?action=DownRMS&CountryId=GER&ext=json").openStream()); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCCertificateImporterRMS.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCCertificateImporterRMS.java index 1fc517f0d94..04fb90f60d6 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCCertificateImporterRMS.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCCertificateImporterRMS.java @@ -10,6 +10,7 @@ import java.net.URL; import java.util.Collection; import org.json.simple.parser.ParseException; +import org.junit.Ignore; import org.junit.Test; import com.sap.sailing.domain.common.orc.ORCCertificate; @@ -26,6 +27,7 @@ public class TestORCCertificateImporterRMS { assertNotNull(milan); } + @Ignore("Certificate used for testing no longer valid after 2019") @Test public void testSimpleOnlineRMSFileRead() throws IOException, ParseException { ORCCertificatesCollection certificates = ORCCertificatesImporter.INSTANCE.read(new URL("https://data.orc.org/public/WPub.dll?action=DownRMS&CountryId=GER&ext=rms").openStream()); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPerformanceCurve.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPerformanceCurve.java index 8dbd1aa57ca..adb7bfc2944 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPerformanceCurve.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPerformanceCurve.java @@ -17,6 +17,7 @@ import org.apache.commons.math.MaxIterationsExceededException; import org.json.simple.parser.ParseException; import org.junit.Assert; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ErrorCollector; @@ -237,6 +238,7 @@ public class TestORCPerformanceCurve { /** * Tests to make sure, that the structure of the certificate files didn't change and performance curves can be built */ + @Ignore("Certificate used for testing no longer valid after 2019") @Test public void testOnlineImport() throws FunctionEvaluationException { assertFalse(Util.isEmpty(importerOnline.getCertificateIds())); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPublicCertificateDatabase.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPublicCertificateDatabase.java index fb9e6646c22..03180de4dfa 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPublicCertificateDatabase.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/orc/TestORCPublicCertificateDatabase.java @@ -13,6 +13,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import com.sap.sailing.domain.base.impl.BoatClassImpl; @@ -85,7 +86,7 @@ public class TestORCPublicCertificateDatabase { assertEquals(handle.getSailNumber(), result.getSailNumber()); } - // TODO this test will probably break 2020 when 2019 certificates will no longer be returned as valid... + @Ignore("Certificate used for testing no longer valid after 2019") @Test public void testParallelFuzzySearch() throws InterruptedException, ExecutionException { final Future> soulmateCertificatesFuture = db.search("Soulmate", "DEN13", new BoatClassImpl("ORC", BoatClassMasterdata.ORC)); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseTest.java index f7d7b010571..06c1def9398 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseTest.java @@ -317,7 +317,7 @@ public class CourseTest { Collections. emptyList(), EmptyWindStore.INSTANCE, /* delayToLiveInMillis */3000, /* millisecondsOverWhichToAverageWind */30000, /* millisecondsOverWhichToAverageSpeed */8000, /*useMarkPassingCalculator*/ false, OneDesignRankingMetric::new, - mock(RaceLogAndTrackedRaceResolver.class), null); + mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); assertLegStructure(course, trackedRace); course.removeWaypoint(0); assertLegStructure(course, trackedRace); @@ -353,7 +353,7 @@ public class CourseTest { EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 3000, /* millisecondsOverWhichToAverageWind */ 30000, /* millisecondsOverWhichToAverageSpeed */ 8000, /*useMarkPassingCalculator*/ false, OneDesignRankingMetric::new, - mock(RaceLogAndTrackedRaceResolver.class), null); + mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); assertLegStructure(course, trackedRace); final WaypointImpl wp1_5 = new WaypointImpl(new MarkImpl("Test Mark 1.5")); assertWaypointIndexes(course); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseUpdateDuringNonAtomicSerializationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseUpdateDuringNonAtomicSerializationTest.java index 9af6d89a18a..d38a049e397 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseUpdateDuringNonAtomicSerializationTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CourseUpdateDuringNonAtomicSerializationTest.java @@ -87,7 +87,8 @@ public class CourseUpdateDuringNonAtomicSerializationTest implements Serializabl trackedRace = new DynamicTrackedRaceImpl(trackedRegatta, race, Collections. emptySet(), EmptyWindStore.INSTANCE, /* delayToLiveInMillis */10000, /* millisecondsOverWhichToAverageWind */30000, /* millisecondsOverWhichToAverageSpeed */ - 7000, /*useMarkPassingCalculator*/ false, OneDesignRankingMetric::new, mock(RaceLogAndTrackedRaceResolver.class), null) { + 7000, /* useMarkPassingCalculator */ false, OneDesignRankingMetric::new, + mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null) { private static final long serialVersionUID = 9114777576548711763L; @Override diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java index c2e9f0c5bf9..72f2100a9d6 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java @@ -152,7 +152,7 @@ public class LeaderboardCourseChangeTest { TrackedRace spyedTrackedRace = spy(new DynamicTrackedRaceImpl(mockedTrackedRegatta, mockedRace, new HashSet(), EmptyWindStore.INSTANCE, 5000, 20000, 20000, /* useMarkPassingCalculator */ false, OneDesignRankingMetric::new, - mock(RaceLogAndTrackedRaceResolver.class), null)); + mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null)); return spyedTrackedRace; } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SerializeRankingMetricTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SerializeRankingMetricTest.java index 2bb6aa5c1ff..d6d0c5e6dac 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SerializeRankingMetricTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/SerializeRankingMetricTest.java @@ -42,7 +42,7 @@ public class SerializeRankingMetricTest extends AbstractSerializationTest { new RaceDefinitionImpl("Race", new CourseImpl("Course", Collections.emptyList()) , /* boatClass */ _49er, Collections.emptyMap()), Collections. emptyList(), EmptyWindStore.INSTANCE, 0l, 0l, 0l, - false, TimeOnTimeAndDistanceRankingMetric::new, null, null); + false, TimeOnTimeAndDistanceRankingMetric::new, null, /* trackingConnectorInfo */ null); RankingMetric clone = cloneBySerialization(trackedRace.getRankingMetric(), DomainFactory.INSTANCE); assertNotNull(clone); assertTrue(clone instanceof TimeOnTimeAndDistanceRankingMetric); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StarbordSideOfStartLineRecognitionTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StarbordSideOfStartLineRecognitionTest.java index 1ca536476f4..414785581e3 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StarbordSideOfStartLineRecognitionTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StarbordSideOfStartLineRecognitionTest.java @@ -91,7 +91,7 @@ public class StarbordSideOfStartLineRecognitionTest { public MockedTrackedRaceImpl() { super(null, null, Collections. emptyList(), null, 0, 0, 0, 0, false, OneDesignRankingMetric::new, - mock(RaceLogAndTrackedRaceResolver.class), null); + mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); } @Override 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 bb4428e912e..d4edf4f0386 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 @@ -201,7 +201,7 @@ public abstract class TrackBasedTest { /* delayToLiveInMillis */ 0, /* millisecondsOverWhichToAverageWind */ 30000, /* millisecondsOverWhichToAverageSpeed */ 30000, /* delay for wind estimation cache invalidation */ 0, useMarkPassingCalculator, - rankingMetricConstructor, raceLogResolver, null); + rankingMetricConstructor, raceLogResolver, /* trackingConnectorInfo */ null); // 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 timed diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/UpdateMarkPassingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/UpdateMarkPassingTest.java index d91a48135ac..a8c5fd69094 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/UpdateMarkPassingTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/UpdateMarkPassingTest.java @@ -47,12 +47,13 @@ public class UpdateMarkPassingTest { when(race.getBoatClass()).thenReturn(new BoatClassImpl("49er", /* typicallyStartsUpwind */ true)); when(race.getCompetitors()).thenReturn(Collections.singleton(competitor)); DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl( - /* trackedRegatta */new DynamicTrackedRegattaImpl(new RegattaImpl("test", null, true, CompetitorRegistrationType.CLOSED, null, null, new HashSet(), false, null, - "test", null, OneDesignRankingMetric::new, - /* registrationLinkSecret */ UUID.randomUUID().toString())), - race, Collections. emptyList(), EmptyWindStore.INSTANCE, - /* delayToLiveInMillis */1000, /* millisecondsOverWhichToAverageWind */30000, - /* millisecondsOverWhichToAverageSpeed */30000, /*useMarkPassingCalculator*/ false, OneDesignRankingMetric::new, mock(RaceLogAndTrackedRaceResolver.class), null); + /* trackedRegatta */new DynamicTrackedRegattaImpl(new RegattaImpl("test", null, true, + CompetitorRegistrationType.CLOSED, null, null, new HashSet(), false, null, "test", null, + OneDesignRankingMetric::new, /* registrationLinkSecret */ UUID.randomUUID().toString())), + race, Collections. emptyList(), EmptyWindStore.INSTANCE, /* delayToLiveInMillis */1000, + /* millisecondsOverWhichToAverageWind */30000, /* millisecondsOverWhichToAverageSpeed */30000, + /* useMarkPassingCalculator */ false, OneDesignRankingMetric::new, + mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); TimePoint now = MillisecondsTimePoint.now(); TimePoint later = now.plus(1000); trackedRace.updateMarkPassings(competitor, Arrays.asList(new MarkPassing[] { new MarkPassingImpl(now, waypoint, competitor) })); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java index e5ee6145e4b..36995d20702 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java @@ -317,7 +317,7 @@ public class WindTest { EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 1000, /* millisecondsOverWhichToAverageWind */ 30000, /* millisecondsOverWhichToAverageSpeed */ 30000, /*useMarkPassingCalculator*/ false, OneDesignRankingMetric::new, - mock(RaceLogAndTrackedRaceResolver.class), null); + mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); TimePoint start = MillisecondsTimePoint.now(); TimePoint topMarkRounding = start.plus(30000); TimePoint finish = topMarkRounding.plus(30000); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractExportedPositionsBasedTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractExportedPositionsBasedTest.java index 0a022f16639..2020db4428c 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractExportedPositionsBasedTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractExportedPositionsBasedTest.java @@ -105,8 +105,9 @@ public abstract class AbstractExportedPositionsBasedTest { competitorsAndBoats, UUID.randomUUID()), /* sidelines */ Collections.emptySet(), EmptyWindStore.INSTANCE, - /* delayToLiveInMillis */ 3000, /* millisecondsOverWhichToAverageWind */ 15000, /* millisecondsOverWhichToAverageSpeed */ 10000, - /* useInternalMarkPassingAlgorithm */ true, OneDesignRankingMetric::new, /* raceLogResolver */ null, null); + /* delayToLiveInMillis */ 3000, /* millisecondsOverWhichToAverageWind */ 15000, + /* millisecondsOverWhichToAverageSpeed */ 10000, /* useInternalMarkPassingAlgorithm */ true, + OneDesignRankingMetric::new, /* raceLogResolver */ null, /* trackingConnectorInfo */ null); result.setStatus(new TrackedRaceStatusImpl(TrackedRaceStatusEnum.LOADING, 0.0)); for (final Entry> e : competitorsAndTheirTracks.entrySet()) { final DynamicGPSFixTrack track = result.getTrack(e.getKey()); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMockedRaceMarkPassingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMockedRaceMarkPassingTest.java index 72f500b09d9..050f92b5817 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMockedRaceMarkPassingTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMockedRaceMarkPassingTest.java @@ -88,7 +88,7 @@ public class AbstractMockedRaceMarkPassingTest { race = new DynamicTrackedRaceImpl(new DynamicTrackedRegattaImpl(r), raceDef, new ArrayList(), new EmptyWindStore(), 0, 10000, 10000, /* useMarkPassingCalculator */ false, OneDesignRankingMetric::new, - mock(RaceLogAndTrackedRaceResolver.class), null); + mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); race.setStartTimeReceived(new MillisecondsTimePoint(10000)); TimePoint t = new MillisecondsTimePoint(30000); List> pos = Arrays.asList(new Util.Pair(m, new DegreePosition(0, 0)), 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 f3ea1f9f0e9..1ffb6d35f77 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 @@ -77,6 +77,7 @@ 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.TrackingConnectorInfo; import com.sap.sailing.domain.tracking.TrackingDataLoader; import com.sap.sailing.domain.tracking.WindLegTypeAndLegBearingAndORCPerformanceCurveCache; import com.sap.sailing.domain.tracking.WindPositionMode; @@ -657,7 +658,9 @@ public class MockedTrackedRace implements DynamicTrackedRace { WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, boolean useMarkPassingcalculator, - RaceLogAndTrackedRaceResolver raceLogResolver, Optional threadLocalTransporter, String trackingConnector) { + RaceLogAndTrackedRaceResolver raceLogResolver, + Optional threadLocalTransporter, + TrackingConnectorInfo trackingConnectorInfo) { return null; } @@ -1285,7 +1288,7 @@ public class MockedTrackedRace implements DynamicTrackedRace { } @Override - public String getTrackingConnector() { + public TrackingConnectorInfo getTrackingConnectorInfo() { 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 a6a4c6b5646..4fffd15d98a 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 @@ -58,6 +58,7 @@ 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.TrackedRegatta; +import com.sap.sailing.domain.tracking.TrackingConnectorInfo; import com.sap.sailing.domain.tracking.WindLegTypeAndLegBearingAndORCPerformanceCurveCache; import com.sap.sailing.domain.tracking.WindPositionMode; import com.sap.sailing.domain.tracking.WindStore; @@ -809,7 +810,7 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace { } @Override - public String getTrackingConnector() { + public TrackingConnectorInfo getTrackingConnectorInfo() { return null; } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaTest.java index fbfa90f9ea1..c2714cd837c 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/tracking/impl/TrackedRegattaTest.java @@ -122,6 +122,6 @@ public class TrackedRegattaTest { RaceDefinition race1 = new RaceDefinitionImpl(name, course, boatClass, Collections.emptyMap()); return new DynamicTrackedRaceImpl(regatta, race1, Collections. emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0, /* useMarkPassingCalculator */ false, OneDesignRankingMetric::new, - mock(RaceLogAndTrackedRaceResolver.class), null); + mock(RaceLogAndTrackedRaceResolver.class), /* trackingConnectorInfo */ null); } } diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java index a87939405b3..dfc76393196 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java @@ -55,6 +55,7 @@ import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.tracking.GPSFixMoving; +import com.sap.sailing.domain.common.tracking.TrackingConnectorType; import com.sap.sailing.domain.common.tracking.impl.GPSFixMovingImpl; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; @@ -74,11 +75,13 @@ import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters; import com.sap.sailing.domain.tracking.RaceTrackingHandler; import com.sap.sailing.domain.tracking.TrackedRegatta; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; +import com.sap.sailing.domain.tracking.TrackingConnectorInfo; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.impl.FinishTimeUpdateHandler; import com.sap.sailing.domain.tracking.impl.RaceAbortedHandler; import com.sap.sailing.domain.tracking.impl.StartTimeUpdateHandler; +import com.sap.sailing.domain.tracking.impl.TrackingConnectorInfoImpl; import com.sap.sailing.domain.tractracadapter.DomainFactory; import com.sap.sailing.domain.tractracadapter.JSONService; import com.sap.sailing.domain.tractracadapter.MetadataParser; @@ -116,7 +119,6 @@ import com.tractrac.subscription.lib.api.SubscriberInitializationException; import difflib.PatchFailedException; public class DomainFactoryImpl implements DomainFactory { - public static final String TRAC_TRAC = "tracTrac"; private static final Logger logger = Logger.getLogger(DomainFactoryImpl.class.getName()); @@ -641,9 +643,13 @@ public class DomainFactoryImpl implements DomainFactory { // add to existing regatta only if boat class matches if (raceDefinition.getBoatClass() == trackedRegatta.getRegatta().getBoatClass()) { trackedRegatta.getRegatta().addRace(raceDefinition); + TrackingConnectorInfo trackingConnectorInfo = null; + if (tractracRace != null) { + trackingConnectorInfo = new TrackingConnectorInfoImpl(TrackingConnectorType.TracTrac, tractracRace.getEvent().getWebURL()); + } trackedRace = createTrackedRace(trackedRegatta, raceDefinition, sidelines, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, raceDefinitionSetToUpdate, ignoreTracTracMarkPassings, - raceLogResolver, raceTrackingHandler); + raceLogResolver, raceTrackingHandler, trackingConnectorInfo); logger.info("Added race " + raceDefinition + " to regatta " + trackedRegatta.getRegatta()); if (runBeforeExposingRace != null) { logger.fine("Running callback for tracked race creation for "+trackedRace.getRace()); @@ -740,11 +746,13 @@ public class DomainFactoryImpl implements DomainFactory { private DynamicTrackedRace createTrackedRace(TrackedRegatta trackedRegatta, RaceDefinition race, Iterable sidelines, WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, - boolean useMarkPassingCalculator, RaceLogAndTrackedRaceResolver raceLogResolver, RaceTrackingHandler raceTrackingHandler) { + boolean useMarkPassingCalculator, RaceLogAndTrackedRaceResolver raceLogResolver, + RaceTrackingHandler raceTrackingHandler, TrackingConnectorInfo trackingConnectorInfo) { return raceTrackingHandler.createTrackedRace(trackedRegatta, race, sidelines, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, /* time over which to average speed: */ race.getBoatClass().getApproximateManeuverDurationInMilliseconds(), - raceDefinitionSetToUpdate, useMarkPassingCalculator, raceLogResolver, Optional.empty(), TRAC_TRAC); + raceDefinitionSetToUpdate, useMarkPassingCalculator, raceLogResolver, Optional.empty(), + trackingConnectorInfo); } /** diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceCourseReceiver.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceCourseReceiver.java index 9b92dad5992..8f833a0bd6f 100755 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceCourseReceiver.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/RaceCourseReceiver.java @@ -20,6 +20,7 @@ import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Sideline; import com.sap.sailing.domain.common.PassingInstruction; +import com.sap.sailing.domain.common.tracking.TrackingConnectorType; import com.sap.sailing.domain.leaderboard.LeaderboardGroupResolver; import com.sap.sailing.domain.racelog.RaceLogAndTrackedRaceResolver; import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet; @@ -28,6 +29,7 @@ import com.sap.sailing.domain.tracking.DynamicTrackedRegatta; import com.sap.sailing.domain.tracking.RaceTrackingHandler; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.WindStore; +import com.sap.sailing.domain.tracking.impl.TrackingConnectorInfoImpl; import com.sap.sailing.domain.tractracadapter.DomainFactory; import com.sap.sailing.domain.tractracadapter.TracTracControlPoint; import com.sap.sse.common.TimePoint; @@ -269,7 +271,7 @@ public class RaceCourseReceiver extends AbstractReceiverWithQueue getTrackingConnectorInfos() { + final Set result = new HashSet<>(); for (LeaderboardGroup lbg : this.getLeaderboardGroups()) { for (Leaderboard lb : lbg.getLeaderboards()) { - //Leaderboard.getTrackedRaces() could lead to performance issues due to duplicative collection of TrackedRaces for (TrackedRace tr : lb.getTrackedRaces()) { - if("tracTrac".equals(tr.getTrackingConnector())){ - return true; + final TrackingConnectorInfo trackingConnectorInfo = tr.getTrackingConnectorInfo(); + if (trackingConnectorInfo != null) { + result.add(trackingConnectorInfo); } } } } - return false; + return result; } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/impl/ORCPublicCertificateDatabaseImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/impl/ORCPublicCertificateDatabaseImpl.java index af8e896ea81..94e7934e358 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/impl/ORCPublicCertificateDatabaseImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/orc/impl/ORCPublicCertificateDatabaseImpl.java @@ -7,6 +7,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Base64; import java.util.Calendar; +import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.HashSet; @@ -330,7 +331,7 @@ public class ORCPublicCertificateDatabaseImpl implements ORCPublicCertificateDat builder = child.getTextContent(); break; case "dxtDate": - issueDate = new MillisecondsTimePoint(isoTimestampFormat.parse(child.getTextContent()+"+0000")); // assume UTC + issueDate = new MillisecondsTimePoint(parseDate(child.getTextContent())); // assume UTC break; case "CertType": certType = Integer.valueOf(child.getTextContent().trim()); @@ -350,6 +351,19 @@ public class ORCPublicCertificateDatabaseImpl implements ORCPublicCertificateDat sailNumber, boatClassName, designer, builder, yearBuilt, issueDate, certType, isOneDesign, isProvisional); } + private Date parseDate(String dateString) throws ParseException { + StringBuilder stringBuilder = new StringBuilder(dateString); + char timeZoneCharacter = stringBuilder.charAt(stringBuilder.length()-1); + if(timeZoneCharacter== 'z' || timeZoneCharacter == 'Z'|| timeZoneCharacter == 'X') { + stringBuilder.deleteCharAt(stringBuilder.length()-1); + } + if(false == stringBuilder.toString().contains("+")) { + stringBuilder.append("+0000"); + } + + return isoTimestampFormat.parse(stringBuilder.toString()); + } + @Override public ORCCertificate getCertificate(String referenceNumber) throws Exception { final HttpClient client = new SystemDefaultHttpClient(); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DummyTrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DummyTrackedRace.java index 2764f7d3a35..9d24e614996 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DummyTrackedRace.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/DummyTrackedRace.java @@ -747,7 +747,7 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials { } @Override - public String getTrackingConnector() { + public TrackingConnectorInfo getTrackingConnectorInfo() { return null; } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceTrackingHandler.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceTrackingHandler.java index b45798a8972..12db12eb574 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceTrackingHandler.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/RaceTrackingHandler.java @@ -35,8 +35,9 @@ public interface RaceTrackingHandler { Iterable sidelines, WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, boolean useMarkPassingCalculator, - RaceLogAndTrackedRaceResolver raceLogResolver, Optional threadLocalTransporter, String trackingConnector); - + RaceLogAndTrackedRaceResolver raceLogResolver, Optional threadLocalTransporter, + TrackingConnectorInfo trackingConnectorInfo); + DynamicCompetitor getOrCreateCompetitor(CompetitorAndBoatStore competitorAndBoatStore, Serializable competitorId, String name, String shortName, Color displayColor, String email, URI flagImageURI, DynamicTeam team, Double timeOnTimeFactor, Duration timeOnDistanceAllowancePerNauticalMile, String searchTag); @@ -58,10 +59,11 @@ public interface RaceTrackingHandler { Iterable sidelines, WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, boolean useMarkPassingCalculator, - RaceLogAndTrackedRaceResolver raceLogResolver, Optional threadLocalTransporter, String trackingConnector) { + RaceLogAndTrackedRaceResolver raceLogResolver, Optional threadLocalTransporter, + TrackingConnectorInfo trackingConnectorInfo) { return trackedRegatta.createTrackedRace(raceDefinition, sidelines, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, raceDefinitionSetToUpdate, - useMarkPassingCalculator, raceLogResolver, threadLocalTransporter, trackingConnector); + useMarkPassingCalculator, raceLogResolver, threadLocalTransporter, trackingConnectorInfo); } @Override 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 0c96eb3c7bd..cfee4b6970a 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 @@ -1249,7 +1249,8 @@ public interface TrackedRace } /** - * gets a String representation of the Tracking-Service used to Track the Race + * gets a {@link TrackingConnectorInfo}, which contains a String representation of the Tracking-Service used to Track the Race and a web-URL for the Event Event; + * may be {@code null}, particularly in test set-ups */ - String getTrackingConnector(); + TrackingConnectorInfo getTrackingConnectorInfo(); } 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 f8d4597d0cf..e74c0aca25d 100644 --- 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 @@ -67,7 +67,7 @@ public interface TrackedRegatta extends Serializable { DynamicTrackedRace createTrackedRace(RaceDefinition raceDefinition, Iterable sidelines, WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, boolean useInternalMarkPassingAlgorithm, RaceLogAndTrackedRaceResolver raceLogResolver, - Optional beforeAndAfterNotificationHandler, String trackingConnector); + Optional beforeAndAfterNotificationHandler, TrackingConnectorInfo trackingConnectorInfo); /** * Obtains the tracked race for race. Blocks until the tracked race has been created 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 f5c181530e8..c251764888d 100644 --- 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 @@ -64,6 +64,7 @@ import com.sap.sailing.domain.tracking.TrackFactory; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedRaceStatus; import com.sap.sailing.domain.tracking.TrackedRegatta; +import com.sap.sailing.domain.tracking.TrackingConnectorInfo; import com.sap.sailing.domain.tracking.TrackingDataLoader; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTrack; @@ -119,10 +120,10 @@ DynamicTrackedRace, GPSTrackListener { WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, long delayForCacheInvalidationOfWindEstimation, boolean useInternalMarkPassingAlgorithm, RankingMetricConstructor rankingMetricConstructor, - RaceLogAndTrackedRaceResolver raceLogResolver, String trackingConnector) { + RaceLogAndTrackedRaceResolver raceLogResolver, TrackingConnectorInfo trackingConnectorInfo) { super(trackedRegatta, race, sidelines, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, delayForCacheInvalidationOfWindEstimation, - useInternalMarkPassingAlgorithm, rankingMetricConstructor, raceLogResolver, trackingConnector); + useInternalMarkPassingAlgorithm, rankingMetricConstructor, raceLogResolver, trackingConnectorInfo); raceStateBasedStartTimeChangedListener = createRaceStateStartTimeChangeListener(); this.competitorResultsFromRaceLog = new HashMap<>(); this.logListener = new DynamicTrackedRaceLogListener(this); @@ -210,10 +211,10 @@ DynamicTrackedRace, GPSTrackListener { public DynamicTrackedRaceImpl(TrackedRegatta trackedRegatta, RaceDefinition race, Iterable sidelines, WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, boolean useInternalMarkPassingAlgorithm, - RankingMetricConstructor rankingMetricConstructor, RaceLogAndTrackedRaceResolver raceLogResolver, String trackingConnector) { + RankingMetricConstructor rankingMetricConstructor, RaceLogAndTrackedRaceResolver raceLogResolver, TrackingConnectorInfo trackingConnectorInfo) { this(trackedRegatta, race, sidelines, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, - millisecondsOverWhichToAverageWind / 2, useInternalMarkPassingAlgorithm, rankingMetricConstructor, raceLogResolver, trackingConnector); + millisecondsOverWhichToAverageWind / 2, useInternalMarkPassingAlgorithm, rankingMetricConstructor, raceLogResolver, trackingConnectorInfo); } @Override 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 087e1d30074..5cd3a7795ed 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 @@ -144,6 +144,7 @@ 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; +import com.sap.sailing.domain.tracking.TrackingConnectorInfo; import com.sap.sailing.domain.tracking.WindLegTypeAndLegBearingAndORCPerformanceCurveCache; import com.sap.sailing.domain.tracking.WindPositionMode; import com.sap.sailing.domain.tracking.WindStore; @@ -188,7 +189,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl private TrackedRaceStatus status; - private final String trackingConnector; + private final TrackingConnectorInfo trackingConnectorInfo; private final Object statusNotifier; @@ -434,10 +435,10 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl public TrackedRaceImpl(final TrackedRegatta trackedRegatta, RaceDefinition race, final Iterable sidelines, final WindStore windStore, long delayToLiveInMillis, final long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, long delayForWindEstimationCacheInvalidation, - boolean useInternalMarkPassingAlgorithm, RaceLogAndTrackedRaceResolver raceLogResolver, String trackedBy) { + boolean useInternalMarkPassingAlgorithm, RaceLogAndTrackedRaceResolver raceLogResolver, TrackingConnectorInfo trackingConnectorInfo) { this(trackedRegatta, race, sidelines, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, delayForWindEstimationCacheInvalidation, - useInternalMarkPassingAlgorithm, OneDesignRankingMetric::new, raceLogResolver, trackedBy); + useInternalMarkPassingAlgorithm, OneDesignRankingMetric::new, raceLogResolver, trackingConnectorInfo); } /** @@ -451,10 +452,10 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl final WindStore windStore, long delayToLiveInMillis, final long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, long delayForWindEstimationCacheInvalidation, boolean useInternalMarkPassingAlgorithm, RankingMetricConstructor rankingMetricConstructor, - RaceLogAndTrackedRaceResolver raceLogResolver, String trackingConnector) { + RaceLogAndTrackedRaceResolver raceLogResolver, TrackingConnectorInfo trackingConnectorInfo) { super(race, trackedRegatta, windStore, millisecondsOverWhichToAverageWind); this.raceLogResolver = raceLogResolver; - this.trackingConnector = trackingConnector; + this.trackingConnectorInfo = trackingConnectorInfo; raceStates = new WeakHashMap<>(); shortTimeWindCache = new ShortTimeWindCache(this, millisecondsOverWhichToAverageWind / 2); locksForMarkPassings = new ConcurrentHashMap>, NamedReentrantReadWriteLock>(); @@ -3974,7 +3975,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl } @Override - public String getTrackingConnector() { - return trackingConnector; + public TrackingConnectorInfo getTrackingConnectorInfo() { + return trackingConnectorInfo; } } 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 2d8a8aebdc7..248ec42687e 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.DynamicTrackedRace; import com.sap.sailing.domain.tracking.RaceListener; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegatta; +import com.sap.sailing.domain.tracking.TrackingConnectorInfo; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; @@ -321,13 +322,13 @@ public class TrackedRegattaImpl implements TrackedRegatta { WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, boolean useInternalMarkPassingAlgorithm, RaceLogAndTrackedRaceResolver raceLogResolver, - Optional threadLocalTransporter, String trackingConnector) { + Optional threadLocalTransporter, TrackingConnectorInfo trackingConnectorInfo) { logger.log(Level.INFO, "Creating DynamicTrackedRaceImpl for RaceDefinition " + raceDefinition.getName()); DynamicTrackedRaceImpl result = new DynamicTrackedRaceImpl(this, raceDefinition, sidelines, windStore, delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed, /* useMarkPassingCalculator */useInternalMarkPassingAlgorithm, getRegatta().getRankingMetricConstructor(), raceLogResolver, - trackingConnector); + trackingConnectorInfo); // adding the raceDefinition to the raceDefinitionSetToUpdate BEFORE calling addTrackedRace helps those who // are called back by RaceListener.raceAdded(TrackedRace) and who then expect the update to have happened if (raceDefinitionSetToUpdate != 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 37fe512cfc9..c315d53b311 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 @@ -64,6 +64,7 @@ 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.TrackingConnectorInfo; import com.sap.sailing.domain.tracking.TrackingDataLoader; import com.sap.sailing.domain.tracking.WindLegTypeAndLegBearingAndORCPerformanceCurveCache; import com.sap.sailing.domain.tracking.WindPositionMode; @@ -336,7 +337,7 @@ public class MockedTrackedRace implements DynamicTrackedRace { public DynamicTrackedRace createTrackedRace(RaceDefinition raceDefinition, Iterable sidelines, WindStore windStore, long delayToLiveInMillis, long millisecondsOverWhichToAverageWind, long millisecondsOverWhichToAverageSpeed, DynamicRaceDefinitionSet raceDefinitionSetToUpdate, - boolean useMarkPassingCalculator, RaceLogAndTrackedRaceResolver raceLogResolver, Optional threadLocalTransporter, String trackingConnector) { + boolean useMarkPassingCalculator, RaceLogAndTrackedRaceResolver raceLogResolver, Optional threadLocalTransporter, TrackingConnectorInfo trackingConnectorInfo) { return null; } @@ -962,7 +963,7 @@ public class MockedTrackedRace implements DynamicTrackedRace { } @Override - public String getTrackingConnector() { + public TrackingConnectorInfo getTrackingConnectorInfo() { return null; } diff --git a/java/com.sap.sailing.gwt.ui/RaceBoard.css b/java/com.sap.sailing.gwt.ui/RaceBoard.css index 3f1498b8616..2d4143de0b4 100755 --- a/java/com.sap.sailing.gwt.ui/RaceBoard.css +++ b/java/com.sap.sailing.gwt.ui/RaceBoard.css @@ -697,6 +697,15 @@ img.openColumn { color: white; } +.RegattaAndRaceTime-Header_with_databy { + top: 3px; +} + +.compactHeader .RegattaAndRaceTime-Header.RegattaAndRaceTime-Header_with_databy { + top: 0; + font-size: 90%; +} + .RegattaAndRaceTime-Header .RegattaName-Anchor { font-size: 15px; color: white; @@ -717,6 +726,14 @@ img.openColumn { margin-top: 5px; } +.compactHeader .RegattaAndRaceTime-Header>* { + margin-top: 3px; +} + +.RegattaAndRaceTime-Header_with_databy .RegattaName-Anchor, .RegattaAndRaceTime-Header_with_databy .RaceTime-Label { + font-size: 13px; +} + .compactHeader .RegattaRaceInformation-Header { left: 110px; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/nodes/LiveRaceBoardNode.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/nodes/LiveRaceBoardNode.java index b166d2a8cff..547a162f726 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/nodes/LiveRaceBoardNode.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/nodes/LiveRaceBoardNode.java @@ -77,7 +77,7 @@ public class LiveRaceBoardNode extends FiresPlaceNode implements RaceTimesInfoPr /** leaderboardGroupName */ null, /** eventId */ null, cf.getErrorReporter(), StringMessages.INSTANCE, null, raceTimesInfoProvider, true, false, - Arrays.asList(DetailType.values()), result.getLeaderboard(), result.getRace()); + Arrays.asList(DetailType.values()), result.getLeaderboard(), result.getRace(), result.getTrackingConnectorInfo()); setPlaceToGo(new LiveRaceWithRaceboardPlace(raceboardPerspective)); firePlaceChangeAndStartTimer(); getBus().fireEvent(new AutoPlayHeaderEvent(cf.getAutoPlayCtxSignalError().getLifeOrPreLiveRace().getRegattaName(), diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/event/GetEventViewAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/event/GetEventViewAction.java index 955a8edd2d9..714e7075b55 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/event/GetEventViewAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/event/GetEventViewAction.java @@ -8,6 +8,7 @@ import java.util.Set; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; import com.google.gwt.core.shared.GwtIncompatible; import com.sap.sailing.domain.base.Event; @@ -22,6 +23,7 @@ import com.sap.sailing.gwt.home.server.EventActionUtil; import com.sap.sailing.gwt.home.server.EventActionUtil.LeaderboardCallback; import com.sap.sailing.gwt.home.server.LeaderboardContext; import com.sap.sailing.gwt.server.HomeServiceUtil; +import com.sap.sailing.gwt.ui.shared.TrackingConnectorInfoDTO; import com.sap.sse.common.Util; import com.sap.sse.common.media.MediaTagConstants; import com.sap.sse.gwt.dispatch.shared.caching.IsClientCacheable; @@ -118,8 +120,10 @@ public class GetEventViewAction implements SailingAction, IsClient singleLeaderboardGroup.getId(), eventAndLeaderboardReferencesForSeriesOrdered)); } } - dto.setTrackedByTracTrac(event.isTrackedByTracTrac()); + Set trackingConnectorInfos = event.getTrackingConnectorInfos().stream() + .map(TrackingConnectorInfoDTO::new).collect(Collectors.toSet()); + dto.setTrackingConnectorInfos(trackingConnectorInfos); return dto; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/eventview/EventViewDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/eventview/EventViewDTO.java index 9bb2b3035ed..60d4ced9353 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/eventview/EventViewDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/eventview/EventViewDTO.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.TreeSet; import com.sap.sailing.domain.common.WindSource; @@ -11,6 +12,7 @@ import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.windfinder.SpotDTO; import com.sap.sailing.gwt.home.communication.event.EventMetadataDTO; import com.sap.sailing.gwt.home.communication.event.HasLogo; +import com.sap.sailing.gwt.ui.shared.TrackingConnectorInfoDTO; import com.sap.sse.common.Util; import com.sap.sse.gwt.client.media.ImageDTO; import com.sap.sse.gwt.dispatch.shared.commands.Result; @@ -27,7 +29,7 @@ public class EventViewDTO extends EventMetadataDTO implements Result, HasLogo { private String sailorsInfoWebsiteURL; private String description; private List allWindFinderSpotIdsUsedByEvent; - private boolean isTrackedByTracTrac; + private Set trackingConnectorInfos; public Collection getRegattas() { @@ -143,12 +145,12 @@ public class EventViewDTO extends EventMetadataDTO implements Result, HasLogo { public boolean isMultiRegatta() { return multiRegatta; } - - public boolean isTrackedByTracTrac() { - return isTrackedByTracTrac; + + public Set getTrackingConnectorInfos() { + return trackingConnectorInfos; } - - public void setTrackedByTracTrac(boolean isTrackedByTracTrac) { - this.isTrackedByTracTrac = isTrackedByTracTrac; + + public void setTrackingConnectorInfos(Set trackingConnectorInfo) { + this.trackingConnectorInfos = trackingConnectorInfo; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/start/EventStageDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/start/EventStageDTO.java index c269e5b59a8..be592d865c2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/start/EventStageDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/start/EventStageDTO.java @@ -1,13 +1,15 @@ package com.sap.sailing.gwt.home.communication.start; +import java.util.Set; + import com.sap.sailing.gwt.home.communication.event.EventLinkAndMetadataDTO; +import com.sap.sailing.gwt.ui.shared.TrackingConnectorInfoDTO; public class EventStageDTO extends EventLinkAndMetadataDTO { private StageEventType stageType; private String stageImageURL; - private boolean isTrackedByTracTrac; - + private Set trackingConnectorInfo; @Override public StageEventType getStageType() { @@ -25,11 +27,12 @@ public class EventStageDTO extends EventLinkAndMetadataDTO { public void setStageImageURL(String stageImageURL) { this.stageImageURL = stageImageURL; } - public boolean isTrackedByTracTrac() { - return isTrackedByTracTrac; + + public Set getTrackingConnectorInfos() { + return trackingConnectorInfo; } - - public void setTrackedByTracTrac(boolean isTrackedByTracTrac) { - this.isTrackedByTracTrac = isTrackedByTracTrac; + + public void setTrackingConnectorInfos(Set trackingConnectorInfo) { + this.trackingConnectorInfo = trackingConnectorInfo; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.gss index 773af70e463..199dd59d12d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.gss @@ -173,6 +173,7 @@ margin: 0.266666666666667em 0 0.266666666666667em 0.333333333333333em; padding-left: 0.666666666666667em; color: #666; + vertical-align: middle; } .eventheader_intro_details_itemlink { color: inherit; @@ -191,14 +192,6 @@ .eventheader_status_body { font-size: 1rem; } -.eventheader_dataBy_logo_container{ - display: inline-block; - white-space: nowrap; - font-size: 0.75em; -} -.eventheader_dataBy_logo{ - height: 1.3333333em !important; -} .locationicon { vertical-align: text-bottom; margin-right: 0.333333333333333em; @@ -273,4 +266,3 @@ .eventnavigation .navbar_button { font-size: 1.2rem; } - diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.java index b9296e4e46a..12f94026c00 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.java @@ -30,6 +30,7 @@ import com.sap.sailing.gwt.home.shared.utils.EventDatesFormatterUtil; import com.sap.sailing.gwt.home.shared.utils.LabelTypeUtil; import com.sap.sailing.gwt.home.shared.utils.LogoUtil; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.databylogo.DataByLogo; import com.sap.sse.common.Util; import com.sap.sse.gwt.client.LinkUtil; @@ -60,7 +61,7 @@ public class EventHeader extends Composite { @UiField DivElement courseAreaUi; @UiField FlowPanel dropdownContent; @UiField SharingButtons sharing; - @UiField AnchorElement tractracLogoContainer; + @UiField DataByLogo dataByLogo; private EventViewDTO event; private Presenter presenter; @@ -150,9 +151,7 @@ public class EventHeader extends Composite { } hide(competitors, races, courseAreaUi, eventCategory); } - if(!event.isTrackedByTracTrac()) { - hide(tractracLogoContainer); - } + dataByLogo.setUp(event.getTrackingConnectorInfos(), /** colorIfPossible **/ true, /** enforceTextColor **/ false); initTitleAndSelection(nameToShow); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.ui.xml index a0689a934d9..ae91b186d00 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeader.ui.xml @@ -1,6 +1,7 @@ + xmlns:dp="urn:import:com.sap.sailing.gwt.home.desktop.partials" + xmlns:s="urn:import:com.sap.sailing.gwt.ui.shared"> @@ -46,10 +47,7 @@ - - - - +
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeaderResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeaderResources.java index 4c234492096..2d04bf42eb4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeaderResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/EventHeaderResources.java @@ -2,8 +2,6 @@ package com.sap.sailing.gwt.home.desktop.partials.eventheader; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.CssResource; -import com.google.gwt.resources.client.DataResource; -import com.google.gwt.resources.client.DataResource.MimeType; import com.google.gwt.resources.client.ImageResource; import com.sap.sailing.gwt.home.desktop.resources.SharedDesktopResources; @@ -16,10 +14,6 @@ public interface EventHeaderResources extends SharedDesktopResources { @Source("location-icon.png") ImageResource location(); - @Source("tractrac-color.svg") - @MimeType("image/svg+xml") - DataResource tractrac(); - public interface LocalCss extends CssResource { String jsdropdown(); String jsdropdown_head(); @@ -47,8 +41,6 @@ public interface EventHeaderResources extends SharedDesktopResources { String eventheader_status(); String eventheader_status_title(); String eventheader_status_body(); - String eventheader_dataBy_logo(); - String eventheader_dataBy_logo_container(); String locationicon(); String eventnavigation(); String eventnavigationnormal(); @@ -60,5 +52,4 @@ public interface EventHeaderResources extends SharedDesktopResources { String navbar_button(); String navbar_buttonhidden(); } - } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/Stage.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/Stage.gss index 7e780286cca..e8e8dc7e9e7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/Stage.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/Stage.gss @@ -209,3 +209,14 @@ -ms-transition: width 0.1s linear; transition: width 0.1s linear; } +.stage_dataBy_logo_container{ + padding: 0 0.4em; + line-height: 4rem; +} +.stage_dataBy_logo_container>*{ + display: inline-block !important; + vertical-align: middle; +} +.stageteaser_rightbound_bond_item{ + float: right; +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/StageResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/StageResources.java index 17e17c8126b..8ae602b032a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/StageResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/StageResources.java @@ -30,6 +30,7 @@ public interface StageResources extends ClientBundle { String stageteaser_content_band_text_headline(); String stageteaser_content_band_text_name(); String stageteaser_content_band_action(); + String stageteaser_rightbound_bond_item(); String swipercontainer(); String swiperslide(); String stage(); @@ -37,6 +38,7 @@ public interface StageResources extends ClientBundle { String stage_controls(); String stage_progress(); String stage_progress_bar(); + String stage_dataBy_logo_container(); } } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/StageTeaserBand.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/StageTeaserBand.java index dfed9e1cb4e..d105732efc1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/StageTeaserBand.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/StageTeaserBand.java @@ -16,6 +16,7 @@ import com.sap.sailing.gwt.home.desktop.app.DesktopPlacesNavigator; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.app.PlaceNavigator; import com.sap.sailing.gwt.home.shared.places.event.EventDefaultPlace; +import com.sap.sailing.gwt.ui.shared.databylogo.DataByLogo; public abstract class StageTeaserBand extends Composite { @@ -28,6 +29,7 @@ public abstract class StageTeaserBand extends Composite { @UiField SpanElement bandSubtitle; @UiField Anchor actionLink; @UiField DivElement isLiveDiv; + @UiField DataByLogo dataByLogo; private final DesktopPlacesNavigator placeNavigator; private final EventStageDTO event; @@ -41,6 +43,8 @@ public abstract class StageTeaserBand extends Composite { initWidget(uiBinder.createAndBindUi(this)); isLiveDiv.getStyle().setDisplay(Display.NONE); + + dataByLogo.setUp(event.getTrackingConnectorInfos(), /** colorIfPossible **/ false, /** enforceTextColor **/ true); eventNavigation = placeNavigator.getEventNavigation(event.getId().toString(), event.getBaseURL(), event.isOnRemoteServer()); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/StageTeaserBand.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/StageTeaserBand.ui.xml index addcb10e59c..149f1303929 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/StageTeaserBand.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/stage/StageTeaserBand.ui.xml @@ -1,10 +1,13 @@ - + - +
+ +
+
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/qrcode/QRCodePlace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/qrcode/QRCodePlace.java index 742ec059b09..25cf582a8c1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/qrcode/QRCodePlace.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/qrcode/QRCodePlace.java @@ -166,6 +166,7 @@ public class QRCodePlace extends AbstractBasePlace { } public String getPublicInviteBranchIOUrl() { + // TODO why is this specific to version 2 and not considering the default server setting for mailInvitationType? return BranchIOConstants.OPEN_REGATTA_2_APP_BRANCHIO + "?" + QRCodePlace.PARAM_REGATTA_NAME + "=" + encodeUrl(publicRegattaName) + "&" + QRCodePlace.PARAM_REGATTA_SECRET + "=" + encodeUrl(regattaRegistrationLinkSecret) + "&" + QRCodePlace.PARAM_SERVER + "=" diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.gss index 9251478cbe5..39dac52d339 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.gss @@ -9,7 +9,8 @@ transition: top 0.3s ease-in-out; } .eventheader_with_logo{ - padding-bottom: 1.5em; + padding-bottom: 0.5em; + position: relative; } .eventheader_info { padding: 0.666666666666667em 0 0 0.666666666666667em; @@ -56,18 +57,9 @@ .eventheader_info_subtitle_info_location { visibility: visible; } -.eventheader_info_subtitle_dataBy_logo{ - height: 1.33333em !important; -} + .eventheader_info_subtitle_dataBy_logo_container{ position:absolute; bottom:0.25em; right:0.25em; - font-size: 0.75em; - display: inline-block; - color: black; -} - -.subtleLink, .subtleLink:hover, .subtleLink:active, .subtleLink:visited, .subtleLink:focus { - text-decoration: none; } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.java index 86cfe3c9378..d08bf84ce83 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.java @@ -14,6 +14,7 @@ import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.utils.EventDatesFormatterUtil; import com.sap.sailing.gwt.home.shared.utils.LabelTypeUtil; import com.sap.sailing.gwt.home.shared.utils.LogoUtil; +import com.sap.sailing.gwt.ui.shared.databylogo.DataByLogo; public class EventHeader extends Composite { private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); @@ -29,7 +30,7 @@ public class EventHeader extends Composite { @UiField DivElement eventDateUi; @UiField DivElement eventLocationUi; @UiField DivElement eventHeader; - @UiField AnchorElement tractracLogoContainer; + @UiField DataByLogo dataByLogo; public EventHeader(EventViewDTO event, String optionalRegattaDisplayName, PlaceNavigation logoNavigation) { EventHeaderResources.INSTANCE.css().ensureInjected(); @@ -50,10 +51,9 @@ public class EventHeader extends Composite { if (logoNavigation != null) { logoNavigation.configureAnchorElement(eventLogoUi); } - if (event.isTrackedByTracTrac()) { - eventHeader.addClassName(EventHeaderResources.INSTANCE.css().eventheader_with_logo()); - } else { - tractracLogoContainer.removeFromParent(); + dataByLogo.setUp(event.getTrackingConnectorInfos(), /** colorIfPossible **/ true, /** enforceTextColor **/ true); + if (dataByLogo.isVisible()) { + this.addStyleName(EventHeaderResources.INSTANCE.css().eventheader_with_logo()); } eventDateUi.setInnerText(EventDatesFormatterUtil.formatDateRangeWithYear(event.getStartDate(), event.getEndDate())); eventLocationUi.setInnerText(event.getLocationAndVenueAndCountry()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.ui.xml index 41caf3ae73d..a06efba2ffc 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.ui.xml @@ -1,6 +1,6 @@ + xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:s="urn:import:com.sap.sailing.gwt.ui.shared"> @@ -40,11 +40,8 @@
- - - - +
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeaderResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeaderResources.java index 5fad1639d99..70ff8be5494 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeaderResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeaderResources.java @@ -3,19 +3,12 @@ package com.sap.sailing.gwt.home.mobile.partials.eventheader; import com.google.gwt.core.client.GWT; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; -import com.google.gwt.resources.client.DataResource; -import com.google.gwt.resources.client.DataResource.MimeType; public interface EventHeaderResources extends ClientBundle { public static final EventHeaderResources INSTANCE = GWT.create(EventHeaderResources.class); @Source("EventHeader.gss") LocalCss css(); - - @Source("tractrac-color.svg") - @MimeType("image/svg+xml") - DataResource tractrac(); - public interface LocalCss extends CssResource { String eventheader(); @@ -31,8 +24,6 @@ public interface EventHeaderResources extends ClientBundle { String eventheader_info_subtitle_info(); String eventheader_info_subtitle_info_date(); String eventheader_info_subtitle_info_location(); - String eventheader_info_subtitle_dataBy_logo(); String eventheader_info_subtitle_dataBy_logo_container(); - String subtleLink(); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/tractrac-color.svg b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/tractrac-color.svg deleted file mode 100644 index 96662ddb01b..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/tractrac-color.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/Stage.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/Stage.gss index eb236c161f0..f247cd8c097 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/Stage.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/Stage.gss @@ -206,5 +206,9 @@ background: #333; } +.stageteaser_databylogo_container{ + padding-top: .4em; +} + @external slick-dots, slick-active; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/StageResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/StageResources.java index 6365a07c1fd..0d9d39b074c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/StageResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/StageResources.java @@ -30,6 +30,7 @@ public interface StageResources extends ClientBundle { String stageteaser_content_band_text_headline(); String stageteaser_content_band_text_name(); String stageteaser_content_band_action(); + String stageteaser_databylogo_container(); String swipercontainer(); String swiperslide(); String stage(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/StageTeaserBand.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/StageTeaserBand.java index d92be73980d..005d2f01d6a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/StageTeaserBand.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/StageTeaserBand.java @@ -10,10 +10,12 @@ import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.home.communication.event.EventLinkAndMetadataDTO; +import com.sap.sailing.gwt.home.communication.start.EventStageDTO; import com.sap.sailing.gwt.home.mobile.app.MobilePlacesNavigator; import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; import com.sap.sailing.gwt.home.shared.app.PlaceNavigator; import com.sap.sailing.gwt.home.shared.places.event.EventDefaultPlace; +import com.sap.sailing.gwt.ui.shared.databylogo.DataByLogo; public abstract class StageTeaserBand extends Composite { @@ -26,7 +28,10 @@ public abstract class StageTeaserBand extends Composite { DivElement bandTitle; @UiField DivElement bandSubtitle; - @UiField Anchor actionLink; + @UiField + Anchor actionLink; + @UiField + DataByLogo dataByLogo; private final MobilePlacesNavigator placeNavigator; private final EventLinkAndMetadataDTO event; @@ -38,7 +43,13 @@ public abstract class StageTeaserBand extends Composite { StageResources.INSTANCE.css().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); - + + if (event instanceof EventStageDTO) { + dataByLogo.setUp(((EventStageDTO) event).getTrackingConnectorInfos(), /** colorIfPossible **/ false, /** enforceTextColor **/ true); + } else { + dataByLogo.setVisible(false); + } + eventNavigation = placeNavigator.getEventNavigation(event.getId().toString(), event.getBaseURL(), event.isOnRemoteServer()); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/StageTeaserBand.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/StageTeaserBand.ui.xml index 952a7374ab8..3c8f3b3881a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/StageTeaserBand.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/stage/StageTeaserBand.ui.xml @@ -1,6 +1,6 @@ + xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:s="urn:import:com.sap.sailing.gwt.ui.shared"> .left { - display: inline; - position: absolute; top: 0px; left: 0px; width: 50%; vertical-align: middle; } .right { - display: inline; - position: absolute; + display: inline; + position: absolute; top: 0px; left: 50%; right: 0px; @@ -41,6 +39,7 @@
+
trackingConnectorInfos = event.getTrackingConnectorInfos().stream() + .map(TrackingConnectorInfoDTO::new).collect(Collectors.toSet()); + dto.setTrackingConnectorInfos(trackingConnectorInfos); dto.setStageImageURL(useTeaserImage ? findEventThumbnailImageUrlAsString(event) : getStageImageURLAsString(event)); return dto; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java index 87133a873eb..767bda207d4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java @@ -144,12 +144,9 @@ public class RegattaDetailsComposite extends Composite { Button button = new Button(stringMessages.registrationLinkShare(), new ClickHandler() { @Override public void onClick(ClickEvent event) { - RegistrationLinkWithQRCode registrationLinkWithQRCode = new RegistrationLinkWithQRCode(); registrationLinkWithQRCode.setSecret(regatta.registrationLinkSecret); - sailingService.getMailType(new AsyncCallback() { - @Override public void onFailure(Throwable caught) { logger.log(Level.SEVERE, "Could not determine MailInvitationType", caught); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java index 400eca6a6ce..5ffa0bba26a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogAddDeviceMappingDialog.java @@ -221,21 +221,28 @@ public class RegattaLogAddDeviceMappingDialog extends DataEntryDialogWithDateTim String url = DeviceMappingConstants.getDeviceMappingForRegattaLogUrl(baseUrlWithoutTrailingSlash, eventIdAsString, leaderboardName, mappedItemType, mappedItemId, regattaRegisterSecret, GwtUrlHelper.INSTANCE); - if (mailInvitationType == MailInvitationType.LEGACY) { + switch (mailInvitationType) { + case LEGACY: // URL is already legacy - } else if (mailInvitationType == MailInvitationType.SailInsight1) { + break; + case SailInsight1: url = BranchIOConstants.SAILINSIGHT_APP_BRANCHIO + "?" + BranchIOConstants.SAILINSIGHT_APP_BRANCHIO_PATH + "=" + GwtUrlHelper.INSTANCE.encodeQueryString(url); - } else if (mailInvitationType == MailInvitationType.SailInsight2) { + break; + case SailInsight2: url = BranchIOConstants.SAILINSIGHT_2_APP_BRANCHIO + "?" + BranchIOConstants.OPEN_REGATTA_2_APP_BRANCHIO_PATH + "=" + GwtUrlHelper.INSTANCE.encodeQueryString(url); - } - else { + break; + case SailInsight3: + url = BranchIOConstants.SAILINSIGHT_3_APP_BRANCHIO + "?" + + BranchIOConstants.OPEN_REGATTA_3_APP_BRANCHIO_PATH + "=" + + GwtUrlHelper.INSTANCE.encodeQueryString(url); + break; + default: throw new QRCodeURLCreationException("Unknown mail invitation type: " + mailInvitationType); } - return url; } }); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegistrationLinkWithQRCodeDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegistrationLinkWithQRCodeDialog.java index 4817fa55eb4..de2b6288d2a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegistrationLinkWithQRCodeDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegistrationLinkWithQRCodeDialog.java @@ -63,14 +63,10 @@ public class RegistrationLinkWithQRCodeDialog extends DataEntryDialog() { @Override public String getValue(EventDTO item) { @@ -98,10 +94,8 @@ public class RegistrationLinkWithQRCodeDialog extends DataEntryDialog parameters = new HashMap(); parameters.put("regatta_name", regattaName); parameters.put("secret", secret); parameters.put("server", baseUrl); parameters.put("event_id", eventIdAsString); + // TODO decide OPEN_REGATTA link variant based on invitationType String deeplinkUrl = BranchIO.generateLink(BranchIOConstants.OPEN_REGATTA_2_APP_BRANCHIO, parameters, URL::encodeQueryString); urlTextBox.setText(deeplinkUrl); - if (invitationType != MailInvitationType.SailInsight2) { + if (invitationType != MailInvitationType.SailInsight2 && + invitationType != MailInvitationType.SailInsight3) { // TODO it would be better to make it a property of an enum literal whether open regatta invitation is possible getStatusLabel().setText(stringMessages.warningSailInsightVersion()); getStatusLabel().setStyleName("errorLabel"); } sailingService.openRegattaRegistrationQrCode(deeplinkUrl, new AsyncCallback() { - @Override public void onFailure(Throwable caught) { GWT.log("Qrcode generation failed: ", caught); @@ -187,9 +176,7 @@ public class RegistrationLinkWithQRCodeDialog extends DataEntryDialog parent, ComponentContext> componentContext, @@ -211,7 +216,7 @@ public class RaceBoardPanel UserAgentDetails userAgent, RaceTimesInfoProvider raceTimesInfoProvider, boolean showChartMarkEditMediaButtonsAndVideo, boolean showHeaderPanel, Iterable availableDetailTypes, StrippedLeaderboardDTOWithSecurity leaderboardDTO, - final RaceWithCompetitorsAndBoatsDTO raceDTO) { + final RaceWithCompetitorsAndBoatsDTO raceDTO, TrackingConnectorInfoDTO trackingConnectorInfo) { super(parent, componentContext, lifecycle, settings); this.sailingService = sailingService; this.mediaService = mediaService; @@ -221,6 +226,7 @@ public class RaceBoardPanel this.userAgent = userAgent; this.timer = timer; this.eventId = eventId; + this.trackingConnectorInfo = trackingConnectorInfo; this.currentRaceHasBeenSelectedOnce = false; this.leaderboardName = leaderboardName; this.selectedRaceIdentifier = selectedRaceIdentifier; @@ -712,6 +718,13 @@ public class RaceBoardPanel regattaAndRaceTimeInformationHeader.clear(); regattaAndRaceTimeInformationHeader.add(regattaNameAnchor); regattaAndRaceTimeInformationHeader.add(raceTimeLabel); + DataByLogo dataByLogo = new DataByLogo(); + dataByLogo.setUp(trackingConnectorInfo == null ? Collections.emptySet() + : Collections.singleton(trackingConnectorInfo), /** colorIfPossible **/ false, /** enforceTextColor **/ true); + if (dataByLogo.isVisible()) { + regattaAndRaceTimeInformationHeader.addStyleName("RegattaAndRaceTime-Header_with_databy"); + } + regattaAndRaceTimeInformationHeader.add(dataByLogo); currentRaceHasBeenSelectedOnce = true; taggingPanel.updateRace(leaderboardName, raceColumn, fleet); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/tagging/TaggingPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/tagging/TaggingPanel.java index 58cd73853ea..66a007faeba 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/tagging/TaggingPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/tagging/TaggingPanel.java @@ -192,7 +192,13 @@ public class TaggingPanel extends ComponentWithoutSettings tagButtons = new ArrayList(); - taggingPanel = new DockLayoutPanel(Style.Unit.PX); + taggingPanel = new DockLayoutPanel(Style.Unit.PX) { + @Override + public void onResize() { + super.onResize(); + taggingPanel.setWidgetSize(footerPanel, calculateFooterPanelHeight()); + } + }; filterbarAndContentPanel = new HeaderPanel(); tagFooterPanel = new TagFooterPanel(this, sailingService, stringMessages, userService); footerPanel = new ScrollPanel(tagFooterPanel); @@ -705,15 +711,7 @@ public class TaggingPanel extends ComponentWithoutSettings Scheduler.get().scheduleFinally(new RepeatingCommand() { @Override public boolean execute() { - // Default size of 2/3 the TaggingPanel - int height = (int) Math.round(taggingPanel.getOffsetHeight() / 3f * 2f); - // Get actual size of the footerPanel which might be 0 if the browser screwed up - final int vScroll = footerPanel.getWidget().getElement().getScrollHeight(); - if (vScroll != 0) { - height = Math.min(height, vScroll); - } - height = Math.max(200, height); - taggingPanel.setWidgetSize(footerPanel, height); + taggingPanel.setWidgetSize(footerPanel, calculateFooterPanelHeight()); taggingPanel.animate(FOOTERPANEL_ANIMATION_PERIOD_MS); return false; } @@ -728,6 +726,15 @@ public class TaggingPanel extends ComponentWithoutSettings } } + private int calculateFooterPanelHeight() { + // Start with footerPanel content height + int height = footerPanel.getWidget().getElement().getOffsetHeight(); + // Limit size if we take up the entire height of the viewing area + // to make sure we don't get pushed out of it at the top making parts of the footerPanel inaccessible + height = Math.min(height, taggingPanel.getOffsetHeight()); + return height; + } + /** * Checks whether current user has permission to modify public tags. * diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 734c972c64c..29a5932c3f9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -397,6 +397,7 @@ import com.sap.sailing.domain.tracking.Track; 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.TrackingConnectorInfo; import com.sap.sailing.domain.tracking.WindLegTypeAndLegBearingAndORCPerformanceCurveCache; import com.sap.sailing.domain.tracking.WindPositionMode; import com.sap.sailing.domain.tracking.WindTrack; @@ -494,6 +495,7 @@ import com.sap.sailing.gwt.ui.shared.SwissTimingReplayRaceDTO; import com.sap.sailing.gwt.ui.shared.TracTracConfigurationWithSecurityDTO; import com.sap.sailing.gwt.ui.shared.TracTracRaceRecordDTO; import com.sap.sailing.gwt.ui.shared.TrackFileImportDeviceIdentifierDTO; +import com.sap.sailing.gwt.ui.shared.TrackingConnectorInfoDTO; import com.sap.sailing.gwt.ui.shared.TypedDeviceMappingDTO; import com.sap.sailing.gwt.ui.shared.VenueDTO; import com.sap.sailing.gwt.ui.shared.WaypointDTO; @@ -1999,7 +2001,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet public RaceboardDataDTO getRaceboardData(String regattaName, String raceName, String leaderboardName, String leaderboardGroupName, UUID eventId) { RaceboardDataDTO result = new RaceboardDataDTO(null, false, false, Collections.emptyList(), - Collections.emptyList(), null, false); + Collections.emptyList(), null, null); RaceWithCompetitorsAndBoatsDTO raceDTO = null; Regatta regatta = getService().getRegattaByName(regattaName); if (regatta != null) { @@ -2053,9 +2055,11 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet StrippedLeaderboardDTOWithSecurity leaderboardDTO = createStrippedLeaderboardDTOWithSecurity( leaderboard, false, false); - boolean isTrackedByTracTrac = isValidEvent && event.isTrackedByTracTrac(); + final TrackingConnectorInfo trackingConnectorInfo = trackedRace.getTrackingConnectorInfo(); + final TrackingConnectorInfoDTO trackingConnectorInfoDTO = trackingConnectorInfo == null ? null + : new TrackingConnectorInfoDTO(trackingConnectorInfo); result = new RaceboardDataDTO(raceDTO, isValidLeaderboardGroup, isValidEvent, - detailTypesForCompetitorChart, availableDetailTypesForLeaderboard, leaderboardDTO, isTrackedByTracTrac); + detailTypesForCompetitorChart, availableDetailTypesForLeaderboard, leaderboardDTO, trackingConnectorInfoDTO); } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceboardDataDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceboardDataDTO.java index 8d5c7bdaa82..52ab9177f7d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceboardDataDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceboardDataDTO.java @@ -16,15 +16,15 @@ public class RaceboardDataDTO implements IsSerializable { private ArrayList detailTypesForCompetitorChart; private ArrayList availableDetailTypesForLeaderboard; private StrippedLeaderboardDTOWithSecurity leaderboard; - private boolean isTrackedByTracTrac; - + private TrackingConnectorInfoDTO trackingConnectorInfo; // for GWT RaceboardDataDTO() {} public RaceboardDataDTO(RaceWithCompetitorsAndBoatsDTO race, boolean isValidLeaderboardGroup, boolean isValidEvent, Iterable detailTypesForCompetitorChart, - Iterable availableDetailTypesForLeaderboard, StrippedLeaderboardDTOWithSecurity leaderboard, boolean isTrackedByTracTrac) { + Iterable availableDetailTypesForLeaderboard, StrippedLeaderboardDTOWithSecurity leaderboard, + TrackingConnectorInfoDTO trackingConnectorInfo) { this.race = race; this.isValidLeaderboardGroup = isValidLeaderboardGroup; this.isValidEvent = isValidEvent; @@ -33,7 +33,7 @@ public class RaceboardDataDTO implements IsSerializable { this.availableDetailTypesForLeaderboard = new ArrayList<>(); Util.addAll(availableDetailTypesForLeaderboard, this.availableDetailTypesForLeaderboard); this.leaderboard = leaderboard; - this.isTrackedByTracTrac = isTrackedByTracTrac; + this.trackingConnectorInfo = trackingConnectorInfo; } public StrippedLeaderboardDTOWithSecurity getLeaderboard() { @@ -67,8 +67,8 @@ public class RaceboardDataDTO implements IsSerializable { public boolean isValidEvent() { return isValidEvent; } - - public boolean isTrackedByTracTrac() { - return isTrackedByTracTrac; + + public TrackingConnectorInfoDTO getTrackingConnectorInfo() { + return trackingConnectorInfo; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/TrackingConnectorInfoDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/TrackingConnectorInfoDTO.java new file mode 100644 index 00000000000..357a4aa7ba2 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/TrackingConnectorInfoDTO.java @@ -0,0 +1,56 @@ +package com.sap.sailing.gwt.ui.shared; + +import com.google.gwt.core.shared.GwtIncompatible; +import com.google.gwt.user.client.rpc.IsSerializable; +import com.sap.sailing.domain.common.tracking.TrackingConnectorType; +import com.sap.sailing.domain.tracking.TrackingConnectorInfo; + +public class TrackingConnectorInfoDTO implements IsSerializable { + private TrackingConnectorType trackingConnectorType; + private String webUrl; + + TrackingConnectorInfoDTO() { + } // GWT serialization + + @GwtIncompatible + public TrackingConnectorInfoDTO(TrackingConnectorInfo trackingConnectorInfo) { + this.trackingConnectorType = trackingConnectorInfo.getTrackingConnectorType(); + this.webUrl = trackingConnectorInfo.getWebUrl() == null ? null : trackingConnectorInfo.getWebUrl().toString(); + } + + public TrackingConnectorType getTrackingConnectorType() { + return trackingConnectorType; + } + + public String getWebUrl() { + return webUrl; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((trackingConnectorType == null) ? 0 : trackingConnectorType.hashCode()); + result = prime * result + ((webUrl == null) ? 0 : webUrl.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + TrackingConnectorInfoDTO other = (TrackingConnectorInfoDTO) obj; + if (trackingConnectorType != other.trackingConnectorType) + return false; + if (webUrl == null) { + if (other.webUrl != null) + return false; + } else if (!webUrl.equals(other.webUrl)) + return false; + return true; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.gss new file mode 100644 index 00000000000..74acd8913dd --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.gss @@ -0,0 +1,30 @@ +img.databylogo_logo { + height: 1.3333333em !important; + vertical-align: middle; + display: inline-block; +} + +.databylogo_text { + vertical-align: middle; +} + +.databylogo_white_text { + color: white; +} + +.databylogo_black_text { + color: black; +} + +.databylogo_subtlelink, .databylogo_subtlelink:hover, + .databylogo_subtlelink:active, .databylogo_subtlelink:visited, + .databylogo_subtlelink:focus { + text-decoration: none; +} + +.databylogo_container { + display: inline-block; + white-space: nowrap; + font-size: 0.75em; + cursor: pointer; +} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.java new file mode 100644 index 00000000000..1e83fa9ed49 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.java @@ -0,0 +1,86 @@ +package com.sap.sailing.gwt.ui.shared.databylogo; + +import java.util.Set; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.AnchorElement; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.ImageElement; +import com.google.gwt.resources.client.DataResource; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.domain.common.tracking.TrackingConnectorType; +import com.sap.sailing.gwt.ui.shared.TrackingConnectorInfoDTO; + +public class DataByLogo extends Widget { + + private static DataByLogoUiBinder uiBinder = GWT.create(DataByLogoUiBinder.class); + + interface DataByLogoUiBinder extends UiBinder { + } + + @UiField + AnchorElement dataByContainer; + @UiField + ImageElement logo; + + public DataByLogo() { + DataByLogoResources.INSTANCE.css().ensureInjected(); + setElement(uiBinder.createAndBindUi(this)); + } + + public void setUp(Set trackingConnectorInfos, boolean colorIfPossible, + boolean enforceTextColor) { + TrackingConnectorInfoDTO mostProminentConnectorInfo = selectMostProminentConnectorInfo(trackingConnectorInfos); + if (mostProminentConnectorInfo == null) { + this.setVisible(false); + } else { + setUpForConnectorType(colorIfPossible, enforceTextColor, mostProminentConnectorInfo); + } + } + + private TrackingConnectorInfoDTO selectMostProminentConnectorInfo( + Set trackingConnectorInfos) { + TrackingConnectorInfoDTO potentialConnectorInfo = null; + if (trackingConnectorInfos != null && !trackingConnectorInfos.isEmpty()) { + for (TrackingConnectorInfoDTO trackingConnectorInfo : trackingConnectorInfos) { + // This logic currently only supports TracTrac as ConnectorInfo + if (trackingConnectorInfo.getTrackingConnectorType() == TrackingConnectorType.TracTrac) { + potentialConnectorInfo = trackingConnectorInfo; + String webUrl = trackingConnectorInfo.getWebUrl(); + if (webUrl != null && !webUrl.isEmpty()) { + break; + } + } + } + } + return potentialConnectorInfo; + } + + private void setUpForConnectorType(boolean colorIfPossible, boolean enforceTextColor, + TrackingConnectorInfoDTO trackingConnectorInfo) { + if (trackingConnectorInfo.getTrackingConnectorType() == TrackingConnectorType.TracTrac) { + setUpTracTracLogo(colorIfPossible, enforceTextColor); + } + setUrl(trackingConnectorInfo); + } + + private void setUpTracTracLogo(boolean colorIfPossible, boolean enforceTextColor) { + final DataByLogoResources resources = DataByLogoResources.INSTANCE; + final DataResource imageToSet = colorIfPossible ? resources.tractracColor() : resources.tractracWhite(); + logo.setSrc(imageToSet.getSafeUri().asString()); + if (enforceTextColor) { + this.addStyleName(colorIfPossible ? resources.css().databylogo_black_text() + : resources.css().databylogo_white_text()); + } + } + + private void setUrl(TrackingConnectorInfoDTO trackingConnectorInfo) { + String webUrl = trackingConnectorInfo.getWebUrl(); + if (webUrl == null || "".equals(trackingConnectorInfo.getWebUrl())) { + webUrl = trackingConnectorInfo.getTrackingConnectorType().getDefaultUrl(); + } + dataByContainer.setHref(webUrl); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.ui.xml new file mode 100644 index 00000000000..5a5279d01ad --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogo.ui.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogoResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogoResources.java new file mode 100644 index 00000000000..42cc5949bfa --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/DataByLogoResources.java @@ -0,0 +1,31 @@ +package com.sap.sailing.gwt.ui.shared.databylogo; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.DataResource; +import com.google.gwt.resources.client.DataResource.MimeType; + +public interface DataByLogoResources extends ClientBundle { + public static final DataByLogoResources INSTANCE = GWT.create(DataByLogoResources.class); + + @Source("DataByLogo.gss") + LocalCss css(); + + @Source("tractrac-color.svg") + @MimeType("image/svg+xml") + DataResource tractracColor(); + + @Source("tractrac-white.svg") + @MimeType("image/svg+xml") + DataResource tractracWhite(); + + public interface LocalCss extends CssResource { + String databylogo_logo(); + String databylogo_subtlelink(); + String databylogo_container(); + String databylogo_white_text(); + String databylogo_black_text(); + String databylogo_text(); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/tractrac-color.svg b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/tractrac-color.svg similarity index 100% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/eventheader/tractrac-color.svg rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/tractrac-color.svg diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/tractrac-white.svg b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/tractrac-white.svg new file mode 100644 index 00000000000..eba4e0347c8 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/databylogo/tractrac-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingWindTracksTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingWindTracksTest.java index 5d3d8ea2122..010f2a34ce5 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingWindTracksTest.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingWindTracksTest.java @@ -106,7 +106,7 @@ public class TestStoringAndRetrievingWindTracksTest extends AbstractTracTracLive public void addRaceDefinition(RaceDefinition race, DynamicTrackedRace trackedRace) { } }, /*useMarkPassingCalculator*/ false, mock(RaceLogAndTrackedRaceResolver.class), - Optional.empty(), null); + Optional.empty(), /* trackingConnectorInfo */ null); WindSource windSource = new WindSourceImpl(WindSourceType.WEB); MongoClient myFirstMongo = newMongo(); MongoDatabase firstDatabase = myFirstMongo.getDatabase(dbConfiguration.getDatabaseName()); diff --git a/java/com.sap.sailing.selenium.test/local-test-environment.xml b/java/com.sap.sailing.selenium.test/local-test-environment.xml index d92872fc57f..b209883b7b8 100644 --- a/java/com.sap.sailing.selenium.test/local-test-environment.xml +++ b/java/com.sap.sailing.selenium.test/local-test-environment.xml @@ -40,7 +40,7 @@ --> webdriver.chrome.driver - C:\apps\ChromeSeleniumDriver\chromedriver.exe + /usr/bin/chromedriver webdriver.gecko.driver - /path/to/geckodriver.exe + /usr/bin/geckodriver - - --> + +