preparing for the introduction of per-series result discarding rules

This commit is contained in:
Axel Uhl committed 2013-06-05 17:31:37 +02:00
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;
}
}
@@ -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;
@@ -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) {
@@ -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();
@@ -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;
}
}
@@ -17,7 +17,6 @@ public class RegattaWithSeriesAndFleetsEditDialog extends RegattaWithSeriesAndFl
nameEntryField.setEnabled(false);
boatClassEntryField.setEnabled(false);
scoringSchemeListBox.setEnabled(false);
sailingEventsListBox.setEnabled(true);
courseAreaListBox.setEnabled(true);
}