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">