From cffa4941b89f7a054867a27410ab3053ef1a79be Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 14 Feb 2017 10:13:49 +0100 Subject: [PATCH] BUG-7464: Switch to use forked TrieMap Switch from dead upstream to our forked version of TrieMap. Change-Id: Ide40b87b96d16500e2a8566d3d627ca1aac8d762 Signed-off-by: Robert Varga --- common/util/pom.xml | 8 +++---- .../yangtools/util/MapAdaptor.java | 5 +++-- .../yangtools/util/ReadOnlyTrieMap.java | 19 +++++++++-------- .../yangtools/util/ReadWriteTrieMap.java | 14 +++++++++---- .../yangtools/util/ReadWriteTrieMapTest.java | 21 +++++++++---------- .../yangtools/triemap/MutableTrieMap.java | 2 +- .../yangtools/triemap/TrieMap.java | 2 +- 7 files changed, 39 insertions(+), 32 deletions(-) diff --git a/common/util/pom.xml b/common/util/pom.xml index f12e86ebcd..b0ca73f8f8 100644 --- a/common/util/pom.xml +++ b/common/util/pom.xml @@ -39,12 +39,12 @@ concepts - com.google.guava - guava + org.opendaylight.yangtools + triemap - com.github.romix - java-concurrent-hash-trie-map + com.google.guava + guava diff --git a/common/util/src/main/java/org/opendaylight/yangtools/util/MapAdaptor.java b/common/util/src/main/java/org/opendaylight/yangtools/util/MapAdaptor.java index 3e5fec119d..6ca8710b18 100644 --- a/common/util/src/main/java/org/opendaylight/yangtools/util/MapAdaptor.java +++ b/common/util/src/main/java/org/opendaylight/yangtools/util/MapAdaptor.java @@ -10,11 +10,12 @@ package org.opendaylight.yangtools.util; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; -import com.romix.scala.collection.concurrent.TrieMap; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import org.opendaylight.yangtools.triemap.MutableTrieMap; +import org.opendaylight.yangtools.triemap.TrieMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -217,7 +218,7 @@ public final class MapAdaptor { * which will maintain the size for us. */ LOG.trace("Copying input {} to a TrieMap ({} entries)", input, size); - final TrieMap map = new TrieMap<>(); + final MutableTrieMap map = TrieMap.create(); map.putAll(input); final Map ret = new ReadOnlyTrieMap<>(map, size); LOG.trace("Read-only TrieMap is {}", ret); diff --git a/common/util/src/main/java/org/opendaylight/yangtools/util/ReadOnlyTrieMap.java b/common/util/src/main/java/org/opendaylight/yangtools/util/ReadOnlyTrieMap.java index 0082ff3f5f..465f668450 100644 --- a/common/util/src/main/java/org/opendaylight/yangtools/util/ReadOnlyTrieMap.java +++ b/common/util/src/main/java/org/opendaylight/yangtools/util/ReadOnlyTrieMap.java @@ -9,9 +9,10 @@ package org.opendaylight.yangtools.util; import com.google.common.base.Preconditions; import com.google.common.collect.ForwardingMap; -import com.romix.scala.collection.concurrent.TrieMap; import java.util.Map; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; +import org.opendaylight.yangtools.triemap.ImmutableTrieMap; +import org.opendaylight.yangtools.triemap.MutableTrieMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,30 +25,30 @@ import org.slf4j.LoggerFactory; */ final class ReadOnlyTrieMap extends ForwardingMap { @SuppressWarnings("rawtypes") - private static final AtomicReferenceFieldUpdater UPDATER = - AtomicReferenceFieldUpdater.newUpdater(ReadOnlyTrieMap.class, TrieMap.class, "readOnly"); + private static final AtomicReferenceFieldUpdater UPDATER = + AtomicReferenceFieldUpdater.newUpdater(ReadOnlyTrieMap.class, ImmutableTrieMap.class, "readOnly"); private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyTrieMap.class); - private final TrieMap readWrite; + private final MutableTrieMap readWrite; private final int size; - private volatile TrieMap readOnly; + private volatile ImmutableTrieMap readOnly; - ReadOnlyTrieMap(final TrieMap map, final int size) { + ReadOnlyTrieMap(final MutableTrieMap map, final int size) { super(); this.readWrite = Preconditions.checkNotNull(map); this.size = size; } Map toReadWrite() { - final Map ret = new ReadWriteTrieMap<>(readWrite.snapshot(), size); + final Map ret = new ReadWriteTrieMap<>(readWrite.mutableSnapshot(), size); LOG.trace("Converted read-only TrieMap {} to read-write {}", this, ret); return ret; } @Override protected Map delegate() { - TrieMap ret = readOnly; + ImmutableTrieMap ret = readOnly; if (ret == null) { - ret = readWrite.readOnlySnapshot(); + ret = readWrite.immutableSnapshot(); if (!UPDATER.compareAndSet(this, null, ret)) { ret = readOnly; } diff --git a/common/util/src/main/java/org/opendaylight/yangtools/util/ReadWriteTrieMap.java b/common/util/src/main/java/org/opendaylight/yangtools/util/ReadWriteTrieMap.java index 4d91e1812d..bf8c06a33b 100644 --- a/common/util/src/main/java/org/opendaylight/yangtools/util/ReadWriteTrieMap.java +++ b/common/util/src/main/java/org/opendaylight/yangtools/util/ReadWriteTrieMap.java @@ -8,12 +8,13 @@ package org.opendaylight.yangtools.util; import com.google.common.base.Preconditions; -import com.romix.scala.collection.concurrent.TrieMap; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.Set; import javax.annotation.Nonnull; +import org.opendaylight.yangtools.triemap.MutableTrieMap; +import org.opendaylight.yangtools.triemap.TrieMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,15 +31,15 @@ import org.slf4j.LoggerFactory; */ final class ReadWriteTrieMap implements Map { private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyTrieMap.class); - private final TrieMap delegate; + private final MutableTrieMap delegate; private int size; ReadWriteTrieMap() { - this.delegate = new TrieMap<>(); + this.delegate = TrieMap.create(); this.size = 0; } - ReadWriteTrieMap(final TrieMap delegate, final int size) { + ReadWriteTrieMap(final MutableTrieMap delegate, final int size) { this.delegate = Preconditions.checkNotNull(delegate); this.size = size; } @@ -130,4 +131,9 @@ final class ReadWriteTrieMap implements Map { public int hashCode() { return delegate.hashCode(); } + + @Override + public String toString() { + return delegate.toString(); + } } diff --git a/common/util/src/test/java/org/opendaylight/yangtools/util/ReadWriteTrieMapTest.java b/common/util/src/test/java/org/opendaylight/yangtools/util/ReadWriteTrieMapTest.java index 8af39c471f..d7f79056f6 100644 --- a/common/util/src/test/java/org/opendaylight/yangtools/util/ReadWriteTrieMapTest.java +++ b/common/util/src/test/java/org/opendaylight/yangtools/util/ReadWriteTrieMapTest.java @@ -9,22 +9,24 @@ package org.opendaylight.yangtools.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import com.romix.scala.collection.concurrent.TrieMap; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.junit.Test; +import org.opendaylight.yangtools.triemap.MutableTrieMap; +import org.opendaylight.yangtools.triemap.TrieMap; public class ReadWriteTrieMapTest { @Test public void testMethodsOfReadWriteTrieMap() { - final TrieMap trieMap = new TrieMap<>(); + final MutableTrieMap trieMap = TrieMap.create(); trieMap.put("0", "zero"); trieMap.put("1", "one"); @@ -51,24 +53,21 @@ public class ReadWriteTrieMapTest { final Collection trieMapValues = readWriteTrieMap.values(); assertEquals("Size of values should be '3'.", 3, trieMapValues.size()); - assertTrue("Entry set of readWriteTrieMap and trieMap should by equals.", - convertSetEntryToMap(readWriteTrieMap.entrySet()).equals(trieMap)); + assertEquals(convertSetEntryToMap(readWriteTrieMap.entrySet()), trieMap); trieMap.put("2", "two"); final ReadWriteTrieMap readWriteTrieMap2 = new ReadWriteTrieMap<>(trieMap, 4); - assertFalse("Objects readWriteTrieMap and readOnlyTrieMap2 should be different.", - readWriteTrieMap.equals(readWriteTrieMap2)); - assertFalse("Hash codes of object readWriteTrieMap and readOnelyTrieMap2 should be different.", - readWriteTrieMap.hashCode() == readWriteTrieMap2.hashCode()); + assertNotEquals(readWriteTrieMap, readWriteTrieMap2); + assertEquals(readWriteTrieMap.hashCode(), readWriteTrieMap2.hashCode()); final Map readOnlyTrieMap = readWriteTrieMap.toReadOnly(); readWriteTrieMap.clear(); - assertEquals("Size of readWriteTrieMap should be '0'.", 0, readWriteTrieMap.size()); - assertEquals("Size of readOnlyTrieMap should be '6'.", 6, readOnlyTrieMap.size()); + assertEquals(0, readWriteTrieMap.size()); + assertEquals(6, readOnlyTrieMap.size()); } - public Map convertSetEntryToMap(final Set> input) { + private static Map convertSetEntryToMap(final Set> input) { Map resultMap = new HashMap<>(); for (Entry entry : input) { resultMap.put(entry.getKey(), entry.getValue()); diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/MutableTrieMap.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/MutableTrieMap.java index 26fbba0816..72c8b19870 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/MutableTrieMap.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/MutableTrieMap.java @@ -35,7 +35,7 @@ import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; * @param the type of mapped values */ @Beta -final class MutableTrieMap extends TrieMap { +public final class MutableTrieMap extends TrieMap { private static final long serialVersionUID = 1L; @SuppressWarnings("rawtypes") diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TrieMap.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TrieMap.java index 5bcefcaa1e..36cf5cc361 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TrieMap.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/TrieMap.java @@ -50,7 +50,7 @@ public abstract class TrieMap extends AbstractMap implements Concurr this.equiv = equiv; } - public static TrieMap create() { + public static MutableTrieMap create() { return new MutableTrieMap<>(Equivalence.equals()); } -- 2.36.6