mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-09 05:40:57 +00:00
preparing for the introduction of per-series result discarding rules
This commit is contained in:
1 parent
84e6a6d98f
commit
2880b3dcef
7 files changed
+74
-18
No files matched your search
@@ -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.<p>
|
||||
*
|
||||
* 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.<p>
|
||||
*
|
||||
* 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 <code>null</code>, 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();
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
+3
@@ -27,6 +27,9 @@ public class LeaderboardDescriptor {
|
||||
this.courseAreaIdAsString = courseAreaIdAsString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Leaves the {@link #regattaName} <code>null</code>, 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;
|
||||
|
||||
+8
-9
@@ -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<Pair<SeriesDTO, List<RaceColumnDTO>>> {
|
||||
public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<RegattaSeriesDescriptor> {
|
||||
private final ListBox addRacesListBox;
|
||||
private Button addRacesBtn;
|
||||
private final List<TextBox> raceNameEntryFields;
|
||||
@@ -34,7 +33,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
|
||||
private VerticalPanel additionalWidgetPanel;
|
||||
private final SeriesDTO selectedSeries;
|
||||
|
||||
private static class RaceDialogValidator implements Validator<Pair<SeriesDTO, List<RaceColumnDTO>>> {
|
||||
private static class RaceDialogValidator implements Validator<RegattaSeriesDescriptor> {
|
||||
private StringMessages stringConstants;
|
||||
private RegattaDTO regatta;
|
||||
|
||||
@@ -44,10 +43,10 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getErrorMessage(Pair<SeriesDTO, List<RaceColumnDTO>> valueToValidate) {
|
||||
public String getErrorMessage(RegattaSeriesDescriptor valueToValidate) {
|
||||
Set<String> raceColumnNamesOfOtherSeries = new HashSet<String>();
|
||||
SeriesDTO seriesToValidate = valueToValidate.getA();
|
||||
List<RaceColumnDTO> raceColumnsToValidate = valueToValidate.getB();
|
||||
SeriesDTO seriesToValidate = valueToValidate.getSeries();
|
||||
List<RaceColumnDTO> raceColumnsToValidate = valueToValidate.getRaces();
|
||||
|
||||
String errorMessage = null;
|
||||
for (SeriesDTO seriesDTO: regatta.series) {
|
||||
@@ -102,7 +101,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
|
||||
}
|
||||
|
||||
public RaceColumnInRegattaSeriesDialog(RegattaDTO regatta, SeriesDTO selectedSeries, StringMessages stringConstants,
|
||||
DialogCallback<Pair<SeriesDTO, List<RaceColumnDTO>>> callback) {
|
||||
DialogCallback<RegattaSeriesDescriptor> 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<Pair<Series
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Pair<SeriesDTO, List<RaceColumnDTO>> getResult() {
|
||||
protected RegattaSeriesDescriptor getResult() {
|
||||
SeriesDTO selectedSeries = getSelectedSeries();
|
||||
List<RaceColumnDTO> races = new ArrayList<RaceColumnDTO>();
|
||||
int racesCount = raceNameEntryFields.size();
|
||||
@@ -159,7 +158,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
|
||||
}
|
||||
races.add(raceColumnDTO);
|
||||
}
|
||||
return new Pair<SeriesDTO, List<RaceColumnDTO>>(selectedSeries, races);
|
||||
return new RegattaSeriesDescriptor(selectedSeries, races);
|
||||
}
|
||||
|
||||
private RaceColumnDTO findRaceColumnInSeriesByName(SeriesDTO series, String raceColumnName) {
|
||||
|
||||
+4
-5
@@ -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<Pair<SeriesDTO, List<RaceColumnDTO>>>() {
|
||||
new DialogCallback<RegattaSeriesDescriptor>() {
|
||||
@Override
|
||||
public void cancel() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ok(final Pair<SeriesDTO, List<RaceColumnDTO>> result) {
|
||||
updateRacesOfRegattaSeries(regatta, result.getA(), result.getB());
|
||||
public void ok(final RegattaSeriesDescriptor result) {
|
||||
updateRacesOfRegattaSeries(regatta, result.getSeries(), result.getRaces());
|
||||
}
|
||||
});
|
||||
raceDialog.show();
|
||||
|
||||
+31
@@ -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<RaceColumnDTO> races;
|
||||
|
||||
public RegattaSeriesDescriptor(SeriesDTO series, List<RaceColumnDTO> races) {
|
||||
this.series = series;
|
||||
this.races = races;
|
||||
}
|
||||
|
||||
public SeriesDTO getSeries() {
|
||||
return series;
|
||||
}
|
||||
|
||||
public List<RaceColumnDTO> getRaces() {
|
||||
return races;
|
||||
}
|
||||
}
|
||||
-1
@@ -17,7 +17,6 @@ public class RegattaWithSeriesAndFleetsEditDialog extends RegattaWithSeriesAndFl
|
||||
nameEntryField.setEnabled(false);
|
||||
boatClassEntryField.setEnabled(false);
|
||||
scoringSchemeListBox.setEnabled(false);
|
||||
|
||||
sailingEventsListBox.setEnabled(true);
|
||||
courseAreaListBox.setEnabled(true);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user