This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 3505d42b3b59ff1753a02396090825e8c2a57953 Author: Andrus Adamchik <[email protected]> AuthorDate: Mon Jul 6 08:56:39 2026 -0400 refactoring - unifying logging of array values also, don't enclose array parameters in <..> --- .../apache/cayenne/access/types/ByteArrayType.java | 31 ++---- .../access/types/ByteOrCharArrayFactory.java | 61 +--------- .../apache/cayenne/access/types/ExtendedType.java | 3 + .../cayenne/dba/sqlite/SQLiteByteArrayType.java | 4 +- .../org/apache/cayenne/log/SQLBindingRenderer.java | 4 +- .../java/org/apache/cayenne/util/ArrayUtil.java | 124 +++++++++++++++------ .../org/apache/cayenne/log/Slf4jSQLLoggerTest.java | 2 +- 7 files changed, 109 insertions(+), 120 deletions(-) diff --git a/cayenne/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java b/cayenne/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java index 139d564e7..007848fea 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java @@ -20,7 +20,7 @@ package org.apache.cayenne.access.types; import org.apache.cayenne.CayenneRuntimeException; -import org.apache.cayenne.util.IDUtil; +import org.apache.cayenne.util.ArrayUtil; import org.apache.cayenne.util.MemoryBlob; import java.io.ByteArrayOutputStream; @@ -34,8 +34,8 @@ import java.sql.SQLException; import java.sql.Types; /** - * Handles <code>byte[]</code>, mapping it as either of JDBC types - BLOB or - * (VAR)BINARY. Can be configured to trim trailing zero bytes. + * Handles <code>byte[]</code>, mapping it as either of JDBC types - BLOB or (VAR)BINARY. Can be configured to trim + * trailing zero bytes. */ public class ByteArrayType implements ExtendedType<byte[]> { @@ -44,25 +44,12 @@ public class ByteArrayType implements ExtendedType<byte[]> { protected boolean trimmingBytes; protected boolean usingBlobs; + /** + * @deprecated in favor of {@link ArrayUtil#appendTruncated(StringBuilder, byte[])} + */ + @Deprecated(since = "5.0", forRemoval = true) public static void logBytes(StringBuilder buffer, byte[] bytes) { - buffer.append("<"); - - int len = bytes.length; - boolean trimming = false; - if (len > TRIM_VALUES_THRESHOLD) { - len = TRIM_VALUES_THRESHOLD; - trimming = true; - } - - for (int i = 0; i < len; i++) { - IDUtil.appendFormattedByte(buffer, bytes[i]); - } - - if (trimming) { - buffer.append("..."); - } - - buffer.append('>'); + ArrayUtil.appendTruncated(buffer, bytes); } /** @@ -166,7 +153,7 @@ public class ByteArrayType implements ExtendedType<byte[]> { } StringBuilder buffer = new StringBuilder(); - logBytes(buffer, value); + ArrayUtil.appendTruncated(buffer, value); return buffer.toString(); } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java b/cayenne/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java index ac85b8954..c7acbca6d 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/types/ByteOrCharArrayFactory.java @@ -18,9 +18,7 @@ ****************************************************************/ package org.apache.cayenne.access.types; -import org.apache.cayenne.util.IDUtil; - -import java.lang.reflect.Array; +import org.apache.cayenne.util.ArrayUtil; /** * A factory that dynamically creates ExtendedTypes for Character, Character[], Byte[] and @@ -119,24 +117,7 @@ class ByteOrCharArrayFactory implements ExtendedTypeFactory { } StringBuilder buffer = new StringBuilder(); - buffer.append("<"); - - int len = Array.getLength(value); - boolean trimming = false; - if (len > TRIM_VALUES_THRESHOLD) { - len = TRIM_VALUES_THRESHOLD; - trimming = true; - } - - for (int i = 0; i < len; i++) { - buffer.append(Array.get(value, i)); - } - - if (trimming) { - buffer.append("..."); - } - - buffer.append('>'); + ArrayUtil.appendTruncated(buffer, value); return buffer.toString(); } } @@ -187,24 +168,7 @@ class ByteOrCharArrayFactory implements ExtendedTypeFactory { } StringBuilder buffer = new StringBuilder(); - buffer.append("<"); - - int len = Array.getLength(value); - boolean trimming = false; - if (len > TRIM_VALUES_THRESHOLD) { - len = TRIM_VALUES_THRESHOLD; - trimming = true; - } - - for (int i = 0; i < len; i++) { - buffer.append(Array.get(value, i)); - } - - if (trimming) { - buffer.append("..."); - } - - buffer.append('>'); + ArrayUtil.appendTruncated(buffer, value); return buffer.toString(); } } @@ -255,24 +219,7 @@ class ByteOrCharArrayFactory implements ExtendedTypeFactory { } StringBuilder buffer = new StringBuilder(); - buffer.append("<"); - - int len = value.length; - boolean trimming = false; - if (len > TRIM_VALUES_THRESHOLD) { - len = TRIM_VALUES_THRESHOLD; - trimming = true; - } - - for (int i = 0; i < len; i++) { - IDUtil.appendFormattedByte(buffer, value[i]); - } - - if (trimming) { - buffer.append("..."); - } - - buffer.append('>'); + ArrayUtil.appendTruncated(buffer, value); return buffer.toString(); } } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/types/ExtendedType.java b/cayenne/src/main/java/org/apache/cayenne/access/types/ExtendedType.java index ebf584d40..c9b05db77 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/types/ExtendedType.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/types/ExtendedType.java @@ -30,7 +30,10 @@ public interface ExtendedType<T> { /** * Defines trimming constant for toString method that helps to limit logging of large values. + * + * @deprecated unused */ + @Deprecated(since = "5.0", forRemoval = true) int TRIM_VALUES_THRESHOLD = 30; /** diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteByteArrayType.java b/cayenne/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteByteArrayType.java index 08a6884c5..2f4eeeb24 100644 --- a/cayenne/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteByteArrayType.java +++ b/cayenne/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteByteArrayType.java @@ -18,7 +18,7 @@ ****************************************************************/ package org.apache.cayenne.dba.sqlite; -import org.apache.cayenne.access.types.ByteArrayType; +import org.apache.cayenne.util.ArrayUtil; import org.apache.cayenne.access.types.ExtendedType; import java.sql.CallableStatement; @@ -74,7 +74,7 @@ class SQLiteByteArrayType implements ExtendedType<byte[]> { } StringBuilder buffer = new StringBuilder(); - ByteArrayType.logBytes(buffer, value); + ArrayUtil.appendTruncated(buffer, value); return buffer.toString(); } } diff --git a/cayenne/src/main/java/org/apache/cayenne/log/SQLBindingRenderer.java b/cayenne/src/main/java/org/apache/cayenne/log/SQLBindingRenderer.java index 409dc460f..0bd9d6d5a 100644 --- a/cayenne/src/main/java/org/apache/cayenne/log/SQLBindingRenderer.java +++ b/cayenne/src/main/java/org/apache/cayenne/log/SQLBindingRenderer.java @@ -27,7 +27,7 @@ import org.apache.cayenne.access.translator.TranslatedProcedure; import org.apache.cayenne.access.translator.TranslatedSQL; import org.apache.cayenne.access.translator.TranslatedSelect; import org.apache.cayenne.access.translator.TranslatedStatement; -import org.apache.cayenne.access.types.ByteArrayType; +import org.apache.cayenne.util.ArrayUtil; import org.apache.cayenne.access.types.ExtendedType; import java.util.Map; @@ -171,7 +171,7 @@ class SQLBindingRenderer { } if (value instanceof byte[] bytes) { StringBuilder buffer = new StringBuilder(); - ByteArrayType.logBytes(buffer, bytes); + ArrayUtil.appendTruncated(buffer, bytes); return buffer.toString(); } return "'" + value + "'"; diff --git a/cayenne/src/main/java/org/apache/cayenne/util/ArrayUtil.java b/cayenne/src/main/java/org/apache/cayenne/util/ArrayUtil.java index 5d0af6055..5b6a2e6c7 100644 --- a/cayenne/src/main/java/org/apache/cayenne/util/ArrayUtil.java +++ b/cayenne/src/main/java/org/apache/cayenne/util/ArrayUtil.java @@ -19,29 +19,31 @@ package org.apache.cayenne.util; +import java.util.function.IntConsumer; + /** * @since 4.1 */ public final class ArrayUtil { public static int[][] sliceArray(int[] array, int batchSize) { - if(array == null) { + if (array == null) { return null; } int length = array.length; - if(length <= batchSize) { + if (length <= batchSize) { return new int[][]{array}; } int batches = length / batchSize; - if(length % batchSize > 0) { + if (length % batchSize > 0) { batches++; } int[][] result = new int[batches][]; int offset = 0; - for(int i=0; i<batches; i++) { + for (int i = 0; i < batches; i++) { int nextSize = i < batches - 1 ? batchSize : length - offset; result[i] = new int[nextSize]; System.arraycopy(array, offset, result[i], 0, nextSize); @@ -51,23 +53,23 @@ public final class ArrayUtil { } public static long[][] sliceArray(long[] array, int batchSize) { - if(array == null) { + if (array == null) { return null; } int length = array.length; - if(length <= batchSize) { + if (length <= batchSize) { return new long[][]{array}; } int batches = length / batchSize; - if(length % batchSize > 0) { + if (length % batchSize > 0) { batches++; } long[][] result = new long[batches][]; int offset = 0; - for(int i=0; i<batches; i++) { + for (int i = 0; i < batches; i++) { int nextSize = i < batches - 1 ? batchSize : length - offset; result[i] = new long[nextSize]; System.arraycopy(array, offset, result[i], 0, nextSize); @@ -77,23 +79,23 @@ public final class ArrayUtil { } public static float[][] sliceArray(float[] array, int batchSize) { - if(array == null) { + if (array == null) { return null; } int length = array.length; - if(length <= batchSize) { + if (length <= batchSize) { return new float[][]{array}; } int batches = length / batchSize; - if(length % batchSize > 0) { + if (length % batchSize > 0) { batches++; } float[][] result = new float[batches][]; int offset = 0; - for(int i=0; i<batches; i++) { + for (int i = 0; i < batches; i++) { int nextSize = i < batches - 1 ? batchSize : length - offset; result[i] = new float[nextSize]; System.arraycopy(array, offset, result[i], 0, nextSize); @@ -103,23 +105,23 @@ public final class ArrayUtil { } public static double[][] sliceArray(double[] array, int batchSize) { - if(array == null) { + if (array == null) { return null; } int length = array.length; - if(length <= batchSize) { + if (length <= batchSize) { return new double[][]{array}; } int batches = length / batchSize; - if(length % batchSize > 0) { + if (length % batchSize > 0) { batches++; } double[][] result = new double[batches][]; int offset = 0; - for(int i=0; i<batches; i++) { + for (int i = 0; i < batches; i++) { int nextSize = i < batches - 1 ? batchSize : length - offset; result[i] = new double[nextSize]; System.arraycopy(array, offset, result[i], 0, nextSize); @@ -129,23 +131,23 @@ public final class ArrayUtil { } public static short[][] sliceArray(short[] array, int batchSize) { - if(array == null) { + if (array == null) { return null; } int length = array.length; - if(length <= batchSize) { + if (length <= batchSize) { return new short[][]{array}; } int batches = length / batchSize; - if(length % batchSize > 0) { + if (length % batchSize > 0) { batches++; } short[][] result = new short[batches][]; int offset = 0; - for(int i=0; i<batches; i++) { + for (int i = 0; i < batches; i++) { int nextSize = i < batches - 1 ? batchSize : length - offset; result[i] = new short[nextSize]; System.arraycopy(array, offset, result[i], 0, nextSize); @@ -155,23 +157,23 @@ public final class ArrayUtil { } public static char[][] sliceArray(char[] array, int batchSize) { - if(array == null) { + if (array == null) { return null; } int length = array.length; - if(length <= batchSize) { + if (length <= batchSize) { return new char[][]{array}; } int batches = length / batchSize; - if(length % batchSize > 0) { + if (length % batchSize > 0) { batches++; } char[][] result = new char[batches][]; int offset = 0; - for(int i=0; i<batches; i++) { + for (int i = 0; i < batches; i++) { int nextSize = i < batches - 1 ? batchSize : length - offset; result[i] = new char[nextSize]; System.arraycopy(array, offset, result[i], 0, nextSize); @@ -181,23 +183,23 @@ public final class ArrayUtil { } public static boolean[][] sliceArray(boolean[] array, int batchSize) { - if(array == null) { + if (array == null) { return null; } int length = array.length; - if(length <= batchSize) { + if (length <= batchSize) { return new boolean[][]{array}; } int batches = length / batchSize; - if(length % batchSize > 0) { + if (length % batchSize > 0) { batches++; } boolean[][] result = new boolean[batches][]; int offset = 0; - for(int i=0; i<batches; i++) { + for (int i = 0; i < batches; i++) { int nextSize = i < batches - 1 ? batchSize : length - offset; result[i] = new boolean[nextSize]; System.arraycopy(array, offset, result[i], 0, nextSize); @@ -207,23 +209,23 @@ public final class ArrayUtil { } public static byte[][] sliceArray(byte[] array, int batchSize) { - if(array == null) { + if (array == null) { return null; } int length = array.length; - if(length <= batchSize) { + if (length <= batchSize) { return new byte[][]{array}; } int batches = length / batchSize; - if(length % batchSize > 0) { + if (length % batchSize > 0) { batches++; } byte[][] result = new byte[batches][]; int offset = 0; - for(int i=0; i<batches; i++) { + for (int i = 0; i < batches; i++) { int nextSize = i < batches - 1 ? batchSize : length - offset; result[i] = new byte[nextSize]; System.arraycopy(array, offset, result[i], 0, nextSize); @@ -233,23 +235,23 @@ public final class ArrayUtil { } public static Object[][] sliceArray(Object[] array, int batchSize) { - if(array == null) { + if (array == null) { return null; } int length = array.length; - if(length <= batchSize) { + if (length <= batchSize) { return new Object[][]{array}; } int batches = length / batchSize; - if(length % batchSize > 0) { + if (length % batchSize > 0) { batches++; } Object[][] result = new Object[batches][]; int offset = 0; - for(int i=0; i<batches; i++) { + for (int i = 0; i < batches; i++) { int nextSize = i < batches - 1 ? batchSize : length - offset; result[i] = new Object[nextSize]; System.arraycopy(array, offset, result[i], 0, nextSize); @@ -257,4 +259,54 @@ public final class ArrayUtil { } return result; } + + /** + * Appends a {@code byte[]} as a truncated hex fragment, e.g. {@code <AB12CD...>}. + * + * @since 5.0 + */ + public static void appendTruncated(StringBuilder buffer, byte[] bytes) { + appendTruncated(buffer, bytes.length, i -> IDUtil.appendFormattedByte(buffer, bytes[i])); + } + + /** + * Appends a {@code Byte[]} as a truncated hex fragment, e.g. {@code <AB12CD...>}. + * + * @since 5.0 + */ + public static void appendTruncated(StringBuilder buffer, Byte[] bytes) { + appendTruncated(buffer, bytes.length, i -> IDUtil.appendFormattedByte(buffer, bytes[i])); + } + + /** + * Appends a {@code char[]} as a truncated fragment, e.g. {@code <abc...>}. + * + * @since 5.0 + */ + public static void appendTruncated(StringBuilder buffer, char[] chars) { + appendTruncated(buffer, chars.length, i -> buffer.append(chars[i])); + } + + /** + * Appends a {@code Character[]} as a truncated fragment, e.g. {@code <abc...>}. + * + * @since 5.0 + */ + public static void appendTruncated(StringBuilder buffer, Character[] chars) { + appendTruncated(buffer, chars.length, i -> buffer.append(chars[i])); + } + + private static void appendTruncated(StringBuilder buffer, int length, IntConsumer appendElement) { + + int trimThreshold = 30; + + int shown = Math.min(length, trimThreshold); + for (int i = 0; i < shown; i++) { + appendElement.accept(i); + } + + if (length > trimThreshold) { + buffer.append("..."); + } + } } diff --git a/cayenne/src/test/java/org/apache/cayenne/log/Slf4jSQLLoggerTest.java b/cayenne/src/test/java/org/apache/cayenne/log/Slf4jSQLLoggerTest.java index 0c6853f24..9dea3ba2b 100644 --- a/cayenne/src/test/java/org/apache/cayenne/log/Slf4jSQLLoggerTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/log/Slf4jSQLLoggerTest.java @@ -154,7 +154,7 @@ public class Slf4jSQLLoggerTest { "INSERT INTO BINARY_PK_TEST1(BIN_ID, NAME) VALUES(?, ?)", new PSBatchParameter[]{binId, name}); assertEquals( - "INSERT INTO BINARY_PK_TEST1(BIN_ID, NAME) VALUES(?, ?) | bind:[BIN_ID:<0102AB>,NAME:'master1'] updated:1", + "INSERT INTO BINARY_PK_TEST1(BIN_ID, NAME) VALUES(?, ?) | bind:[BIN_ID:0102AB,NAME:'master1'] updated:1", line(logger, batch, "updated:", 1)); }
