Author: markt Date: Thu Oct 5 19:35:23 2017 New Revision: 1811241 URL: http://svn.apache.org/viewvc?rev=1811241&view=rev Log: Start to improved Java 9 JAR scanning Make StandardJarScanner easier to extend
Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java?rev=1811241&r1=1811240&r2=1811241&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java Thu Oct 5 19:35:23 2017 @@ -20,11 +20,14 @@ package org.apache.tomcat.util.scan; import java.io.File; import java.io.IOException; import java.net.JarURLConnection; +import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; -import java.util.Iterator; +import java.util.List; import java.util.Set; import java.util.StringTokenizer; @@ -36,6 +39,7 @@ import org.apache.tomcat.JarScanner; import org.apache.tomcat.JarScannerCallback; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.buf.UriUtil; +import org.apache.tomcat.util.compat.JreCompat; import org.apache.tomcat.util.file.Matcher; import org.apache.tomcat.util.res.StringManager; @@ -155,9 +159,7 @@ public class StandardJarScanner implemen // Scan WEB-INF/lib Set<String> dirList = context.getResourcePaths(Constants.WEB_INF_LIB); if (dirList != null) { - Iterator<String> it = dirList.iterator(); - while (it.hasNext()) { - String path = it.next(); + for (String path : dirList) { if (path.endsWith(Constants.JAR_EXT) && !Matcher.matchName(ignoredJars, path.substring(path.lastIndexOf('/')+1))) { @@ -189,58 +191,109 @@ public class StandardJarScanner implemen // Scan the classpath if (scanClassPath && classloader != null) { - if (log.isTraceEnabled()) { - log.trace(sm.getString("jarScan.classloaderStart")); - } - ClassLoader loader = classloader; + } + } - ClassLoader stopLoader = null; - if (!scanBootstrapClassPath) { - // Stop when we reach the bootstrap class loader - stopLoader = ClassLoader.getSystemClassLoader().getParent(); - } - while (loader != null && loader != stopLoader) { - if (loader instanceof URLClassLoader) { - URL[] urls = ((URLClassLoader) loader).getURLs(); - for (int i=0; i<urls.length; i++) { - // Extract the jarName if there is one to be found - String jarName = getJarName(urls[i]); - - // Skip JARs known not to be interesting and JARs - // in WEB-INF/lib we have already scanned - if (jarName != null && - !(Matcher.matchName(ignoredJars, jarName) || - urls[i].toString().contains( - Constants.WEB_INF_LIB + jarName))) { - if (log.isDebugEnabled()) { - log.debug(sm.getString("jarScan.classloaderJarScan", urls[i])); - } - try { - process(callback, urls[i]); - } catch (IOException ioe) { - log.warn(sm.getString( - "jarScan.classloaderFail",urls[i]), ioe); - } - } else { - if (log.isTraceEnabled()) { - log.trace(sm.getString("jarScan.classloaderJarNoScan", urls[i])); - } + protected void doScanClassPath(ClassLoader classloader, JarScannerCallback callback, + Set<String> ignoredJars) { + + if (log.isTraceEnabled()) { + log.trace(sm.getString("jarScan.classloaderStart")); + } + + ClassLoader loader = classloader; + + ClassLoader stopLoader = null; + if (!scanBootstrapClassPath) { + // Stop when we reach the bootstrap class loader + stopLoader = ClassLoader.getSystemClassLoader().getParent(); + } + + Set<URL> processedURLs = new HashSet<URL>(); + + while (loader != null && loader != stopLoader) { + if (loader instanceof URLClassLoader) { + URL[] urls = ((URLClassLoader) loader).getURLs(); + for (int i=0; i<urls.length; i++) { + // Extract the jarName if there is one to be found + String jarName = getJarName(urls[i]); + + // Skip JARs known not to be interesting and JARs + // in WEB-INF/lib we have already scanned + if (jarName != null && + !(Matcher.matchName(ignoredJars, jarName) || + urls[i].toString().contains( + Constants.WEB_INF_LIB + jarName))) { + if (log.isDebugEnabled()) { + log.debug(sm.getString("jarScan.classloaderJarScan", urls[i])); + } + try { + process(callback, urls[i]); + processedURLs.add(urls[i]); + } catch (IOException ioe) { + log.warn(sm.getString("jarScan.classloaderFail",urls[i]), ioe); + } + } else { + if (log.isTraceEnabled()) { + log.trace(sm.getString("jarScan.classloaderJarNoScan", urls[i])); } } } - loader = loader.getParent(); } + loader = loader.getParent(); + } + if (JreCompat.isJre9Available()) { + // The application and platform class loaders are not + // instances of URLClassLoader. Use the class path in this + // case. + List<URL> urls = getClassPath(); + for (URL url : urls) { + if (!processedURLs.contains(url)) { + try { + process(callback, url); + processedURLs.add(url); + } catch (IOException ioe) { + log.warn(sm.getString("jarScan.classloaderFail",url), ioe); + } + } + } + + // TODO Java 9 module path + } + + } + + + protected List<URL> getClassPath() { + String classPath = System.getProperty("java.class.path"); + + if (classPath == null || classPath.length() == 0) { + return Collections.emptyList(); + } + + String[] classPathEntries = classPath.split(File.pathSeparator); + List<URL> urls = new ArrayList<URL>(classPathEntries.length); + for (String classPathEntry : classPathEntries) { + File f = new File(classPath); + try { + urls.add(f.toURI().toURL()); + } catch (MalformedURLException e) { + log.warn(sm.getString("jarScan.classPath.badEntry", classPathEntry), e); + } } + + return urls; } + /* * Scan a URL for JARs with the optional extensions to look at all files * and all directories. */ - private void process(JarScannerCallback callback, URL url) + protected void process(JarScannerCallback callback, URL url) throws IOException { if (log.isTraceEnabled()) { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org