You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2012/10/09 23:37:44 UTC

svn commit: r1396344 - /logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java

Author: ggregory
Date: Tue Oct  9 21:37:44 2012
New Revision: 1396344

URL: http://svn.apache.org/viewvc?rev=1396344&view=rev
Log:
Work around the regression bug in Class.getDeclaredMethods() in Oracle Java in version > 1.6.0_17: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786

Modified:
    logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java

Modified: logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java?rev=1396344&r1=1396343&r2=1396344&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java (original)
+++ logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java Tue Oct  9 21:37:44 2012
@@ -16,19 +16,20 @@
  */
 package org.apache.logging.log4j.core.pattern;
 
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.plugins.PluginManager;
-import org.apache.logging.log4j.core.config.plugins.PluginType;
-import org.apache.logging.log4j.status.StatusLogger;
-
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.plugins.PluginManager;
+import org.apache.logging.log4j.core.config.plugins.PluginType;
+import org.apache.logging.log4j.status.StatusLogger;
+
 /**
  * Most of the work of the {@link org.apache.logging.log4j.core.layout.PatternLayout} class
  * is delegated to the PatternParser class.
@@ -425,24 +426,27 @@ public final class PatternParser {
             return null;
         }
 
+        // Work around the regression bug in Class.getDeclaredMethods() in Oracle Java in version > 1.6.0_17:
+        // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786
         Method[] methods = converterClass.getDeclaredMethods();
-        Method newInstance = null;
+        Method newInstanceMethod = null;
         for (Method method : methods) {
-            if (method.getName().equals("newInstance")) {
-                if (newInstance == null) {
-                    newInstance = method;
-                } else {
-                    LOGGER.error("Class " + converterClass + " cannot contain multiple newInstance methods");
+            if (Modifier.isStatic(method.getModifiers()) && method.getDeclaringClass().equals(converterClass) &&
+                    method.getName().equals("newInstance")) {
+                if (newInstanceMethod == null) {
+                    newInstanceMethod = method;
+                } else if (method.getReturnType().equals(newInstanceMethod.getReturnType())) {
+                    LOGGER.error("Class " + converterClass + " cannot contain multiple static newInstance methods");
                     return null;
                 }
             }
         }
-        if (newInstance == null) {
-            LOGGER.error("Class " + converterClass + " does not contain a newInstance method");
+        if (newInstanceMethod == null) {
+            LOGGER.error("Class " + converterClass + " does not contain a static newInstance method");
             return null;
         }
 
-        Class[] parmTypes = newInstance.getParameterTypes();
+        Class[] parmTypes = newInstanceMethod.getParameterTypes();
         Object [] parms = parmTypes.length > 0 ? new Object[parmTypes.length] : null;
 
         if (parms != null) {
@@ -455,7 +459,7 @@ public final class PatternParser {
                 } else if (clazz.isAssignableFrom(Configuration.class)) {
                     parms[i] = config;
                 } else {
-                    LOGGER.error("Unknown parameter type " + clazz.getName() + " for newInstance method of " +
+                    LOGGER.error("Unknown parameter type " + clazz.getName() + " for static newInstance method of " +
                         converterClass.getName());
                     errors = true;
                 }
@@ -467,7 +471,7 @@ public final class PatternParser {
         }
 
         try {
-            Object newObj = newInstance.invoke(null, parms);
+            Object newObj = newInstanceMethod.invoke(null, parms);
 
             if (newObj instanceof PatternConverter) {
                 currentLiteral.delete(0, currentLiteral.length()