From 7afed74f4bcac6e519229076c97c6d67e2e31e07 Mon Sep 17 00:00:00 2001
From: Herwin van Welbergen <hvanwelbergen@techfak.uni-bielefeld.de>
Date: Tue, 26 Apr 2016 16:02:14 +0200
Subject: [PATCH] fixed thread safety of Payload

---
 ipaacalib/java/src/ipaaca/Payload.java | 28 ++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/ipaacalib/java/src/ipaaca/Payload.java b/ipaacalib/java/src/ipaaca/Payload.java
index 5d1ed1d..aee8d7b 100644
--- a/ipaacalib/java/src/ipaaca/Payload.java
+++ b/ipaacalib/java/src/ipaaca/Payload.java
@@ -36,7 +36,10 @@ import ipaaca.protobuf.Ipaaca.PayloadItem;
 
 import org.apache.commons.lang.StringEscapeUtils;
 
+import com.google.common.collect.ImmutableSet;
+
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -49,7 +52,7 @@ import java.util.Set;
  */
 public class Payload implements Map<String, String>
 {
-    private Map<String, String> map = new HashMap<String, String>();
+    private Map<String, String> map = Collections.synchronizedMap(new HashMap<String, String>());
     private final AbstractIU iu;
 
     public Payload(AbstractIU iu)
@@ -82,17 +85,23 @@ public class Payload implements Map<String, String>
     public void set(Map<String, String> newPayload, String writerName)
     {
         iu.setPayload(newPayload, writerName);
-        map.clear();
-        map.putAll(newPayload);
+        synchronized(map)
+        {
+            map.clear();
+            map.putAll(newPayload);
+        }
     }
 
     public void set(List<PayloadItem> newPayload, String writerName)
     {
         iu.handlePayloadSetting(newPayload, writerName);
-        map.clear();
-        for (PayloadItem item : newPayload)
+        synchronized(map)
         {
-            map.put(item.getKey(), pseudoConvertFromJSON(item.getValue(), item.getType()));
+            map.clear();
+            for (PayloadItem item : newPayload)
+            {
+                map.put(item.getKey(), pseudoConvertFromJSON(item.getValue(), item.getType()));
+            }
         }
     }
 
@@ -136,9 +145,12 @@ public class Payload implements Map<String, String>
         return map.containsValue(value);
     }
 
-    public Set<java.util.Map.Entry<String, String>> entrySet()
+    /**
+     * Provides an immutable copy of the entryset of the Payload
+     */
+    public ImmutableSet<java.util.Map.Entry<String, String>> entrySet()
     {
-        return map.entrySet();
+        return ImmutableSet.copyOf(map.entrySet());
     }
 
     public boolean equals(Object o)
-- 
GitLab