diff --git a/src/main/java/net/openhft/chronicle/map/BytesMapEventListener.java b/src/main/java/net/openhft/chronicle/map/BytesMapEventListener.java index 59499f54d..7454782d0 100644 --- a/src/main/java/net/openhft/chronicle/map/BytesMapEventListener.java +++ b/src/main/java/net/openhft/chronicle/map/BytesMapEventListener.java @@ -36,6 +36,9 @@ import java.io.Serializable; * alignment (see {@link ChronicleMapBuilder#entryAndValueAlignment(Alignment)} * ), followed by the serialized value itself. * + * + *

There are helper methods {@link ChronicleMap#readKey(Bytes, long)} and + * {@link ChronicleMap#readValue(Bytes, long)} that help to deal with this. */ public abstract class BytesMapEventListener implements Serializable { private static final long serialVersionUID = 0L; diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMap.java b/src/main/java/net/openhft/chronicle/map/ChronicleMap.java index d0d06daad..1e34883cc 100755 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/ChronicleMap.java @@ -294,6 +294,10 @@ public interface ChronicleMap extends ConcurrentMap, ChronicleHash { */ K newKeyInstance(); + K readKey(Bytes entry, long keyPos); + + V readValue(Bytes entry, long valuePos); + /** * @return the class of {@code } */ diff --git a/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java b/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java index 5c5b36a77..8ab514674 100755 --- a/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java @@ -217,6 +217,16 @@ class StatelessChronicleMap implements ChronicleMap, Closeable, Clon return VanillaChronicleMap.newInstance(kClass, true); } + @Override + public K readKey(Bytes entry, long keyPos) { + throw new UnsupportedOperationException(); + } + + @Override + public V readValue(Bytes entry, long valuePos) { + throw new UnsupportedOperationException(); + } + @Override public Class keyClass() { return kClass; diff --git a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java index 4e2317826..6b394318a 100755 --- a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java @@ -233,6 +233,33 @@ class VanillaChronicleMap, } } + @Override + public K readKey(Bytes entry, long keyPos) { + long initialPos = entry.position(); + try { + entry.position(keyPos); + long keySize = keySizeMarshaller.readSize(entry); + ThreadLocalCopies copies = keyReaderProvider.getCopies(null); + return keyReaderProvider.get(copies, originalKeyReader).read(entry, keySize); + } finally { + entry.position(initialPos); + } + } + + @Override + public V readValue(Bytes entry, long valuePos) { + long initialPos = entry.position(); + try { + entry.position(valuePos); + long valueSize = valueSizeMarshaller.readSize(entry); + alignment.alignPositionAddr(entry); + ThreadLocalCopies copies = valueReaderProvider.getCopies(null); + return valueReaderProvider.get(copies, originalValueReader).read(entry, valueSize); + } finally { + entry.position(initialPos); + } + } + static void segmentStateNotNullImpliesCopiesNotNull( @Nullable ThreadLocalCopies copies, @Nullable SegmentState segmentState) { assert copies != null || segmentState == null; // segmentState != null -> copies != null diff --git a/src/test/java/net/openhft/chronicle/map/ReplicationCheckingMap.java b/src/test/java/net/openhft/chronicle/map/ReplicationCheckingMap.java index c227b538d..7394ebe74 100644 --- a/src/test/java/net/openhft/chronicle/map/ReplicationCheckingMap.java +++ b/src/test/java/net/openhft/chronicle/map/ReplicationCheckingMap.java @@ -16,6 +16,7 @@ package net.openhft.chronicle.map; +import net.openhft.lang.io.Bytes; import org.jetbrains.annotations.NotNull; import org.junit.Assert; @@ -245,6 +246,16 @@ public class ReplicationCheckingMap implements ChronicleMap { throw new UnsupportedOperationException(); } + @Override + public K readKey(Bytes entry, long keyPos) { + return map1.readKey(entry, keyPos); + } + + @Override + public V readValue(Bytes entry, long valuePos) { + return map1.readValue(entry, valuePos); + } + @Override public Class keyClass() { return map1.keyClass(); diff --git a/src/test/java/net/openhft/chronicle/map/jsr166/map/StatelessChronicleMapTest.java b/src/test/java/net/openhft/chronicle/map/jsr166/map/StatelessChronicleMapTest.java index fb76835e5..4461a8e23 100755 --- a/src/test/java/net/openhft/chronicle/map/jsr166/map/StatelessChronicleMapTest.java +++ b/src/test/java/net/openhft/chronicle/map/jsr166/map/StatelessChronicleMapTest.java @@ -19,6 +19,7 @@ package net.openhft.chronicle.map.jsr166.map; import net.openhft.chronicle.hash.replication.TcpTransportAndNetworkConfig; import net.openhft.chronicle.map.*; import net.openhft.chronicle.map.jsr166.JSR166TestCase; +import net.openhft.lang.io.Bytes; import org.jetbrains.annotations.NotNull; import org.junit.After; import org.junit.Before; @@ -198,6 +199,16 @@ public class StatelessChronicleMapTest extends JSR166TestCase { throw new UnsupportedOperationException(); } + @Override + public K readKey(Bytes entry, long keyPos) { + return d.readKey(entry, keyPos); + } + + @Override + public V readValue(Bytes entry, long valuePos) { + return d.readValue(entry, valuePos); + } + @Override public Class keyClass() { return d.keyClass();