added remaining leaderboard manipulation operations

This commit is contained in:
Axel Uhl
2012-04-19 10:14:57 +02:00
parent b9186c5b1d
commit b4fb3c460a
19 changed files with 269 additions and 55 deletions
@@ -0,0 +1,29 @@
package com.sap.sailing.domain.common;
/**
* The reasons why a competitor may get the maximum number of points, usually equaling the
* number of competitors enlisted for the regatta plus one.
*
* @author Axel Uhl (d043530)
*
*/
public enum MaxPointsReason {
/** The competitor finished the race properly */
NONE,
/** Did Not Start */
DNS,
/** Did Not Finish */
DNF,
/** DiSQualified */
DSQ,
/** On Course Side (jumped the gun) */
OCS,
/** Disqualified, non-discardable */
DND,
/** Black Flag Disqualified */
BFD,
/** Did Not Compete */
DNC,
/** Retired After Finishing */
RAF
}
@@ -21,6 +21,7 @@ import com.sap.sailing.domain.base.SpeedWithBearing;
import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl; import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl;
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.EventNameAndRaceName; import com.sap.sailing.domain.common.EventNameAndRaceName;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
@@ -33,7 +34,6 @@ import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID;
import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard; import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
import com.sap.sailing.domain.leaderboard.ScoreCorrection.MaxPointsReason;
import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.SettableScoreCorrection;
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl; import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl;
@@ -5,9 +5,9 @@ import java.util.Iterator;
import java.util.Map; import java.util.Map;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard; import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
import com.sap.sailing.domain.leaderboard.ScoreCorrection.MaxPointsReason;
import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.SettableScoreCorrection;
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
import com.sap.sailing.domain.leaderboard.impl.LeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LeaderboardImpl;
@@ -15,13 +15,13 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.SpeedWithBearing; import com.sap.sailing.domain.base.SpeedWithBearing;
import com.sap.sailing.domain.base.Timed; import com.sap.sailing.domain.base.Timed;
import com.sap.sailing.domain.common.Bearing; import com.sap.sailing.domain.common.Bearing;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.Speed; import com.sap.sailing.domain.common.Speed;
import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard; import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
import com.sap.sailing.domain.leaderboard.ScoreCorrection.MaxPointsReason;
import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.SettableScoreCorrection;
import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.domain.tracking.Positioned; import com.sap.sailing.domain.tracking.Positioned;
@@ -22,13 +22,13 @@ import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.base.impl.NationalityImpl; import com.sap.sailing.domain.base.impl.NationalityImpl;
import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.PersonImpl;
import com.sap.sailing.domain.base.impl.TeamImpl; import com.sap.sailing.domain.base.impl.TeamImpl;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard; import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
import com.sap.sailing.domain.leaderboard.ScoreCorrection.MaxPointsReason;
import com.sap.sailing.domain.leaderboard.impl.LeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LeaderboardImpl;
import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl;
import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl;
@@ -3,11 +3,11 @@ package com.sap.sailing.domain.leaderboard;
import java.util.Map; import java.util.Map;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.Named; import com.sap.sailing.domain.common.Named;
import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.leaderboard.ScoreCorrection.MaxPointsReason;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
/** /**
@@ -1,6 +1,7 @@
package com.sap.sailing.domain.leaderboard; package com.sap.sailing.domain.leaderboard;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
@@ -15,34 +16,6 @@ import com.sap.sailing.domain.tracking.TrackedRace;
* *
*/ */
public interface ScoreCorrection { public interface ScoreCorrection {
/**
* The reasons why a competitor may get the maximum number of points, usually equaling the
* number of competitors enlisted for the regatta plus one.
*
* @author Axel Uhl (d043530)
*
*/
enum MaxPointsReason {
/** The competitor finished the race properly */
NONE,
/** Did Not Start */
DNS,
/** Did Not Finish */
DNF,
/** DiSQualified */
DSQ,
/** On Course Side (jumped the gun) */
OCS,
/** Disqualified, non-discardable */
DND,
/** Black Flag Disqualified */
BFD,
/** Did Not Compete */
DNC,
/** Retired After Finishing */
RAF
};
public interface Result { public interface Result {
int getCorrectedScore(); int getCorrectedScore();
MaxPointsReason getMaxPointsReason(); MaxPointsReason getMaxPointsReason();
@@ -1,6 +1,7 @@
package com.sap.sailing.domain.leaderboard; package com.sap.sailing.domain.leaderboard;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.MaxPointsReason;
public interface SettableScoreCorrection extends ScoreCorrection { public interface SettableScoreCorrection extends ScoreCorrection {
@@ -9,6 +9,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.Named; import com.sap.sailing.domain.common.Named;
import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
@@ -16,7 +17,6 @@ import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard; import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
import com.sap.sailing.domain.leaderboard.ScoreCorrection.MaxPointsReason;
import com.sap.sailing.domain.leaderboard.ScoreCorrection.Result; import com.sap.sailing.domain.leaderboard.ScoreCorrection.Result;
import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.SettableScoreCorrection;
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
@@ -4,11 +4,11 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard; import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
import com.sap.sailing.domain.leaderboard.ScoreCorrection;
import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.SettableScoreCorrection;
import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRace;
@@ -33,7 +33,7 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection {
private final Map<Pair<Competitor, RaceInLeaderboard>, Integer> correctedScores; private final Map<Pair<Competitor, RaceInLeaderboard>, Integer> correctedScores;
public ScoreCorrectionImpl() { public ScoreCorrectionImpl() {
this.maxPointsReasons = new HashMap<Util.Pair<Competitor,RaceInLeaderboard>, ScoreCorrection.MaxPointsReason>(); this.maxPointsReasons = new HashMap<Util.Pair<Competitor,RaceInLeaderboard>, MaxPointsReason>();
this.correctedScores = new HashMap<Util.Pair<Competitor,RaceInLeaderboard>, Integer>(); this.correctedScores = new HashMap<Util.Pair<Competitor,RaceInLeaderboard>, Integer>();
} }
@@ -10,6 +10,7 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import com.sap.sailing.domain.common.DetailType; import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.EventAndRaceIdentifier; import com.sap.sailing.domain.common.EventAndRaceIdentifier;
import com.sap.sailing.domain.common.EventIdentifier; import com.sap.sailing.domain.common.EventIdentifier;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSource;
@@ -122,10 +123,11 @@ public interface SailingService extends RemoteService {
void updateLeaderboardCarryValue(String leaderboardName, String competitorIdAsString, Integer carriedPoints); void updateLeaderboardCarryValue(String leaderboardName, String competitorIdAsString, Integer carriedPoints);
/** /**
* @return the new net points in {@link Pair#getA()} and the new total points in {@link Pair#getB()} * @return the new net points in {@link Pair#getA()} and the new total points in {@link Pair#getB()} for time point
* <code>date</code> after the max points reason has been updated to <code>maxPointsReasonAsString</code>.
*/ */
Pair<Integer, Integer> updateLeaderboardMaxPointsReason(String leaderboardName, String competitorIdAsString, Pair<Integer, Integer> updateLeaderboardMaxPointsReason(String leaderboardName, String competitorIdAsString,
String raceColumnName, String maxPointsReasonAsString, Date date) throws NoWindException; String raceColumnName, MaxPointsReason maxPointsReason, Date date) throws NoWindException;
Pair<Integer, Integer> updateLeaderboardScoreCorrection(String leaderboardName, String competitorIdAsString, Pair<Integer, Integer> updateLeaderboardScoreCorrection(String leaderboardName, String competitorIdAsString,
String raceName, Integer correctedScore, Date date) throws NoWindException; String raceName, Integer correctedScore, Date date) throws NoWindException;
@@ -9,6 +9,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.common.DetailType; import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.EventAndRaceIdentifier; import com.sap.sailing.domain.common.EventAndRaceIdentifier;
import com.sap.sailing.domain.common.EventIdentifier; import com.sap.sailing.domain.common.EventIdentifier;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
@@ -209,7 +210,7 @@ public interface SailingServiceAsync {
void updateLeaderboardCarryValue(String leaderboardName, String competitorID, Integer carriedPoints, AsyncCallback<Void> callback); void updateLeaderboardCarryValue(String leaderboardName, String competitorID, Integer carriedPoints, AsyncCallback<Void> callback);
void updateLeaderboardMaxPointsReason(String leaderboardName, String competitorID, String raceColumnName, void updateLeaderboardMaxPointsReason(String leaderboardName, String competitorID, String raceColumnName,
String maxPointsReasonAsString, Date date, AsyncCallback<Pair<Integer, Integer>> asyncCallback); MaxPointsReason maxPointsReason, Date date, AsyncCallback<Pair<Integer, Integer>> asyncCallback);
void updateLeaderboardScoreCorrection(String leaderboardName, String competitorID, String raceName, void updateLeaderboardScoreCorrection(String leaderboardName, String competitorID, String raceName,
Integer correctedScore, Date date, AsyncCallback<Pair<Integer, Integer>> asyncCallback); Integer correctedScore, Date date, AsyncCallback<Pair<Integer, Integer>> asyncCallback);
@@ -1,7 +1,6 @@
package com.sap.sailing.gwt.ui.leaderboardedit; package com.sap.sailing.gwt.ui.leaderboardedit;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -13,6 +12,7 @@ import com.google.gwt.cell.client.HasCell;
import com.google.gwt.cell.client.SelectionCell; import com.google.gwt.cell.client.SelectionCell;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor; import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
@@ -143,7 +143,12 @@ public class EditableLeaderboardPanel extends LeaderboardPanel {
public MaxPointsDropDownCellProvider(String raceName) { public MaxPointsDropDownCellProvider(String raceName) {
this.raceName = raceName; this.raceName = raceName;
dropDownCell = new SelectionCell(Arrays.asList(new String[] { "", "DNS", "DNF", "OCS", "DND", "RAF", "BFD", "DNC", "DSQ" })); List<String> selectionCellContents = new ArrayList<String>();
selectionCellContents.add(""); // represents "no" max points reason
for (MaxPointsReason maxPointReason : MaxPointsReason.values()) {
selectionCellContents.add(maxPointReason.name());
}
dropDownCell = new SelectionCell(selectionCellContents);
} }
@Override @Override
@@ -160,7 +165,7 @@ public class EditableLeaderboardPanel extends LeaderboardPanel {
EditableLeaderboardPanel.this.getData()); EditableLeaderboardPanel.this.getData());
getWhiteboardOwner().whiteboardProduced(whiteboard); getWhiteboardOwner().whiteboardProduced(whiteboard);
getSailingService().updateLeaderboardMaxPointsReason(getLeaderboardName(), row.competitor.id, getSailingService().updateLeaderboardMaxPointsReason(getLeaderboardName(), row.competitor.id,
raceName, value == null || value.trim().length() == 0 ? null : value.trim(), raceName, value == null || value.trim().length() == 0 ? null : MaxPointsReason.valueOf(value.trim()),
getLeaderboardDisplayDate(), new AsyncCallback<Pair<Integer, Integer>>() { getLeaderboardDisplayDate(), new AsyncCallback<Pair<Integer, Integer>>() {
@Override @Override
public void onFailure(Throwable t) { public void onFailure(Throwable t) {
@@ -58,6 +58,7 @@ import com.sap.sailing.domain.common.EventIdentifier;
import com.sap.sailing.domain.common.EventName; import com.sap.sailing.domain.common.EventName;
import com.sap.sailing.domain.common.EventNameAndRaceName; import com.sap.sailing.domain.common.EventNameAndRaceName;
import com.sap.sailing.domain.common.LegType; import com.sap.sailing.domain.common.LegType;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.NoWindError; import com.sap.sailing.domain.common.NoWindError;
import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.Placemark; import com.sap.sailing.domain.common.Placemark;
@@ -80,7 +81,6 @@ import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.Leaderboard.Entry; import com.sap.sailing.domain.leaderboard.Leaderboard.Entry;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard; import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
import com.sap.sailing.domain.leaderboard.ScoreCorrection.MaxPointsReason;
import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl;
import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.DomainObjectFactory;
import com.sap.sailing.domain.persistence.MongoObjectFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory;
@@ -1269,13 +1269,13 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
} }
@Override @Override
public void updateLeaderboard(String leaderboardName, String newLeaderboardName, int[] newDiscardingThreasholds) { public void updateLeaderboard(String leaderboardName, String newLeaderboardName, int[] newDiscardingThresholds) {
if (!leaderboardName.equals(newLeaderboardName)) { if (!leaderboardName.equals(newLeaderboardName)) {
getService().renameLeaderboard(leaderboardName, newLeaderboardName); getService().renameLeaderboard(leaderboardName, newLeaderboardName);
} }
Leaderboard leaderboard = getService().getLeaderboardByName(newLeaderboardName); Leaderboard leaderboard = getService().getLeaderboardByName(newLeaderboardName);
if (!Arrays.equals(leaderboard.getResultDiscardingRule().getDiscardIndexResultsStartingWithHowManyRaces(), newDiscardingThreasholds)) { if (!Arrays.equals(leaderboard.getResultDiscardingRule().getDiscardIndexResultsStartingWithHowManyRaces(), newDiscardingThresholds)) {
leaderboard.setResultDiscardingRule(new ResultDiscardingRuleImpl(newDiscardingThreasholds)); leaderboard.setResultDiscardingRule(new ResultDiscardingRuleImpl(newDiscardingThresholds));
} }
getService().updateStoredLeaderboard(leaderboard); getService().updateStoredLeaderboard(leaderboard);
} }
@@ -1381,7 +1381,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
@Override @Override
public Pair<Integer, Integer> updateLeaderboardMaxPointsReason(String leaderboardName, String competitorIdAsString, String raceColumnName, public Pair<Integer, Integer> updateLeaderboardMaxPointsReason(String leaderboardName, String competitorIdAsString, String raceColumnName,
String maxPointsReasonAsString, Date date) throws NoWindException { MaxPointsReason maxPointsReason, Date date) throws NoWindException {
TimePoint timePoint = new MillisecondsTimePoint(date); TimePoint timePoint = new MillisecondsTimePoint(date);
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
if (leaderboard != null) { if (leaderboard != null) {
@@ -1391,11 +1391,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
if (raceColumn == null) { if (raceColumn == null) {
throw new IllegalArgumentException("Didn't find race "+raceColumnName+" in leaderboard "+leaderboardName); throw new IllegalArgumentException("Didn't find race "+raceColumnName+" in leaderboard "+leaderboardName);
} }
if (maxPointsReasonAsString == null) { leaderboard.getScoreCorrection().setMaxPointsReason(competitor, raceColumn, maxPointsReason);
leaderboard.getScoreCorrection().setMaxPointsReason(competitor, raceColumn, null); // null means "unset"
} else {
leaderboard.getScoreCorrection().setMaxPointsReason(competitor, raceColumn, MaxPointsReason.valueOf(maxPointsReasonAsString));
}
getService().updateStoredLeaderboard(leaderboard); getService().updateStoredLeaderboard(leaderboard);
Entry updatedEntry = leaderboard.getEntry(competitor, raceColumn, timePoint); Entry updatedEntry = leaderboard.getEntry(competitor, raceColumn, timePoint);
return new Pair<Integer, Integer>(updatedEntry.getNetPoints(), updatedEntry.getTotalPoints()); return new Pair<Integer, Integer>(updatedEntry.getNetPoints(), updatedEntry.getTotalPoints());
@@ -16,10 +16,10 @@ import com.sap.sailing.domain.base.impl.CompetitorImpl;
import com.sap.sailing.domain.base.impl.NationalityImpl; import com.sap.sailing.domain.base.impl.NationalityImpl;
import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.PersonImpl;
import com.sap.sailing.domain.base.impl.TeamImpl; import com.sap.sailing.domain.base.impl.TeamImpl;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard; import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
import com.sap.sailing.domain.leaderboard.ScoreCorrection;
import com.sap.sailing.domain.leaderboard.impl.LeaderboardImpl; import com.sap.sailing.domain.leaderboard.impl.LeaderboardImpl;
import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl; import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl;
import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl; import com.sap.sailing.domain.leaderboard.impl.ScoreCorrectionImpl;
@@ -97,7 +97,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest {
final String leaderboardName = "TestLeaderboard"; final String leaderboardName = "TestLeaderboard";
final String raceColumnName1 = "My First Race 1"; final String raceColumnName1 = "My First Race 1";
final String raceColumnName2 = "My First Race 2"; final String raceColumnName2 = "My First Race 2";
final ScoreCorrection.MaxPointsReason maxPointsReason = ScoreCorrection.MaxPointsReason.DNF; final MaxPointsReason maxPointsReason = MaxPointsReason.DNF;
final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 };
LeaderboardImpl leaderboard = new LeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), LeaderboardImpl leaderboard = new LeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(),
new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces)); new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces));
@@ -124,7 +124,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest {
final String raceColumnName1 = "My First Race 1"; final String raceColumnName1 = "My First Race 1";
final String raceColumnName2 = "My First Race 2"; final String raceColumnName2 = "My First Race 2";
final int correctedPoints = 2; final int correctedPoints = 2;
final ScoreCorrection.MaxPointsReason maxPointsReason = ScoreCorrection.MaxPointsReason.DNF; final MaxPointsReason maxPointsReason = MaxPointsReason.DNF;
final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 }; final int[] discardIndexResultsStartingWithHowManyRaces = new int[] { 5, 8 };
LeaderboardImpl leaderboard = new LeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(), LeaderboardImpl leaderboard = new LeaderboardImpl(leaderboardName, new ScoreCorrectionImpl(),
new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces)); new ResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces));
@@ -0,0 +1,45 @@
package com.sap.sailing.server.operationaltransformation;
import java.util.Arrays;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.impl.ResultDiscardingRuleImpl;
import com.sap.sailing.server.RacingEventService;
public class UpdateLeaderboard extends AbstractLeaderboardOperation {
private static final long serialVersionUID = -8040361040050151768L;
private final String newLeaderboardName;
private final int[] newDiscardingThresholds;
public UpdateLeaderboard(String leaderboardName, String newLeaderboardName, int[] newDiscardingThresholds) {
super(leaderboardName);
this.newLeaderboardName = newLeaderboardName;
this.newDiscardingThresholds = newDiscardingThresholds;
}
@Override
public RacingEventServiceOperation transformClientOp(RacingEventServiceOperation serverOp) {
// TODO Auto-generated method stub
return null;
}
@Override
public RacingEventServiceOperation transformServerOp(RacingEventServiceOperation clientOp) {
// TODO Auto-generated method stub
return null;
}
@Override
public RacingEventService applyTo(RacingEventService toState) {
if (!getLeaderboardName().equals(newLeaderboardName)) {
toState.renameLeaderboard(getLeaderboardName(), newLeaderboardName);
}
Leaderboard leaderboard = toState.getLeaderboardByName(newLeaderboardName);
if (!Arrays.equals(leaderboard.getResultDiscardingRule().getDiscardIndexResultsStartingWithHowManyRaces(), newDiscardingThresholds)) {
leaderboard.setResultDiscardingRule(new ResultDiscardingRuleImpl(newDiscardingThresholds));
}
toState.updateStoredLeaderboard(leaderboard);
return toState;
}
}
@@ -0,0 +1,51 @@
package com.sap.sailing.server.operationaltransformation;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.server.RacingEventService;
public class UpdateLeaderboardCarryValue extends AbstractLeaderboardOperation {
private static final long serialVersionUID = 5467731814788887426L;
private final String competitorIdAsString;
private final Integer newCarriedValue;
public UpdateLeaderboardCarryValue(String leaderboardName, String competitorIdAsString, Integer newCarriedValue) {
super(leaderboardName);
this.competitorIdAsString = competitorIdAsString;
this.newCarriedValue = newCarriedValue;
}
@Override
public RacingEventServiceOperation transformClientOp(RacingEventServiceOperation serverOp) {
// TODO Auto-generated method stub
return null;
}
@Override
public RacingEventServiceOperation transformServerOp(RacingEventServiceOperation clientOp) {
// TODO Auto-generated method stub
return null;
}
@Override
public RacingEventService applyTo(RacingEventService toState) {
Leaderboard leaderboard = toState.getLeaderboardByName(getLeaderboardName());
if (leaderboard != null) {
Competitor competitor = leaderboard.getCompetitorByIdAsString(competitorIdAsString);
if (competitor != null) {
if (newCarriedValue == null) {
leaderboard.unsetCarriedPoints(competitor);
} else {
leaderboard.setCarriedPoints(competitor, newCarriedValue);
}
toState.updateStoredLeaderboard(leaderboard);
} else {
throw new IllegalArgumentException("Didn't find competitor ID "+competitorIdAsString+" in leaderboard "+getLeaderboardName());
}
} else {
throw new IllegalArgumentException("Didn't find leaderboard "+getLeaderboardName());
}
return toState;
}
}
@@ -0,0 +1,54 @@
package com.sap.sailing.server.operationaltransformation;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
import com.sap.sailing.server.RacingEventService;
public class UpdateLeaderboardMaxPointsReason extends AbstractLeaderboardColumnOperation {
private static final long serialVersionUID = -492130952256848047L;
private final String competitorIdAsString;
private final MaxPointsReason newMaxPointsReason;
public UpdateLeaderboardMaxPointsReason(String leaderboardName, String columnName, String competitorIdAsString,
MaxPointsReason newMaxPointsReason) {
super(leaderboardName, columnName);
this.competitorIdAsString = competitorIdAsString;
this.newMaxPointsReason = newMaxPointsReason;
}
@Override
public RacingEventServiceOperation transformClientOp(RacingEventServiceOperation serverOp) {
// TODO Auto-generated method stub
return null;
}
@Override
public RacingEventServiceOperation transformServerOp(RacingEventServiceOperation clientOp) {
// TODO Auto-generated method stub
return null;
}
@Override
public RacingEventService applyTo(RacingEventService toState) {
Leaderboard leaderboard = toState.getLeaderboardByName(getLeaderboardName());
if (leaderboard != null) {
Competitor competitor = leaderboard.getCompetitorByIdAsString(competitorIdAsString);
if (competitor != null) {
RaceInLeaderboard raceColumn = leaderboard.getRaceColumnByName(getColumnName());
if (raceColumn == null) {
throw new IllegalArgumentException("Didn't find race "+getColumnName()+" in leaderboard "+getLeaderboardName());
}
leaderboard.getScoreCorrection().setMaxPointsReason(competitor, raceColumn, newMaxPointsReason);
toState.updateStoredLeaderboard(leaderboard);
} else {
throw new IllegalArgumentException("Didn't find competitor with ID "+competitorIdAsString+" in leaderboard "+getLeaderboardName());
}
} else {
throw new IllegalArgumentException("Didn't find leaderboard "+getLeaderboardName());
}
return toState;
}
}
@@ -0,0 +1,57 @@
package com.sap.sailing.server.operationaltransformation;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
import com.sap.sailing.server.RacingEventService;
public class UpdateLeaderboardScoreCorrection extends AbstractLeaderboardColumnOperation {
private static final long serialVersionUID = -977025759476022993L;
private final String competitorIdAsString;
private final Integer correctedScore;
public UpdateLeaderboardScoreCorrection(String leaderboardName, String columnName, String competitorIdAsString,
Integer correctedScore) {
super(leaderboardName, columnName);
this.competitorIdAsString = competitorIdAsString;
this.correctedScore = correctedScore;
}
@Override
public RacingEventServiceOperation transformClientOp(RacingEventServiceOperation serverOp) {
// TODO Auto-generated method stub
return null;
}
@Override
public RacingEventServiceOperation transformServerOp(RacingEventServiceOperation clientOp) {
// TODO Auto-generated method stub
return null;
}
@Override
public RacingEventService applyTo(RacingEventService toState) {
Leaderboard leaderboard = toState.getLeaderboardByName(getLeaderboardName());
if (leaderboard != null) {
Competitor competitor = leaderboard.getCompetitorByIdAsString(competitorIdAsString);
if (competitor != null) {
RaceInLeaderboard raceColumn = leaderboard.getRaceColumnByName(getColumnName());
if (raceColumn == null) {
throw new IllegalArgumentException("Didn't find race "+getColumnName()+" in leaderboard "+getLeaderboardName());
}
if (correctedScore == null) {
leaderboard.getScoreCorrection().uncorrectScore(competitor, raceColumn);
} else {
leaderboard.getScoreCorrection().correctScore(competitor, raceColumn, correctedScore);
}
} else {
throw new IllegalArgumentException("Didn't find competitor with ID "+competitorIdAsString+" in leaderboard "+getLeaderboardName());
}
} else {
throw new IllegalArgumentException("Didn't find leaderboard "+getLeaderboardName());
}
toState.updateStoredLeaderboard(leaderboard);
return toState;
}
}