Fix NoSuchElementException reported in ONOS-4763 and ONOS-4757
Change-Id: I973b6c33f02defac3463b6e53ea177056f1f9714
diff --git a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResources.java b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResources.java
index 7ec9de0..a6a7d08 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResources.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResources.java
@@ -98,14 +98,25 @@
public DiscreteResources difference(DiscreteResources other) {
if (other instanceof EncodableDiscreteResources) {
EncodableDiscreteResources cast = (EncodableDiscreteResources) other;
- Map<Class<?>, EncodedDiscreteResources> newMap =
- Stream.concat(this.map.entrySet().stream(), cast.map.entrySet().stream())
- .filter(entry -> this.map.containsKey(entry.getKey()))
- .collect(Collectors.toMap(
- Map.Entry::getKey,
- Map.Entry::getValue,
- EncodedDiscreteResources::difference,
- LinkedHashMap::new));
+
+ Map<Class<?>, EncodedDiscreteResources> newMap = new LinkedHashMap<>();
+ for (Class<?> key : this.map.keySet()) {
+ EncodedDiscreteResources thisValues = this.map.get(key);
+ if (!cast.map.containsKey(key)) {
+ newMap.put(key, thisValues);
+ continue;
+ }
+ EncodedDiscreteResources otherValues = cast.map.get(key);
+ EncodedDiscreteResources diff = thisValues.difference(otherValues);
+ // omit empty resources from a new resource set
+ // empty EncodedDiscreteResources can't deserialize due to
+ // inability to reproduce a Class<?> instance from the serialized data
+ if (diff.isEmpty()) {
+ continue;
+ }
+ newMap.put(key, diff);
+ }
+
return of(parent, newMap);
} else if (other instanceof EmptyDiscreteResources) {
return this;