You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ck...@apache.org on 2019/05/14 14:51:41 UTC

[logging-log4j2] branch release-2.x updated: LOG4J2-2564: PatternParser chooses newInstance methods with known parameters

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

ckozak pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/release-2.x by this push:
     new 173cda5  LOG4J2-2564: PatternParser chooses newInstance methods with known parameters
173cda5 is described below

commit 173cda59736e3a5f9d01fa1e5999b9c588d4841d
Author: Carter Kozak <ck...@apache.org>
AuthorDate: Mon May 13 23:41:20 2019 -0400

    LOG4J2-2564: PatternParser chooses newInstance methods with known parameters
    
    Fixes MapPatternConverter, which contains two newInstance methods where
    only one can be created using the PatternParser factory.
---
 .../logging/log4j/core/pattern/PatternParser.java       | 17 +++++++++++++++--
 .../logging/log4j/core/pattern/PatternParserTest.java   |  9 +++++++++
 src/changes/changes.xml                                 |  4 ++++
 3 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
index f603b05..2e854e9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
@@ -540,8 +540,10 @@ public final class PatternParser {
         final Method[] methods = converterClass.getDeclaredMethods();
         Method newInstanceMethod = null;
         for (final Method method : methods) {
-            if (Modifier.isStatic(method.getModifiers()) && method.getDeclaringClass().equals(converterClass)
-                    && method.getName().equals("newInstance")) {
+            if (Modifier.isStatic(method.getModifiers())
+                    && method.getDeclaringClass().equals(converterClass)
+                    && method.getName().equals("newInstance")
+                    && areValidNewInstanceParameters(method.getParameterTypes())) {
                 if (newInstanceMethod == null) {
                     newInstanceMethod = method;
                 } else if (method.getReturnType().equals(newInstanceMethod.getReturnType())) {
@@ -595,6 +597,17 @@ public final class PatternParser {
         return null;
     }
 
+    /** LOG4J2-2564: Returns true if all method parameters are valid for injection. */
+    private static boolean areValidNewInstanceParameters(Class<?>[] parameterTypes) {
+        for (Class<?> clazz : parameterTypes) {
+            if (!clazz.isAssignableFrom(Configuration.class)
+                    && !(clazz.isArray() && "[Ljava.lang.String;".equals(clazz.getName()))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     /**
      * Processes a format specifier sequence.
      *
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
index 1c15091..445910b 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java
@@ -406,4 +406,13 @@ public class PatternParserTest {
         assertEquals("|", options.getSeparator());
     }
 
+    // LOG4J2-2564: Multiple newInstance methods.
+    @Test
+    public void testMapPatternConverter() {
+        final List<PatternFormatter> formatters = parser.parse("%K");
+        assertNotNull(formatters);
+        assertTrue(formatters.size() == 1);
+        PatternFormatter formatter = formatters.get(0);
+        assertTrue("Expected a MapPatternConverter", formatter.getConverter() instanceof MapPatternConverter);
+    }
 }
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 69ac966..bf51e8f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -72,6 +72,10 @@
       <action issue="LOG4J2-2598" dev="ggregory" type="fix" due-to="Gary Gregory">
         java.lang.StackOverflowError at org.apache.logging.log4j.junit.AbstractExternalFileCleaner.println(AbstractExternalFileCleaner.java:169).
       </action>
+      <action issue="LOG4J2-2564" dev="ckozak" type="fix">
+        MapPatternConverter is properly created from the '%K', '%map', and '%MAP' patterns.
+        PatternConverter instanceOf methods with unknown parameter types no longer elide those with known parameters.
+      </action>
     </release>
     <release version="2.11.2" date="2019-02-04" description="GA Release 2.11.2">
       <action issue="LOG4J2-2500" dev="rgoers" type="fix">