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));
     }
 

Reply via email to