From 82f4555d3b80ef5e7ee3bba13510f5e2a7c82404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alen=20Vre=C4=8Dko?= <332217+avrecko@users.noreply.github.com> Date: Fri, 8 Feb 2019 18:21:03 +0100 Subject: [PATCH] Ability to disable array content printout on toString(). --- .../org/agrona/ExpandableArrayBuffer.java | 6 ++++- .../java/org/agrona/MutableDirectBuffer.java | 6 +++++ .../org/agrona/concurrent/UnsafeBuffer.java | 5 +++- .../agrona/concurrent/UnsafeBufferTest.java | 24 +++++++++++++++++-- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/agrona/src/main/java/org/agrona/ExpandableArrayBuffer.java b/agrona/src/main/java/org/agrona/ExpandableArrayBuffer.java index 2c6e23608..3e068bd82 100644 --- a/agrona/src/main/java/org/agrona/ExpandableArrayBuffer.java +++ b/agrona/src/main/java/org/agrona/ExpandableArrayBuffer.java @@ -38,6 +38,10 @@ */ public class ExpandableArrayBuffer implements MutableDirectBuffer { + + private static final boolean SHOULD_PRINT_ARRAY_CONTENT = + !Boolean.getBoolean(DISABLE_ARRAY_CONTENT_PRINTOUT_PROP_NAME); + /** * Maximum length to which the underlying buffer can grow. Some JVMs set bits in the last few bytes. */ @@ -1107,7 +1111,7 @@ public int compareTo(final DirectBuffer that) public String toString() { return "ExpandableArrayBuffer{" + - "byteArray=" + Arrays.toString(byteArray) + + "byteArray=" + (SHOULD_PRINT_ARRAY_CONTENT ? Arrays.toString(byteArray) : byteArray) + '}'; } } diff --git a/agrona/src/main/java/org/agrona/MutableDirectBuffer.java b/agrona/src/main/java/org/agrona/MutableDirectBuffer.java index d0735fa2c..4710b5b6f 100644 --- a/agrona/src/main/java/org/agrona/MutableDirectBuffer.java +++ b/agrona/src/main/java/org/agrona/MutableDirectBuffer.java @@ -26,6 +26,12 @@ */ public interface MutableDirectBuffer extends DirectBuffer { + + /** + * Don't print the content of the array while calling toString() on buffer instance. + */ + String DISABLE_ARRAY_CONTENT_PRINTOUT_PROP_NAME = "agrona.disable.array.printout"; + /** * Is this buffer expandable to accommodate putting data into it beyond the current capacity? * diff --git a/agrona/src/main/java/org/agrona/concurrent/UnsafeBuffer.java b/agrona/src/main/java/org/agrona/concurrent/UnsafeBuffer.java index 6d2acaead..f468f3457 100644 --- a/agrona/src/main/java/org/agrona/concurrent/UnsafeBuffer.java +++ b/agrona/src/main/java/org/agrona/concurrent/UnsafeBuffer.java @@ -55,6 +55,8 @@ public class UnsafeBuffer implements AtomicBuffer public static final String DISABLE_BOUNDS_CHECKS_PROP_NAME = "agrona.disable.bounds.checks"; public static final boolean SHOULD_BOUNDS_CHECK = !Boolean.getBoolean(DISABLE_BOUNDS_CHECKS_PROP_NAME); + public static final boolean SHOULD_PRINT_ARRAY_CONTENT = + !Boolean.getBoolean(DISABLE_ARRAY_CONTENT_PRINTOUT_PROP_NAME); private long addressOffset; private int capacity; @@ -1752,7 +1754,8 @@ public String toString() return "UnsafeBuffer{" + "addressOffset=" + addressOffset + ", capacity=" + capacity + - ", byteArray=" + Arrays.toString(byteArray) + + ", byteArray=" + (SHOULD_PRINT_ARRAY_CONTENT ? + Arrays.toString(byteArray) : byteArray) + ", byteBuffer=" + byteBuffer + '}'; } diff --git a/agrona/src/test/java/org/agrona/concurrent/UnsafeBufferTest.java b/agrona/src/test/java/org/agrona/concurrent/UnsafeBufferTest.java index 7fe9fdd0e..cee1b1c15 100644 --- a/agrona/src/test/java/org/agrona/concurrent/UnsafeBufferTest.java +++ b/agrona/src/test/java/org/agrona/concurrent/UnsafeBufferTest.java @@ -22,6 +22,8 @@ import org.junit.experimental.theories.Theory; import org.junit.runner.RunWith; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.nio.ByteBuffer; import java.util.Arrays; @@ -30,8 +32,7 @@ import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.lessThan; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.junit.Assert.*; @RunWith(Theories.class) public class UnsafeBufferTest @@ -236,6 +237,25 @@ private void putAscii(final UnsafeBuffer buffer, final String value) buffer.putBytes(INDEX, value.getBytes(US_ASCII)); } + @Test + public void shouldSkipArrayContentPrintout() throws Exception + { + final Field settingField = UnsafeBuffer.class.getDeclaredField("SHOULD_PRINT_ARRAY_CONTENT"); + settingField.setAccessible(true); + final Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(settingField, settingField.getModifiers() & ~Modifier.FINAL); + + final byte[] backingArray = new byte[10]; + final UnsafeBuffer unsafeBuffer = new UnsafeBuffer(backingArray); + + settingField.set(null, true); + assertTrue(unsafeBuffer.toString().contains(Arrays.toString(backingArray))); + + settingField.set(null, false); + assertFalse(unsafeBuffer.toString().contains(Arrays.toString(backingArray))); + } + @DataPoints public static int[][] valuesAndLengths() {