From 1ff11f8121a24db6fb60453d4cf38d3d480e177e Mon Sep 17 00:00:00 2001 From: elcnesh Date: Thu, 9 Apr 2015 22:06:18 +0000 Subject: [PATCH] Prevent some possible concurrency exceptions in views --- .../java/forge/game/combat/CombatView.java | 28 +++++++++++++------ .../java/forge/game/player/PlayerView.java | 5 ++-- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/forge-game/src/main/java/forge/game/combat/CombatView.java b/forge-game/src/main/java/forge/game/combat/CombatView.java index 8106738b249..1739a3e8aee 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatView.java +++ b/forge-game/src/main/java/forge/game/combat/CombatView.java @@ -3,10 +3,11 @@ package forge.game.combat; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Map.Entry; -import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import forge.game.GameEntityView; import forge.game.card.CardView; @@ -15,7 +16,6 @@ import forge.trackable.TrackableProperty; import forge.trackable.Tracker; import forge.util.FCollection; - public class CombatView extends TrackableObject { private static final long serialVersionUID = 68085618912864941L; @@ -68,11 +68,15 @@ public class CombatView extends TrackableObject { } public boolean isBlocking(final CardView card) { - for (final FCollection blockers : getAttackersWithBlockers().values()) { + final List> allBlockers; + synchronized (this) { + allBlockers = Lists.newArrayList(getAttackersWithBlockers().values()); + } + for (final FCollection blockers : allBlockers) { if (blockers == null) { continue; } - if (Iterables.contains(blockers, card)) { + if (blockers.contains(card)) { return true; } } @@ -122,8 +126,12 @@ public class CombatView extends TrackableObject { } public FCollection getAttackersOf(final GameEntityView defender) { - FCollection views = new FCollection(); - for (Entry entry : getAttackersWithDefenders().entrySet()) { + final List> attackersWithDefenders; + synchronized (this) { + attackersWithDefenders = Lists.newArrayList(getAttackersWithDefenders().entrySet()); + } + final FCollection views = new FCollection(); + for (final Entry entry : attackersWithDefenders) { if (entry.getValue().equals(defender)) { views.add(entry.getKey()); } @@ -131,8 +139,12 @@ public class CombatView extends TrackableObject { return views; } public Iterable> getAttackingBandsOf(final GameEntityView defender) { - ArrayList> views = new ArrayList>(); - for (Entry, GameEntityView> entry : getBandsWithDefenders().entrySet()) { + final List, GameEntityView>> bandsWithDefenders; + synchronized (this) { + bandsWithDefenders = Lists.newArrayList(getBandsWithDefenders().entrySet()); + } + final List> views = new ArrayList>(); + for (final Entry, GameEntityView> entry : bandsWithDefenders) { if (entry.getValue().equals(defender)) { views.add(entry.getKey()); } diff --git a/forge-game/src/main/java/forge/game/player/PlayerView.java b/forge-game/src/main/java/forge/game/player/PlayerView.java index 5c4c6d530bb..06915fb5253 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerView.java +++ b/forge-game/src/main/java/forge/game/player/PlayerView.java @@ -187,8 +187,9 @@ public class PlayerView extends GameEntityView { } public List getDisplayableKeywords() { final List allKws; - synchronized (this) { - allKws = Lists.newArrayList(getKeywords()); + final KeywordCollectionView kws = getKeywords(); + synchronized (kws) { + allKws = Lists.newArrayList(kws); } while (allKws.remove("CanSeeOpponentsFaceDownCards")) { }