Reduce the memory usage by RangeSet in backing data structure

- Typically resource query is more frequent than resource registration.
  This patch optimizes memory usage for resource query rather than registration

Change-Id: Ic680c09c83b4299e80d4493d01e642081549fa24
(cherry picked from commit fd18ded046b9135a7fdc7e58c3fbafea9c835fe8)
diff --git a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedResourcesSerializer.java b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedResourcesSerializer.java
index 587fb4c..61de641 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedResourcesSerializer.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedResourcesSerializer.java
@@ -19,18 +19,15 @@
 import com.esotericsoftware.kryo.Serializer;
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
-import com.google.common.collect.DiscreteDomain;
 import com.google.common.collect.Range;
+import com.google.common.collect.RangeSet;
 import com.google.common.collect.TreeRangeSet;
 import org.onlab.util.ClosedOpenRange;
 import org.onosproject.net.resource.DiscreteResourceCodec;
 
 import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.stream.Collectors;
-import java.util.stream.IntStream;
 
 /**
  * Kryo Serializer for {@link EncodedDiscreteResources}.
@@ -38,12 +35,7 @@
 final class EncodedResourcesSerializer extends Serializer<EncodedDiscreteResources> {
     @Override
     public void write(Kryo kryo, Output output, EncodedDiscreteResources object) {
-        TreeRangeSet<Integer> rangeSet = TreeRangeSet.create();
-        object.rawValues().stream()
-                .map(Range::singleton)
-                .map(x -> x.canonical(DiscreteDomain.integers()))
-                .forEach(rangeSet::add);
-        List<ClosedOpenRange> ranges = rangeSet.asRanges().stream()
+        List<ClosedOpenRange> ranges = object.rangeSet().asRanges().stream()
                 .map(ClosedOpenRange::of)
                 .collect(Collectors.toList());
         kryo.writeObject(output, ranges);
@@ -56,10 +48,10 @@
         List<ClosedOpenRange> ranges = kryo.readObject(input, ArrayList.class);
         DiscreteResourceCodec codec = (DiscreteResourceCodec) kryo.readClassAndObject(input);
 
-        HashSet<Integer> rawValues = ranges.stream()
-                .flatMapToInt(x -> IntStream.range(x.lowerBound(), x.upperBound()))
-                .boxed()
-                .collect(Collectors.toCollection(LinkedHashSet::new));
-        return new EncodedDiscreteResources(rawValues, codec);
+        RangeSet<Integer> rangeSet = TreeRangeSet.create();
+        ranges.stream()
+                .map(x -> Range.closedOpen(x.lowerBound(), x.upperBound()))
+                .forEach(rangeSet::add);
+        return new EncodedDiscreteResources(rangeSet, codec);
     }
 }