You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2017/11/11 21:04:21 UTC

svn commit: r1814981 - /jmeter/trunk/src/jorphan/org/apache/jorphan/reflect/ClassFinder.java

Author: pmouawad
Date: Sat Nov 11 21:04:20 2017
New Revision: 1814981

URL: http://svn.apache.org/viewvc?rev=1814981&view=rev
Log:
Improve logging
Fix some SONAR warnings

Modified:
    jmeter/trunk/src/jorphan/org/apache/jorphan/reflect/ClassFinder.java

Modified: jmeter/trunk/src/jorphan/org/apache/jorphan/reflect/ClassFinder.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/jorphan/org/apache/jorphan/reflect/ClassFinder.java?rev=1814981&r1=1814980&r2=1814981&view=diff
==============================================================================
--- jmeter/trunk/src/jorphan/org/apache/jorphan/reflect/ClassFinder.java (original)
+++ jmeter/trunk/src/jorphan/org/apache/jorphan/reflect/ClassFinder.java Sat Nov 11 21:04:20 2017
@@ -70,7 +70,7 @@ public final class ClassFinder {
         private final String contains; // class name should contain this string
         private final String notContains; // class name should not contain this string
 
-        private final transient ClassLoader contextClassLoader
+        private final ClassLoader contextClassLoader
             = Thread.currentThread().getContextClassLoader(); // Potentially expensive; do it once
 
         ExtendsClassFilter(Class<?> []parents, boolean inner, String contains, String notContains){
@@ -82,7 +82,6 @@ public final class ClassFinder {
 
         @Override
         public boolean accept(String className) {
-
             if (contains != null && !className.contains(contains)) {
                 return false; // It does not contain a required string
             }
@@ -90,12 +89,47 @@ public final class ClassFinder {
                 return false; // It contains a banned string
             }
             if (!className.contains("$") || inner) { // $NON-NLS-1$
-                if (isChildOf(parents, className, contextClassLoader)) {
-                    return true;
-                }
+                return isChildOf(parents, className, contextClassLoader);
             }
             return false;
         }
+        
+       /**
+        *
+        * @param parentClasses list of classes to check for
+        * @param strClassName name of class to be checked
+        * @param contextClassLoader the classloader to use
+        * @return true if the class is a non-abstract, non-interface instance of at least one of the parent classes
+        */
+       private boolean isChildOf(Class<?> [] parentClasses, String strClassName,
+               ClassLoader contextClassLoader){
+               // might throw an exception, assume this is ignorable
+               try {
+                   Class<?> c = Class.forName(strClassName, false, contextClassLoader);
+
+                   if (!c.isInterface() && !Modifier.isAbstract(c.getModifiers())) {
+                       for (Class<?> parentClass : parentClasses) {
+                           if (parentClass.isAssignableFrom(c)) {
+                               return true;
+                           }
+                       }
+                   }
+               } catch (UnsupportedClassVersionError | ClassNotFoundException
+                       | NoClassDefFoundError | VerifyError e) {
+                   log.debug(e.getLocalizedMessage(), e);
+               }
+           return false;
+       }
+
+        /* (non-Javadoc)
+         * @see java.lang.Object#toString()
+         */
+        @Override
+        public String toString() {
+            return "ExtendsClassFilter [parents=" + 
+                    (parents != null ? Arrays.toString(parents) : "null") + ", inner=" + inner + ", contains="
+                    + contains + ", notContains=" + notContains + "]";
+        }
     }
     
     private static class AnnoClassFilter implements ClassFilter {
@@ -103,7 +137,7 @@ public final class ClassFinder {
         private final boolean inner; // are inner classes OK?
 
         private final Class<? extends Annotation>[] annotations; // annotation classes to check
-        private final transient ClassLoader contextClassLoader
+        private final ClassLoader contextClassLoader
             = Thread.currentThread().getContextClassLoader(); // Potentially expensive; do it once
         
         AnnoClassFilter(Class<? extends Annotation> []annotations, boolean inner){
@@ -114,12 +148,36 @@ public final class ClassFinder {
         @Override
         public boolean accept(String className) {
             if (!className.contains("$") || inner) { // $NON-NLS-1$
-                if (hasAnnotationOnMethod(annotations,className, contextClassLoader)) {
-                    return true;
-                }
+                return hasAnnotationOnMethod(annotations,className, contextClassLoader);
             }
             return false;
         }
+        
+        private boolean hasAnnotationOnMethod(Class<? extends Annotation>[] annotations, String classInQuestion,
+                ClassLoader contextClassLoader ){
+                try{
+                    Class<?> c = Class.forName(classInQuestion, false, contextClassLoader);
+                    for(Method method : c.getMethods()) {
+                        for(Class<? extends Annotation> annotation : annotations) {
+                            if(method.isAnnotationPresent(annotation)) {
+                                return true;
+                            }
+                        }
+                    }
+                } catch (NoClassDefFoundError | ClassNotFoundException | UnsupportedClassVersionError | VerifyError ignored) {
+                    log.debug(ignored.getLocalizedMessage(), ignored);
+                }
+                return false;
+            }
+
+        /**
+         * @see java.lang.Object#toString()
+         */
+        @Override
+        public String toString() {
+            return "AnnoClassFilter [inner=" + inner + ", annotations=" + 
+                    (annotations != null ? Arrays.toString(annotations) : "null")+ "]";
+        }        
     }
 
     /**
@@ -240,10 +298,12 @@ public final class ClassFinder {
                 String contains, String notContains, boolean annotations)
                 throws IOException  {
         if (log.isDebugEnabled()) {
-            log.debug("searchPathsOrJars : {}", Arrays.toString(searchPathsOrJars));
-            log.debug("superclass : {}", Arrays.toString(classNames));
-            log.debug("innerClasses : {} annotations: {}", innerClasses, annotations);
-            log.debug("contains: {}, notContains: {}", contains, notContains);
+            log.debug("findClassesThatExtend with searchPathsOrJars : {}, superclass : {}"+
+                    " innerClasses : {} annotations: {} contains: {}, notContains: {}", 
+                    Arrays.toString(searchPathsOrJars),
+                    Arrays.toString(classNames),
+                    innerClasses, annotations,
+                    contains, notContains);
         }
 
         
@@ -274,7 +334,8 @@ public final class ClassFinder {
      */
     public static List<String> findClasses(String[] searchPathsOrJars, ClassFilter filter) throws IOException  {
         if (log.isDebugEnabled()) {
-            log.debug("searchPathsOrJars : {}", Arrays.toString(searchPathsOrJars));
+            log.debug("findClasses with searchPathsOrJars : {} and classFilter : {}", 
+                    Arrays.toString(searchPathsOrJars), filter);
         }
     
         // Find all jars in the search path
@@ -341,7 +402,8 @@ public final class ClassFinder {
                 }
             }
             if (!found) {
-                log.debug("Did not find: {}", classpathElement);
+                log.debug("Classpath element {} does not match any search path {}", classpathElement,
+                        strPathsOrJars);
             }
         }
         return listPaths;
@@ -379,51 +441,6 @@ public final class ClassFinder {
     }
 
     /**
-     *
-     * @param parentClasses list of classes to check for
-     * @param strClassName name of class to be checked
-     * @param contextClassLoader the classloader to use
-     * @return true if the class is a non-abstract, non-interface instance of at least one of the parent classes
-     */
-    private static boolean isChildOf(Class<?> [] parentClasses, String strClassName,
-            ClassLoader contextClassLoader){
-            // might throw an exception, assume this is ignorable
-            try {
-                Class<?> c = Class.forName(strClassName, false, contextClassLoader);
-
-                if (!c.isInterface() && !Modifier.isAbstract(c.getModifiers())) {
-                    for (Class<?> parentClass : parentClasses) {
-                        if (parentClass.isAssignableFrom(c)) {
-                            return true;
-                        }
-                    }
-                }
-            } catch (UnsupportedClassVersionError | ClassNotFoundException
-                    | NoClassDefFoundError | VerifyError e) {
-                log.debug(e.getLocalizedMessage(), e);
-            }
-        return false;
-    }
-
-    private static boolean hasAnnotationOnMethod(Class<? extends Annotation>[] annotations, String classInQuestion,
-        ClassLoader contextClassLoader ){
-        try{
-            Class<?> c = Class.forName(classInQuestion, false, contextClassLoader);
-            for(Method method : c.getMethods()) {
-                for(Class<? extends Annotation> annotation : annotations) {
-                    if(method.isAnnotationPresent(annotation)) {
-                        return true;
-                    }
-                }
-            }
-        } catch (NoClassDefFoundError | ClassNotFoundException | UnsupportedClassVersionError | VerifyError ignored) {
-            log.debug(ignored.getLocalizedMessage(), ignored);
-        }
-        return false;
-    }
-
-
-    /*
      * Converts a class file from the text stored in a Jar file to a version
      * that can be used in Class.forName().
      *
@@ -432,11 +449,11 @@ public final class ClassFinder {
      * @return String the Java-style dotted version of the name
      */
     private static String fixClassName(String strClassName) {
-        strClassName = strClassName.replace('\\', '.'); // $NON-NLS-1$ // $NON-NLS-2$
-        strClassName = strClassName.replace('/', '.'); // $NON-NLS-1$ // $NON-NLS-2$
+        String fixedClassName = strClassName.replace('\\', '.'); // $NON-NLS-1$ // $NON-NLS-2$
+        fixedClassName = fixedClassName.replace('/', '.'); // $NON-NLS-1$ // $NON-NLS-2$
         // remove ".class"
-        strClassName = strClassName.substring(0, strClassName.length() - DOT_CLASS_LEN);
-        return strClassName;
+        fixedClassName = fixedClassName.substring(0, fixedClassName.length() - DOT_CLASS_LEN);
+        return fixedClassName;
     }