You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2023/01/02 16:05:03 UTC

[logging-log4j2] 01/02: LOG4J2-2297 - Allow java.sql.Time objects to format properly in MapMessages.

This is an automated email from the ASF dual-hosted git repository.

rgoers pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 7b10ba69cc2af35c666af66fc54656f76cd0b152
Author: Ralph Goers <rg...@apache.org>
AuthorDate: Mon Jan 2 09:04:00 2023 -0700

    LOG4J2-2297 - Allow java.sql.Time objects to format properly in MapMessages.
---
 .../logging/log4j/message/MapMessageTest.java      | 17 ++++++++++----
 log4j-api/src/main/java/module-info.java           |  1 +
 .../apache/logging/log4j/util/StringBuilders.java  | 26 ++++++++++++++++++++++
 src/changes/changes.xml                            |  3 +++
 4 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
index d420e2bf7f..106cce2c97 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
@@ -16,17 +16,18 @@
  */
 package org.apache.logging.log4j.message;
 
-import org.apache.logging.log4j.util.StringBuilderFormattable;
-import org.apache.logging.log4j.util.Strings;
-import org.junit.jupiter.api.Test;
-
 import java.math.BigDecimal;
+import java.sql.Time;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 
+import org.apache.logging.log4j.util.StringBuilderFormattable;
+import org.apache.logging.log4j.util.Strings;
+import org.junit.jupiter.api.Test;
+
 import static org.junit.jupiter.api.Assertions.*;
 
 /**
@@ -311,6 +312,14 @@ public class MapMessageTest {
         assertEquals(expected, result);
     }
 
+    @Test
+    public void testTime() throws Exception {
+        final Time time = new Time(12, 5, 5);
+        final ObjectMapMessage message = new ObjectMapMessage().with("time", time);
+        assertEquals("time=\"" + time.toString() + "\"",
+                message.getFormattedMessage(), "Incorrect time format");
+    }
+
     private static final class FormattableTestType implements StringBuilderFormattable {
 
         @Override
diff --git a/log4j-api/src/main/java/module-info.java b/log4j-api/src/main/java/module-info.java
index 732b3d595d..57f500e63e 100644
--- a/log4j-api/src/main/java/module-info.java
+++ b/log4j-api/src/main/java/module-info.java
@@ -38,6 +38,7 @@ module org.apache.logging.log4j {
     exports org.apache.logging.log4j.status;
     exports org.apache.logging.log4j.util;
 
+    requires static java.sql;
     requires static org.osgi.framework;
     uses org.apache.logging.log4j.spi.Provider;
     uses PropertySource;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
index e5b0e53273..d0c931d039 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
@@ -16,6 +16,8 @@
  */
 package org.apache.logging.log4j.util;
 
+import java.lang.reflect.Array;
+import java.util.Collections;
 import java.util.Map.Entry;
 
 import static java.lang.Character.toLowerCase;
@@ -25,6 +27,21 @@ import static java.lang.Character.toLowerCase;
  */
 @InternalApi
 public final class StringBuilders {
+
+    private static final Object timeClass;
+
+    static {
+        Object obj;
+        try {
+            Class<?> clazz = Class.forName("java.sql.Time");
+            long current = System.currentTimeMillis();
+            obj = clazz.getDeclaredConstructor(Long.TYPE).newInstance(current);
+        } catch(Exception ex) {
+            obj = null;
+        }
+        timeClass = obj;
+    }
+
     private StringBuilders() {
     }
 
@@ -118,12 +135,21 @@ public final class StringBuilders {
             stringBuilder.append(((Float) obj).floatValue());
         } else if (obj instanceof Byte) {
             stringBuilder.append(((Byte) obj).byteValue());
+        } else if (isTime(obj) || obj instanceof java.time.temporal.Temporal) {
+            stringBuilder.append(obj);
         } else {
             return false;
         }
         return true;
     }
 
+    /*
+        Check to see if obj is an instance of java.sql.time without requiring the java.sql module.
+     */
+    private static boolean isTime(final Object obj) {
+        return obj.getClass().isInstance(timeClass);
+    }
+
     /**
      * Returns true if the specified section of the left CharSequence equals the specified section of the right
      * CharSequence.
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index f3d8ba836a..b87c3cfbc9 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -202,6 +202,9 @@
       </action>
     </release>
     <release version="2.19.1" date="TBD" description="GA Release 2.19.1">
+      <action issue="LOG4J2-2297" dev="rgoers" type="fix">
+        Allow java.sql.Time objects to format properly in MapMessages.
+      </action>
       <action issue="LOG4J2-2785" dev="rgoers" type="add" due-to="Markus Spann">
         Pattern Layout to abbreviate the name of all logger components except the 2 rightmost.
       </action>