From 2880b3dcefff8fb4ff39cd2b17c7e1f5281da7af Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 5 Jun 2013 17:31:37 +0200 Subject: [PATCH 01/13] preparing for the introduction of per-series result discarding rules --- .../com/sap/sailing/domain/base/Series.java | 20 ++++++++++-- .../sailing/domain/base/impl/SeriesImpl.java | 11 +++++++ .../adminconsole/LeaderboardDescriptor.java | 3 ++ .../RaceColumnInRegattaSeriesDialog.java | 17 +++++----- .../adminconsole/RegattaDetailsComposite.java | 9 +++--- .../adminconsole/RegattaSeriesDescriptor.java | 31 +++++++++++++++++++ .../RegattaWithSeriesAndFleetsEditDialog.java | 1 - 7 files changed, 74 insertions(+), 18 deletions(-) create mode 100755 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaSeriesDescriptor.java diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Series.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Series.java index cb5305a094f..fb736a569fb 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Series.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Series.java @@ -1,17 +1,23 @@ package com.sap.sailing.domain.base; +import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRegattaRegistry; /** - * A series is a part of a {@link Regatta}. Rounds are ordered within the regatta, and rules for who is assigned to + * A series is a part of a {@link Regatta}. Series are ordered within the regatta, and rules for who is assigned to * which series may exist on the regatta. For example, a regatta may have a qualification series, a final series, and a * medal "series" with usually only a single medal race. Each series has one or more fleets, deciding how many races per * race column have to be run in this round. For example, if the 49er regatta has so many competitors that they cannot - * all start in one race, the qualification round can be split into two {@link Fleet}s, "Yellow" and "Blue," each - * getting their separate races. Fleet assignment may or may not vary. This usually depends on the round's + * all start in one race, the qualification series can be split into two {@link Fleet}s, "Yellow" and "Blue," each + * getting their separate races. Fleet assignment may or may not vary. This usually depends on the series' * characteristics of having ordered or unordered fleets.

* + * A series may define its result discarding scheme. If it does, a regatta leaderboard for the containing regatta + * has to adhere to this and may not define its own cross-cutting result discarding scheme. If one or more series + * in the regatta choose to define their own result discarding scheme, discards are determined per series and not + * per leaderboard.

+ * * To receive notifications when {@link TrackedRace tracked races} are linked to or unlinked from any of this series' * columns, {@link RaceColumnListener}s can be added / removed. * @@ -42,6 +48,14 @@ public interface Series extends SeriesBase { void removeRaceColumn(String raceColumnName); + /** + * If not null, a containing regatta's leaderboard must obey this rule and in particular cannot define + * a "cross-cutting" result discarding rule where discards may be arbitrarily distributed across series. + */ + ThresholdBasedResultDiscardingRule getResultDiscardingRule(); + + void setResultDiscardingRule(ThresholdBasedResultDiscardingRule resultDiscardingRule); + Regatta getRegatta(); /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java index eec7fe7c3c2..1617a625f3e 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java @@ -32,6 +32,7 @@ public class SeriesImpl extends NamedImpl implements Series, RaceColumnListener private boolean isMedal; private Regatta regatta; private final RaceColumnListeners raceColumnListeners; + private ThresholdBasedResultDiscardingRule resultDiscardingRule; /** * @param fleets @@ -259,4 +260,14 @@ public class SeriesImpl extends NamedImpl implements Series, RaceColumnListener public boolean isTransient() { return false; } + + @Override + public ThresholdBasedResultDiscardingRule getResultDiscardingRule() { + return resultDiscardingRule; + } + + @Override + public void setResultDiscardingRule(ThresholdBasedResultDiscardingRule resultDiscardingRule) { + this.resultDiscardingRule = resultDiscardingRule; + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardDescriptor.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardDescriptor.java index dcd8816e882..81b967dbee5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardDescriptor.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardDescriptor.java @@ -27,6 +27,9 @@ public class LeaderboardDescriptor { this.courseAreaIdAsString = courseAreaIdAsString; } + /** + * Leaves the {@link #regattaName} null, representing a flexible leaderboard, not a regatta leaderboard + */ public LeaderboardDescriptor(String name, String displayName, ScoringSchemeType scoringScheme, int[] discardThresholds, String courseAreaIdAsString) { this.name = name; this.displayName = displayName; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceColumnInRegattaSeriesDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceColumnInRegattaSeriesDialog.java index e7ab75edb60..fe9b9bb198b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceColumnInRegattaSeriesDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceColumnInRegattaSeriesDialog.java @@ -17,13 +17,12 @@ import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.domain.common.dto.RaceColumnDTO; -import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.gwt.ui.client.DataEntryDialog; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO; -public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog>> { +public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog { private final ListBox addRacesListBox; private Button addRacesBtn; private final List raceNameEntryFields; @@ -34,7 +33,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog>> { + private static class RaceDialogValidator implements Validator { private StringMessages stringConstants; private RegattaDTO regatta; @@ -44,10 +43,10 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog> valueToValidate) { + public String getErrorMessage(RegattaSeriesDescriptor valueToValidate) { Set raceColumnNamesOfOtherSeries = new HashSet(); - SeriesDTO seriesToValidate = valueToValidate.getA(); - List raceColumnsToValidate = valueToValidate.getB(); + SeriesDTO seriesToValidate = valueToValidate.getSeries(); + List raceColumnsToValidate = valueToValidate.getRaces(); String errorMessage = null; for (SeriesDTO seriesDTO: regatta.series) { @@ -102,7 +101,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog>> callback) { + DialogCallback callback) { super(stringConstants.actionEditRaces(), null, stringConstants.ok(), stringConstants.cancel(), new RaceDialogValidator(regatta, stringConstants), callback); this.selectedSeries = selectedSeries; @@ -146,7 +145,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog> getResult() { + protected RegattaSeriesDescriptor getResult() { SeriesDTO selectedSeries = getSelectedSeries(); List races = new ArrayList(); int racesCount = raceNameEntryFields.size(); @@ -159,7 +158,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog>(selectedSeries, races); + return new RegattaSeriesDescriptor(selectedSeries, races); } private RaceColumnDTO findRaceColumnInSeriesByName(SeriesDTO series, String raceColumnName) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java index 38c438fb1e5..f9928523474 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java @@ -24,12 +24,11 @@ import com.sap.sailing.domain.common.ScoringSchemeType; import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.domain.common.dto.RaceColumnInSeriesDTO; -import com.sap.sailing.domain.common.impl.Util.Pair; +import com.sap.sailing.gwt.ui.client.DataEntryDialog.DialogCallback; import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.RegattaRefresher; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.client.DataEntryDialog.DialogCallback; import com.sap.sailing.gwt.ui.leaderboard.ScoringSchemeTypeFormatter; import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO; @@ -195,14 +194,14 @@ public class RegattaDetailsComposite extends Composite { private void editRacesOfRegattaSeries(final RegattaDTO regatta, final SeriesDTO series) { RaceColumnInRegattaSeriesDialog raceDialog = new RaceColumnInRegattaSeriesDialog(regatta, series, stringMessages, - new DialogCallback>>() { + new DialogCallback() { @Override public void cancel() { } @Override - public void ok(final Pair> result) { - updateRacesOfRegattaSeries(regatta, result.getA(), result.getB()); + public void ok(final RegattaSeriesDescriptor result) { + updateRacesOfRegattaSeries(regatta, result.getSeries(), result.getRaces()); } }); raceDialog.show(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaSeriesDescriptor.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaSeriesDescriptor.java new file mode 100755 index 00000000000..fd0adafb524 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaSeriesDescriptor.java @@ -0,0 +1,31 @@ +package com.sap.sailing.gwt.ui.adminconsole; + +import java.util.List; + +import com.sap.sailing.domain.common.dto.RaceColumnDTO; +import com.sap.sailing.gwt.ui.shared.SeriesDTO; + +/** + * Used by {@link RaceColumnInRegattaSeriesDialog} to capture the result of the user's configuration changes, + * including the race columns that the series shall define, the medal status and the discarding rules, if any. + * + * @author Axel Uhl (d043530) + * + */ +public class RegattaSeriesDescriptor { + private final SeriesDTO series; + private final List races; + + public RegattaSeriesDescriptor(SeriesDTO series, List races) { + this.series = series; + this.races = races; + } + + public SeriesDTO getSeries() { + return series; + } + + public List getRaces() { + return races; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaWithSeriesAndFleetsEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaWithSeriesAndFleetsEditDialog.java index f9d51abb9a6..476c49a0440 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaWithSeriesAndFleetsEditDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaWithSeriesAndFleetsEditDialog.java @@ -17,7 +17,6 @@ public class RegattaWithSeriesAndFleetsEditDialog extends RegattaWithSeriesAndFl nameEntryField.setEnabled(false); boatClassEntryField.setEnabled(false); scoringSchemeListBox.setEnabled(false); - sailingEventsListBox.setEnabled(true); courseAreaListBox.setEnabled(true); } From a1cafa284e09af0f47be8300eb63d99cf7ef9938 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 5 Jun 2013 18:11:58 +0200 Subject: [PATCH 02/13] a few renames and persistence for Series result discarding rules --- .../impl/DomainObjectFactoryImpl.java | 17 +++-- .../domain/persistence/impl/FieldNames.java | 1 + .../impl/MongoObjectFactoryImpl.java | 11 +-- .../test/LeaderboardForKielWeekTest.java | 4 +- .../domain/test/LeaderboardOfflineTest.java | 16 ++--- .../LeaderboardScoringAndRankingTest.java | 12 ++-- .../domain/test/OfflineSerializationTest.java | 6 +- ...resholdBasedResultDiscardingRuleImpl.java} | 4 +- .../AbstractLeaderboardDialog.java | 14 ++++ .../FlexibleLeaderboardDialog.java | 9 +-- .../adminconsole/RegattaDetailsComposite.java | 6 +- ...sDescriptor.java => SeriesDescriptor.java} | 6 +- ...eriesDialog.java => SeriesEditDialog.java} | 19 +++-- .../gwt/ui/client/DataEntryDialog.java | 4 +- .../sap/sailing/gwt/ui/shared/SeriesDTO.java | 1 + ...StoringAndRetrievingLeaderboardGroups.java | 70 +++++++++---------- .../TestStoringAndRetrievingLeaderboards.java | 24 +++---- ...ingAndRetrievingRaceLogInLeaderboards.java | 4 +- .../test/LeaderboardDiscardingRulesTest.java | 4 +- .../server/impl/RacingEventServiceImpl.java | 10 +-- .../UpdateLeaderboard.java | 4 +- 21 files changed, 130 insertions(+), 116 deletions(-) rename java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/{ResultDiscardingRuleImpl.java => ThresholdBasedResultDiscardingRuleImpl.java} (94%) rename java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/{RegattaSeriesDescriptor.java => SeriesDescriptor.java} (73%) rename java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/{RaceColumnInRegattaSeriesDialog.java => SeriesEditDialog.java} (91%) diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index f2770ee8f52..5c3bb43e76b 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -83,7 +83,7 @@ import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl; import com.sap.sailing.domain.leaderboard.impl.RegattaLeaderboardImpl; -import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; +import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard; import com.sap.sailing.domain.persistence.DomainObjectFactory; @@ -238,7 +238,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } if (result == null) { SettableScoreCorrection scoreCorrection = new ScoreCorrectionImpl(); - ThresholdBasedResultDiscardingRule resultDiscardingRule = loadResultDiscardingRule(dbLeaderboard); + ThresholdBasedResultDiscardingRule resultDiscardingRule = loadResultDiscardingRule(dbLeaderboard, FieldNames.LEADERBOARD_DISCARDING_THRESHOLDS); String regattaName = (String) dbLeaderboard.get(FieldNames.REGATTA_NAME.name()); if (groupForMetaLeaderboard != null) { result = new LeaderboardGroupMetaLeaderboard(groupForMetaLeaderboard, loadScoringScheme(dbLeaderboard), resultDiscardingRule); @@ -314,17 +314,16 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } /** - * @param dbLeaderboard expects to find a field named {@link FieldNames#LEADERBOARD_DISCARDING_THRESHOLDS} + * @param dbObject expects to find a field identified by field which holds a {@link BasicDBList} */ - private ThresholdBasedResultDiscardingRule loadResultDiscardingRule(DBObject dbLeaderboard) { - BasicDBList dbDiscardIndexResultsStartingWithHowManyRaces = (BasicDBList) dbLeaderboard - .get(FieldNames.LEADERBOARD_DISCARDING_THRESHOLDS.name()); + private ThresholdBasedResultDiscardingRule loadResultDiscardingRule(DBObject dbObject, FieldNames field) { + BasicDBList dbDiscardIndexResultsStartingWithHowManyRaces = (BasicDBList) dbObject.get(field.name()); int[] discardIndexResultsStartingWithHowManyRaces = new int[dbDiscardIndexResultsStartingWithHowManyRaces.size()]; int i = 0; for (Object discardingThresholdAsObject : dbDiscardIndexResultsStartingWithHowManyRaces) { discardIndexResultsStartingWithHowManyRaces[i++] = (Integer) discardingThresholdAsObject; } - ThresholdBasedResultDiscardingRule resultDiscardingRule = new ResultDiscardingRuleImpl( + ThresholdBasedResultDiscardingRule resultDiscardingRule = new ThresholdBasedResultDiscardingRuleImpl( discardIndexResultsStartingWithHowManyRaces); return resultDiscardingRule; } @@ -917,6 +916,10 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { fleetsByName.values(), raceColumnNames, trackedRegattaRegistry); + if (dbSeries.get(FieldNames.SERIES_DISCARDING_THRESHOLDS.name()) != null) { + ThresholdBasedResultDiscardingRule resultDiscardingRule = loadResultDiscardingRule(dbSeries, FieldNames.SERIES_DISCARDING_THRESHOLDS); + series.setResultDiscardingRule(resultDiscardingRule); + } loadRaceColumnRaceLinks(dbRaceColumns, series); return series; } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java index 02807f1736f..915625b5116 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java @@ -22,6 +22,7 @@ public enum FieldNames { SERIES_IS_MEDAL, SERIES_FLEETS, SERIES_RACE_COLUMNS, + SERIES_DISCARDING_THRESHOLDS, FLEET_NAME, FLEET_ORDERING, FLEET_COLOR, diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index af0b4dc3707..dc1674f28b1 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -238,7 +238,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { storeScoreCorrections(leaderboard, dbScoreCorrections); dbLeaderboard.put(FieldNames.LEADERBOARD_SCORE_CORRECTIONS.name(), dbScoreCorrections); final ThresholdBasedResultDiscardingRule resultDiscardingRule = leaderboard.getResultDiscardingRule(); - storeResultDiscardingRule(dbLeaderboard, resultDiscardingRule); + storeResultDiscardingRule(dbLeaderboard, resultDiscardingRule, FieldNames.LEADERBOARD_DISCARDING_THRESHOLDS); BasicDBList competitorDisplayNames = new BasicDBList(); for (Competitor competitor : leaderboard.getCompetitors()) { String displayNameForCompetitor = leaderboard.getDisplayName(competitor); @@ -252,13 +252,13 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { dbLeaderboard.put(FieldNames.LEADERBOARD_COMPETITOR_DISPLAY_NAMES.name(), competitorDisplayNames); } - private void storeResultDiscardingRule(BasicDBObject dbLeaderboard, - final ThresholdBasedResultDiscardingRule resultDiscardingRule) { + private void storeResultDiscardingRule(DBObject dbObject, + final ThresholdBasedResultDiscardingRule resultDiscardingRule, FieldNames field) { BasicDBList dbResultDiscardingThresholds = new BasicDBList(); for (int threshold : resultDiscardingRule.getDiscardIndexResultsStartingWithHowManyRaces()) { dbResultDiscardingThresholds.add(threshold); } - dbLeaderboard.put(FieldNames.LEADERBOARD_DISCARDING_THRESHOLDS.name(), dbResultDiscardingThresholds); + dbObject.put(field.name(), dbResultDiscardingThresholds); } private BasicDBObject storeRaceColumn(RaceColumn raceColumn) { @@ -478,6 +478,9 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { dbRaceColumns.add(storeRaceColumn(raceColumn)); } dbSeries.put(FieldNames.SERIES_RACE_COLUMNS.name(), dbRaceColumns); + if (s.getResultDiscardingRule() != null) { + storeResultDiscardingRule(dbSeries, s.getResultDiscardingRule(), FieldNames.SERIES_DISCARDING_THRESHOLDS); + } return dbSeries; } diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardForKielWeekTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardForKielWeekTest.java index a5917d0586a..5613aa65226 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardForKielWeekTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardForKielWeekTest.java @@ -21,7 +21,7 @@ import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LowPoint; -import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; +import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.tracking.impl.WindImpl; import com.sap.sailing.domain.tractracadapter.ReceiverType; @@ -37,7 +37,7 @@ public class LeaderboardForKielWeekTest extends OnlineTracTracBasedTest { @Test public void leaderboardWithOneRaceTest() throws URISyntaxException, NoWindException, IOException, InterruptedException { leaderboard = new FlexibleLeaderboardImpl("Kiel Week 2011 505s", new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(new int[] { 3, 6 }), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(new int[] { 3, 6 }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); MillisecondsTimePoint now = MillisecondsTimePoint.now(); loadRace("357c700a-9d9a-11e0-85be-406186cbf87c"); // 505 Race 2 diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java index b2a12be2795..e8cc3d74568 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardOfflineTest.java @@ -37,7 +37,7 @@ import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LowPoint; -import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; +import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRankAndManyCompetitors; @@ -100,7 +100,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { @Test public void ensureMedalRaceParamIsIgnoredIfRaceColumnAlreadyExists() { - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ScoreCorrectionImpl(), new ResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ScoreCorrectionImpl(), new ThresholdBasedResultDiscardingRuleImpl( new int[] { 5, 8 }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); final String columnName = "abc"; @@ -113,7 +113,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { @Test public void testRepeatedLeaderboardDTOCacheInvalidation() throws NoWindException, InterruptedException, ExecutionException { - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ScoreCorrectionImpl(), new ResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ScoreCorrectionImpl(), new ThresholdBasedResultDiscardingRuleImpl( new int[] { 5, 8 }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); final String columnName = "abc"; @@ -169,7 +169,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { testRaces.add(r); // hash set should take care of more or less randomly permuting the races } ScoreCorrectionImpl scoreCorrection = new ScoreCorrectionImpl(); - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ThresholdBasedResultDiscardingRuleImpl( new int[] { 1 }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); int i=0; @@ -203,7 +203,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { testRace.addCompetitor(c2); testRace.addCompetitor(c3); // this makes maxPoints==4 ScoreCorrectionImpl scoreCorrection = new ScoreCorrectionImpl(); - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ThresholdBasedResultDiscardingRuleImpl( new int[] { 2 }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); leaderboard.addRace(testRace, "R1", /* medalRace */ false, defaultFleet); @@ -232,7 +232,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { testRace.addCompetitor(c2); testRace.addCompetitor(c3); // this makes maxPoints==4 ScoreCorrectionImpl scoreCorrection = new ScoreCorrectionImpl(); - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ThresholdBasedResultDiscardingRuleImpl( new int[] { 2 }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); RaceColumn r1 = leaderboard.addRace(testRace, "R1", /* medalRace */ false, defaultFleet); @@ -260,7 +260,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { testRaces.add(r); // hash set should take care of more or less randomly permuting the races } ScoreCorrectionImpl scoreCorrection = new ScoreCorrectionImpl(); - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", scoreCorrection, new ThresholdBasedResultDiscardingRuleImpl( new int[] { 1 }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); int i=0; @@ -287,7 +287,7 @@ public class LeaderboardOfflineTest extends AbstractLeaderboardTest { protected void testLeaderboard(int numberOfStartedRaces, int numberOfNotStartedRaces, int firstDiscardingThreshold, int secondDiscardingThreshold, Integer carry, boolean addOneMedalRace, int numberOfUntrackedRaces) throws NoWindException { setupRaces(numberOfStartedRaces, numberOfNotStartedRaces); - FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ScoreCorrectionImpl(), new ResultDiscardingRuleImpl( + FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl("Test Leaderboard", new ScoreCorrectionImpl(), new ThresholdBasedResultDiscardingRuleImpl( new int[] { firstDiscardingThreshold, secondDiscardingThreshold }), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); int i=0; diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java index bbf4f98a83f..2f3857080d1 100644 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardScoringAndRankingTest.java @@ -45,7 +45,7 @@ import com.sap.sailing.domain.leaderboard.impl.HighPoint; import com.sap.sailing.domain.leaderboard.impl.HighPointExtremeSailingSeriesOverall; import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl; import com.sap.sailing.domain.leaderboard.impl.RegattaLeaderboardImpl; -import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; +import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithStartTimeAndRanks; @@ -60,7 +60,7 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest { private Leaderboard createLeaderboard(Regatta regatta, int[] discardingThresholds) { ScoreCorrectionImpl scoreCorrections = new ScoreCorrectionImpl(); - ResultDiscardingRuleImpl discardingRules = new ResultDiscardingRuleImpl(discardingThresholds); + ThresholdBasedResultDiscardingRuleImpl discardingRules = new ThresholdBasedResultDiscardingRuleImpl(discardingThresholds); return new RegattaLeaderboardImpl(regatta, scoreCorrections, discardingRules); } @@ -801,7 +801,7 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest { TimePoint now = MillisecondsTimePoint.now(); TimePoint later = new MillisecondsTimePoint(now.asMillis()+1000); FlexibleLeaderboard leaderboard1 = new FlexibleLeaderboardImpl("Leaderboard 1", new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null); leaderboard1.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f1)), "R1", /* medalRace */ false, leaderboard1.getFleet(null)); leaderboard1.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f2)), "R2", /* medalRace */ false, @@ -809,7 +809,7 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest { assertTrue(leaderboard1.getScoringScheme().getScoreComparator(/* nullScoresAreBetter */ false).compare( leaderboard1.getTotalPoints(c[0], later), leaderboard1.getTotalPoints(c[3], later)) < 0); // c0 better than c3 FlexibleLeaderboard leaderboard2 = new FlexibleLeaderboardImpl("Leaderboard 3", new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null); leaderboard2.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f3)), "R1", /* medalRace */ false, leaderboard1.getFleet(null)); leaderboard2.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f4)), "R2", /* medalRace */ false, @@ -817,7 +817,7 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest { assertTrue(leaderboard2.getScoringScheme().getScoreComparator(/* nullScoresAreBetter */ false).compare( leaderboard2.getTotalPoints(c[3], later), leaderboard2.getTotalPoints(c[0], later)) < 0); // c3 better than c0 FlexibleLeaderboard leaderboard3 = new FlexibleLeaderboardImpl("Leaderboard 3", new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]), new HighPoint(), null); leaderboard3.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f5)), "R1", /* medalRace */ false, leaderboard1.getFleet(null)); leaderboard3.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(f6)), "R2", /* medalRace */ false, @@ -827,7 +827,7 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest { LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl("Leaderboard Group", "Leaderboard Group", false, Arrays.asList(leaderboard1, leaderboard2, leaderboard3)); leaderboardGroup.setOverallLeaderboard(new LeaderboardGroupMetaLeaderboard(leaderboardGroup, new HighPointExtremeSailingSeriesOverall(), - new ResultDiscardingRuleImpl(new int[0]))); + new ThresholdBasedResultDiscardingRuleImpl(new int[0]))); leaderboardGroup.getOverallLeaderboard().setSuppressed(c[1], true); leaderboardGroup.getOverallLeaderboard().setSuppressed(c[2], true); List rankedCompetitors = leaderboardGroup.getOverallLeaderboard().getCompetitorsFromBestToWorst(later); diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java index 38937b02c0a..d52445f78f3 100755 --- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java +++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java @@ -25,7 +25,7 @@ import com.sap.sailing.domain.base.impl.DomainFactoryImpl; import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.TeamImpl; import com.sap.sailing.domain.common.impl.Util.Pair; -import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; +import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; public class OfflineSerializationTest extends AbstractSerializationTest { /** @@ -81,8 +81,8 @@ public class OfflineSerializationTest extends AbstractSerializationTest { @Test public void testSerializingResultDiscardingRuleImpl() throws ClassNotFoundException, IOException { DomainFactory receiverDomainFactory = new DomainFactoryImpl(); - ResultDiscardingRuleImpl rdri = new ResultDiscardingRuleImpl(new int[] { 5, 8 }); - ResultDiscardingRuleImpl clone = cloneBySerialization(rdri, receiverDomainFactory); + ThresholdBasedResultDiscardingRuleImpl rdri = new ThresholdBasedResultDiscardingRuleImpl(new int[] { 5, 8 }); + ThresholdBasedResultDiscardingRuleImpl clone = cloneBySerialization(rdri, receiverDomainFactory); assertTrue(Arrays.equals(rdri.getDiscardIndexResultsStartingWithHowManyRaces(), clone.getDiscardIndexResultsStartingWithHowManyRaces())); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ResultDiscardingRuleImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ThresholdBasedResultDiscardingRuleImpl.java similarity index 94% rename from java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ResultDiscardingRuleImpl.java rename to java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ThresholdBasedResultDiscardingRuleImpl.java index 71947814eef..68b0c137171 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ResultDiscardingRuleImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ThresholdBasedResultDiscardingRuleImpl.java @@ -30,11 +30,11 @@ import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; * @author Axel Uhl (d043530) * */ -public class ResultDiscardingRuleImpl implements ThresholdBasedResultDiscardingRule { +public class ThresholdBasedResultDiscardingRuleImpl implements ThresholdBasedResultDiscardingRule { private static final long serialVersionUID = 386341628517357988L; private final int[] discardIndexResultsStartingWithHowManyRaces; - public ResultDiscardingRuleImpl(int[] discardIndexResultsStartingWithHowManyRaces) { + public ThresholdBasedResultDiscardingRuleImpl(int[] discardIndexResultsStartingWithHowManyRaces) { super(); this.discardIndexResultsStartingWithHowManyRaces = new int[discardIndexResultsStartingWithHowManyRaces.length]; System.arraycopy(discardIndexResultsStartingWithHowManyRaces, 0, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardDialog.java index 58550481ecd..44694017cb1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardDialog.java @@ -3,6 +3,9 @@ package com.sap.sailing.gwt.ui.adminconsole; import java.util.ArrayList; import java.util.List; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.LongBox; import com.google.gwt.user.client.ui.TextBox; @@ -56,6 +59,17 @@ public abstract class AbstractLeaderboardDialog extends DataEntryDialog() { + SeriesEditDialog raceDialog = new SeriesEditDialog(regatta, series, stringMessages, + new DialogCallback() { @Override public void cancel() { } @Override - public void ok(final RegattaSeriesDescriptor result) { + public void ok(final SeriesDescriptor result) { updateRacesOfRegattaSeries(regatta, result.getSeries(), result.getRaces()); } }); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaSeriesDescriptor.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesDescriptor.java similarity index 73% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaSeriesDescriptor.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesDescriptor.java index fd0adafb524..bab82fe8666 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaSeriesDescriptor.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesDescriptor.java @@ -6,17 +6,17 @@ import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO; /** - * Used by {@link RaceColumnInRegattaSeriesDialog} to capture the result of the user's configuration changes, + * Used by {@link SeriesEditDialog} to capture the result of the user's configuration changes, * including the race columns that the series shall define, the medal status and the discarding rules, if any. * * @author Axel Uhl (d043530) * */ -public class RegattaSeriesDescriptor { +public class SeriesDescriptor { private final SeriesDTO series; private final List races; - public RegattaSeriesDescriptor(SeriesDTO series, List races) { + public SeriesDescriptor(SeriesDTO series, List races) { this.series = series; this.races = races; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceColumnInRegattaSeriesDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesEditDialog.java similarity index 91% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceColumnInRegattaSeriesDialog.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesEditDialog.java index fe9b9bb198b..44e756ab0c2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceColumnInRegattaSeriesDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesEditDialog.java @@ -22,7 +22,7 @@ import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO; -public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog { +public class SeriesEditDialog extends DataEntryDialog { private final ListBox addRacesListBox; private Button addRacesBtn; private final List raceNameEntryFields; @@ -33,7 +33,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog { + private static class RaceDialogValidator implements Validator { private StringMessages stringConstants; private RegattaDTO regatta; @@ -43,7 +43,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog raceColumnNamesOfOtherSeries = new HashSet(); SeriesDTO seriesToValidate = valueToValidate.getSeries(); List raceColumnsToValidate = valueToValidate.getRaces(); @@ -100,12 +100,11 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog callback) { - super(stringConstants.actionEditRaces(), null, stringConstants.ok(), stringConstants.cancel(), - new RaceDialogValidator(regatta, stringConstants), callback); + public SeriesEditDialog(RegattaDTO regatta, SeriesDTO selectedSeries, StringMessages stringMessages,DialogCallback callback) { + super(stringMessages.actionEditRaces(), null, stringMessages.ok(), stringMessages.cancel(), + new RaceDialogValidator(regatta, stringMessages), callback); this.selectedSeries = selectedSeries; - this.stringMessages = stringConstants; + this.stringMessages = stringMessages; addRacesListBox = createListBox(false); raceNamePrefixTextBox = createTextBox(null); raceNameEntryFields = new ArrayList(); @@ -145,7 +144,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog races = new ArrayList(); int racesCount = raceNameEntryFields.size(); @@ -158,7 +157,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog { return result; } - public void alignAllPanelWidgetsVertically(HorizontalPanel panel, HasVerticalAlignment.VerticalAlignmentConstant alignment) { - for(int i = 0; i < panel.getWidgetCount(); i++) { + public static void alignAllPanelWidgetsVertically(HorizontalPanel panel, HasVerticalAlignment.VerticalAlignmentConstant alignment) { + for (int i = 0; i < panel.getWidgetCount(); i++) { panel.setCellVerticalAlignment(panel.getWidget(i), alignment); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SeriesDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SeriesDTO.java index 92442b013e8..851a7e539f7 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SeriesDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SeriesDTO.java @@ -11,6 +11,7 @@ public class SeriesDTO extends NamedDTO { private List fleets; private List raceColumns; private boolean isMedal; + private int[] discardThresholds; public SeriesDTO() {} diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java index dcbdb2eea13..f92fbcaf1c4 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java @@ -39,7 +39,7 @@ import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.HighPointExtremeSailingSeriesOverall; import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl; import com.sap.sailing.domain.leaderboard.impl.LowPoint; -import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; +import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard; import com.sap.sailing.domain.persistence.DomainObjectFactory; @@ -77,21 +77,21 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final ArrayList leaderboards = new ArrayList<>(); Leaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); final LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl(groupName, groupDescription, false, leaderboards); final Leaderboard overallLeaderboard = new LeaderboardGroupMetaLeaderboard(leaderboardGroup, - new HighPointExtremeSailingSeriesOverall(), new ResultDiscardingRuleImpl(new int[0])); + new HighPointExtremeSailingSeriesOverall(), new ThresholdBasedResultDiscardingRuleImpl(new int[0])); leaderboardGroup.setOverallLeaderboard(overallLeaderboard); mongoObjectFactory.storeLeaderboardGroup(leaderboardGroup); @@ -125,18 +125,18 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String groupDescription = "A leaderboard group"; FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); racingEventService.addLeaderboard(leaderboard); leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false, leaderboard.getFleet(null)); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); racingEventService.addLeaderboard(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); racingEventService.addLeaderboard(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); racingEventService.addLeaderboard(leaderboard); LeaderboardGroup leaderboardGroup = racingEventService.addLeaderboardGroup(groupName, groupDescription, false, Arrays.asList(leaderboardNames), new int[0], @@ -182,23 +182,23 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final ArrayList leaderboards = new ArrayList<>(); FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false, leaderboard.getFleet(null)); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); final LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl(groupName, groupDescription, false, leaderboards); final Leaderboard overallLeaderboard = new LeaderboardGroupMetaLeaderboard(leaderboardGroup, - new HighPointExtremeSailingSeriesOverall(), new ResultDiscardingRuleImpl(new int[0])); + new HighPointExtremeSailingSeriesOverall(), new ThresholdBasedResultDiscardingRuleImpl(new int[0])); leaderboardGroup.setOverallLeaderboard(overallLeaderboard); overallLeaderboard.setSuppressed(wolfgang, true); mongoObjectFactory.storeLeaderboardGroup(leaderboardGroup); @@ -239,23 +239,23 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final ArrayList leaderboards = new ArrayList<>(); FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); leaderboard.addRace(raceWithTwoCompetitors, raceColumnName1, /* medalRace */ false, leaderboard.getFleet(null)); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); final LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl(groupName, groupDescription, false, leaderboards); final Leaderboard overallLeaderboard = new LeaderboardGroupMetaLeaderboard(leaderboardGroup, - new HighPointExtremeSailingSeriesOverall(), new ResultDiscardingRuleImpl(new int[0])); + new HighPointExtremeSailingSeriesOverall(), new ThresholdBasedResultDiscardingRuleImpl(new int[0])); leaderboardGroup.setOverallLeaderboard(overallLeaderboard); overallLeaderboard.setSuppressed(wolfgang, true); overallLeaderboard.setSuppressed(hasso, true); @@ -287,13 +287,13 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String groupDescription1 = "A leaderboard group 1"; final ArrayList leaderboards1 = new ArrayList<>(); Leaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards1.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards1.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards1.add(leaderboard); final LeaderboardGroup leaderboardGroup1 = new LeaderboardGroupImpl(groupName1, groupDescription1, false, leaderboards1); mongoObjectFactory.storeLeaderboardGroup(leaderboardGroup1); @@ -302,10 +302,10 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String groupDescription2= "A leaderboard group 2"; final ArrayList leaderboards2 = new ArrayList<>(); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards2.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards2.add(leaderboard); final LeaderboardGroup leaderboardGroup2 = new LeaderboardGroupImpl(groupName2, groupDescription2, false, leaderboards2); mongoObjectFactory.storeLeaderboardGroup(leaderboardGroup2); @@ -332,16 +332,16 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final ArrayList leaderboards = new ArrayList<>(); Leaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[2], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[3], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); final LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl(groupName, groupDescription, false, leaderboards); @@ -370,10 +370,10 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final ArrayList leaderboards = new ArrayList<>(); Leaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[0], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); leaderboard = new FlexibleLeaderboardImpl(leaderboardNames[1], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboards.add(leaderboard); final LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl(groupName, groupDescription, false, leaderboards); @@ -383,11 +383,11 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final FlexibleLeaderboard[] ungroupedLeaderboards = { new FlexibleLeaderboardImpl(ungroupedLeaderboardNames[0], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null), + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null), new FlexibleLeaderboardImpl(ungroupedLeaderboardNames[1], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null), + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null), new FlexibleLeaderboardImpl(ungroupedLeaderboardNames[2], new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null) }; + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null) }; mongoObjectFactory.storeLeaderboard(ungroupedLeaderboards[0]); mongoObjectFactory.storeLeaderboard(ungroupedLeaderboards[1]); mongoObjectFactory.storeLeaderboard(ungroupedLeaderboards[2]); @@ -424,7 +424,7 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe final String groupDescription = "A leaderboard group"; final ArrayList leaderboards = new ArrayList<>(); - final FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + final FlexibleLeaderboard leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); final Fleet fleet = leaderboard.getFleet(null); final RaceColumn race = leaderboard.addRaceColumn(columnName, false, fleet); leaderboards.add(leaderboard); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java index b4b904dabe5..9326338ccec 100755 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java @@ -30,7 +30,7 @@ import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.HighPoint; import com.sap.sailing.domain.leaderboard.impl.LowPoint; -import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; +import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.persistence.impl.DomainObjectFactoryImpl; import com.sap.sailing.domain.persistence.impl.MongoObjectFactoryImpl; @@ -48,7 +48,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final String leaderboardName = "TestLeaderboard"; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); leaderboard.addRaceColumn("R1", /* medalRace */ false); RaceColumn r2 = leaderboard.addRaceColumn("R2", /* medalRace */ false); r2.setFactor(1.5); @@ -66,7 +66,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final String leaderboardName = "TestLeaderboard"; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); Competitor wolfgang = createCompetitor(); Competitor hasso = new CompetitorImpl(234, "Hasso Plattner", new TeamImpl("STG", Collections.singleton( new PersonImpl("Hasso Plattner", new NationalityImpl("GER"), @@ -95,7 +95,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; SettableScoreCorrection scoreCorrection = new ScoreCorrectionImpl(); FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, scoreCorrection, - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); scoreCorrection.setComment("Humba"); MillisecondsTimePoint now = MillisecondsTimePoint.now(); scoreCorrection.setTimePointOfLastCorrectionsValidity(now); @@ -111,7 +111,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; SettableScoreCorrection scoreCorrection = new ScoreCorrectionImpl(); FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, scoreCorrection, - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); Competitor competitor = createCompetitor(); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); final String raceColumnName1 = "My First Race 1"; @@ -132,7 +132,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final String leaderboardName = "TestLeaderboard"; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard); Leaderboard loadedLeaderboard = new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null); assertEquals(leaderboardName, loadedLeaderboard.getName()); @@ -145,7 +145,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final String leaderboardName = "TestLeaderboard"; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new HighPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new HighPoint(), null); new MongoObjectFactoryImpl(db).storeLeaderboard(leaderboard); Leaderboard loadedLeaderboard = new DomainObjectFactoryImpl(db).loadLeaderboard(leaderboardName, /* regattaRegistry */ null); assertSame(HighPoint.class, loadedLeaderboard.getScoringScheme().getClass()); @@ -159,7 +159,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final double carriedPointsForWolfgangHunger = 3.7; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); Competitor competitor = createCompetitor(); TrackedRace raceWithOneCompetitor = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); leaderboard.addRace(raceWithOneCompetitor, raceColumnName, /* medalRace */ false, leaderboard.getFleet(null)); @@ -184,7 +184,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final double correctedPoints = 2.75; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); Competitor competitor = createCompetitor(); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true); @@ -212,7 +212,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final double correctedPoints = 2.75; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); Competitor competitor = createCompetitor(); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true); @@ -238,7 +238,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final MaxPointsReason maxPointsReason = MaxPointsReason.DNF; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); Competitor competitor = createCompetitor(); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true); @@ -267,7 +267,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest { final MaxPointsReason maxPointsReason = MaxPointsReason.DNF; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); Competitor competitor = createCompetitor(); TrackedRace raceWithOneCompetitor1 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 1, /* started */ true); TrackedRace raceWithOneCompetitor2 = new MockedTrackedRaceWithFixedRank(competitor, /* rank */ 2, /* started */ true); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java index faf70a0caea..3b536af2ce4 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java @@ -28,7 +28,7 @@ import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LowPoint; -import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; +import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.persistence.MongoFactory; import com.sap.sailing.domain.persistence.MongoRaceLogStoreFactory; @@ -68,7 +68,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD RaceLogStore raceLogStore = MongoRaceLogStoreFactory.INSTANCE.getMongoRaceLogStore(mongoObjectFactory, domainObjectFactory); leaderboard = new FlexibleLeaderboardImpl(raceLogStore, leaderboardName, new ScoreCorrectionImpl(), - new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); + new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces), new LowPoint(), null); Fleet defaultFleet = leaderboard.getFleet(null); leaderboard.addRaceColumn(raceColumnName, /* medalRace */ false, defaultFleet); diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/LeaderboardDiscardingRulesTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/LeaderboardDiscardingRulesTest.java index fee18037e75..038983fee6d 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/LeaderboardDiscardingRulesTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/LeaderboardDiscardingRulesTest.java @@ -22,7 +22,7 @@ import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.impl.HighPoint; import com.sap.sailing.domain.leaderboard.impl.LowPoint; -import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; +import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.test.AbstractLeaderboardTest; import com.sap.sailing.domain.test.mock.MockedTrackedRaceWithFixedRank; import com.sap.sailing.domain.tracking.TrackedRace; @@ -47,7 +47,7 @@ public class LeaderboardDiscardingRulesTest { FlexibleLeaderboard leaderboard = (FlexibleLeaderboard) racingEventService.getLeaderboardByName(LEADERBOARDNAME); assertNotNull(leaderboard); int[] discardingRulesNew = new int[] { 1, 5 }; - leaderboard.setResultDiscardingRule(new ResultDiscardingRuleImpl(discardingRulesNew)); + leaderboard.setResultDiscardingRule(new ThresholdBasedResultDiscardingRuleImpl(discardingRulesNew)); racingEventService.updateStoredLeaderboard(leaderboard); Leaderboard leaderboardNew = racingEventService.getLeaderboardByName(LEADERBOARDNAME); assertNotNull(leaderboardNew); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index fc25e6b6c4f..24265ff430e 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -66,7 +66,7 @@ import com.sap.sailing.domain.leaderboard.ScoringScheme; import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl; import com.sap.sailing.domain.leaderboard.impl.RegattaLeaderboardImpl; -import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; +import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard; import com.sap.sailing.domain.persistence.DomainObjectFactory; @@ -330,7 +330,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen mongoObjectFactory, domainObjectFactory); CourseArea courseArea = getCourseArea(courseAreaId); - FlexibleLeaderboard result = new FlexibleLeaderboardImpl(raceLogStore, leaderboardName, new ScoreCorrectionImpl(), new ResultDiscardingRuleImpl( + FlexibleLeaderboard result = new FlexibleLeaderboardImpl(raceLogStore, leaderboardName, new ScoreCorrectionImpl(), new ThresholdBasedResultDiscardingRuleImpl( discardThresholds), scoringScheme, courseArea); result.setDisplayName(leaderboardDisplayName); synchronized (leaderboardsByName) { @@ -362,7 +362,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen + (regatta == null ? "null" : (regatta.getName() + " (" + regatta.hashCode() + ")")) + " to " + this); RegattaLeaderboard result = null; if (regatta != null) { - result = new RegattaLeaderboardImpl(regatta, new ScoreCorrectionImpl(), new ResultDiscardingRuleImpl( + result = new RegattaLeaderboardImpl(regatta, new ScoreCorrectionImpl(), new ThresholdBasedResultDiscardingRuleImpl( discardThresholds)); result.setDisplayName(leaderboardDisplayName); synchronized (leaderboardsByName) { @@ -1513,7 +1513,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen removeLeaderboard(overallLeaderboard.getName()); } else { // update existing overall leaderboard's discards settings; scoring scheme cannot be updated in-place - overallLeaderboard.setResultDiscardingRule(new ResultDiscardingRuleImpl(overallLeaderboardDiscardThresholds)); + overallLeaderboard.setResultDiscardingRule(new ThresholdBasedResultDiscardingRuleImpl(overallLeaderboardDiscardThresholds)); updateStoredLeaderboard(overallLeaderboard); } } else if (overallLeaderboard == null && overallLeaderboardScoringSchemeType != null) { @@ -1527,7 +1527,7 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen private void addOverallLeaderboardToLeaderboardGroup(LeaderboardGroup leaderboardGroup, ScoringScheme scoringScheme, int[] discardThresholds) { Leaderboard overallLeaderboard = new LeaderboardGroupMetaLeaderboard(leaderboardGroup, scoringScheme, - new ResultDiscardingRuleImpl(discardThresholds)); + new ThresholdBasedResultDiscardingRuleImpl(discardThresholds)); leaderboardGroup.setOverallLeaderboard(overallLeaderboard); addLeaderboard(overallLeaderboard); updateStoredLeaderboard(overallLeaderboard); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateLeaderboard.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateLeaderboard.java index 2e232fcc692..f1ffba2d63d 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateLeaderboard.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateLeaderboard.java @@ -6,7 +6,7 @@ import java.util.Arrays; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; -import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; +import com.sap.sailing.domain.leaderboard.impl.ThresholdBasedResultDiscardingRuleImpl; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.RacingEventServiceOperation; @@ -44,7 +44,7 @@ public class UpdateLeaderboard extends AbstractLeaderboardOperation } Leaderboard leaderboard = toState.getLeaderboardByName(newLeaderboardName); if (!Arrays.equals(leaderboard.getResultDiscardingRule().getDiscardIndexResultsStartingWithHowManyRaces(), newDiscardingThresholds)) { - leaderboard.setResultDiscardingRule(new ResultDiscardingRuleImpl(newDiscardingThresholds)); + leaderboard.setResultDiscardingRule(new ThresholdBasedResultDiscardingRuleImpl(newDiscardingThresholds)); } leaderboard.setDisplayName(newLeaderboardDisplayName); From 463c57bef14efd49a661790cbe6e5dd121474e60 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 5 Jun 2013 21:33:01 +0200 Subject: [PATCH 03/13] extended SeriesDTO to hold discard thresholds --- .../SeriesWithFleetsCreateDialog.java | 2 ++ .../sailing/gwt/ui/client/SailingService.java | 2 ++ .../gwt/ui/client/SailingServiceAsync.java | 2 ++ .../gwt/ui/server/SailingServiceImpl.java | 10 +++++++++- .../sap/sailing/gwt/ui/shared/SeriesDTO.java | 7 ++++++- .../AbstractColumnInSeriesOperation.java | 20 ------------------- .../AbstractSeriesOperation.java | 19 ++++++++++++++++++ .../AddColumnToSeries.java | 2 +- 8 files changed, 41 insertions(+), 23 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesWithFleetsCreateDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesWithFleetsCreateDialog.java index 2454798f53b..24101d12e8b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesWithFleetsCreateDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesWithFleetsCreateDialog.java @@ -110,6 +110,8 @@ public class SeriesWithFleetsCreateDialog extends DataEntryDialog { fleetsGrid = new Grid(0, 0); // create at least one fleet addFleetWidget("Default", 0, null); + + // TODO bug 1414 add checkbox for enabling series-specific result discarding and, if checked, show the discard threshold boxes to be shared with leaderboard create/edit dialogs } private Widget createFleetNameWidget(String defaultName) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index 3ede22af652..00613c3c46f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -152,6 +152,8 @@ public interface SailingService extends RemoteService { List addRaceColumnsToSeries(RegattaIdentifier regattaIdentifier, String seriesName, List columnNames); + void updateSeries(RegattaIdentifier regattaIdentifier, String seriesName, boolean isMedal, int[] resultDiscardingThresholds); + RaceColumnInSeriesDTO addRaceColumnToSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName); void removeRaceColumnsFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, List columnNames); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index 32b9fd6e489..38bbfad8d9c 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -369,6 +369,8 @@ public interface SailingServiceAsync { void addRaceColumnsToSeries(RegattaIdentifier regattaIdentifier, String seriesName, List columnNames, AsyncCallback> callback); + + void updateSeries(RegattaIdentifier regattaIdentifier, String seriesName, boolean isMedal, int[] resultDiscardingThresholds, AsyncCallback callback); void removeRaceColumnsFromSeries(RegattaIdentifier regattaIdentifier, String seriesName, List columnNames, AsyncCallback callback); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 59f3307d23c..7b545f9cb9f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -257,6 +257,7 @@ import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardMaxPoin import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardScoreCorrection; import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardScoreCorrectionMetadata; import com.sap.sailing.server.operationaltransformation.UpdateRaceDelayToLive; +import com.sap.sailing.server.operationaltransformation.UpdateSeries; import com.sap.sailing.server.operationaltransformation.UpdateSpecificRegatta; import com.sap.sailing.server.replication.ReplicaDescriptor; import com.sap.sailing.server.replication.ReplicationFactory; @@ -483,7 +484,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S raceColumnDTO.setExplicitFactor(raceColumn.getExplicitFactor()); raceColumns.add(raceColumnDTO); } - SeriesDTO result = new SeriesDTO(series.getName(), fleets, raceColumns, series.isMedal()); + SeriesDTO result = new SeriesDTO(series.getName(), fleets, raceColumns, series.isMedal(), + series.getResultDiscardingRule() == null ? null : series.getResultDiscardingRule().getDiscardIndexResultsStartingWithHowManyRaces()); return result; } @@ -2482,6 +2484,12 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } return result; } + + @Override + public void updateSeries(RegattaIdentifier regattaIdentifier, String seriesName, boolean isMedal, + int[] resultDiscardingThresholds) { + getService().apply(new UpdateSeries(regattaIdentifier, seriesName, isMedal, resultDiscardingThresholds)); + } @Override public RaceColumnInSeriesDTO addRaceColumnToSeries(RegattaIdentifier regattaIdentifier, String seriesName, String columnName) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SeriesDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SeriesDTO.java index 851a7e539f7..4767e06431b 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SeriesDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/SeriesDTO.java @@ -15,11 +15,12 @@ public class SeriesDTO extends NamedDTO { public SeriesDTO() {} - public SeriesDTO(String name, List fleets, List raceColumns, boolean isMedal) { + public SeriesDTO(String name, List fleets, List raceColumns, boolean isMedal, int[] discardThresholds) { super(name); this.fleets = fleets; this.raceColumns = raceColumns; this.isMedal = isMedal; + this.discardThresholds = discardThresholds; } public boolean isMedal() { @@ -45,4 +46,8 @@ public class SeriesDTO extends NamedDTO { public void setRaceColumns(List raceColumns) { this.raceColumns = raceColumns; } + + public int[] getDiscardThresholds() { + return discardThresholds; + } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractColumnInSeriesOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractColumnInSeriesOperation.java index f7717d36761..38c8a274585 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractColumnInSeriesOperation.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractColumnInSeriesOperation.java @@ -1,15 +1,9 @@ package com.sap.sailing.server.operationaltransformation; -import java.util.logging.Logger; - -import com.sap.sailing.domain.base.Regatta; -import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.common.RegattaIdentifier; -import com.sap.sailing.server.RacingEventService; public abstract class AbstractColumnInSeriesOperation extends AbstractSeriesOperation { private static final long serialVersionUID = -8985474505327170991L; - private static final Logger logger = Logger.getLogger(AbstractColumnInSeriesOperation.class.getName()); private final String columnName; public AbstractColumnInSeriesOperation(RegattaIdentifier regattaIdentifier, String seriesName, String columnName) { @@ -20,18 +14,4 @@ public abstract class AbstractColumnInSeriesOperation extends Abstra protected String getColumnName() { return columnName; } - - protected Series getSeries(RacingEventService toState) { - Series series = null; - Regatta regatta = toState.getRegatta(getRegattaIdentifier()); - if (regatta != null) { - series = regatta.getSeriesByName(getSeriesName()); - if (series == null) { - logger.warning("series "+getSeriesName()+" not found in regatta "+regatta.getName()); - } - } else { - logger.warning("regatta "+getRegattaIdentifier()+" not found"); - } - return series; - } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractSeriesOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractSeriesOperation.java index c2efc134070..f32cd6565ce 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractSeriesOperation.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AbstractSeriesOperation.java @@ -1,9 +1,15 @@ package com.sap.sailing.server.operationaltransformation; +import java.util.logging.Logger; + +import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.common.RegattaIdentifier; +import com.sap.sailing.server.RacingEventService; public abstract class AbstractSeriesOperation extends AbstractRacingEventServiceOperation { private static final long serialVersionUID = -7786133902346491275L; + private Logger logger = Logger.getLogger(AbstractSeriesOperation.class.getName()); private final RegattaIdentifier regattaIdentifier; private final String seriesName; @@ -21,4 +27,17 @@ public abstract class AbstractSeriesOperation extends AbstractRacing return seriesName; } + protected Series getSeries(RacingEventService toState) { + Series series = null; + Regatta regatta = toState.getRegatta(getRegattaIdentifier()); + if (regatta != null) { + series = regatta.getSeriesByName(getSeriesName()); + if (series == null) { + logger.warning("series "+getSeriesName()+" not found in regatta "+regatta.getName()); + } + } else { + logger.warning("regatta "+getRegattaIdentifier()+" not found"); + } + return series; + } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddColumnToSeries.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddColumnToSeries.java index b4f9d3e0b20..353061d9502 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddColumnToSeries.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddColumnToSeries.java @@ -19,7 +19,7 @@ public class AddColumnToSeries extends AbstractColumnInSeriesOperation Date: Wed, 5 Jun 2013 21:58:50 +0200 Subject: [PATCH 04/13] started to extend regatta / series UI to allow for medal race setting change and result discarding definition --- .../adminconsole/RegattaDetailsComposite.java | 38 ++++++++++------ .../gwt/ui/adminconsole/SeriesDescriptor.java | 14 +++++- .../gwt/ui/adminconsole/SeriesEditDialog.java | 30 ++++++------- .../sailing/gwt/ui/client/StringMessages.java | 1 + .../gwt/ui/client/StringMessages.properties | 1 + .../ui/client/StringMessages_de.properties | 1 + .../UpdateSeries.java | 43 +++++++++++++++++++ 7 files changed, 98 insertions(+), 30 deletions(-) create mode 100755 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateSeries.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java index 6f05d2132db..22cb27dd8ab 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaDetailsComposite.java @@ -1,6 +1,7 @@ package com.sap.sailing.gwt.ui.adminconsole; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import com.google.gwt.cell.client.FieldUpdater; @@ -61,32 +62,24 @@ public class RegattaDetailsComposite extends Composite { this.regattaRefresher = regattaRefresher; this.errorReporter = errorReporter; this.stringMessages = stringMessages; - regatta = null; - mainPanel = new CaptionPanel(stringMessages.regatta()); VerticalPanel vPanel = new VerticalPanel(); mainPanel.add(vPanel); - Grid grid = new Grid(4, 2); vPanel.add(grid); - regattaName = new Label(); grid.setWidget(0 , 0, new Label(stringMessages.regattaName() + ":")); grid.setWidget(0 , 1, regattaName); - boatClassName = new Label(); grid.setWidget(1 , 0, new Label(stringMessages.boatClass() + ":")); grid.setWidget(1 , 1, boatClassName); - defaultCourseArea = new Label(); grid.setWidget(2 , 0, new Label(stringMessages.courseArea() + ":")); grid.setWidget(2 , 1, defaultCourseArea); - scoringSystem = new Label(); grid.setWidget(3 , 0, new Label(stringMessages.scoringSystem() + ":")); grid.setWidget(3 , 1, scoringSystem); - seriesTable = createRegattaSeriesTable(); seriesSelectionModel = new SingleSelectionModel(); seriesSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { @@ -95,11 +88,9 @@ public class RegattaDetailsComposite extends Composite { } }); seriesTable.setSelectionModel(seriesSelectionModel); - seriesListDataProvider = new ListDataProvider(); seriesListDataProvider.addDataDisplay(seriesTable); vPanel.add(seriesTable); - initWidget(mainPanel); } @@ -201,13 +192,18 @@ public class RegattaDetailsComposite extends Composite { @Override public void ok(final SeriesDescriptor result) { - updateRacesOfRegattaSeries(regatta, result.getSeries(), result.getRaces()); + updateRacesOfRegattaSeries(regatta, result); } }); raceDialog.show(); } - private void updateRacesOfRegattaSeries(final RegattaDTO regatta, final SeriesDTO series, List newRaceColumns) { + private void updateRacesOfRegattaSeries(final RegattaDTO regatta, final SeriesDescriptor seriesDescriptor) { + final SeriesDTO series = seriesDescriptor.getSeries(); + final List newRaceColumns = seriesDescriptor.getRaces(); + final boolean isMedalChanged = series.isMedal() != seriesDescriptor.isMedal(); + final boolean seriesResultDiscardingThresholdsChanged = !Arrays.equals(series.getDiscardThresholds(), + seriesDescriptor.getResultDiscardingThresholds()); final RegattaIdentifier regattaIdentifier = new RegattaName(regatta.name); List existingRaceColumns = series.getRaceColumns(); final List raceColumnsToAdd = new ArrayList(); @@ -223,7 +219,6 @@ public class RegattaDetailsComposite extends Composite { raceColumnsToRemove.add(existingRaceColumn.name); } } - sailingService.addRaceColumnsToSeries(regattaIdentifier, series.name, raceColumnsToAdd, new AsyncCallback>() { @Override public void onFailure(Throwable caught) { @@ -245,7 +240,6 @@ public class RegattaDetailsComposite extends Composite { errorReporter.reportError("Error trying to remove race columns " + raceColumnsToAdd + " from series " + series.name + ": " + caught.getMessage()); - } @Override @@ -253,6 +247,22 @@ public class RegattaDetailsComposite extends Composite { regattaRefresher.fillRegattas(); } }); + if (isMedalChanged || seriesResultDiscardingThresholdsChanged) { + sailingService.updateSeries(regattaIdentifier, series.name, seriesDescriptor.isMedal(), + seriesDescriptor.getResultDiscardingThresholds(), new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error trying to remove race columns " + + raceColumnsToAdd + " from series " + series.name + + ": " + caught.getMessage()); + } + + @Override + public void onSuccess(Void result) { + regattaRefresher.fillRegattas(); + } + }); + } } private void updateRegattaDetails() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesDescriptor.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesDescriptor.java index bab82fe8666..d587eadaf09 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesDescriptor.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesDescriptor.java @@ -15,10 +15,14 @@ import com.sap.sailing.gwt.ui.shared.SeriesDTO; public class SeriesDescriptor { private final SeriesDTO series; private final List races; + private final boolean isMedal; + private final int[] resultDiscardingThresholds; - public SeriesDescriptor(SeriesDTO series, List races) { + public SeriesDescriptor(SeriesDTO series, List races, boolean isMedal, int[] resultDiscardingThresholds) { this.series = series; this.races = races; + this.isMedal = isMedal; + this.resultDiscardingThresholds = resultDiscardingThresholds; } public SeriesDTO getSeries() { @@ -28,4 +32,12 @@ public class SeriesDescriptor { public List getRaces() { return races; } + + public boolean isMedal() { + return isMedal; + } + + public int[] getResultDiscardingThresholds() { + return resultDiscardingThresholds; + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesEditDialog.java index 44e756ab0c2..ab1534ddcfe 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesEditDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/SeriesEditDialog.java @@ -9,6 +9,7 @@ import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; @@ -25,6 +26,8 @@ import com.sap.sailing.gwt.ui.shared.SeriesDTO; public class SeriesEditDialog extends DataEntryDialog { private final ListBox addRacesListBox; private Button addRacesBtn; + private CheckBox isMedalCheckbox; + private CheckBox useSeriesResultDiscardingThresholdsCheckbox; private final List raceNameEntryFields; private final List