From 6635c974e89f0cc424bdbb19621e9cbbced19265 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Mon, 24 Jul 2017 17:52:24 +0200 Subject: [PATCH] bug 4247: don't manipulate operation before replicating it Change-Id: I718a8210f9abfe9b375ae105614b6c59c934d2a1 --- .../UpdateEliminatedCompetitorsInLeaderboard.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateEliminatedCompetitorsInLeaderboard.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateEliminatedCompetitorsInLeaderboard.java index ab9574de1bb..6da2d1317f1 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateEliminatedCompetitorsInLeaderboard.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/UpdateEliminatedCompetitorsInLeaderboard.java @@ -1,5 +1,6 @@ package com.sap.sailing.server.operationaltransformation; +import java.util.HashSet; import java.util.Set; import com.sap.sailing.domain.base.Competitor; @@ -19,13 +20,15 @@ public class UpdateEliminatedCompetitorsInLeaderboard extends AbstractLeaderboar @Override public Void internalApplyTo(RacingEventService toState) throws Exception { + // important not to manipulate the operation; create a local copy of the competitors before alterint it; see bug 4247 + final Set myNewEliminatedCompetitors = new HashSet<>(newEliminatedCompetitors); RegattaLeaderboardWithEliminations leaderboard = (RegattaLeaderboardWithEliminations) toState.getLeaderboardByName(getLeaderboardName()); // first un-eliminate those currently eliminated and no longer in newEliminatedCompetitors for (final Competitor c : leaderboard.getEliminatedCompetitors()) { - leaderboard.setEliminated(c, newEliminatedCompetitors.remove(c)); + leaderboard.setEliminated(c, myNewEliminatedCompetitors.remove(c)); } // then eliminated the remaining ones from newEliminatedCompetitors - for (final Competitor c : newEliminatedCompetitors) { + for (final Competitor c : myNewEliminatedCompetitors) { leaderboard.setEliminated(c, true); } updateStoredLeaderboard(toState, leaderboard);