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