Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id B08AF200C50 for ; Wed, 1 Mar 2017 01:14:02 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id AF4D2160B7E; Wed, 1 Mar 2017 00:14:02 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id D8A2C160B80 for ; Wed, 1 Mar 2017 01:14:01 +0100 (CET) Received: (qmail 73926 invoked by uid 500); 1 Mar 2017 00:14:01 -0000 Mailing-List: contact commits-help@geode.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@geode.apache.org Delivered-To: mailing list commits@geode.apache.org Received: (qmail 73783 invoked by uid 99); 1 Mar 2017 00:14:01 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 01 Mar 2017 00:14:01 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id E332CDFEE9; Wed, 1 Mar 2017 00:14:00 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: klund@apache.org To: commits@geode.apache.org Date: Wed, 01 Mar 2017 00:14:02 -0000 Message-Id: <723e8c34e0fa44d6864014f376a895ed@git.apache.org> In-Reply-To: <1953e7af7d6746039f8fc74d9b1ee755@git.apache.org> References: <1953e7af7d6746039f8fc74d9b1ee755@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [03/34] geode git commit: GEODE-2428: Adding support of Serialization/deserialization of LinkedHashMap in DataSerializer Also added a test for the same. archived-at: Wed, 01 Mar 2017 00:14:02 -0000 GEODE-2428: Adding support of Serialization/deserialization of LinkedHashMap in DataSerializer Also added a test for the same. GEODE-2428: Addressing review comment, Fixing the wild-card import issue. Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/a8757f6a Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/a8757f6a Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/a8757f6a Branch: refs/heads/GEODE-4160-mockito Commit: a8757f6a16920488d15f78174f1638c87565eacf Parents: 64cd6fc Author: adongre Authored: Sat Feb 4 19:47:51 2017 +0530 Committer: adongre Committed: Mon Feb 27 17:20:33 2017 +0530 ---------------------------------------------------------------------- .../java/org/apache/geode/DataSerializer.java | 69 ++++++++++++++++++++ .../internal/DataSerializableJUnitTest.java | 64 +++++++++++++----- 2 files changed, 117 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/a8757f6a/geode-core/src/main/java/org/apache/geode/DataSerializer.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/DataSerializer.java b/geode-core/src/main/java/org/apache/geode/DataSerializer.java index 375ff3b..627661a 100644 --- a/geode-core/src/main/java/org/apache/geode/DataSerializer.java +++ b/geode-core/src/main/java/org/apache/geode/DataSerializer.java @@ -33,6 +33,7 @@ import java.util.HashSet; import java.util.Hashtable; import java.util.IdentityHashMap; import java.util.LinkedHashSet; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.Map; import java.util.Properties; @@ -2667,6 +2668,74 @@ public abstract class DataSerializer { } } + + /** + * Writes a LinkedHashMap to a DataOutput. Note that even though + * map may be an instance of a subclass of LinkedHashMap, + * readLinkedHashMap will always return an instance of LinkedHashMap, + * not an instance of the subclass. To preserve the class type of map, + * {@link #writeObject(Object, DataOutput)} should be used for data serialization. This method + * will serialize a null map and not throw a NullPointerException. + * + * @throws IOException A problem occurs while writing to out + * @see #readLinkedHashMap + */ + public static void writeLinkedHashMap(Map map, DataOutput out) throws IOException { + + InternalDataSerializer.checkOut(out); + + int size; + if (map == null) { + size = -1; + } else { + size = map.size(); + } + InternalDataSerializer.writeArrayLength(size, out); + if (logger.isTraceEnabled(LogMarker.SERIALIZER)) { + logger.trace(LogMarker.SERIALIZER, "Writing LinkedHashMap with {} elements: {}", size, map); + } + if (size > 0) { + for (Map.Entry entry : map.entrySet()) { + writeObject(entry.getKey(), out); + writeObject(entry.getValue(), out); + } + } + } + + /** + * Reads a LinkedHashMap from a DataInput. + * + * @throws IOException A problem occurs while reading from in + * @throws ClassNotFoundException The class of one of the HashMap's elements cannot + * be found. + * @see #writeLinkedHashMap + */ + public static LinkedHashMap readLinkedHashMap(DataInput in) + throws IOException, ClassNotFoundException { + + InternalDataSerializer.checkIn(in); + + int size = InternalDataSerializer.readArrayLength(in); + if (size == -1) { + return null; + } else { + LinkedHashMap map = new LinkedHashMap<>(size); + for (int i = 0; i < size; i++) { + K key = DataSerializer.readObject(in); + V value = DataSerializer.readObject(in); + map.put(key, value); + } + + if (logger.isTraceEnabled(LogMarker.SERIALIZER)) { + logger.trace(LogMarker.SERIALIZER, "Read LinkedHashMap with {} elements: {}", size, map); + } + + return map; + } + } + + + /** * Writes a TreeSet to a DataOutput. Note that even though * set may be an instance of a subclass of TreeSet, http://git-wip-us.apache.org/repos/asf/geode/blob/a8757f6a/geode-core/src/test/java/org/apache/geode/internal/DataSerializableJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/internal/DataSerializableJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/DataSerializableJUnitTest.java index eec5fc2..0c5d561 100755 --- a/geode-core/src/test/java/org/apache/geode/internal/DataSerializableJUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/internal/DataSerializableJUnitTest.java @@ -32,22 +32,7 @@ import java.math.BigInteger; import java.net.InetAddress; import java.nio.ByteBuffer; import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.IdentityHashMap; -import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.Properties; -import java.util.Random; -import java.util.Stack; -import java.util.TreeMap; -import java.util.TreeSet; -import java.util.UUID; -import java.util.Vector; +import java.util.*; import java.util.concurrent.TimeUnit; import org.junit.Before; @@ -1580,6 +1565,53 @@ public class DataSerializableJUnitTest implements Serializable { } /** + * Tests data serializing an {@link java.util.LinkedHashMap} + */ + @Test + public void testLinkedHashMap() throws Exception { + Random random = getRandom(); + LinkedHashMap map = new LinkedHashMap(); + int size = random.nextInt(50); + for (int i = 0; i < size; i++) { + Object key = new Long(random.nextLong()); + Object value = String.valueOf(random.nextLong()); + map.put(key, value); + } + + DataOutputStream out = getDataOutput(); + DataSerializer.writeLinkedHashMap(map, out); + out.flush(); + + DataInput in = getDataInput(); + LinkedHashMap map2 = DataSerializer.readLinkedHashMap(in); + assertEquals(map, map2); + } + + /** + * Tests data serializing an {@link LinkedHashMap} using {@link DataSerializer#writeObject}. + */ + @Test + public void testLinkedHashMapObject() throws Exception { + Random random = getRandom(); + LinkedHashMap map = new LinkedHashMap(); + int size = random.nextInt(50); + for (int i = 0; i < size; i++) { + Object key = new Long(random.nextLong()); + Object value = String.valueOf(random.nextLong()); + map.put(key, value); + } + + DataOutputStream out = getDataOutput(); + DataSerializer.writeObject(map, out); + out.flush(); + + DataInput in = getDataInput(); + LinkedHashMap map2 = (LinkedHashMap) DataSerializer.readObject(in); + assertEquals(map, map2); + } + + + /** * Tests data serializing an {@link IdentityHashMap} */ @Test