added canBoatsOfCompetitorsChangePerRace attribute to regatta (+corresponding load/store methods and admin UI)

This commit is contained in:
fmittag
2016-12-30 17:05:03 +01:00
parent 474295d281
commit 45452ac185
62 changed files with 243 additions and 129 deletions
@@ -1151,8 +1151,13 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
final Double buoyZoneRadiusInHullLengths = (Double) dbRegatta.get(FieldNames.REGATTA_BUOY_ZONE_RADIUS_IN_HULL_LENGTHS.name());
final Boolean useStartTimeInference = (Boolean) dbRegatta.get(FieldNames.REGATTA_USE_START_TIME_INFERENCE.name());
final Boolean controlTrackingFromStartAndFinishTimes = (Boolean) dbRegatta.get(FieldNames.REGATTA_CONTROL_TRACKING_FROM_START_AND_FINISH_TIMES.name());
Boolean canBoatsOfCompetitorsChangePerRace = (Boolean) dbRegatta.get(FieldNames.REGATTA_CAN_BOATS_OF_COMPETITORS_CHANGE_PER_RACE.name());
// for backward compatibility
if(canBoatsOfCompetitorsChangePerRace == null) {
canBoatsOfCompetitorsChangePerRace = true;
}
final RankingMetricConstructor rankingMetricConstructor = loadRankingMetricConstructor(dbRegatta);
result = new RegattaImpl(getRaceLogStore(), getRegattaLogStore(), name, boatClass, startDate, endDate, series, /* persistent */true,
result = new RegattaImpl(getRaceLogStore(), getRegattaLogStore(), name, boatClass, canBoatsOfCompetitorsChangePerRace, startDate, endDate, series, /* persistent */true,
loadScoringScheme(dbRegatta), id, courseArea, buoyZoneRadiusInHullLengths == null ? Regatta.DEFAULT_BUOY_ZONE_RADIUS_IN_HULL_LENGTHS : buoyZoneRadiusInHullLengths, useStartTimeInference == null ? true
: useStartTimeInference, controlTrackingFromStartAndFinishTimes == null ? false : controlTrackingFromStartAndFinishTimes,
rankingMetricConstructor);
@@ -37,6 +37,7 @@ public enum FieldNames {
REGATTA_BUOY_ZONE_RADIUS_IN_HULL_LENGTHS,
REGATTA_USE_START_TIME_INFERENCE,
REGATTA_CONTROL_TRACKING_FROM_START_AND_FINISH_TIMES,
REGATTA_CAN_BOATS_OF_COMPETITORS_CHANGE_PER_RACE,
SERIES_NAME,
SERIES_IS_MEDAL,
SERIES_IS_FLEETS_CAN_RUN_IN_PARALLEL,
@@ -654,6 +654,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
dbRegatta.put(FieldNames.REGATTA_BUOY_ZONE_RADIUS_IN_HULL_LENGTHS.name(), regatta.getBuoyZoneRadiusInHullLengths());
dbRegatta.put(FieldNames.REGATTA_USE_START_TIME_INFERENCE.name(), regatta.useStartTimeInference());
dbRegatta.put(FieldNames.REGATTA_CONTROL_TRACKING_FROM_START_AND_FINISH_TIMES.name(), regatta.isControlTrackingFromStartAndFinishTimes());
dbRegatta.put(FieldNames.REGATTA_CAN_BOATS_OF_COMPETITORS_CHANGE_PER_RACE.name(), regatta.canBoatsOfCompetitorsChangePerRace());
dbRegatta.put(FieldNames.REGATTA_RANKING_METRIC.name(), storeRankingMetric(regatta));
regattasCollection.update(query, dbRegatta, /* upsrt */ true, /* multi */ false, WriteConcern.SAFE);
}
@@ -123,7 +123,7 @@ public class AbstractGPSFixStoreTest {
protected DynamicTrackedRaceImpl createDynamicTrackedRace(BoatClass boatClass, RaceDefinition raceDefinition) {
DynamicTrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE,
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass,
/* startDate */ null, /* endDate */null, null, null, "a", null));
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */ null, /* endDate */null, null, null, "a", null));
return new DynamicTrackedRaceImpl(regatta, raceDefinition, Collections.<Sideline> emptyList(),
EmptyWindStore.INSTANCE, 0, 0, 0, /* useMarkPassingCalculator */ false, OneDesignRankingMetric::new,
mock(RaceLogResolver.class));
@@ -85,7 +85,8 @@ public class CreateAndTrackWithRaceLogTest {
Series series = new SeriesImpl("series", /* isMedal */ false, /* isFleetsCanRunInParallel */ true, Collections.singletonList(fleet), Collections.emptySet(),
service);
regatta = service.createRegatta(RegattaImpl.getDefaultName("regatta", "Laser"), "Laser",
/* startDate */null, /* endDate */null, UUID.randomUUID(), Collections.<Series> singletonList(series), false,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null,
UUID.randomUUID(), Collections.<Series> singletonList(series), false,
new HighPoint(), UUID.randomUUID(), /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
series.addRaceColumn(columnName, /* trackedRegattaRegistry */null);
leaderboard = service.addRegattaLeaderboard(regatta.getRegattaIdentifier(), "RegattaLeaderboard", new int[] {});
@@ -101,7 +101,7 @@ public class RaceLogFixTrackerManagerTest {
RaceDefinition race = new RaceDefinitionImpl("race", course, boatClass, competitorsAndBoats);
DynamicTrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE,
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass,
/* startDate */ null, /* endDate */null, null, null, "a", null));
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */ null, /* endDate */null, null, null, "a", null));
trackedRace = new DynamicTrackedRaceImpl(regatta, race, Collections.<Sideline> emptyList(),
EmptyWindStore.INSTANCE, 0, 0, 0, /* useMarkPassingCalculator */ false, OneDesignRankingMetric::new,
mock(RaceLogResolver.class));
@@ -153,7 +153,7 @@ public class SensorFixStoreAndLoadTest {
RaceDefinition race = new RaceDefinitionImpl("race", course, boatClass, competitorsAndBoats);
DynamicTrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE,
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass,
/* startDate */ null, /* endDate */null, null, null, "a", null));
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */ null, /* endDate */null, null, null, "a", null));
trackedRace = new DynamicTrackedRaceImpl(regatta, race, Collections.<Sideline> emptyList(),
EmptyWindStore.INSTANCE, 0, 0, 0, /* useMarkPassingCalculator */ false, OneDesignRankingMetric::new,
mock(RaceLogResolver.class));
@@ -77,8 +77,8 @@ public class TrackedRaceStartTimeInferenceTest extends AbstractGPSFixStoreTest {
RaceDefinition race = new RaceDefinitionImpl("race", course, boatClass, competitorsAndBoats);
TrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE,
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, /* startDate */
null, /* endDate */null, null, null, "a", null));
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */ null, /* endDate */null, null, null, "a", null));
final DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race,
Collections.<Sideline> emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0,
/* useMarkPassingCalculator */ false,
@@ -143,8 +143,8 @@ public class TrackedRaceStartTimeInferenceTest extends AbstractGPSFixStoreTest {
new WaypointImpl(mark2) }));
RaceDefinition race = new RaceDefinitionImpl("race", course, boatClass, competitorsAndBoats);
TrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE,
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, /* startDate */
null, /* endDate */null, null, null, "a", null));
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */ null, /* endDate */null, null, null, "a", null));
final DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race,
Collections.<Sideline> emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0,
/* useMarkPassingCalculator */ false,
@@ -185,8 +185,8 @@ public class TrackedRaceStartTimeInferenceTest extends AbstractGPSFixStoreTest {
new WaypointImpl(mark2) }));
RaceDefinition race = new RaceDefinitionImpl("race", course, boatClass, competitorsAndBoats);
TrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE,
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, /* startDate */
null, /* endDate */null, null, null, "a", null));
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */ null, /* endDate */null, null, null, "a", null));
final DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race,
Collections.<Sideline> emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0,
/* useMarkPassingCalculator */ false,
@@ -230,8 +230,8 @@ public class TrackedRaceStartTimeInferenceTest extends AbstractGPSFixStoreTest {
new WaypointImpl(mark2) }));
RaceDefinition race = new RaceDefinitionImpl("race", course, boatClass, competitorsAndBoats);
TrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE,
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, /* startDate */
null, /* endDate */null, null, null, "a", null));
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */ null, /* endDate */null, null, null, "a", null));
assertTrue(regatta.getRegatta().useStartTimeInference());
final DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race,
Collections.<Sideline> emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0,
@@ -338,8 +338,8 @@ public class TrackedRaceStartTimeInferenceTest extends AbstractGPSFixStoreTest {
new WaypointImpl(mark2) }));
RaceDefinition race = new RaceDefinitionImpl("race", course, boatClass, competitorsAndBoats);
TrackedRegatta regatta = new DynamicTrackedRegattaImpl(new RegattaImpl(EmptyRaceLogStore.INSTANCE,
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, /* startDate */
null, /* endDate */null, null, null, "a", null));
EmptyRegattaLogStore.INSTANCE, RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null, null, null, "a", null));
final DynamicTrackedRaceImpl trackedRace = new DynamicTrackedRaceImpl(regatta, race,
Collections.<Sideline> emptyList(), EmptyWindStore.INSTANCE, 0, 0, 0,
/* useMarkPassingCalculator */ false,
@@ -109,7 +109,8 @@ public class SimpleDomainFactoryTest {
public void testCourseConfigForMark() throws PatchFailedException {
DomainFactory domainFactory = DomainFactory.INSTANCE;
Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE, "TestEvent",
/* boatClass */ null, /*startDate*/ null, /*endDate*/ null, new RacingEventServiceImpl(),
/* boatClass */ null, /* canBoatsOfCompetitorsChangePerRace */ true,
/*startDate*/ null, /*endDate*/ null, new RacingEventServiceImpl(),
com.sap.sailing.domain.base.DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", null);
Race race = new RaceImpl("1234", "R1", "Race 1234");
Iterable<Competitor> competitors = Collections.emptyList();
@@ -135,7 +136,8 @@ public class SimpleDomainFactoryTest {
public void testCourseConfigForGate() throws PatchFailedException {
DomainFactory domainFactory = DomainFactory.INSTANCE;
Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE,
"TestEvent", /* boatClass */ null, /*startDate*/ null, /*endDate*/ null, new RacingEventServiceImpl(),
"TestEvent", /* boatClass */ null, /* canBoatsOfCompetitorsChangePerRace */ true,
/*startDate*/ null, /*endDate*/ null, new RacingEventServiceImpl(),
com.sap.sailing.domain.base.DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", null);
Race race = new RaceImpl("1234", "R1", "Race 1234");
Iterable<Competitor> competitors = Collections.emptyList();
@@ -107,7 +107,8 @@ public class DomainFactoryImpl implements DomainFactory {
Calendar calendar = Calendar.getInstance();
result = new RegattaImpl(raceLogStore, regattaLogStore, RegattaImpl.getDefaultName(
"ST Regatta " + calendar.get(Calendar.YEAR) + " for race " + raceID, regattaBoatClass.getName()),
regattaBoatClass, /*startDate*/ null, /*endDate*/ null, trackedRegattaRegistry, getBaseDomainFactory().createScoringScheme(
regattaBoatClass, /* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
trackedRegattaRegistry, getBaseDomainFactory().createScoringScheme(
ScoringSchemeType.LOW_POINT), raceID, null);
logger.info("Created regatta "+result.getName()+" ("+result.hashCode()+")");
raceIDToRegattaCache.put(raceID, result);
@@ -96,7 +96,8 @@ public class TestFarthestAheadWithSkippedMarkPassing {
final TimePoint timePointForFixes = MillisecondsTimePoint.now();
BoatClassImpl boatClass = new BoatClassImpl("Some Handicap Boat Class", /* typicallyStartsUpwind */ true);
Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE,
RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null,
RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", /* courseArea */ null, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
TrackedRegatta trackedRegatta = new DynamicTrackedRegattaImpl(regatta);
List<Waypoint> waypoints = new ArrayList<Waypoint>();
@@ -78,7 +78,8 @@ public class TestSimpleTimeOnTimeRankingWithOneUpwindLeg {
final TimePoint timePointForFixes = MillisecondsTimePoint.now();
BoatClassImpl boatClass = new BoatClassImpl("Some Handicap Boat Class", /* typicallyStartsUpwind */ true);
Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE,
RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null,
RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", /* courseArea */ null, /* controlTrackingFromStartAndFinishTimes */ false, TimeOnTimeAndDistanceRankingMetric::new);
TrackedRegatta trackedRegatta = new DynamicTrackedRegattaImpl(regatta);
List<Waypoint> waypoints = new ArrayList<Waypoint>();
@@ -74,8 +74,9 @@ public class CompetitorProviderCacheInvalidationTest extends AbstractLeaderboard
new ThresholdBasedResultDiscardingRuleImpl(new int[0]), new LowPoint(), courseArea);
competitorProviderFlexibleLeaderboard = new CompetitorProviderFromRaceColumnsAndRegattaLike(flexibleLeaderboard);
regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE,
EmptyRegattaLogStore.INSTANCE, "Test Regatta", new BoatClassImpl("49er", BoatClassMasterdata._49ER), /* startDate */
null, /* endDate */null, /* trackedRegattaRegistry */null, new LowPoint(), UUID.randomUUID(),
EmptyRegattaLogStore.INSTANCE, "Test Regatta", new BoatClassImpl("49er", BoatClassMasterdata._49ER),
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */ null, /* endDate */null,
/* trackedRegattaRegistry */null, new LowPoint(), UUID.randomUUID(),
courseArea);
regattaLeaderboard = new RegattaLeaderboardImpl(regatta, new ThresholdBasedResultDiscardingRuleImpl(new int[0]));
regatta.addSeries(new SeriesImpl("Test Series", /* isMedal */false, /* isFleetsCanRunInParallel */ true, Arrays.asList(new FleetImpl("Yellow"),
@@ -308,7 +308,7 @@ public class CourseTest {
final Map<Competitor,Boat> competitorsAndBoats = new HashMap<>();
competitorsAndBoats.put(hasso.getCompetitor(), hasso.getBoat());
DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(/* trackedRegatta */new DynamicTrackedRegattaImpl(
new RegattaImpl("test", null, null, null, new HashSet<Series>(), false, null, "test", null, OneDesignRankingMetric::new)),
new RegattaImpl("test", null, true, null, null, new HashSet<Series>(), false, null, "test", null, OneDesignRankingMetric::new)),
new RaceDefinitionImpl("Test Race", course, boatClass, competitorsAndBoats),
Collections.<Sideline> emptyList(), EmptyWindStore.INSTANCE, /* delayToLiveInMillis */3000,
/* millisecondsOverWhichToAverageWind */30000,
@@ -342,7 +342,7 @@ public class CourseTest {
final Map<Competitor,Boat> competitorsAndBoats = new HashMap<>();
competitorsAndBoats.put(hasso.getCompetitor(), hasso.getBoat());
DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(/* trackedRegatta */ new DynamicTrackedRegattaImpl(
new RegattaImpl("test", null, null, null, new HashSet<Series>(), false, null, "test", null, OneDesignRankingMetric::new)),
new RegattaImpl("test", null, true, null, null, new HashSet<Series>(), false, null, "test", null, OneDesignRankingMetric::new)),
new RaceDefinitionImpl("Test Race", course, boatClass, competitorsAndBoats), Collections.<Sideline> emptyList(),
EmptyWindStore.INSTANCE, /* delayToLiveInMillis */ 3000,
/* millisecondsOverWhichToAverageWind */ 30000,
@@ -76,7 +76,8 @@ public class CourseUpdateDuringNonAtomicSerializationTest implements Serializabl
removeCalls = new HashMap<>();
course = new CourseImpl("Test Course", waypoints);
Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE, "Test Regatta",
new BoatClassImpl("505", BoatClassMasterdata._5O5), /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null,
new BoatClassImpl("505", BoatClassMasterdata._5O5),
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null,
new LowPoint(), UUID.randomUUID(), new CourseAreaImpl("Alpha", UUID.randomUUID()));
TrackedRegatta trackedRegatta = new TrackedRegattaImpl(regatta);
RaceDefinition race = new RaceDefinitionImpl("Test Race", course, regatta.getBoatClass(), Collections.<Competitor,Boat>emptyMap());
@@ -86,7 +86,7 @@ public class LeaderboardCourseChangeTest {
RaceColumn raceColumn = series.addRaceColumn(raceColumnName, trackedRegattaRegistry);
ScoringScheme scoringScheme = new LowPoint();
Regatta mockedRegatta = new RegattaImpl(RegattaImpl.getDefaultName("TestRegatta", boatClass.getName()), boatClass,
/*startDate*/ null, /*endDate*/ null, seriesSet, false, scoringScheme,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, seriesSet, false, scoringScheme,
UUID.randomUUID(), mock(CourseArea.class), OneDesignRankingMetric::new);
ControlPoint start = new MarkImpl("Start");
ControlPoint m1 = new MarkImpl("M1");
@@ -1336,7 +1336,8 @@ public class LeaderboardScoringAndRankingTest extends LeaderboardScoringAndRanki
public void testAdditionalScoreInformationLeadsToChangedScoreForOneColumn() throws NoWindException {
TrackedRegattaRegistry trackedRegattaRegistry = mock(TrackedRegattaRegistry.class);
Regatta dummyRegatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE, "Dummy",
new BoatClassImpl("Extreme40", false), /*startDate*/ null, /*endDate*/ null, trackedRegattaRegistry,
new BoatClassImpl("Extreme40", false),
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, trackedRegattaRegistry,
new HighPointFirstGets10Or8AndLastBreaksTie(), "578876345345",
new CourseAreaImpl("Humba", UUID.randomUUID()));
trackedRegattaRegistry.getOrCreateTrackedRegatta(dummyRegatta);
@@ -1908,7 +1909,8 @@ public class LeaderboardScoringAndRankingTest extends LeaderboardScoringAndRanki
series.add(finalSeries);
}
final BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("Extreme40", /* typicallyStartsUpwind */ false);
Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null,
Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
series, /* persistent */false, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.HIGH_POINT_FIRST_GETS_TEN), "123", /* course area */null, OneDesignRankingMetric::new);
List<Competitor> competitors = createCompetitors(12);
final int firstYellowCompetitorIndex = 3;
@@ -2026,7 +2028,8 @@ public class LeaderboardScoringAndRankingTest extends LeaderboardScoringAndRanki
series.add(medalSeries);
}
final BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("470", /* typicallyStartsUpwind */ true);
Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null,
Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
series, /* persistent */false, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", /* course area */null, OneDesignRankingMetric::new);
List<Competitor> competitors = createCompetitors(12);
final int firstYellowCompetitorIndex = 3;
@@ -2138,7 +2141,8 @@ public class LeaderboardScoringAndRankingTest extends LeaderboardScoringAndRanki
series.add(finalSeries);
}
final BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("470", /* typicallyStartsUpwind */ true);
Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null,
Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
series, /* persistent */false, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", /* course area */null, OneDesignRankingMetric::new);
List<Competitor> competitors = createCompetitors(12);
final int firstYellowCompetitorIndex = 3;
@@ -2226,7 +2230,8 @@ public class LeaderboardScoringAndRankingTest extends LeaderboardScoringAndRanki
series.add(finalSeries);
}
final BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("470", /* typicallyStartsUpwind */ true);
Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null,
Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
series, /* persistent */false, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", /* course area */null, OneDesignRankingMetric::new);
final int TOTAL_NUMBER_OF_COMPETITORS = 100;
List<Competitor> competitors = createCompetitors(TOTAL_NUMBER_OF_COMPETITORS);
@@ -125,8 +125,8 @@ public class LeaderboardScoringAndRankingTestBase extends AbstractLeaderboardTes
series.add(defaultSeries);
Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName(regattaName, boatClass.getName()), boatClass,
/* startDate */null, /* endDate */null, series, /* persistent */false, scoringScheme, "123", null,
OneDesignRankingMetric::new);
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null, series,
/* persistent */false, scoringScheme, "123", null, OneDesignRankingMetric::new);
return regatta;
}
@@ -181,7 +181,8 @@ public class LeaderboardScoringAndRankingTestBase extends AbstractLeaderboardTes
}
Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName(regattaBaseName, boatClass.getName()), boatClass,
/*startDate*/ null, /*endDate*/ null, series, /* persistent */ false, scoringScheme, "123", null, OneDesignRankingMetric::new);
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, series,
/* persistent */ false, scoringScheme, "123", null, OneDesignRankingMetric::new);
return regatta;
}
@@ -226,8 +227,8 @@ public class LeaderboardScoringAndRankingTestBase extends AbstractLeaderboardTes
}
}
Regatta regatta = new RegattaImpl(RegattaImpl.getDefaultName(regattaBaseName, boatClass.getName()), boatClass,
/*startDate*/ null, /*endDate*/ null, series, /* persistent */ false, scoringScheme,
/* ID */ "123", /* course area */ null, OneDesignRankingMetric::new);
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, series,
/* persistent */ false, scoringScheme, /* ID */ "123", /* course area */ null, OneDesignRankingMetric::new);
return regatta;
}
}
@@ -229,8 +229,8 @@ public class RaceExecutionOrderProvdiderAttachDetachTest extends TrackBasedTest
raceColumnInSeries = series.addRaceColumn(RACECOLUMN_SERIES, null);
ScoringScheme scoringScheme = new LowPoint();
regatta = new RegattaImpl(RegattaImpl.getDefaultName(REGATTA, boatClass.getName()), boatClass,
/* startDate */null, /* endDate */null, seriesSet, false, scoringScheme, UUID.randomUUID(), null,
OneDesignRankingMetric::new);
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null,
seriesSet, false, scoringScheme, UUID.randomUUID(), null, OneDesignRankingMetric::new);
}
/**
@@ -96,7 +96,8 @@ public class ReachingLegTest extends TrackBasedTest {
Map<Competitor,Boat> competitorsAndBoats, TimePoint timePointForFixes) {
BoatClassImpl boatClass = new BoatClassImpl(boatClassName, /* typicallyStartsUpwind */ true);
Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE,
RegattaImpl.getDefaultName(regattaName, boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null,
RegattaImpl.getDefaultName(regattaName, boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", null);
TrackedRegatta trackedRegatta = new DynamicTrackedRegattaImpl(regatta);
List<Waypoint> waypoints = new ArrayList<Waypoint>();
@@ -115,7 +115,7 @@ public class RegattaLogEventNotificationForwardingTest extends AbstractSerializa
@Test
public void testRegattaLeaderboardRegattaLogEventForwarding() {
Regatta regatta = new RegattaImpl("test", null, null, null, new HashSet<Series>(), false, null, "test", null, OneDesignRankingMetric::new);
Regatta regatta = new RegattaImpl("test", null, true, null, null, new HashSet<Series>(), false, null, "test", null, OneDesignRankingMetric::new);
final RegattaLogEvent[] receivedRegattaLogEvent = new RegattaLogEvent[1];
regatta.addRaceColumnListener(new RaceColumnListenerWithDefaultAction() {
private static final long serialVersionUID = -3835439531940986851L;
@@ -136,7 +136,7 @@ public class RegattaLogEventNotificationForwardingTest extends AbstractSerializa
@Test
public void testRegattaLeaderboardRegattaLogEventForwardingAfterRegattaDeserialization() throws ClassNotFoundException, IOException {
Regatta regatta = new RegattaImpl("test", null, null, null, new HashSet<Series>(), false, null, "test", null, OneDesignRankingMetric::new);
Regatta regatta = new RegattaImpl("test", null, true, null, null, new HashSet<Series>(), false, null, "test", null, OneDesignRankingMetric::new);
Regatta deserializedRegatta = cloneBySerialization(regatta, DomainFactory.INSTANCE);
final RegattaLogEvent[] receivedRegattaLogEvent = new RegattaLogEvent[1];
deserializedRegatta.addRaceColumnListener(new RaceColumnListenerWithDefaultAction() {
@@ -181,7 +181,7 @@ public class RegattaLogEventNotificationForwardingTest extends AbstractSerializa
Series series = new SeriesImpl("Test Series", /* isMedal */ false, /* isFleetsCanRunInParallel */ true,
/* fleets */ Collections.singleton(new FleetImpl("Default")),
Collections.singleton("R1"), /* trackedRegattaRegistry */ null);
Regatta regatta = new RegattaImpl("test", null, null, null, Collections.singleton(series), false,
Regatta regatta = new RegattaImpl("test", null, true, null, null, Collections.singleton(series), false,
new LowPoint(), "test", null, OneDesignRankingMetric::new);
return regatta;
}
@@ -34,8 +34,8 @@ public class SerializeRankingMetricTest extends AbstractSerializationTest {
final BoatClass _49er = DomainFactory.INSTANCE.getOrCreateBoatClass("49er");
final TrackedRace trackedRace = new DynamicTrackedRaceImpl(new DynamicTrackedRegattaImpl(
new RegattaImpl(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE, "Regatta", /* boatClass */ _49er,
/* startDate */ null, /* endDate */ null, /* trackedRegattaRegistry */ null,
new LowPoint(), UUID.randomUUID(), /* courseArea */ null)),
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */ null, /* endDate */ null,
/* trackedRegattaRegistry */ null, new LowPoint(), UUID.randomUUID(), /* courseArea */ null)),
new RaceDefinitionImpl("Race", new CourseImpl("Course", Collections.<Waypoint>emptyList()) ,
/* boatClass */ _49er, Collections.<Competitor,Boat>emptyMap()),
Collections.<Sideline> emptyList(), EmptyWindStore.INSTANCE, 0l, 0l, 0l,
@@ -159,7 +159,8 @@ public abstract class TrackBasedTest {
Map<Competitor, Boat> competitorsAndBoats, TimePoint timePointForFixes, boolean useMarkPassingCalculator, RaceLogResolver raceLogResolver) {
BoatClassImpl boatClass = new BoatClassImpl(boatClassName, /* typicallyStartsUpwind */ true);
Regatta regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE,
RegattaImpl.getDefaultName(regattaName, boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null,
RegattaImpl.getDefaultName(regattaName, boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */ null,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", null);
TrackedRegatta trackedRegatta = new DynamicTrackedRegattaImpl(regatta);
List<Waypoint> waypoints = new ArrayList<Waypoint>();
@@ -209,7 +210,8 @@ public abstract class TrackBasedTest {
TrackedRegattaRegistry trackedRegattaRegistry = mock(TrackedRegattaRegistry.class);
Series series = new SeriesImpl("series name", isMedal, /* isFleetsCanRunInParallel */ true, regattaFleets, raceColumnNames, trackedRegattaRegistry);
Iterable<? extends Series> regattaSeries = Collections.singleton(series);
return new RegattaImpl(regattaName, boatClass, startDate, endDate, regattaSeries, persistent, scoringScheme, regatteId , courseArea, OneDesignRankingMetric::new);
return new RegattaImpl(regattaName, boatClass, /* canBoatsOfCompetitorsChangePerRace */ true,
startDate, endDate, regattaSeries, persistent, scoringScheme, regatteId , courseArea, OneDesignRankingMetric::new);
}
public static void assignRacesToRegattaLeaderboardColumns(RegattaLeaderboard leaderboard, Collection<RaceIdentifier> raceIdentifiers) {
@@ -46,7 +46,7 @@ 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, null, null, new HashSet<Series>(), false, null,
/* trackedRegatta */new DynamicTrackedRegattaImpl(new RegattaImpl("test", null, true, null, null, new HashSet<Series>(), false, null,
"test", null, OneDesignRankingMetric::new)),
race, Collections.<Sideline> emptyList(), EmptyWindStore.INSTANCE,
/* delayToLiveInMillis */1000, /* millisecondsOverWhichToAverageWind */30000,
@@ -286,7 +286,8 @@ public class WindTest {
competitorsAndBoats.put(competitor, boat);
DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(new DynamicTrackedRegattaImpl(
new RegattaImpl(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE,
RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null,
RegattaImpl.getDefaultName("Test Regatta", boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
/* trackedRegattaRegistry */ null, domainFactory.createScoringScheme(ScoringSchemeType.LOW_POINT), "123", null)),
new RaceDefinitionImpl("Test Race",
new CourseImpl("Test Course", Arrays.asList(new Waypoint[] { w1, w2, w3 })),
@@ -72,7 +72,7 @@ public class AbstractMockedRaceMarkPassingTest {
Waypoint w4 = new WaypointImpl(m, PassingInstruction.Starboard);
Waypoint w5 = new WaypointImpl(cp, PassingInstruction.Line);
waypoints = Arrays.asList(w1, w2, w3, w4, w5);
Regatta r = new RegattaImpl(RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass,
Regatta r = new RegattaImpl(RegattaImpl.getDefaultName("regatta", boatClass.getName()), boatClass, /* canBoatsOfCompetitorsChangePerRace */ true,
/*startDate*/ null, /*endDate*/ null, Arrays.asList(new SeriesImpl("Series", true, /* isFleetsCanRunInParallel */ true, Arrays.asList(new FleetImpl("fleet")),
new ArrayList<String>(), null)), true, new HighPoint(), "ID", new CourseAreaImpl("area", new UUID(5, 5)), OneDesignRankingMetric::new);
Course course = new CourseImpl("course", waypoints);
@@ -329,6 +329,11 @@ public class MockedTrackedRace implements DynamicTrackedRace {
return null;
}
@Override
public boolean canBoatsOfCompetitorsChangePerRace() {
return false;
}
@Override
public void addRace(RaceDefinition race) {
}
@@ -369,7 +369,8 @@ public class DomainFactoryImpl implements DomainFactory {
// Then, there is no way but restart the server to get rid of this stale cache entry here.
if (result == null) {
result = new RegattaImpl(raceLogStore, regattaLogStore, RegattaImpl.getDefaultName(
defaultRegattaNameAndBoatClass.getA(), boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null,
defaultRegattaNameAndBoatClass.getA(), boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
trackedRegattaRegistry,
// use the low-point system as the default scoring scheme
getBaseDomainFactory().createScoringScheme(ScoringSchemeType.LOW_POINT), race.getId(), null);
@@ -147,6 +147,8 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
*/
private boolean controlTrackingFromStartAndFinishTimes;
private final boolean canBoatsOfCompetitorsChangePerRace;
/**
* Defaults to <code>true</code>. See {@link Regatta#useStartTimeInference()}.
*/
@@ -160,10 +162,10 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
* Constructs a regatta with an empty {@link RaceLogStore} and with
* {@link Regatta#isControlTrackingFromStartAndFinishTimes()} set to {@code false}.
*/
public RegattaImpl(String name, BoatClass boatClass, TimePoint startDate, TimePoint endDate,
public RegattaImpl(String name, BoatClass boatClass, boolean canBoatsOfCompetitorsChangePerRace, TimePoint startDate, TimePoint endDate,
Iterable<? extends Series> series, boolean persistent, ScoringScheme scoringScheme, Serializable id,
CourseArea courseArea, RankingMetricConstructor rankingMetricConstructor) {
this(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE, name, boatClass, startDate, endDate, series,
this(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE, name, boatClass, canBoatsOfCompetitorsChangePerRace, startDate, endDate, series,
persistent, scoringScheme, id, courseArea, 0.0, /* useStartTimeInference */true, /* controlTrackingFromStartAndFinishTimes */ false,
rankingMetricConstructor);
}
@@ -181,9 +183,9 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
* carried out.
*/
public RegattaImpl(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, String name, BoatClass boatClass,
TimePoint startDate, TimePoint endDate, TrackedRegattaRegistry trackedRegattaRegistry,
boolean canBoatsOfCompetitorsChangePerRace, TimePoint startDate, TimePoint endDate, TrackedRegattaRegistry trackedRegattaRegistry,
ScoringScheme scoringScheme, Serializable id, CourseArea courseArea) {
this(raceLogStore, regattaLogStore, name, boatClass, startDate, endDate, trackedRegattaRegistry, scoringScheme,
this(raceLogStore, regattaLogStore, name, boatClass, canBoatsOfCompetitorsChangePerRace, startDate, endDate, trackedRegattaRegistry, scoringScheme,
id, courseArea, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
}
@@ -198,10 +200,10 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
* carried out.
*/
public RegattaImpl(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, String name, BoatClass boatClass,
TimePoint startDate, TimePoint endDate, TrackedRegattaRegistry trackedRegattaRegistry,
boolean canBoatsOfCompetitorsChangePerRace, TimePoint startDate, TimePoint endDate, TrackedRegattaRegistry trackedRegattaRegistry,
ScoringScheme scoringScheme, Serializable id, CourseArea courseArea,
boolean controlTrackingFromStartAndFinishTimes, RankingMetricConstructor rankingMetricConstructor) {
this(raceLogStore, regattaLogStore, name, boatClass, startDate, endDate, Collections
this(raceLogStore, regattaLogStore, name, boatClass, canBoatsOfCompetitorsChangePerRace, startDate, endDate, Collections
.singletonList(new SeriesImpl(LeaderboardNameConstants.DEFAULT_SERIES_NAME,
/* isMedal */false, /* isFleetsCanRunInParallel */ true, Collections
.singletonList(new FleetImpl(LeaderboardNameConstants.DEFAULT_FLEET_NAME)),
@@ -216,7 +218,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
* this new regatta.
*/
public <S extends Series> RegattaImpl(RaceLogStore raceLogStore, RegattaLogStore regattaLogStore, String name,
BoatClass boatClass, TimePoint startDate, TimePoint endDate, Iterable<S> series, boolean persistent,
BoatClass boatClass, boolean canBoatsOfCompetitorsChangePerRace, TimePoint startDate, TimePoint endDate, Iterable<S> series, boolean persistent,
ScoringScheme scoringScheme, Serializable id, CourseArea courseArea, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference,
boolean controlTrackingFromStartAndFinishTimes, RankingMetricConstructor rankingMetricConstructor) {
super(name);
@@ -229,6 +231,7 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
regattaListeners = new HashSet<RegattaListener>();
raceColumnListeners = new RaceColumnListeners();
this.boatClass = boatClass;
this.canBoatsOfCompetitorsChangePerRace = canBoatsOfCompetitorsChangePerRace;
this.startDate = startDate;
this.endDate = endDate;
final List<S> seriesList = new ArrayList<S>();
@@ -706,6 +709,11 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
return useStartTimeInference;
}
@Override
public boolean canBoatsOfCompetitorsChangePerRace() {
return canBoatsOfCompetitorsChangePerRace;
}
@Override
public RegattaLog getRegattaLog() {
return regattaLikeHelper.getRegattaLog();
@@ -366,4 +366,9 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements
protected LeaderboardType getLeaderboardType() {
return LeaderboardType.FlexibleLeaderboard;
}
@Override
public boolean canBoatsOfCompetitorsChangePerRace() {
return false;
}
}
@@ -60,7 +60,12 @@ public abstract class BaseRegattaLikeImpl implements IsRegattaLike {
public void removeListener(RegattaLikeListener listener) {
listeners.remove(listener);
}
@Override
public boolean canBoatsOfCompetitorsChangePerRace() {
return false;
}
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
ois.defaultReadObject();
listeners = new HashSet<>();
@@ -26,6 +26,12 @@ public interface IsRegattaLike extends Serializable {
*/
RegattaLog getRegattaLog();
/**
* Indicates whether the competitors use the same boat for the whole regatta or change the boat used during the competition
* @return true when the competitors change their boats, false otherwise
*/
boolean canBoatsOfCompetitorsChangePerRace();
RaceColumn getRaceColumnByName(String raceColumnName);
RegattaLikeIdentifier getRegattaLikeIdentifier();
@@ -39,7 +39,8 @@ public class PingMarkViaRegattaLogTest {
service.getMongoObjectFactory().getDatabase().dropDatabase();
Series series = new SeriesImpl("series", false, /* isFleetsCanRunInParallel */ true, Collections.singletonList(fleet),
Collections.singletonList(columnName), service);
Regatta regatta = service.createRegatta(RegattaImpl.getDefaultName("regatta", "Laser"), "Laser", /*startDate*/ null, /*endDate*/ null,
Regatta regatta = service.createRegatta(RegattaImpl.getDefaultName("regatta", "Laser"), "Laser",
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
UUID.randomUUID(), Collections.<Series>singletonList(series),
false, new HighPoint(), UUID.randomUUID(), /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true,
/* controlTrackingFromStartAndFinishTimes */ false, RankingMetricsFactory.getRankingMetricConstructor(RankingMetrics.ONE_DESIGN));
@@ -64,7 +64,7 @@ public class CreateRegattaCallback implements DialogCallback<RegattaDTO>{
seriesStructure.put(seriesDTO.getName(), seriesPair);
}
sailingService.createRegatta(newRegatta.getName(), newRegatta.boatClass==null?null:newRegatta.boatClass.getName(),
newRegatta.startDate, newRegatta.endDate,
newRegatta.canBoatsOfCompetitorsChangePerRace, newRegatta.startDate, newRegatta.endDate,
new RegattaCreationParametersDTO(seriesStructure), true,
newRegatta.scoringScheme, newRegatta.defaultCourseAreaUuid, newRegatta.buoyZoneRadiusInHullLengths, newRegatta.useStartTimeInference,
newRegatta.controlTrackingFromStartAndFinishTimes,
@@ -60,6 +60,7 @@ public class RegattaDetailsComposite extends Composite {
private final Label defaultCourseArea;
private final Label useStartTimeInference;
private final Label controlTrackingFromStartAndFinishTimes;
private final Label canBoatsOfCompetitorsChangePerRace;
private final Label configuration;
private final Label buoyZoneRadiusInHullLengths;
@@ -80,7 +81,7 @@ public class RegattaDetailsComposite extends Composite {
VerticalPanel vPanel = new VerticalPanel();
mainPanel.add(vPanel);
int rows = 12;
int rows = 13;
Grid grid = new Grid(rows, 2);
vPanel.add(grid);
@@ -93,6 +94,7 @@ public class RegattaDetailsComposite extends Composite {
defaultCourseArea = createLabelAndValueWidget(grid, currentRow++, stringMessages.courseArea(), "CourseAreaLabel");
useStartTimeInference = createLabelAndValueWidget(grid, currentRow++, stringMessages.useStartTimeInference(), "UseStartTimeInferenceLabel");
controlTrackingFromStartAndFinishTimes = createLabelAndValueWidget(grid, currentRow++, stringMessages.controlTrackingFromStartAndFinishTimes(), "UseStartTimeInferenceLabel");
canBoatsOfCompetitorsChangePerRace = createLabelAndValueWidget(grid, currentRow++, stringMessages.canBoatsOfCompetitorsChangePerRace(), "CanBoatsOfCompetitorsChangePerRaceLabel");
buoyZoneRadiusInHullLengths = createLabelAndValueWidget(grid, currentRow++, stringMessages.buoyZoneRadiusInHullLengths(), "BuoyZoneRadiusInHullLengthsLabel");
configuration = createLabelAndValueWidget(grid, currentRow++, stringMessages.racingProcedureConfiguration(), "RacingProcedureLabel");
scoringSystem = createLabelAndValueWidget(grid, currentRow++, stringMessages.scoringSystem(), "ScoringSystemLabel");
@@ -400,6 +402,7 @@ public class RegattaDetailsComposite extends Composite {
defaultCourseArea.setText(regatta.defaultCourseAreaUuid == null ? "" : regatta.defaultCourseAreaName);
useStartTimeInference.setText(regatta.useStartTimeInference ? stringMessages.yes() : stringMessages.no());
controlTrackingFromStartAndFinishTimes.setText(regatta.controlTrackingFromStartAndFinishTimes ? stringMessages.yes() : stringMessages.no());
canBoatsOfCompetitorsChangePerRace.setText(regatta.canBoatsOfCompetitorsChangePerRace ? stringMessages.yes() : stringMessages.no());
buoyZoneRadiusInHullLengths.setText(String.valueOf(regatta.buoyZoneRadiusInHullLengths));
if (regatta.configuration != null) {
@@ -2,6 +2,7 @@ package com.sap.sailing.gwt.ui.adminconsole;
import java.util.List;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SuggestBox;
@@ -20,6 +21,7 @@ import com.sap.sse.gwt.client.controls.listedit.ListEditorComposite;
public abstract class RegattaWithSeriesAndFleetsDialog extends AbstractRegattaWithSeriesAndFleetsDialog<RegattaDTO> {
protected TextBox nameEntryField;
protected SuggestBox boatClassEntryField;
protected CheckBox canBoatsOfCompetitorsChangePerRaceCheckBox;
public RegattaWithSeriesAndFleetsDialog(RegattaDTO regatta, Iterable<SeriesDTO> series, List<EventDTO> existingEvents, EventDTO defaultEvent,
String title, String okButton, StringMessages stringMessages,
@@ -35,6 +37,9 @@ public abstract class RegattaWithSeriesAndFleetsDialog extends AbstractRegattaWi
if (regatta.boatClass != null) {
boatClassEntryField.setText(regatta.boatClass.getName());
}
canBoatsOfCompetitorsChangePerRaceCheckBox = createCheckbox("");
canBoatsOfCompetitorsChangePerRaceCheckBox.ensureDebugId("CanBoatsOfCompetitorsChangePerRaceCheckBox");
canBoatsOfCompetitorsChangePerRaceCheckBox.setValue(regatta.canBoatsOfCompetitorsChangePerRace);
}
@Override
@@ -49,16 +54,20 @@ public abstract class RegattaWithSeriesAndFleetsDialog extends AbstractRegattaWi
RegattaDTO result = getRegattaDTO();
result.setName(nameEntryField.getText().trim()); // trim to particularly avoid trailing blanks
result.boatClass = new BoatClassDTO(boatClassEntryField.getText(), Distance.NULL);
result.canBoatsOfCompetitorsChangePerRace = canBoatsOfCompetitorsChangePerRaceCheckBox.getValue();
return result;
}
@Override
protected void setupAdditionalWidgetsOnPanel(VerticalPanel panel, Grid formGrid) {
formGrid.insertRow(0);
formGrid.insertRow(0);
formGrid.insertRow(0);
formGrid.setWidget(0, 0, new Label(stringMessages.name() + ":"));
formGrid.setWidget(0, 1, nameEntryField);
formGrid.setWidget(1, 0, new Label(stringMessages.boatClass() + ":"));
formGrid.setWidget(1, 1, boatClassEntryField);
formGrid.setWidget(2, 0, new Label(stringMessages.canBoatsOfCompetitorsChangePerRace() + ":"));
formGrid.setWidget(2, 1, canBoatsOfCompetitorsChangePerRaceCheckBox);
}
}
@@ -51,6 +51,7 @@ public class RegattaWithSeriesAndFleetsEditDialog extends RegattaWithSeriesAndFl
nameEntryField.setEnabled(false);
boatClassEntryField.setEnabled(false);
canBoatsOfCompetitorsChangePerRaceCheckBox.setEnabled(false);
scoringSchemeListBox.setEnabled(false);
sailingEventsListBox.setEnabled(true);
courseAreaListBox.setEnabled(true);
@@ -217,7 +217,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
void moveLeaderboardColumnDown(String leaderboardName, String columnName);
RegattaDTO createRegatta(String regattaName, String boatClassName, Date startDate, Date endDate,
RegattaDTO createRegatta(String regattaName, String boatClassName, boolean canBoatsOfCompetitorsChangePerRace, Date startDate, Date endDate,
RegattaCreationParametersDTO seriesNamesWithFleetNamesAndFleetOrderingAndMedal, boolean persistent,
ScoringSchemeType scoringSchemeType, UUID defaultCourseAreaId, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference,
boolean controlTrackingFromStartAndFinishTimes, RankingMetrics rankingMetricType);
@@ -438,7 +438,7 @@ public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageMan
void moveRaceColumnInSeriesDown(RegattaIdentifier regattaIdentifier, String seriesName, String columnName,
AsyncCallback<Void> callback);
void createRegatta(String regattaName, String boatClassName, Date startDate, Date endDate,
void createRegatta(String regattaName, String boatClassName, boolean canBoatsOfCompetitorsChangePerRace, Date startDate, Date endDate,
RegattaCreationParametersDTO seriesNamesWithFleetNamesAndFleetOrderingAndMedal, boolean persistent,
ScoringSchemeType scoringSchemeType, UUID defaultCourseAreaId, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference,
boolean controlTrackingFromStartAndFinishTimes, RankingMetrics rankingMetricType,
@@ -1169,6 +1169,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String setTimeToNow();
String useStartTimeInference();
String controlTrackingFromStartAndFinishTimes();
String canBoatsOfCompetitorsChangePerRace();
String numberOfQueueMessagesSent();
String totalSize();
String averageMessageSize();
@@ -1142,6 +1142,7 @@ lastScoreCorrectionsComment=Last score correction comment
setTimeToNow=Set time to ''now''
useStartTimeInference=Use start time inference from start mark passings
controlTrackingFromStartAndFinishTimes=Control tracking from start and finish times
canBoatsOfCompetitorsChangePerRace=Can boats of competitors change per race
numberOfQueueMessagesSent=Number of queue messages sent
totalSize=Total Size
averageMessageSize=Average size per message in bytes
@@ -1133,6 +1133,7 @@ lastScoreCorrectionsComment=Letzter Kommentar der Punktzahl-Korrektur
setTimeToNow=Setze den Zeitpunkt auf ''Jetzt''
useStartTimeInference=Startzeit aus Startlinienüberquerungen automatisch ableiten
controlTrackingFromStartAndFinishTimes=Tracking durch Start- und Ende-Zeiten automatisch steuern
canBoatsOfCompetitorsChangePerRace=Das Boot des Teilnehmers kann sich pro Wettfahrt ändern
numberOfQueueMessagesSent=Anzahl verschickter Queue Nachrichten
totalSize=Gesamtgröße
averageMessageSize=Durchschnittsgrösse einer Nachricht
@@ -895,6 +895,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
regattaDTO.buoyZoneRadiusInHullLengths = regatta.getBuoyZoneRadiusInHullLengths();
regattaDTO.useStartTimeInference = regatta.useStartTimeInference();
regattaDTO.controlTrackingFromStartAndFinishTimes = regatta.isControlTrackingFromStartAndFinishTimes();
regattaDTO.canBoatsOfCompetitorsChangePerRace = regatta.canBoatsOfCompetitorsChangePerRace();
regattaDTO.configuration = convertToRegattaConfigurationDTO(regatta.getRegattaConfiguration());
regattaDTO.rankingMetricType = regatta.getRankingMetricType();
return regattaDTO;
@@ -2884,6 +2885,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
regatta = getService().createRegatta(
RegattaImpl.getDefaultName(replayRaceDTO.rsc, boatClass.trim()),
boatClass.trim(),
/* canBoatsOfCompetitorsChangePerRace */ false,
/* startDate*/ null, /*endDate*/ null,
RegattaImpl.getDefaultName(replayRaceDTO.rsc, replayRaceDTO.boat_class),
Collections.singletonList(new SeriesImpl(LeaderboardNameConstants.DEFAULT_SERIES_NAME,
@@ -4102,7 +4104,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
@Override
public RegattaDTO createRegatta(String regattaName, String boatClassName, Date startDate, Date endDate,
public RegattaDTO createRegatta(String regattaName, String boatClassName, boolean canBoatsOfCompetitorsChangePerRace, Date startDate, Date endDate,
RegattaCreationParametersDTO seriesNamesWithFleetNamesAndFleetOrderingAndMedal,
boolean persistent, ScoringSchemeType scoringSchemeType, UUID defaultCourseAreaId, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference,
boolean controlTrackingFromStartAndFinishTimes, RankingMetrics rankingMetricType) {
@@ -4111,7 +4113,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
TimePoint endTimePoint = endDate != null ? new MillisecondsTimePoint(endDate) : null;
Regatta regatta = getService().apply(
new AddSpecificRegatta(
regattaName, boatClassName, startTimePoint, endTimePoint, UUID.randomUUID(),
regattaName, boatClassName, canBoatsOfCompetitorsChangePerRace, startTimePoint, endTimePoint, UUID.randomUUID(),
seriesNamesWithFleetNamesAndFleetOrderingAndMedal,
persistent, baseDomainFactory.createScoringScheme(scoringSchemeType), defaultCourseAreaId, buoyZoneRadiusInHullLengths, useStartTimeInference,
controlTrackingFromStartAndFinishTimes, rankingMetricType));
@@ -4362,7 +4364,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
private void createRegattaFromRegattaDTO(RegattaDTO regatta) {
SecurityUtils.getSubject().checkPermission(Permission.REGATTA.getStringPermissionForObjects(Mode.CREATE, regatta.getName()));
this.createRegatta(regatta.getName(), regatta.boatClass.getName(), regatta.startDate, regatta.endDate,
this.createRegatta(regatta.getName(), regatta.boatClass.getName(), regatta.canBoatsOfCompetitorsChangePerRace, regatta.startDate, regatta.endDate,
new RegattaCreationParametersDTO(getSeriesCreationParameters(regatta)),
true, regatta.scoringScheme, regatta.defaultCourseAreaUuid, regatta.buoyZoneRadiusInHullLengths, regatta.useStartTimeInference,
regatta.controlTrackingFromStartAndFinishTimes, regatta.rankingMetricType);
@@ -36,6 +36,7 @@ public class RegattaDTO extends NamedDTO {
public DeviceConfigurationDTO.RegattaConfigurationDTO configuration;
public boolean useStartTimeInference = true;
public boolean controlTrackingFromStartAndFinishTimes = false;
public boolean canBoatsOfCompetitorsChangePerRace = true;
public RankingMetrics rankingMetricType;
public Double buoyZoneRadiusInHullLengths;
@@ -68,6 +69,7 @@ public class RegattaDTO extends NamedDTO {
this.configuration = other.configuration;
this.useStartTimeInference = other.useStartTimeInference;
this.controlTrackingFromStartAndFinishTimes = other.controlTrackingFromStartAndFinishTimes;
this.canBoatsOfCompetitorsChangePerRace = other.canBoatsOfCompetitorsChangePerRace;
this.buoyZoneRadiusInHullLengths = other.buoyZoneRadiusInHullLengths;
}
@@ -61,7 +61,8 @@ public abstract class AbstractTestStoringAndRetrievingRaceLogInRegatta extends R
boolean persistent, ScoringScheme scoringScheme, CourseArea courseArea) {
List<Series> series = createSeriesForTestRegatta();
Regatta regatta = new RegattaImpl(getRaceLogStore(), getRegattaLogStore(), RegattaImpl.getDefaultName(regattaBaseName,
boatClass == null ? null : boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null, series, persistent, scoringScheme, "123",
boatClass == null ? null : boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, series, persistent, scoringScheme, "123",
courseArea, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
return regatta;
}
@@ -215,7 +215,7 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
final String regattaBaseName = "Kieler Woche";
BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("29erXX", /* typicallyStartsUpwind */ true);
Regatta regatta = createRegatta(RegattaImpl.getDefaultName(regattaBaseName, boatClass.getName()), boatClass,
regattaStartDate, regattaEndDate, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), courseArea, OneDesignRankingMetric::new);
/* canBoatsOfCompetitorsChangePerRace */ true, regattaStartDate, regattaEndDate, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), courseArea, OneDesignRankingMetric::new);
mof.storeRegatta(regatta);
DomainObjectFactory dof = PersistenceFactory.INSTANCE.getDomainObjectFactory(getMongoService(), DomainFactory.INSTANCE);
@@ -407,9 +407,10 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
final String regattaBaseName = "Kieler Woche";
BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("29erXX", /* typicallyStartsUpwind */ true);
Regatta regattaProxy = createRegatta(RegattaImpl.getDefaultName(regattaBaseName, boatClass.getName()), boatClass,
regattaStartDate, regattaEndDate, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, OneDesignRankingMetric::new);
/* canBoatsOfCompetitorsChangePerRace */ true, regattaStartDate, regattaEndDate, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, OneDesignRankingMetric::new);
final String regattaName = regattaProxy.getName();
Regatta regatta = res.createRegatta(regattaName, regattaProxy.getBoatClass().getName(), regattaStartDate, regattaEndDate,
Regatta regatta = res.createRegatta(regattaName, regattaProxy.getBoatClass().getName(),
/* canBoatsOfCompetitorsChangePerRace */ true, regattaStartDate, regattaEndDate,
"123", regattaProxy.getSeries(), regattaProxy.isPersistent(), DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
addRaceColumns(numberOfQualifyingRaces, numberOfFinalRaces, regatta);
res.addRegattaLeaderboard(regatta.getRegattaIdentifier(), null, new int[] { 3, 5 });
@@ -450,8 +451,10 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
final int numberOfFinalRaces = 7;
final String regattaBaseName = "Kieler Woche";
Regatta regattaProxy = createRegatta(RegattaImpl.getDefaultName(regattaBaseName, boatClass.getName()), boatClass, regattaStartDate, regattaEndDate, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, OneDesignRankingMetric::new);
Regatta regatta = res.createRegatta(regattaProxy.getName(), regattaProxy.getBoatClass().getName(), regattaProxy.getStartDate(), regattaProxy.getEndDate(),
Regatta regattaProxy = createRegatta(RegattaImpl.getDefaultName(regattaBaseName, boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, regattaStartDate, regattaEndDate, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, OneDesignRankingMetric::new);
Regatta regatta = res.createRegatta(regattaProxy.getName(), regattaProxy.getBoatClass().getName(),
regattaProxy.canBoatsOfCompetitorsChangePerRace(), regattaProxy.getStartDate(), regattaProxy.getEndDate(),
"123", regattaProxy.getSeries(), regattaProxy.isPersistent(), DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
trackedRegatta[0] = new DynamicTrackedRegattaImpl(regatta);
addRaceColumns(numberOfQualifyingRaces, numberOfFinalRaces, regatta);
@@ -729,7 +732,8 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
final String regattaBaseName = "Kieler Woche";
BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("29erXX", /* typicallyStartsUpwind */ true);
final String regattaName = RegattaImpl.getDefaultName(regattaBaseName, boatClass.getName());
Regatta regatta = createRegatta(regattaName, boatClass, regattaStartDate, regattaEndDate,
Regatta regatta = createRegatta(regattaName, boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, regattaStartDate, regattaEndDate,
/* persistent */ false, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, OneDesignRankingMetric::new);
MongoObjectFactory mof = PersistenceFactory.INSTANCE.getMongoObjectFactory(getMongoService());
mof.storeRegatta(regatta);
@@ -785,8 +789,8 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
private Regatta createRegattaAndAddRaceColumns(final int numberOfQualifyingRaces, final int numberOfFinalRaces,
final String regattaName, BoatClass boatClass, TimePoint startDate, TimePoint endDate, boolean persistent,
ScoringScheme scoringScheme, RankingMetricConstructor rankingMetricConstructor) {
Regatta regatta = createRegatta(regattaName, boatClass, startDate, endDate, persistent, scoringScheme, null,
rankingMetricConstructor);
Regatta regatta = createRegatta(regattaName, boatClass, /* canBoatsOfCompetitorsChangePerRace */ true,
startDate, endDate, persistent, scoringScheme, null, rankingMetricConstructor);
addRaceColumns(numberOfQualifyingRaces, numberOfFinalRaces, regatta);
return regatta;
}
@@ -807,7 +811,7 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
addRaceColumnsToSeries(medalRaceColumnNames, regatta.getSeriesByName("Medal"));
}
private Regatta createRegatta(final String regattaName, BoatClass boatClass, TimePoint startDate,
private Regatta createRegatta(final String regattaName, BoatClass boatClass, boolean canBoatsOfCompetitorsChangePerRace, TimePoint startDate,
TimePoint endDate, boolean persistent, ScoringScheme scoringScheme, CourseArea courseArea,
RankingMetricConstructor rankingMetricConstructor) {
List<String> emptyRaceColumnNames = Collections.emptyList();
@@ -833,7 +837,8 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
medalFleets.add(new FleetImpl("Medal"));
Series medalSeries = new SeriesImpl("Medal", /* isMedal */ true, /* isFleetsCanRunInParallel */ true, medalFleets, emptyRaceColumnNames, /* trackedRegattaRegistry */ null);
series.add(medalSeries);
Regatta regatta = new RegattaImpl(regattaName, boatClass, startDate, endDate, series, persistent, scoringScheme, "123", courseArea, rankingMetricConstructor);
Regatta regatta = new RegattaImpl(regattaName, boatClass, canBoatsOfCompetitorsChangePerRace, startDate, endDate,
series, persistent, scoringScheme, "123", courseArea, rankingMetricConstructor);
return regatta;
}
@@ -847,7 +852,8 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
public void testRegattaRaceAssociationStore() throws Exception {
BoatClass boatClass = DomainFactory.INSTANCE.getOrCreateBoatClass("112er", /* typicallyStartsUpwind */ true);
Regatta regatta = createRegatta(RegattaImpl.getDefaultName("Cologne Masters", boatClass.getName()), boatClass,
regattaStartDate, regattaEndDate, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, OneDesignRankingMetric::new);
/* canBoatsOfCompetitorsChangePerRace */ true, regattaStartDate, regattaEndDate, /* persistent */ true,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, OneDesignRankingMetric::new);
Map<Competitor, Boat> competitorsAndBoats = new LinkedHashMap<>();
Competitor c = new CompetitorImpl("Axel", "Axel Uhl", "KYC", Color.RED, null, null, null, null, /* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null, null);
@@ -50,7 +50,7 @@ public class LeaderboardGroupResourceTest extends AbstractJaxRsApiTest {
raceColumnNames, /* trackedRegattaRegistry */null);
series.add(testSeries);
regatta = racingEventService.createRegatta(RegattaImpl.getDefaultName(regattaName, boatClassName), boatClassName,
/*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), series, /*persistent*/ true,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), series, /*persistent*/ true,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /*buoyZoneRadiusInHullLengths*/2.0,
/* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
testSeries.addRaceColumn("R1", /* trackedRegattaRegistry */ null);
@@ -49,7 +49,7 @@ public class LeaderboardsResourceCheckinAndOutTest extends AbstractJaxRsApiTest
competitor = racingEventService.getBaseDomainFactory().getOrCreateCompetitor(c.getId(), c.getName(), c.getShortName(),
c.getColor(), c.getEmail(), c.getFlagImage(), (DynamicTeam) c.getTeam(), (DynamicBoat) c.getBoat(),
/* timeOnTimeFactor */ null, /* timeOnDistanceAllowancePerNauticalMile */ null, null);
Regatta regatta = new RegattaImpl("regatta", new BoatClassImpl("49er", false), MillisecondsTimePoint.now(),
Regatta regatta = new RegattaImpl("regatta", new BoatClassImpl("49er", false), /* canBoatsOfCompetitorsChangePerRace */ true, MillisecondsTimePoint.now(),
MillisecondsTimePoint.now(), Collections.singleton(new SeriesImpl("series", false, /* isFleetsCanRunInParallel */ true, Collections
.singleton(new FleetImpl("fleet")), Arrays.asList("column"), racingEventService)), false,
new HighPoint(), 0, null, OneDesignRankingMetric::new);
@@ -61,7 +61,7 @@ public class LeaderboardsResourcePingMarkTest extends AbstractJaxRsApiTest {
super.setUp();
mark = racingEventService.getBaseDomainFactory().getOrCreateMark("id", "name");
Regatta regatta = new RegattaImpl("regatta", new BoatClassImpl("49er", false), MillisecondsTimePoint.now(),
Regatta regatta = new RegattaImpl("regatta", new BoatClassImpl("49er", false), /* canBoatsOfCompetitorsChangePerRace */ true, MillisecondsTimePoint.now(),
MillisecondsTimePoint.now(), Collections.singleton(new SeriesImpl("series", false, /* isFleetsCanRunInParallel */ true, Collections
.singleton(new FleetImpl("fleet")), Arrays.asList("column"), racingEventService)), false,
new HighPoint(), 0, null, OneDesignRankingMetric::new);
@@ -57,7 +57,7 @@ public class LeaderboardsResourceTest extends AbstractJaxRsApiTest {
raceColumnNames, /* trackedRegattaRegistry */null);
series.add(testSeries);
regatta = racingEventService.createRegatta(RegattaImpl.getDefaultName(regattaBaseName, boatClassName), boatClassName,
/*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), series, /*persistent*/ true,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), series, /*persistent*/ true,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null,
/*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
testSeries.addRaceColumn("R1", /* trackedRegattaRegistry */ null);
@@ -48,7 +48,7 @@ public class RegattasResourceTest extends AbstractJaxRsApiTest {
Series testSeries = new SeriesImpl("TestSeries", /* isMedal */false, /* isFleetsCanRunInParallel */ true, fleets, raceColumnNames, /* trackedRegattaRegistry */null);
series.add(testSeries);
racingEventService.createRegatta(RegattaImpl.getDefaultName(regattaName, boatClassName), boatClassName,
startDate, endDate, UUID.randomUUID(), series, /*persistent*/ true,
/* canBoatsOfCompetitorsChangePerRace */ true, startDate, endDate, UUID.randomUUID(), series, /*persistent*/ true,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
testSeries.addRaceColumn("R1", /* trackedRegattaRegistry */ null);
testSeries.addRaceColumn("R2", /* trackedRegattaRegistry */ null);
@@ -103,7 +103,8 @@ public abstract class AbstractLogReplicationTest<LogT extends AbstractLog<EventT
// 1. Install some race column on master...
RegattaCreationParametersDTO regattaCreationParams = new RegattaCreationParametersDTO(seriesCreationParameters);
AddSpecificRegatta addRegattaOperation = new AddSpecificRegatta(regattaName, boatClassName,
/*startDate*/ null, /*endDate*/ null, /* regatta ID */ UUID.randomUUID(), regattaCreationParams, /* persistent */ true,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
/* regatta ID */ UUID.randomUUID(), regattaCreationParams, /* persistent */ true,
new LowPoint(), /* default course area ID */ UUID.randomUUID(), /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true,
/* controlTrackingFromStartAndFinishTimes */ false, RankingMetrics.ONE_DESIGN);
return master.apply(addRegattaOperation);
@@ -79,7 +79,7 @@ public class CompetitorReplicationTest extends AbstractServerReplicationTest {
URI flagImageURI = new URI("http://www.sapsailing.com");
Iterable<Series> series = Collections.emptyList();
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName(baseEventName, boatClassName), boatClassName,
/*startDate*/ null, /*endDate*/ null, regattaId, series,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, regattaId, series,
/* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true,
/* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
Iterable<Waypoint> emptyWaypointList = Collections.emptyList();
@@ -126,7 +126,7 @@ public class InitialLoadReplicationObjectIdentityTest extends AbstractServerRepl
final String boatClassName = "49er";
final Iterable<Series> series = Collections.emptyList();
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName(baseEventName, boatClassName), boatClassName,
/*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), series,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), series,
/* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true,
/* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric.CONSTRUCTOR);
assertNotNull(master.getRegatta(masterRegatta.getRegattaIdentifier()));
@@ -45,8 +45,9 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
final Iterable<Series> series = Collections.emptyList();
final UUID regattaId = UUID.randomUUID();
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName(baseEventName, boatClassName), boatClassName,
/*startDate*/ null, /*endDate*/ null, regattaId, series,
/* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, regattaId, series,
/* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null,
/*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
Thread.sleep(1000);
@@ -74,7 +75,8 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
UUID currentCourseAreaId = null;
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName("Kiel Week 2012", "49er"), "49er",
/*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), Collections.<Series>emptyList(),
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
UUID.randomUUID(), Collections.<Series>emptyList(),
/* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), currentCourseAreaId,
/*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
@@ -124,7 +126,9 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
master.addCourseAreas(event.getId(), new String[] {"TV"}, new UUID[] {tvCourseAreaId});
master.addCourseAreas(event.getId(), new String[] {"Golf"}, new UUID[] {golfCourseAreaId});
final String regattaName = RegattaImpl.getDefaultName("Kiel Week 2012", "49er");
Regatta masterRegatta = master.createRegatta(regattaName, "49er", /*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), Collections.<Series>emptyList(),
Regatta masterRegatta = master.createRegatta(regattaName, "49er",
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
UUID.randomUUID(), Collections.<Series>emptyList(),
/* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), tvCourseAreaId,
/*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
event = master.getEvent(event.getId());
@@ -151,7 +155,9 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
master.addCourseAreas(event.getId(), new String[] {"Alpha"}, new UUID[] {alphaCourseAreaId});
UUID currentCourseAreaId = null;
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName("RR", "49er"), "49er", /*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), Collections.<Series>emptyList(),
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName("RR", "49er"), "49er",
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
UUID.randomUUID(), Collections.<Series>emptyList(),
true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), currentCourseAreaId,
/*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
@@ -198,7 +204,8 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
Arrays.asList(new Fleet[] { new FleetImpl("Gold", 1), new FleetImpl("Silver", 2) }), emptyRaceColumnNamesList, /* trackedRegattaRegistry */ null);
Series medal = new SeriesImpl("Medal", /* isMedal */ true, /* isFleetsCanRunInParallel */ true,
Arrays.asList(new Fleet[] { new FleetImpl("Medal") }), emptyRaceColumnNamesList, /* trackedRegattaRegistry */ null);
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName(baseEventName, boatClassName), boatClassName, /*startDate*/ null, /*endDate*/ null,
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName(baseEventName, boatClassName), boatClassName,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
UUID.randomUUID(), Arrays.asList(new Series[] { qualification, finals, medal }), /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null,
/*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
Thread.sleep(1000);
@@ -234,7 +241,8 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
final List<String> emptyRaceColumnNamesList = Collections.emptyList();
Series qualification = new SeriesImpl("Qualification", /* isMedal */ false, /* isFleetsCanRunInParallel */ true,
Arrays.asList(new Fleet[] { new FleetImpl("Yellow"), new FleetImpl("Blue") }), emptyRaceColumnNamesList, /* trackedRegattaRegistry */ null);
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName(baseEventName, boatClassName), boatClassName, /*startDate*/ null, /*endDate*/ null,
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName(baseEventName, boatClassName), boatClassName,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
UUID.randomUUID(), Arrays.asList(new Series[] { qualification }), /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null,
/*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
Thread.sleep(1000);
@@ -278,7 +286,8 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
final List<String> emptyRaceColumnNamesList = Collections.emptyList();
Series qualification = new SeriesImpl("Qualification", /* isMedal */ false, /* isFleetsCanRunInParallel */ true,
Arrays.asList(new Fleet[] { new FleetImpl("Yellow"), new FleetImpl("Blue") }), emptyRaceColumnNamesList, /* trackedRegattaRegistry */ null);
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName(baseEventName, boatClassName), boatClassName, /*startDate*/ null, /*endDate*/ null,
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName(baseEventName, boatClassName), boatClassName,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
UUID.randomUUID(), Arrays.asList(new Series[] { qualification }), /* persistent */ true,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null,
/*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false,
@@ -316,7 +325,8 @@ public class RegattaReplicationTest extends AbstractServerReplicationTest {
Event masterEvent = master.addEvent(eventName, /* eventDescription */ null, eventStartDate, eventEndDate, venueName, isPublic, UUID.randomUUID());
CourseArea masterCourseArea = master.addCourseAreas(masterEvent.getId(), new String[] {courseArea}, new UUID[] {UUID.randomUUID()})[0];
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName(eventName, boatClassName), boatClassName, /*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), series,
Regatta masterRegatta = master.createRegatta(RegattaImpl.getDefaultName(eventName, boatClassName), boatClassName,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), series,
/* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), masterCourseArea.getId(),
/*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
Thread.sleep(1000);
@@ -230,7 +230,7 @@ public class MasterDataImportTest {
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta(
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME,
/* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -522,7 +522,8 @@ public class MasterDataImportTest {
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta(
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME,
/* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null,
regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -680,8 +681,9 @@ public class MasterDataImportTest {
series.add(new SeriesImpl("testSeries", false, /* isFleetsCanRunInParallel */ true, fleets, emptyRaceColumnNamesList, sourceService));
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta(RegattaImpl.getDefaultName("testRegatta", "29er"), "29er",
/* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null,
regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
series.get(0).addRaceColumn(name, sourceService);
@@ -844,7 +846,8 @@ public class MasterDataImportTest {
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta(
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME,
/* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null,
regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -1004,7 +1007,8 @@ public class MasterDataImportTest {
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta(
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME,
/* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null,
regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -1117,8 +1121,9 @@ public class MasterDataImportTest {
seriesNotToOverride.add(new SeriesImpl("testSeries", false, /* isFleetsCanRunInParallel */ true, fleetsNotToOverride, emptyRaceColumnNamesList,
destService));
Regatta regattaNotToOverride = destService.createRegatta(
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME, /* startDate */
null, /* endDate */null, regattaUUID, seriesNotToOverride, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */ null, /* endDate */null,
regattaUUID, seriesNotToOverride, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
event.addRegatta(regattaNotToOverride);
for (String name : raceColumnNamesNotToOverride) {
@@ -1206,7 +1211,8 @@ public class MasterDataImportTest {
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta(
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME,
/* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null,
regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -1315,8 +1321,9 @@ public class MasterDataImportTest {
seriesToOverride.add(new SeriesImpl("testSeries", false, /* isFleetsCanRunInParallel */ true, fleetsToOverride, emptyRaceColumnNamesList,
destService));
Regatta regattaToOverride = destService.createRegatta(
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME, /* startDate */
null, /* endDate */null, regattaUUID, seriesToOverride, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */ null, /* endDate */null,
regattaUUID, seriesToOverride, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
event.addRegatta(regattaToOverride);
for (String name : raceColumnNamesToOverride) {
@@ -1425,7 +1432,8 @@ public class MasterDataImportTest {
new UUID[] { UUID.randomUUID() })[0];
Regatta regatta = sourceService.createRegatta(
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME, /* startDate */
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */
null, /* endDate */null, UUID.randomUUID(), new ArrayList<Series>(), true, new LowPoint(),
defaultCourseArea.getId(), /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
// Let's use the setters directly because we are not testing replication
@@ -1508,8 +1516,10 @@ public class MasterDataImportTest {
Regatta regatta = sourceService.createRegatta(
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME,
/* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(),
defaultCourseArea.getId(), /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null,
regattaUUID, series, true, new LowPoint(),
defaultCourseArea.getId(), /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */true,
/* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
for (String name : raceColumnNames) {
series.get(0).addRaceColumn(name, sourceService);
}
@@ -1642,7 +1652,8 @@ public class MasterDataImportTest {
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta(
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME,
/* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null,
regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* useStartTimeInference */true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -1886,7 +1897,7 @@ public class MasterDataImportTest {
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta(
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME,
/* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null, regattaUUID, series, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* useStartTimeInference */true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
event.addRegatta(regatta);
for (String name : raceColumnNames) {
@@ -2116,8 +2127,9 @@ public class MasterDataImportTest {
seriesOnTarget.add(new SeriesImpl("testSeries", false, /* isFleetsCanRunInParallel */ true, fleets, emptyRaceColumnNamesList, sourceService));
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta(
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME, /* startDate */
null, /* endDate */null, regattaUUID, seriesOnSource, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME,
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */ null, /* endDate */null,
regattaUUID, seriesOnSource, true, new LowPoint(), courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0,
/* useStartTimeInference */true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
for (String name : raceColumnNames) {
seriesOnSource.get(0).addRaceColumn(name, sourceService);
@@ -2245,7 +2257,8 @@ public class MasterDataImportTest {
Regatta regattaOnTarget = destService.createRegatta(
RegattaImpl.getDefaultName(TEST_REGATTA_NAME, TEST_BOAT_CLASS_NAME), TEST_BOAT_CLASS_NAME,
/* startDate */null, /* endDate */null, regattaUUID, seriesOnTarget, true, new LowPoint(),
/* canBoatsOfCompetitorsChangePerRace */ true, /* startDate */null, /* endDate */null,
regattaUUID, seriesOnTarget, true, new LowPoint(),
courseAreaUUID, /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */true, /* controlTrackingFromStartAndFinishTimes */ false, OneDesignRankingMetric::new);
raceColumnOnTarget.setTrackedRace(defaultFleetOnTarget, new DummyTrackedRace(raceId, createCompetitorsAndBoatsMap(boatClass, competitors),
@@ -70,7 +70,8 @@ public class RaceTrackerStartStopTest {
racingEventService = new RacingEventServiceImplMock(){};
boatClass = new BoatClassImpl(BOATCLASSNAME, /* typicallyStartsUpwind */ true);
regatta = new RegattaImpl(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE,
RegattaImpl.getDefaultName(EVENTNAME, boatClass.getName()), boatClass, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */
RegattaImpl.getDefaultName(EVENTNAME, boatClass.getName()), boatClass,
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, /* trackedRegattaRegistry */
null, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), UUID.randomUUID(), null);
racingEventService.getRegattasByName().put(EVENTNAME, regatta);
TrackedRegatta trackedRegatta1 = racingEventService.getOrCreateTrackedRegatta(regatta);
@@ -139,7 +139,7 @@ public class SearchServiceTest {
/* medal */false, /* fleetsCanRunInParallel */ true, /* startsWithZero */false, /* firstColumnIsNonDiscardableCarryForward */false,
/* discardingThresholds */null, /* hasSplitFleetContiguousScoring */false, /* maximumNumberOfDiscards */ null));
pfingstbusch29er = server.apply(new AddSpecificRegatta(RegattaImpl.getDefaultName("Pfingstbusch", "29er"), "29er",
/*startDate*/ null, /*endDate*/ null, UUID.randomUUID(),
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, UUID.randomUUID(),
new RegattaCreationParametersDTO(seriesCreationParams), /* persistent */
true, new LowPoint(), kielAlpha.getId(), /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, RankingMetrics.ONE_DESIGN));
server.apply(new AddColumnToSeries(pfingstbusch29er.getRegattaIdentifier(), "Default", "R1"));
@@ -148,7 +148,8 @@ public class SearchServiceTest {
RegattaLeaderboard pfingstbusch29erLeaderboard = server.apply(new CreateRegattaLeaderboard(pfingstbusch29er.getRegattaIdentifier(),
/* leaderboardDisplayName */ null, /* discardThresholds */ new int[0]));
pfingstbusch470 = server.apply(new AddSpecificRegatta(RegattaImpl.getDefaultName("Pfingstbusch", "470"), "470",
/*startDate*/ null, /*endDate*/ null, UUID.randomUUID(), new RegattaCreationParametersDTO(seriesCreationParams), /* persistent */
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null,
UUID.randomUUID(), new RegattaCreationParametersDTO(seriesCreationParams), /* persistent */
true, new LowPoint(), kielBravo.getId(), /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, RankingMetrics.ONE_DESIGN));
server.apply(new AddColumnToSeries(pfingstbusch470.getRegattaIdentifier(), "Default", "R1"));
server.apply(new AddColumnToSeries(pfingstbusch470.getRegattaIdentifier(), "Default", "R2"));
@@ -170,7 +171,7 @@ public class SearchServiceTest {
final CourseAreaImpl flensburgStandard = new CourseAreaImpl("Standard", UUID.randomUUID());
flensburg.addCourseArea(flensburgStandard);
aalRegatta = server.apply(new AddSpecificRegatta(RegattaImpl.getDefaultName("Aalregatta", "ORC"), "ORC",
/*startDate*/ null, /*endDate*/ null, UUID.randomUUID(),
/* canBoatsOfCompetitorsChangePerRace */ true, /*startDate*/ null, /*endDate*/ null, UUID.randomUUID(),
new RegattaCreationParametersDTO(seriesCreationParams), /* persistent */
true, new LowPoint(), flensburgStandard.getId(), /*buoyZoneRadiusInHullLengths*/2.0, /* useStartTimeInference */ true, /* controlTrackingFromStartAndFinishTimes */ false, RankingMetrics.ONE_DESIGN));
server.apply(new AddColumnToSeries(aalRegatta.getRegattaIdentifier(), "Default", "R1"));
@@ -313,7 +313,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
* @param series the series must not have any {@link RaceColumn}s yet
* @param controlTrackingFromStartAndFinishTimes TODO
*/
Regatta createRegatta(String regattaName, String boatClassName, TimePoint startDate, TimePoint endDate, Serializable id, Iterable<? extends Series> series,
Regatta createRegatta(String regattaName, String boatClassName, boolean canBoatsOfCompetitorsChangePerRace, TimePoint startDate, TimePoint endDate, Serializable id, Iterable<? extends Series> series,
boolean persistent, ScoringScheme scoringScheme, Serializable defaultCourseAreaId, Double buoyZoneRadiusInHullLengths,
boolean useStartTimeInference, boolean controlTrackingFromStartAndFinishTimes, RankingMetricConstructor rankingMetricConstructor);
@@ -463,7 +463,7 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
* the call
*/
Util.Pair<Regatta, Boolean> getOrCreateRegattaWithoutReplication(String fullRegattaName, String boatClassName,
TimePoint startDate, TimePoint endDate, Serializable id,
boolean canBoatsOfCompetitorsChangePerRace, TimePoint startDate, TimePoint endDate, Serializable id,
Iterable<? extends Series> series, boolean persistent, ScoringScheme scoringScheme,
Serializable defaultCourseAreaId, double buoyZoneRadiusInHullLengths, boolean useStartTimeInference,
boolean controlTrackingFromStartAndFinishTimes, RankingMetricConstructor rankingMetricConstructor);
@@ -1217,7 +1217,8 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
Regatta result = regattasByName.get(name);
if (result == null) {
result = new RegattaImpl(getRaceLogStore(), getRegattaLogStore(), name, getBaseDomainFactory()
.getOrCreateBoatClass(boatClassName), /* startDate */null, /* endDate */null, this,
.getOrCreateBoatClass(boatClassName), /* canBoatsOfCompetitorsChangePerRace*/ false,
/* startDate */null, /* endDate */null, this,
getBaseDomainFactory().createScoringScheme(ScoringSchemeType.LOW_POINT), id, null);
logger.info("Created default regatta " + result.getName() + " (" + hashCode() + ") on " + this);
onRegattaLikeAdded(result);
@@ -1236,12 +1237,12 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
}
@Override
public Regatta createRegatta(String fullRegattaName, String boatClassName, TimePoint startDate, TimePoint endDate,
public Regatta createRegatta(String fullRegattaName, String boatClassName, boolean canBoatsOfCompetitorsChangePerRace, TimePoint startDate, TimePoint endDate,
Serializable id, Iterable<? extends Series> series, boolean persistent, ScoringScheme scoringScheme,
Serializable defaultCourseAreaId, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, boolean controlTrackingFromStartAndFinishTimes,
RankingMetricConstructor rankingMetricConstructor) {
com.sap.sse.common.Util.Pair<Regatta, Boolean> regattaWithCreatedFlag = getOrCreateRegattaWithoutReplication(
fullRegattaName, boatClassName, startDate, endDate, id, series, persistent, scoringScheme,
fullRegattaName, boatClassName, canBoatsOfCompetitorsChangePerRace, startDate, endDate, id, series, persistent, scoringScheme,
defaultCourseAreaId, buoyZoneRadiusInHullLengths, useStartTimeInference, controlTrackingFromStartAndFinishTimes, rankingMetricConstructor);
Regatta regatta = regattaWithCreatedFlag.getA();
if (regattaWithCreatedFlag.getB()) {
@@ -1273,13 +1274,13 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
@Override
public com.sap.sse.common.Util.Pair<Regatta, Boolean> getOrCreateRegattaWithoutReplication(String fullRegattaName,
String boatClassName, TimePoint startDate, TimePoint endDate, Serializable id,
String boatClassName, boolean canBoatsOfCompetitorsChangePerRace, TimePoint startDate, TimePoint endDate, Serializable id,
Iterable<? extends Series> series, boolean persistent, ScoringScheme scoringScheme,
Serializable defaultCourseAreaId, double buoyZoneRadiusInHullLengths, boolean useStartTimeInference, boolean controlTrackingFromStartAndFinishTimes,
RankingMetricConstructor rankingMetricConstructor) {
CourseArea courseArea = getCourseArea(defaultCourseAreaId);
Regatta regatta = new RegattaImpl(getRaceLogStore(), getRegattaLogStore(), fullRegattaName,
getBaseDomainFactory().getOrCreateBoatClass(boatClassName), startDate, endDate, series, persistent,
getBaseDomainFactory().getOrCreateBoatClass(boatClassName), canBoatsOfCompetitorsChangePerRace, startDate, endDate, series, persistent,
scoringScheme, id, courseArea, buoyZoneRadiusInHullLengths, useStartTimeInference, controlTrackingFromStartAndFinishTimes, rankingMetricConstructor);
boolean wasCreated = addAndConnectRegatta(persistent, defaultCourseAreaId, regatta);
if (wasCreated) {
@@ -1459,7 +1460,8 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
courseAreaId = regatta.getDefaultCourseArea().getId();
}
replicate(new AddSpecificRegatta(regatta.getName(), regatta.getBoatClass() == null ? null : regatta
.getBoatClass().getName(), regatta.getStartDate(), regatta.getEndDate(), regatta.getId(),
.getBoatClass().getName(), regatta.canBoatsOfCompetitorsChangePerRace(),
regatta.getStartDate(), regatta.getEndDate(), regatta.getId(),
getSeriesWithoutRaceColumnsConstructionParametersAsMap(regatta), regatta.isPersistent(),
regatta.getScoringScheme(), courseAreaId, regatta.getBuoyZoneRadiusInHullLengths(), regatta.useStartTimeInference(), regatta.isControlTrackingFromStartAndFinishTimes(),
regatta.getRankingMetricType()));
@@ -32,13 +32,15 @@ public class AddSpecificRegatta extends AbstractAddRegattaOperation {
private final Double buoyZoneRadiusInHullLengths;
private final boolean useStartTimeInference;
private final boolean controlTrackingFromStartAndFinishTimes;
private final boolean canBoatsOfCompetitorsChangePerRace;
private final RankingMetrics rankingMetricType;
public AddSpecificRegatta(String regattaName, String boatClassName, TimePoint startDate, TimePoint endDate, Serializable id,
public AddSpecificRegatta(String regattaName, String boatClassName, boolean canBoatsOfCompetitorsChangePerRace, TimePoint startDate, TimePoint endDate, Serializable id,
RegattaCreationParametersDTO seriesNamesWithFleetNamesAndFleetOrderingAndMedalAndDiscardingThresholds,
boolean persistent, ScoringScheme scoringScheme, Serializable defaultCourseAreaId, Double buoyZoneRadiusInHullLengths, boolean useStartTimeInference,
boolean controlTrackingFromStartAndFinishTimes, RankingMetrics rankingMetricType) {
super(regattaName, boatClassName, startDate, endDate, id);
this.canBoatsOfCompetitorsChangePerRace = canBoatsOfCompetitorsChangePerRace;
this.seriesNamesWithFleetNamesAndFleetOrderingAndMedalAndStartsWithZeroScoreAndDiscardingThresholds = seriesNamesWithFleetNamesAndFleetOrderingAndMedalAndDiscardingThresholds;
this.persistent = persistent;
this.scoringScheme = scoringScheme;
@@ -51,7 +53,7 @@ public class AddSpecificRegatta extends AbstractAddRegattaOperation {
@Override
public Regatta internalApplyTo(RacingEventService toState) throws Exception {
Regatta regatta = toState.createRegatta(getRegattaName(), getBoatClassName(), getStartDate(), getEndDate(), getId(), createSeries(toState),
Regatta regatta = toState.createRegatta(getRegattaName(), getBoatClassName(), canBoatsOfCompetitorsChangePerRace, getStartDate(), getEndDate(), getId(), createSeries(toState),
persistent, scoringScheme, defaultCourseAreaId, buoyZoneRadiusInHullLengths, useStartTimeInference, controlTrackingFromStartAndFinishTimes, RankingMetricsFactory.getRankingMetricConstructor(rankingMetricType));
return regatta;
}
@@ -100,7 +100,8 @@ public class StructureImporter {
final TimePoint endDate = null; // TODO can regatta end time be inferred from XRR document?
RegattaImpl regatta = new RegattaImpl(RegattaImpl.getDefaultName(event.getTitle(), ((Division) event
.getRaceOrDivisionOrRegattaSeriesResult().get(0)).getTitle()),
baseDomainFactory.getOrCreateBoatClass(result.getA().getBoatClass()), startDate, endDate, getSeries(buildStructure), false,
baseDomainFactory.getOrCreateBoatClass(result.getA().getBoatClass()),
/* canBoatsOfCompetitorsChangePerRace */ true, startDate, endDate, getSeries(buildStructure), false,
this.baseDomainFactory.createScoringScheme(ScoringSchemeType.LOW_POINT), event.getEventID(), null, OneDesignRankingMetric::new);
addSpecificRegattas.add(regatta);
}