From: "Enrico Weigelt, metux IT consult" <enrico.weig...@gr13.net>

---
 .../client/gui/dialog/EditSettlementDialog.java    |  2 +-
 .../client/gui/panel/report/ReportIndianPanel.java |  2 +-
 src/net/sf/freecol/common/model/Player.java        | 74 ++++++++++++++--------
 .../sf/freecol/common/model/SimpleCombatModel.java |  4 +-
 src/net/sf/freecol/server/FreeColServer.java       |  4 +-
 src/net/sf/freecol/server/ai/NativeAIPlayer.java   |  8 +--
 src/net/sf/freecol/server/model/ServerGame.java    |  9 +--
 src/net/sf/freecol/server/model/ServerPlayer.java  | 18 +++---
 .../freecol/server/generator/MapGeneratorTest.java |  2 +-
 9 files changed, 71 insertions(+), 52 deletions(-)

diff --git a/src/net/sf/freecol/client/gui/dialog/EditSettlementDialog.java 
b/src/net/sf/freecol/client/gui/dialog/EditSettlementDialog.java
index 8cde7a524bb..9ac37076c90 100644
--- a/src/net/sf/freecol/client/gui/dialog/EditSettlementDialog.java
+++ b/src/net/sf/freecol/client/gui/dialog/EditSettlementDialog.java
@@ -228,7 +228,7 @@ public final class EditSettlementDialog extends 
FreeColDialog<IndianSettlement>
             if (this.capital.isSelected() && !is.isCapital()) {
                 // make sure we downgrade the old capital
                 for (IndianSettlement indianSettlement
-                         : is.getOwner().getIndianSettlementList()) {
+                         : is.getOwner().getIndianSettlements()) {
                     indianSettlement.setCapital(false);
                 }
                 is.setCapital(true);
diff --git a/src/net/sf/freecol/client/gui/panel/report/ReportIndianPanel.java 
b/src/net/sf/freecol/client/gui/panel/report/ReportIndianPanel.java
index b01ab6ee434..a531adaa804 100644
--- a/src/net/sf/freecol/client/gui/panel/report/ReportIndianPanel.java
+++ b/src/net/sf/freecol/client/gui/panel/report/ReportIndianPanel.java
@@ -94,7 +94,7 @@ public final class ReportIndianPanel extends ReportPanel {
     private void buildIndianAdvisorPanel(Player player, Player opponent) {
         final NationSummary ns = igc().getNationSummary(opponent);
         List<IndianSettlement> nativeSettlements
-            = opponent.getIndianSettlementList();
+            = opponent.getIndianSettlements();
         String numSettlements = String.valueOf(nativeSettlements.size())
             + " / " + ((ns == null) ? "?"
                 : String.valueOf(ns.getNumberOfSettlements()));
diff --git a/src/net/sf/freecol/common/model/Player.java 
b/src/net/sf/freecol/common/model/Player.java
index f0354687958..1714d5ec7f7 100644
--- a/src/net/sf/freecol/common/model/Player.java
+++ b/src/net/sf/freecol/common/model/Player.java
@@ -2426,8 +2426,12 @@ public class Player extends FreeColGameObject implements 
Nameable {
      *     or null if not found.
      */
     public IndianSettlement getIndianSettlementByName(String name) {
-        return find(getIndianSettlements(),
-                    matchKeyEquals(name, IndianSettlement::getName));
+        synchronized (this.settlements) {
+            for (Settlement s : this.settlements)
+                if (s instanceof IndianSettlement && Utils.equals(name, 
((IndianSettlement)s).getName()))
+                    return (IndianSettlement)s;
+        }
+        return null;
     }
 
     /**
@@ -2488,25 +2492,35 @@ public class Player extends FreeColGameObject 
implements Nameable {
     }
 
     /**
-     * Get a stream of all the indian settlements this player owns.
+     * Get a list of all the IndianSettlements this player owns.
      *
-     * @return A stream of the {@code IndianSettlement}s this player owns.
+     * @return A list of the {@code IndianSettlement}s this player owns.
      */
-    public Stream<IndianSettlement> getIndianSettlements() {
-        return getIndianSettlementList().stream();
+    public List<IndianSettlement> getIndianSettlements() {
+        synchronized (this.settlements) {
+            List<IndianSettlement> result = new ArrayList<>();
+            for (Settlement s : this.settlements)
+                if (s instanceof IndianSettlement)
+                    result.add((IndianSettlement)s);
+            return result;
+        }
     }
 
     /**
-     * Get a list of all the IndianSettlements this player owns.
+     * Get a list of all the IndianSettlements this player owns, that have
+     * been contacted by given player.
      *
-     * @return A list of the {@code IndianSettlement}s this player owns.
+     * @return A list of this player's {@code IndianSettlement}s, that have
+     * been contacted by given player.
      */
-    public List<IndianSettlement> getIndianSettlementList() {
-        List<IndianSettlement> result = new ArrayList<>();
-        for (Settlement s : this.settlements)
-            if (s instanceof IndianSettlement)
-                result.add((IndianSettlement)s);
-        return result;
+    public List<IndianSettlement> getIndianSettlementsContacted(Player player) 
{
+        synchronized (this.settlements) {
+            List<IndianSettlement> result = new ArrayList<>();
+            for (Settlement s : this.settlements)
+                if (s instanceof IndianSettlement && s.hasContacted(player))
+                    result.add((IndianSettlement)s);
+            return result;
+        }
     }
 
     /**
@@ -2517,24 +2531,32 @@ public class Player extends FreeColGameObject 
implements Nameable {
      * @return A list of the {@code IndianSettlement}s with a matching
      *     missionary.
      */
-    public List<IndianSettlement> 
getIndianSettlementsWithMissionaryList(Player p) {
-        List<IndianSettlement> result = new ArrayList<>();
-        for (Settlement s : this.settlements)
-            if ((s instanceof IndianSettlement) && 
((IndianSettlement)s).hasMissionary(p))
-                result.add((IndianSettlement)s);
-        return result;
+    public List<IndianSettlement> getIndianSettlementsWithMissionary(Player p) 
{
+        synchronized (this.settlements) {
+            List<IndianSettlement> result = new ArrayList<>();
+            for (Settlement s : this.settlements)
+                if ((s instanceof IndianSettlement) && 
((IndianSettlement)s).hasMissionary(p))
+                    result.add((IndianSettlement)s);
+            return result;
+        }
     }
 
     /**
-     * Get a stream of all indian settlements owned by this player with
+     * Check whether player has an indian settlements owned by this player with
      * a missionary from a given player.
      *
      * @param p The {@code Player}.
-     * @return A stream of the {@code IndianSettlement}s with a matching
-     *     missionary.
+     * @return A True if there player has an indian settlement with missionary
+     *     from given player.
      */
-    public Stream<IndianSettlement> getIndianSettlementsWithMissionary(Player 
p) {
-        return getIndianSettlementsWithMissionaryList(p).stream();
+    public final boolean hasIndianSettlementsWithMissionary(Player p) {
+        synchronized (this.settlements) {
+            List<IndianSettlement> result = new ArrayList<>();
+            for (Settlement s : this.settlements)
+                if ((s instanceof IndianSettlement) && 
((IndianSettlement)s).hasMissionary(p))
+                    return true;
+            return false;
+        }
     }
 
     /**
@@ -2902,7 +2924,7 @@ public class Player extends FreeColGameObject implements 
Nameable {
                 // All missions if using enhanced missionaries.
                 if (spec.getBoolean(GameOptions.ENHANCED_MISSIONARIES))
                     for (Player other : getGame().getLiveNativePlayers(this))
-                        for (IndianSettlement is : 
getIndianSettlementsWithMissionaryList(this))
+                        for (IndianSettlement is : 
getIndianSettlementsWithMissionary(this))
                             vismap.setVisible(is);
 
                 // All other European settlements if can see all colonies.
diff --git a/src/net/sf/freecol/common/model/SimpleCombatModel.java 
b/src/net/sf/freecol/common/model/SimpleCombatModel.java
index 64fc90d4cb1..a536559adcb 100644
--- a/src/net/sf/freecol/common/model/SimpleCombatModel.java
+++ b/src/net/sf/freecol/common/model/SimpleCombatModel.java
@@ -794,10 +794,8 @@ public class SimpleCombatModel extends CombatModel {
                             lose++;
                         }
                     } else if (r >= 1.0 - winner.getBurnProbability()) {
-                        if (any(transform(loserPlayer.getIndianSettlements(),
-                                    s -> s.hasMissionary(winnerPlayer)))) {
+                        if 
(loserPlayer.hasIndianSettlementsWithMissionary(winnerPlayer))
                             crs.add(CombatResult.BURN_MISSIONS);
-                        }
                     }
                 }
                 if (settlement.getUnitCount() + tile.getUnitCount() <= lose) {
diff --git a/src/net/sf/freecol/server/FreeColServer.java 
b/src/net/sf/freecol/server/FreeColServer.java
index 2ded50a8033..c056fed241a 100644
--- a/src/net/sf/freecol/server/FreeColServer.java
+++ b/src/net/sf/freecol/server/FreeColServer.java
@@ -1155,7 +1155,7 @@ public final class FreeColServer {
                 p.setReady(true); // Players in running game must be ready
                 // @compat 0.10.5
                 if (p.isIndian()) {
-                    for (IndianSettlement is : p.getIndianSettlementList()) {
+                    for (IndianSettlement is : p.getIndianSettlements()) {
                         ((ServerIndianSettlement)is).updateMostHated();
                     }
                 }
@@ -1317,7 +1317,7 @@ public final class FreeColServer {
                         + Tension.Level.CONTENT.getLimit()) / 2;
                     for (Player other : 
serverGame.getLiveNativePlayers(player)) {
                         player.setStance(other, Stance.PEACE);
-                        for (IndianSettlement is : 
player.getIndianSettlementList()) {
+                        for (IndianSettlement is : 
player.getIndianSettlements()) {
                             is.setAlarm(other, new Tension(alarm));
                         }
                     }
diff --git a/src/net/sf/freecol/server/ai/NativeAIPlayer.java 
b/src/net/sf/freecol/server/ai/NativeAIPlayer.java
index 4121139630e..237002960c0 100644
--- a/src/net/sf/freecol/server/ai/NativeAIPlayer.java
+++ b/src/net/sf/freecol/server/ai/NativeAIPlayer.java
@@ -140,7 +140,7 @@ public class NativeAIPlayer extends MissionAIPlayer {
 
         // Give defensive missions up to the minimum expected defence,
         // leave the rest with the default wander-hostile mission.
-        for (IndianSettlement is : player.getIndianSettlementList()) {
+        for (IndianSettlement is : player.getIndianSettlements()) {
             List<Unit> units = is.getAllUnitsList();
             while (units.size() > is.getRequiredDefenders()) {
                 Unit u = units.remove(0);
@@ -189,7 +189,7 @@ public class NativeAIPlayer extends MissionAIPlayer {
     private void secureSettlements(int[] randoms, LogBuilder lb) {
         int randomIdx = 0;
         List<IndianSettlement> settlements
-            = getPlayer().getIndianSettlementList();
+            = getPlayer().getIndianSettlements();
         for (IndianSettlement is : settlements) {
             // Spread arms and horses between camps
             // FIXME: maybe make this dependent on difficulty level?
@@ -467,7 +467,7 @@ public class NativeAIPlayer extends MissionAIPlayer {
         int randomIdx = 0;
         lb.mark();
 
-        for (IndianSettlement is : player.getIndianSettlementList()) {
+        for (IndianSettlement is : player.getIndianSettlements()) {
             // Do not bring gifts all the time.
             if (randoms[randomIdx++] >= giftProbability) continue;
 
@@ -567,7 +567,7 @@ public class NativeAIPlayer extends MissionAIPlayer {
         int randomIdx = 0;
         lb.mark();
 
-        for (IndianSettlement is : player.getIndianSettlementList()) {
+        for (IndianSettlement is : player.getIndianSettlements()) {
             // Do not demand tribute all of the time.
             if (randoms[randomIdx++] >= demandProbability) continue;
 
diff --git a/src/net/sf/freecol/server/model/ServerGame.java 
b/src/net/sf/freecol/server/model/ServerGame.java
index 815f7660010..a9899897bf5 100644
--- a/src/net/sf/freecol/server/model/ServerGame.java
+++ b/src/net/sf/freecol/server/model/ServerGame.java
@@ -50,6 +50,7 @@ import net.sf.freecol.common.model.Goods;
 import net.sf.freecol.common.model.GoodsLocation;
 import net.sf.freecol.common.model.HighSeas;
 import net.sf.freecol.common.model.HistoryEvent;
+import net.sf.freecol.common.model.IndianSettlement;
 import net.sf.freecol.common.model.Limit;
 import net.sf.freecol.common.model.Location;
 import net.sf.freecol.common.model.ModelMessage;
@@ -367,9 +368,8 @@ public class ServerGame extends Game implements 
ServerModelObject {
         Set<Tile> updated = new HashSet<>();
         ServerPlayer strongest = (ServerPlayer)strongAI;
         ServerPlayer weakest = (ServerPlayer)weakAI;
-        forEach(flatten(getLiveNativePlayers(),
-                        p -> p.getIndianSettlementsWithMissionary(weakest)),
-            is -> {
+        for (Player p : getLiveNativePlayers()) {
+            for (IndianSettlement is : 
p.getIndianSettlementsWithMissionary(weakest)) {
                 lb.add(" ", is.getName(), "(mission)");
                 is.getTile().cacheUnseen(strongest);//+til
                 tiles.add(is.getTile());
@@ -380,7 +380,8 @@ public class ServerGame extends Game implements 
ServerModelObject {
                     is.getTile().updateIndianSettlement(strongest);
                     cs.add(See.perhaps().always(strongest), is);
                 }
-            });
+            }
+        }
         for (Colony c : weakest.getColonies()) {
             updated.addAll(c.getOwnedTiles());
             ((ServerColony)c).csChangeOwner(strongest, false, 
cs);//-vis(both),-til
diff --git a/src/net/sf/freecol/server/model/ServerPlayer.java 
b/src/net/sf/freecol/server/model/ServerPlayer.java
index 745401de83a..d904f23ffe2 100644
--- a/src/net/sf/freecol/server/model/ServerPlayer.java
+++ b/src/net/sf/freecol/server/model/ServerPlayer.java
@@ -633,7 +633,7 @@ public class ServerPlayer extends Player implements 
ServerModelObject {
         // Clean up missions and remove tension/alarm/stance.
         for (Player other : getGame().getLivePlayers(this)) {
             if (isEuropean() && other.isIndian()) {
-                for (IndianSettlement is : other.getIndianSettlementList()) {
+                for (IndianSettlement is : other.getIndianSettlements()) {
                     ServerIndianSettlement sis = (ServerIndianSettlement)is;
                     if (is.hasMissionary(this)) sis.csKillMissionary(null, cs);
                     is.getTile().cacheUnseen();//+til
@@ -1384,9 +1384,9 @@ public class ServerPlayer extends Player implements 
ServerModelObject {
         // Propagate tension change as settlement alarm to all
         // settlements except the one that originated it (if any).
         if (isIndian()) {
-            for (IndianSettlement is : transform(getIndianSettlements(),
-                    i -> i != origin && i.hasContacted(player))) {
-                ((ServerIndianSettlement)is).csModifyAlarm(player, add,
+            for (IndianSettlement is : getIndianSettlementsContacted(player)) {
+                if (is != origin)
+                    ((ServerIndianSettlement)is).csModifyAlarm(player, add,
                                                            false, cs);//+til
             }
         }
@@ -1758,7 +1758,7 @@ outer:  for (Effect effect : effects) {
             // The simple way to do it is just to save all old tension
             // levels and check if they have changed after applying
             // all the changes.
-            List<IndianSettlement> allSettlements = getIndianSettlementList();
+            List<IndianSettlement> allSettlements = getIndianSettlements();
             java.util.Map<IndianSettlement,
                 java.util.Map<Player, Tension.Level>> oldLevels = new 
HashMap<>();
             for (IndianSettlement is : allSettlements) {
@@ -1970,8 +1970,7 @@ outer:  for (Effect effect : effects) {
                 for (Player p : transform(game.getLiveNativePlayers(),
                                           p -> p.hasContacted(this))) {
                     p.setTension(this, new Tension(Tension.TENSION_MIN));
-                    for (IndianSettlement is : 
transform(p.getIndianSettlements(),
-                                                         is -> 
is.hasContacted(this))) {
+                    for (IndianSettlement is : 
p.getIndianSettlementsContacted(this)) {
                         is.getTile().cacheUnseen();//+til
                         is.setAlarm(this, new 
Tension(Tension.TENSION_MIN));//-til
                         cs.add(See.only(this), is);
@@ -2557,8 +2556,7 @@ outer:  for (Effect effect : effects) {
             // FIXME: just the tension
             cs.add(See.perhaps().always(this), defenderPlayer);
             csChangeStance(Stance.PEACE, defenderPlayer, true, cs);
-            for (IndianSettlement is : 
transform(defenderPlayer.getIndianSettlements(),
-                                                 is -> is.hasContacted(this))) 
{
+            for (IndianSettlement is : defenderPlayer.getIndianSettlements()) {
                 is.getAlarm(this).setValue(Tension.SURRENDERED);
                 // Only update attacker with settlements that have
                 // been seen, as contact can occur with its members.
@@ -2704,7 +2702,7 @@ outer:  for (Effect effect : effects) {
 
         // Burn down the missions
         boolean here = is.hasMissionary(attackerPlayer);
-        for (IndianSettlement s : 
nativePlayer.getIndianSettlementsWithMissionaryList(attackerPlayer)) {
+        for (IndianSettlement s : 
nativePlayer.getIndianSettlementsWithMissionary(attackerPlayer)) {
             ((ServerIndianSettlement)s).csKillMissionary(null, cs);
         }
         // Backtrack on updating this tile, avoiding duplication in csCombat
diff --git a/test/src/net/sf/freecol/server/generator/MapGeneratorTest.java 
b/test/src/net/sf/freecol/server/generator/MapGeneratorTest.java
index aea6944b7c8..2960c83a78f 100644
--- a/test/src/net/sf/freecol/server/generator/MapGeneratorTest.java
+++ b/test/src/net/sf/freecol/server/generator/MapGeneratorTest.java
@@ -178,7 +178,7 @@ public class MapGeneratorTest extends FreeColTestCase {
             // has at least one settlement.
             int settlements = 0;
             int capitals = 0;
-            for (IndianSettlement s : p.getIndianSettlementList()) {
+            for (IndianSettlement s : p.getIndianSettlements()) {
                 settlements++;
                 if (s.isCapital()) capitals++;
             }
-- 
2.11.0.rc0.7.gbe5a750


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Freecol-developers mailing list
Freecol-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freecol-developers

Reply via email to