Performance improvement in deserialization of EncodableDiscreteResources

Over 1500x faster. This is for ONOS-4698

Before this patch
Benchmark                                   Mode  Cnt     Score   Error  Units
VlanSetSerialize.deserialize_compact_vlans  avgt  200  1681.625 ± 8.937  us/op
VlanSetSerialize.serialize_compact_vlans    avgt  200     1.532 ± 0.017  us/op

After this patch
Benchmark                                   Mode  Cnt  Score   Error  Units
VlanSetSerialize.deserialize_compact_vlans  avgt  200  1.070 ± 0.012  us/op
VlanSetSerialize.serialize_compact_vlans    avgt  200  1.613 ± 0.014  us/op

Change-Id: I2f00f7fbf25ee36555751e0bcff95d06b701f8c8
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 3dc12b3..125b5d9 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
@@ -66,7 +66,7 @@
         return new EncodableDiscreteResources(parent, values);
     }
 
-    private EncodableDiscreteResources(DiscreteResource parent, Map<Class<?>, EncodedDiscreteResources> map) {
+    EncodableDiscreteResources(DiscreteResource parent, Map<Class<?>, EncodedDiscreteResources> map) {
         this.parent = parent;
         this.map = map;
     }
diff --git a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResourcesSerializer.java b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResourcesSerializer.java
index 8c39e31..83bc342 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResourcesSerializer.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResourcesSerializer.java
@@ -21,8 +21,10 @@
 import com.esotericsoftware.kryo.io.Output;
 import org.onosproject.net.resource.DiscreteResource;
 
+import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -41,9 +43,11 @@
         @SuppressWarnings("unchecked")
         Set<EncodedDiscreteResources> resources = kryo.readObject(input, LinkedHashSet.class);
 
-        return EncodableDiscreteResources.of(parent,
-                resources.stream()
-                        .flatMap(x -> x.values(parent.id()).stream())
-                        .collect(Collectors.toCollection(LinkedHashSet::new)));
+        return new EncodableDiscreteResources(parent, resources.stream()
+                .collect(Collectors.toMap(
+                        EncodedDiscreteResources::encodedClass,
+                        Function.identity(),
+                        (v1, v2) -> v1,
+                        LinkedHashMap::new)));
     }
 }
diff --git a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedDiscreteResources.java b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedDiscreteResources.java
index d02e91c..e5bf85a 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedDiscreteResources.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedDiscreteResources.java
@@ -76,6 +76,11 @@
                 .collect(Collectors.toCollection(LinkedHashSet::new));
     }
 
+    Class<?> encodedClass() {
+        Range<Integer> firstRange = rangeSet.asRanges().iterator().next();
+        return codec.decode(firstRange.lowerEndpoint()).getClass();
+    }
+
     @SuppressWarnings("unchecked")
     boolean contains(DiscreteResource resource) {
         return resource.valueAs(Object.class)