From 486385883aadac439f255480b65eee849edf1fb8 Mon Sep 17 00:00:00 2001 From: Simon Pamies Date: Tue, 28 May 2013 10:30:01 +0200 Subject: [PATCH 01/47] Updated howto (markdown) --- wiki/howto.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/wiki/howto.md b/wiki/howto.md index 0a209da2c89..21f01f9c3f5 100644 --- a/wiki/howto.md +++ b/wiki/howto.md @@ -1,23 +1,23 @@ -# How to work with this Wiki - -### General Information -This Wiki is being stored into a GIT repository on branch master that is tracking remote branch master of origin at `/home/trac/git`. The physical location is `/home/gollum/wiki/gitwiki`. The changes here are pushed to origin on a more or less regular base (every week) by one of the admins. - -The script `/home/gollum/wiki/serve.sh` can be executed to either start or restart the process being responsible for this wiki. The process is a Ruby webserver (Rack) that uses the handler defined in `/home/gollum/wiki/app.rb`. This handler embeds Gollum wiki software into Rack and also makes sure that only authenticated access is possible (see `/home/gollum/wiki/users.yml`). - -### Making websites public -Accessing this wiki is normally only allowed for authenticated users. If you want to share your work with others not having an account here then you can just request making a given url publicly available. On the server this is done by simply putting a new line to `/home/gollum/wiki/public.txt`. - -### Creating a New Account -A new account can be created by adding a new entry to `/home/gollum/wiki/users.yml`. The password there is encrypted using sha1sum. - -### Editing -You can edit information here freely but do not leave any nonsense here. - -The syntax of the markup is relatively easy and is documented here http://daringfireball.net/projects/markdown/dingus. When you create a new Page then make sure to put some thinking into the right tree structure and then just extend the URL above. It is also possible to use plain HTML for tables or image refs but use with care. If there is a markdown command then it is always to be preferred. - -* Make sure to always have _wiki/_ as the base path so that contents is not cluttered around. So if you want to create `server/SystemBoot` then the correct URL is `wiki/server/SystemBoot`. Make sure to add your Page to the Table of Contents of [/home] by editing the document there. The contents of java/ is protected so that one can neither write nor read. - -* Password can be found in the encrypted page [[Passwords|wiki/passwords]]. You can decrypt it by using `gpg -d < passwords.md` after having entered the password. If you want to edit, first decrypt and then encrypt again using `gpg -a --symmetric passwords.md`. Make sure to never save the unencrypted version! The encryption is a symmetric one (not key based) based on a password that is known to the admins. - +# How to work with this Wiki + +### General Information +This Wiki is being stored into a GIT repository on branch master that is tracking remote branch master of origin at `/home/trac/git`. The physical location is `/home/gollum/wiki/gitwiki`. The changes here are pushed to origin on a more or less regular base (every week) by one of the admins. + +The script `/home/gollum/wiki/serve.sh` can be executed to either start or restart the process being responsible for this wiki. The process is a Ruby webserver (Rack) that uses the handler defined in `/home/gollum/wiki/app.rb`. This handler embeds Gollum wiki software into Rack and also makes sure that only authenticated access is possible (see `/home/gollum/wiki/users.yml`). + +### Making websites public +Accessing this wiki is normally only allowed for authenticated users. If you want to share your work with others not having an account here then you can just request making a given url publicly available. On the server this is done by simply putting a new line to `/home/gollum/wiki/public.txt`. + +### Creating a New Account +A new account can be created by adding a new entry to `/home/gollum/wiki/users.yml`. The password there is encrypted using sha1sum (`echo -n "password" | sha1sum`). + +### Editing +You can edit information here freely but do not leave any nonsense here. + +The syntax of the markup is relatively easy and is documented here http://daringfireball.net/projects/markdown/dingus. When you create a new Page then make sure to put some thinking into the right tree structure and then just extend the URL above. It is also possible to use plain HTML for tables or image refs but use with care. If there is a markdown command then it is always to be preferred. + +* Make sure to always have _wiki/_ as the base path so that contents is not cluttered around. So if you want to create `server/SystemBoot` then the correct URL is `wiki/server/SystemBoot`. Make sure to add your Page to the Table of Contents of [/home] by editing the document there. The contents of java/ is protected so that one can neither write nor read. + +* Password can be found in the encrypted page [[Passwords|wiki/passwords]]. You can decrypt it by using `gpg -d < passwords.md` after having entered the password. If you want to edit, first decrypt and then encrypt again using `gpg -a --symmetric passwords.md`. Make sure to never save the unencrypted version! The encryption is a symmetric one (not key based) based on a password that is known to the admins. + If you have any questions then either contact Axel Uhl, Jens Rommel, Frank Mittag or Simon PamiƩs. \ No newline at end of file From 34bc3a225d528f42860c75aa5b215e925e0bf943 Mon Sep 17 00:00:00 2001 From: Simon Pamies Date: Wed, 5 Jun 2013 12:43:41 +0200 Subject: [PATCH 02/47] Updated cook book (markdown) --- wiki/cook-book.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/wiki/cook-book.md b/wiki/cook-book.md index 40187ebbf44..c3e97a97fdb 100644 --- a/wiki/cook-book.md +++ b/wiki/cook-book.md @@ -85,4 +85,13 @@ One can find more information about the Jetty architecture here: http://docs.cod ### Ignore GIT line endings during merge -Following http://stackoverflow.com/questions/861995/is-it-possible-for-git-merge-to-ignore-line-ending-differences one can use `git config merge.renormalize true` \ No newline at end of file +Following http://stackoverflow.com/questions/861995/is-it-possible-for-git-merge-to-ignore-line-ending-differences one can use `git config merge.renormalize true` + +### Remove association between local and remote branch in GIT + +To remove the association between the local and remote branch, and delete the local branch, run: + +
+git config --unset branch..remote
+git config --unset branch..merge
+
\ No newline at end of file From dbf7b6d0ed0839ab63dc113743706cc39e3eb5d8 Mon Sep 17 00:00:00 2001 From: Simon Pamies Date: Wed, 5 Jun 2013 12:44:07 +0200 Subject: [PATCH 03/47] Updated cook book (markdown) --- wiki/cook-book.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wiki/cook-book.md b/wiki/cook-book.md index c3e97a97fdb..3470c274e75 100644 --- a/wiki/cook-book.md +++ b/wiki/cook-book.md @@ -92,6 +92,6 @@ Following http://stackoverflow.com/questions/861995/is-it-possible-for-git-merge To remove the association between the local and remote branch, and delete the local branch, run:
-git config --unset branch..remote
-git config --unset branch..merge
+git config --unset branch.<branch>.remote
+git config --unset branch.<branch>.merge
 
\ No newline at end of file From 2880b3dcefff8fb4ff39cd2b17c7e1f5281da7af Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 5 Jun 2013 17:31:37 +0200 Subject: [PATCH 04/47] 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 05/47] 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 06/47] 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 07/47] 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