Author: markt Date: Wed May 4 12:47:43 2016 New Revision: 1742266 URL: http://svn.apache.org/viewvc?rev=1742266&view=rev Log: Refactor JarScanning - Move Jar interface - Pass Jar rather than URL - Reduce code duplication - Clean-up
Added: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/Jar.java - copied, changed from r1742248, tomcat/trunk/java/org/apache/tomcat/Jar.java tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java - copied, changed from r1742246, tomcat/trunk/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java Removed: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/Jar.java Modified: tomcat/tc8.5.x/trunk/ (props changed) tomcat/tc8.5.x/trunk/java/org/apache/catalina/startup/ContextConfig.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/JspCompilationContext.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/Compiler.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspDocumentParser.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspReader.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspUtil.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/Parser.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/ParserController.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TagFileProcessor.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TldCache.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/servlet/TldScanner.java tomcat/tc8.5.x/trunk/java/org/apache/jasper/xmlparser/XMLEncodingDetector.java tomcat/tc8.5.x/trunk/java/org/apache/tomcat/JarScannerCallback.java tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/descriptor/tld/TldResourcePath.java tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFactory.java tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFileUrlJar.java tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFileUrlNestedJar.java tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/UrlJar.java tomcat/tc8.5.x/trunk/test/org/apache/jasper/servlet/TestTldScanner.java tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/bcel/TesterPerformance.java tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/scan/TestStandardJarScanner.java Propchange: tomcat/tc8.5.x/trunk/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Wed May 4 12:47:43 2016 @@ -1 +1 @@ -/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489,1736646,1736703,1736836,1736849,1737104-1737105,1737112,1737117,1737119-1737120,1737155,1737157,1737192,1737280,1737339,1737632,1737664,1737715,1737748,1737785,1737834,1737860,1737959,1738005,1738007,1738014-1738015,1738018,1738022,1738039,1738043,1738059-1738060,1738147,1738149,1738174-1738175,1738261,1738589,1738623-1738625,1738643,1738816,1738850,1738855,1738946-1738948,1738953-1738954,1738979,1738982,1739079-1739081,1739087,1739113,1739153,1739172,1739176,1739191,1739474,1739726,1739762,1739775,1739814,1739817-1739818,1739975,1740131,1740324,1740465,1740495,1740508-1740509,1740520,1740535,1740707,1740803,1740810,1740969,1740980,1740991,1740997,1741015,1741033,1741036,1741058,1741060,1741080,1741147,1741159,1741164,1741173,1741181,1741190,1741197,1741202,1741208,1741213,1741221,1741225,1741232,1741409,1741501,1741677 ,1741892,1741896,1741984,1742023,1742042,1742071,1742090,1742093,1742101,1742105,1742111,1742139,1742146,1742148,1742166 +/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489,1736646,1736703,1736836,1736849,1737104-1737105,1737112,1737117,1737119-1737120,1737155,1737157,1737192,1737280,1737339,1737632,1737664,1737715,1737748,1737785,1737834,1737860,1737959,1738005,1738007,1738014-1738015,1738018,1738022,1738039,1738043,1738059-1738060,1738147,1738149,1738174-1738175,1738261,1738589,1738623-1738625,1738643,1738816,1738850,1738855,1738946-1738948,1738953-1738954,1738979,1738982,1739079-1739081,1739087,1739113,1739153,1739172,1739176,1739191,1739474,1739726,1739762,1739775,1739814,1739817-1739818,1739975,1740131,1740324,1740465,1740495,1740508-1740509,1740520,1740535,1740707,1740803,1740810,1740969,1740980,1740991,1740997,1741015,1741033,1741036,1741058,1741060,1741080,1741147,1741159,1741164,1741173,1741181,1741190,1741197,1741202,1741208,1741213,1741221,1741225,1741232,1741409,1741501,1741677 ,1741892,1741896,1741984,1742023,1742042,1742071,1742090,1742093,1742101,1742105,1742111,1742139,1742146,1742148,1742166,1742181,1742184,1742187,1742246,1742248-1742250,1742263-1742264 Modified: tomcat/tc8.5.x/trunk/java/org/apache/catalina/startup/ContextConfig.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/catalina/startup/ContextConfig.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/catalina/startup/ContextConfig.java Wed May 4 12:47:43 2016 @@ -67,6 +67,7 @@ import org.apache.catalina.util.ContextN import org.apache.catalina.util.Introspection; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.Jar; import org.apache.tomcat.JarScanType; import org.apache.tomcat.JarScanner; import org.apache.tomcat.util.ExceptionUtils; @@ -103,7 +104,6 @@ import org.apache.tomcat.util.descriptor import org.apache.tomcat.util.digester.Digester; import org.apache.tomcat.util.digester.RuleSet; import org.apache.tomcat.util.res.StringManager; -import org.apache.tomcat.util.scan.Jar; import org.apache.tomcat.util.scan.JarFactory; import org.xml.sax.InputSource; import org.xml.sax.SAXParseException; Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/JspCompilationContext.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/JspCompilationContext.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/JspCompilationContext.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/JspCompilationContext.java Wed May 4 12:47:43 2016 @@ -39,8 +39,8 @@ import org.apache.jasper.servlet.JasperL import org.apache.jasper.servlet.JspServletWrapper; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.Jar; import org.apache.tomcat.util.descriptor.tld.TldResourcePath; -import org.apache.tomcat.util.scan.Jar; /** * A place holder for various things that are used through out the JSP Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/Compiler.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/Compiler.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/Compiler.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/Compiler.java Wed May 4 12:47:43 2016 @@ -36,7 +36,7 @@ import org.apache.jasper.Options; import org.apache.jasper.servlet.JspServletWrapper; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; -import org.apache.tomcat.util.scan.Jar; +import org.apache.tomcat.Jar; import org.apache.tomcat.util.scan.JarFactory; /** Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JavacErrorDetail.java Wed May 4 12:47:43 2016 @@ -26,7 +26,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.jasper.JspCompilationContext; -import org.apache.tomcat.util.scan.Jar; +import org.apache.tomcat.Jar; /** * Class providing details about a javac compilation error. Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspDocumentParser.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspDocumentParser.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspDocumentParser.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspDocumentParser.java Wed May 4 12:47:43 2016 @@ -32,10 +32,10 @@ import javax.xml.parsers.SAXParserFactor import org.apache.jasper.Constants; import org.apache.jasper.JasperException; import org.apache.jasper.JspCompilationContext; +import org.apache.tomcat.Jar; import org.apache.tomcat.util.descriptor.DigesterFactory; import org.apache.tomcat.util.descriptor.LocalResolver; import org.apache.tomcat.util.descriptor.tld.TldResourcePath; -import org.apache.tomcat.util.scan.Jar; import org.apache.tomcat.util.security.PrivilegedGetTccl; import org.apache.tomcat.util.security.PrivilegedSetTccl; import org.xml.sax.Attributes; Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspReader.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspReader.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspReader.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspReader.java Wed May 4 12:47:43 2016 @@ -26,7 +26,7 @@ import org.apache.jasper.JspCompilationC import org.apache.jasper.util.ExceptionUtils; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; -import org.apache.tomcat.util.scan.Jar; +import org.apache.tomcat.Jar; /** * JspReader is an input buffer for the JSP parser. It should allow Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspUtil.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspUtil.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspUtil.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/JspUtil.java Wed May 4 12:47:43 2016 @@ -26,7 +26,7 @@ import java.util.Vector; import org.apache.jasper.Constants; import org.apache.jasper.JasperException; import org.apache.jasper.JspCompilationContext; -import org.apache.tomcat.util.scan.Jar; +import org.apache.tomcat.Jar; import org.xml.sax.Attributes; import org.xml.sax.InputSource; Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/Parser.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/Parser.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/Parser.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/Parser.java Wed May 4 12:47:43 2016 @@ -29,8 +29,8 @@ import javax.servlet.jsp.tagext.TagLibra import org.apache.jasper.JasperException; import org.apache.jasper.JspCompilationContext; import org.apache.jasper.util.UniqueAttributesImpl; +import org.apache.tomcat.Jar; import org.apache.tomcat.util.descriptor.tld.TldResourcePath; -import org.apache.tomcat.util.scan.Jar; import org.xml.sax.Attributes; import org.xml.sax.helpers.AttributesImpl; Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/ParserController.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/ParserController.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/ParserController.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/ParserController.java Wed May 4 12:47:43 2016 @@ -24,7 +24,7 @@ import java.util.Stack; import org.apache.jasper.JasperException; import org.apache.jasper.JspCompilationContext; import org.apache.jasper.xmlparser.XMLEncodingDetector; -import org.apache.tomcat.util.scan.Jar; +import org.apache.tomcat.Jar; import org.xml.sax.Attributes; /** Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TagFileProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TagFileProcessor.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TagFileProcessor.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TagFileProcessor.java Wed May 4 12:47:43 2016 @@ -36,8 +36,8 @@ import org.apache.jasper.JasperException import org.apache.jasper.JspCompilationContext; import org.apache.jasper.runtime.JspSourceDependent; import org.apache.jasper.servlet.JspServletWrapper; +import org.apache.tomcat.Jar; import org.apache.tomcat.util.descriptor.tld.TldResourcePath; -import org.apache.tomcat.util.scan.Jar; /** * 1. Processes and extracts the directive info in a tag file. 2. Compiles and Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TagLibraryInfoImpl.java Wed May 4 12:47:43 2016 @@ -44,12 +44,12 @@ import javax.servlet.jsp.tagext.Validati import org.apache.jasper.JasperException; import org.apache.jasper.JspCompilationContext; +import org.apache.tomcat.Jar; import org.apache.tomcat.util.descriptor.tld.TagFileXml; import org.apache.tomcat.util.descriptor.tld.TagXml; import org.apache.tomcat.util.descriptor.tld.TaglibXml; import org.apache.tomcat.util.descriptor.tld.TldResourcePath; import org.apache.tomcat.util.descriptor.tld.ValidatorXml; -import org.apache.tomcat.util.scan.Jar; /** * Implementation of the TagLibraryInfo class from the JSP spec. Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TldCache.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TldCache.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TldCache.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/compiler/TldCache.java Wed May 4 12:47:43 2016 @@ -27,10 +27,10 @@ import javax.servlet.ServletContext; import org.apache.jasper.Constants; import org.apache.jasper.JasperException; +import org.apache.tomcat.Jar; import org.apache.tomcat.util.descriptor.tld.TaglibXml; import org.apache.tomcat.util.descriptor.tld.TldParser; import org.apache.tomcat.util.descriptor.tld.TldResourcePath; -import org.apache.tomcat.util.scan.Jar; import org.xml.sax.SAXException; /** Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java Wed May 4 12:47:43 2016 @@ -47,7 +47,7 @@ import org.apache.jasper.util.FastRemova import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.InstanceManager; -import org.apache.tomcat.util.scan.Jar; +import org.apache.tomcat.Jar; /** * The JSP engine (a.k.a Jasper). Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/servlet/TldScanner.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/servlet/TldScanner.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/servlet/TldScanner.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/servlet/TldScanner.java Wed May 4 12:47:43 2016 @@ -40,14 +40,13 @@ import org.apache.jasper.compiler.JarSca import org.apache.jasper.compiler.Localizer; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.Jar; import org.apache.tomcat.JarScanType; import org.apache.tomcat.JarScanner; import org.apache.tomcat.JarScannerCallback; import org.apache.tomcat.util.descriptor.tld.TaglibXml; import org.apache.tomcat.util.descriptor.tld.TldParser; import org.apache.tomcat.util.descriptor.tld.TldResourcePath; -import org.apache.tomcat.util.scan.Jar; -import org.apache.tomcat.util.scan.JarFactory; import org.xml.sax.SAXException; /** @@ -296,27 +295,24 @@ public class TldScanner { @Override - public void scan(URL jarUrl, String webappPath, boolean isWebapp) throws IOException { + public void scan(Jar jar, String webappPath, boolean isWebapp) throws IOException { boolean found = false; - URL jarFileUrl; - try (Jar jar = JarFactory.newInstance(jarUrl)) { - jarFileUrl = jar.getJarFileURL(); - jar.nextEntry(); - for (String entryName = jar.getEntryName(); - entryName != null; - jar.nextEntry(), entryName = jar.getEntryName()) { - if (!(entryName.startsWith("META-INF/") && - entryName.endsWith(TLD_EXT))) { - continue; - } - found = true; - TldResourcePath tldResourcePath = - new TldResourcePath(jarFileUrl, webappPath, entryName); - try { - parseTld(tldResourcePath); - } catch (SAXException e) { - throw new IOException(e); - } + URL jarFileUrl = jar.getJarFileURL(); + jar.nextEntry(); + for (String entryName = jar.getEntryName(); + entryName != null; + jar.nextEntry(), entryName = jar.getEntryName()) { + if (!(entryName.startsWith("META-INF/") && + entryName.endsWith(TLD_EXT))) { + continue; + } + found = true; + TldResourcePath tldResourcePath = + new TldResourcePath(jarFileUrl, webappPath, entryName); + try { + parseTld(tldResourcePath); + } catch (SAXException e) { + throw new IOException(e); } } if (found) { Modified: tomcat/tc8.5.x/trunk/java/org/apache/jasper/xmlparser/XMLEncodingDetector.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/jasper/xmlparser/XMLEncodingDetector.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/jasper/xmlparser/XMLEncodingDetector.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/jasper/xmlparser/XMLEncodingDetector.java Wed May 4 12:47:43 2016 @@ -36,7 +36,7 @@ import org.apache.jasper.JspCompilationC import org.apache.jasper.compiler.ErrorDispatcher; import org.apache.jasper.compiler.JspUtil; import org.apache.jasper.compiler.Localizer; -import org.apache.tomcat.util.scan.Jar; +import org.apache.tomcat.Jar; public class XMLEncodingDetector { Copied: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/Jar.java (from r1742248, tomcat/trunk/java/org/apache/tomcat/Jar.java) URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/Jar.java?p2=tomcat/tc8.5.x/trunk/java/org/apache/tomcat/Jar.java&p1=tomcat/trunk/java/org/apache/tomcat/Jar.java&r1=1742248&r2=1742266&rev=1742266&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/Jar.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/Jar.java Wed May 4 12:47:43 2016 @@ -19,17 +19,18 @@ package org.apache.tomcat; import java.io.IOException; import java.io.InputStream; import java.net.URL; - -import org.apache.tomcat.util.scan.JarFactory; +import java.util.jar.Manifest; /** * Provides an abstraction for use by the various classes that need to scan - * JARs. The classes provided by the JRE for accessing JARs ({@link java.util.jar.JarFile} and - * {@link java.util.jar.JarInputStream}) have significantly different performance - * characteristics depending on the form of the URL used to access the JAR. - * For file based JAR {@link java.net.URL}s, {@link java.util.jar.JarFile} is faster but for non-file - * based {@link java.net.URL}s, {@link java.util.jar.JarFile} creates a copy of the JAR in the - * temporary directory so {@link java.util.jar.JarInputStream} is faster. + * JARs. The classes provided by the JRE for accessing JARs + * ({@link java.util.jar.JarFile} and {@link java.util.jar.JarInputStream}) have + * significantly different performance characteristics depending on the form of + * the URL used to access the JAR. For file based JAR {@link java.net.URL}s, + * {@link java.util.jar.JarFile} is faster but for non-file based + * {@link java.net.URL}s, {@link java.util.jar.JarFile} creates a copy of the + * JAR in the temporary directory so {@link java.util.jar.JarInputStream} is + * faster. */ public interface Jar extends AutoCloseable { @@ -108,7 +109,8 @@ public interface Jar extends AutoCloseab * be used, rather the jar:jar:file:... form (that the JRE does not * understand will be used). Note that this means that any code using these * URLs will need to understand the jar:jar:file:... form and use the - * {@link JarFactory} to ensure resources are accessed correctly. + * {@link org.apache.tomcat.util.scan.JarFactory} to ensure resources are + * accessed correctly. * * @param entry The entry to generate the URL for * @@ -117,6 +119,15 @@ public interface Jar extends AutoCloseab String getURL(String entry); /** + * Obtain the manifest for the JAR file. + * + * @return The manifest for this JAR file. + * + * @throws IOException If an I/O error occurs trying to obtain the manifest + */ + Manifest getManifest() throws IOException; + + /** * Resets the internal pointer used to track JAR entries to the beginning of * the JAR. * Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/JarScannerCallback.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/JarScannerCallback.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/JarScannerCallback.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/JarScannerCallback.java Wed May 4 12:47:43 2016 @@ -18,7 +18,6 @@ package org.apache.tomcat; import java.io.File; import java.io.IOException; -import java.net.URL; /** * This interface is implemented by clients of the {@link JarScanner} to enable @@ -28,9 +27,9 @@ public interface JarScannerCallback { /** * A JAR was found and may be accessed for further processing via the - * provided URL connection. + * provided URL connection. The caller is responsible for closing the JAR. * - * @param jarURL The URL for the identified JAR + * @param jar The JAR to process * @param webappPath The path, if any, to the JAR within the web application * @param isWebapp Indicates if the JAR was found within a web * application. If <code>false</code> the JAR should @@ -38,7 +37,7 @@ public interface JarScannerCallback { * * @throws IOException if an I/O error occurs while scanning the JAR */ - public void scan(URL jarURL, String webappPath, boolean isWebapp) + public void scan(Jar jar, String webappPath, boolean isWebapp) throws IOException; /** Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/descriptor/tld/TldResourcePath.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/descriptor/tld/TldResourcePath.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/descriptor/tld/TldResourcePath.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/descriptor/tld/TldResourcePath.java Wed May 4 12:47:43 2016 @@ -21,7 +21,7 @@ import java.io.InputStream; import java.net.URL; import java.util.Objects; -import org.apache.tomcat.util.scan.Jar; +import org.apache.tomcat.Jar; import org.apache.tomcat.util.scan.JarFactory; /** Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java Wed May 4 12:47:43 2016 @@ -24,9 +24,8 @@ import java.net.URL; import java.util.HashMap; import java.util.Map; +import org.apache.tomcat.Jar; import org.apache.tomcat.JarScannerCallback; -import org.apache.tomcat.util.scan.Jar; -import org.apache.tomcat.util.scan.JarFactory; import org.xml.sax.InputSource; /** @@ -51,9 +50,8 @@ public class FragmentJarScannerCallback @Override - public void scan(URL jarUrl, String webappPath, boolean isWebapp) throws IOException { + public void scan(Jar jar, String webappPath, boolean isWebapp) throws IOException { - Jar jar = null; InputStream is = null; WebXml fragment = new WebXml(); fragment.setWebappJar(isWebapp); @@ -65,7 +63,6 @@ public class FragmentJarScannerCallback // web-fragment.xml files don't need to be parsed if they are never // going to be used. if (isWebapp && parseRequired) { - jar = JarFactory.newInstance(jarUrl); is = jar.getInputStream(FRAGMENT_LOCATION); } @@ -74,7 +71,6 @@ public class FragmentJarScannerCallback // distributable fragment.setDistributable(true); } else { - @SuppressWarnings("null") // Cannot be null here String fragmentUrl = jar.getURL(FRAGMENT_LOCATION); InputSource source = new InputSource(fragmentUrl); source.setByteStream(is); @@ -83,14 +79,11 @@ public class FragmentJarScannerCallback } } } finally { - if (jar != null) { - jar.close(); - } - fragment.setURL(jarUrl); + fragment.setURL(jar.getJarFileURL()); if (fragment.getName() == null) { fragment.setName(fragment.getURL().toString()); } - fragment.setJarName(extractJarFileName(jarUrl)); + fragment.setJarName(extractJarFileName(jar.getJarFileURL())); fragments.put(fragment.getName(), fragment); } } @@ -107,6 +100,7 @@ public class FragmentJarScannerCallback return url.substring(url.lastIndexOf('/') + 1); } + @Override public void scan(File file, String webappPath, boolean isWebapp) throws IOException { Copied: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java (from r1742246, tomcat/trunk/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java) URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java?p2=tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java&p1=tomcat/trunk/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java&r1=1742246&r2=1742266&rev=1742266&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/AbstractInputStreamJar.java Wed May 4 12:47:43 2016 @@ -20,6 +20,9 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.jar.JarEntry; +import java.util.jar.Manifest; + +import org.apache.tomcat.Jar; /** * Base implementation of Jar for implementations that use a JarInputStream to @@ -117,6 +120,13 @@ public abstract class AbstractInputStrea } + @Override + public Manifest getManifest() throws IOException { + reset(); + return jarInputStream.getManifest(); + } + + @Override public void reset() throws IOException { closeStream(); Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFactory.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFactory.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFactory.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFactory.java Wed May 4 12:47:43 2016 @@ -20,6 +20,8 @@ import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; +import org.apache.tomcat.Jar; + /** * Provide a mechanism to obtain objects that implement {@link Jar}. */ Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFileUrlJar.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFileUrlJar.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFileUrlJar.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFileUrlJar.java Wed May 4 12:47:43 2016 @@ -25,8 +25,11 @@ import java.net.URL; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.jar.Manifest; import java.util.zip.ZipEntry; +import org.apache.tomcat.Jar; + /** * Implementation of {@link Jar} that is optimised for file based JAR URLs that * refer directly to a JAR file (e.g URLs of the form jar:file: ... .jar!/ or @@ -144,6 +147,12 @@ public class JarFileUrlJar implements Ja } @Override + public Manifest getManifest() throws IOException { + return jarFile.getManifest(); + } + + + @Override public void reset() throws IOException { entries = null; entry = null; Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFileUrlNestedJar.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFileUrlNestedJar.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFileUrlNestedJar.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/JarFileUrlNestedJar.java Wed May 4 12:47:43 2016 @@ -17,28 +17,23 @@ package org.apache.tomcat.util.scan; import java.io.IOException; -import java.io.InputStream; import java.net.JarURLConnection; import java.net.URL; import java.util.jar.JarEntry; import java.util.jar.JarFile; - /** - * Implementation of {@link Jar} that is optimised for file based JAR URLs that - * refer to a JAR file nested inside a WAR + * Implementation of {@link org.apache.tomcat.Jar} that is optimised for file + * based JAR URLs that refer to a JAR file nested inside a WAR * (e.g URLs of the form jar:file: ... .war!/ ... .jar). */ -public class JarFileUrlNestedJar implements Jar { +public class JarFileUrlNestedJar extends AbstractInputStreamJar { - private final URL jarFileURL; private final JarFile warFile; private final JarEntry jarEntry; - private NonClosingJarInputStream jarInputStream = null; - private JarEntry entry = null; public JarFileUrlNestedJar(URL url) throws IOException { - jarFileURL = url; + super(url); JarURLConnection jarConn = (JarURLConnection) url.openConnection(); jarConn.setUseCaches(false); warFile = jarConn.getJarFile(); @@ -51,77 +46,8 @@ public class JarFileUrlNestedJar impleme @Override - public URL getJarFileURL() { - return jarFileURL; - } - - - - @Override - public boolean entryExists(String name) throws IOException { - reset(); - JarEntry entry = jarInputStream.getNextJarEntry(); - while (entry != null) { - if (name.equals(entry.getName())) { - break; - } - entry = jarInputStream.getNextJarEntry(); - } - - return entry != null; - } - - - @Override - public InputStream getInputStream(String name) throws IOException { - reset(); - JarEntry entry = jarInputStream.getNextJarEntry(); - while (entry != null) { - if (name.equals(entry.getName())) { - break; - } - entry = jarInputStream.getNextJarEntry(); - } - - if (entry == null) { - return null; - } else { - return jarInputStream; - } - } - - - @Override - public long getLastModified(String name) throws IOException { - reset(); - JarEntry entry = jarInputStream.getNextJarEntry(); - while (entry != null) { - if (name.equals(entry.getName())) { - break; - } - entry = jarInputStream.getNextJarEntry(); - } - - if (entry == null) { - return -1; - } else { - return entry.getTime(); - } - } - - @Override - public String getURL(String entry) { - StringBuilder result = new StringBuilder("jar:"); - result.append(getJarFileURL().toExternalForm()); - result.append("!/"); - result.append(entry); - - return result.toString(); - } - - @Override public void close() { - closeInner(); + closeStream(); if (warFile != null) { try { warFile.close(); @@ -132,61 +58,8 @@ public class JarFileUrlNestedJar impleme } - private void closeInner() { - if (jarInputStream != null) { - try { - jarInputStream.reallyClose(); - } catch (IOException ioe) { - // Ignore - } - } - } - - private NonClosingJarInputStream createJarInputStream() throws IOException { - return new NonClosingJarInputStream(warFile.getInputStream(jarEntry)); - } - - @Override - public void nextEntry() { - if (jarInputStream == null) { - try { - jarInputStream = createJarInputStream(); - } catch (IOException e) { - entry = null; - return; - } - } - try { - entry = jarInputStream.getNextJarEntry(); - } catch (IOException ioe) { - entry = null; - } - } - - - @Override - public String getEntryName() { - if (entry == null) { - return null; - } else { - return entry.getName(); - } - } - - - @Override - public InputStream getEntryInputStream() throws IOException { - if (jarInputStream == null) { - jarInputStream = createJarInputStream(); - } - return jarInputStream; - } - - - @Override - public void reset() throws IOException { - closeInner(); - jarInputStream = createJarInputStream(); + protected NonClosingJarInputStream createJarInputStream() throws IOException { + return new NonClosingJarInputStream(warFile.getInputStream(jarEntry)); } } Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java Wed May 4 12:47:43 2016 @@ -30,6 +30,7 @@ import javax.servlet.ServletContext; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.Jar; import org.apache.tomcat.JarScanFilter; import org.apache.tomcat.JarScanType; import org.apache.tomcat.JarScanner; @@ -305,17 +306,20 @@ public class StandardJarScanner implemen log.trace(sm.getString("jarScan.jarUrlStart", url)); } - String urlStr = url.toString(); - if (urlStr.startsWith("jar:") || urlStr.endsWith(Constants.JAR_EXT)) { - callback.scan(url, webappPath, isWebapp); - } else if (urlStr.startsWith("file:")) { + if ("jar".equals(url.getProtocol()) || url.getPath().endsWith(Constants.JAR_EXT)) { + try (Jar jar = JarFactory.newInstance(url)) { + callback.scan(jar, webappPath, isWebapp); + } + } else if ("file".equals(url.getProtocol())) { File f; try { f = new File(url.toURI()); if (f.isFile() && isScanAllFiles()) { // Treat this file as a JAR URL jarURL = UriUtil.buildJarUrl(f); - callback.scan(jarURL, webappPath, isWebapp); + try (Jar jar = JarFactory.newInstance(jarURL)) { + callback.scan(jar, webappPath, isWebapp); + } } else if (f.isDirectory()) { if (scanType == JarScanType.PLUGGABILITY) { callback.scan(f, webappPath, isWebapp); Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/UrlJar.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/UrlJar.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/UrlJar.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/scan/UrlJar.java Wed May 4 12:47:43 2016 @@ -17,134 +17,33 @@ package org.apache.tomcat.util.scan; import java.io.IOException; -import java.io.InputStream; import java.net.JarURLConnection; import java.net.URL; import java.net.URLConnection; -import java.util.jar.JarEntry; /** - * Implementation of {@link Jar} that is optimised for non-file based JAR URLs - * (e.g. JNDI based URLs of the form jar:jndi:...). + * Implementation of {@link org.apache.tomcat.Jar} that is optimised for + * non-file based JAR URLs (e.g. JNDI based URLs of the form jar:jndi:...). */ -public class UrlJar implements Jar { +public class UrlJar extends AbstractInputStreamJar { - private NonClosingJarInputStream jarInputStream = null; - private final URL url; - private JarEntry entry = null; - - public UrlJar(URL url) throws IOException { - this.url = url; - this.jarInputStream = createJarInputStream(); + public UrlJar(URL jarFileURL) { + super(jarFileURL); } - @Override - public URL getJarFileURL() { - return url; - } - - @Override - public boolean entryExists(String name) throws IOException { - JarEntry entry = jarInputStream.getNextJarEntry(); - while (entry != null) { - if (name.equals(entry.getName())) { - break; - } - entry = jarInputStream.getNextJarEntry(); - } - - return entry != null; - } - - @Override - public InputStream getInputStream(String name) throws IOException { - JarEntry entry = jarInputStream.getNextJarEntry(); - while (entry != null) { - if (name.equals(entry.getName())) { - break; - } - entry = jarInputStream.getNextJarEntry(); - } - - if (entry == null) { - return null; - } else { - return jarInputStream; - } - } @Override - public long getLastModified(String name) throws IOException { - JarEntry entry = jarInputStream.getNextJarEntry(); - while (entry != null) { - if (name.equals(entry.getName())) { - break; - } - entry = jarInputStream.getNextJarEntry(); - } - - if (entry == null) { - return -1; - } else { - return entry.getTime(); - } + public void close() { + closeStream(); } - @Override - public String getURL(String entry) { - StringBuilder result = new StringBuilder("jar:"); - result.append(getJarFileURL().toExternalForm()); - result.append("!/"); - result.append(entry); - - return result.toString(); - } @Override - public void close() { - if (jarInputStream != null) { - try { - jarInputStream.reallyClose(); - } catch (IOException ioe) { - // Ignore - } - } - } - - private NonClosingJarInputStream createJarInputStream() throws IOException { - JarURLConnection jarConn = (JarURLConnection) url.openConnection(); + protected NonClosingJarInputStream createJarInputStream() throws IOException { + JarURLConnection jarConn = (JarURLConnection) getJarFileURL().openConnection(); URL resourceURL = jarConn.getJarFileURL(); URLConnection resourceConn = resourceURL.openConnection(); resourceConn.setUseCaches(false); return new NonClosingJarInputStream(resourceConn.getInputStream()); } - - @Override - public void nextEntry() { - try { - entry = jarInputStream.getNextJarEntry(); - } catch (IOException ioe) { - entry = null; - } - } - - @Override - public String getEntryName() { - if (entry == null) { - return null; - } else { - return entry.getName(); - } - } - - @Override - public InputStream getEntryInputStream() throws IOException { - return jarInputStream; - } - - @Override - public void reset() throws IOException { - close(); - jarInputStream = createJarInputStream(); - } } Modified: tomcat/tc8.5.x/trunk/test/org/apache/jasper/servlet/TestTldScanner.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/test/org/apache/jasper/servlet/TestTldScanner.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/test/org/apache/jasper/servlet/TestTldScanner.java (original) +++ tomcat/tc8.5.x/trunk/test/org/apache/jasper/servlet/TestTldScanner.java Wed May 4 12:47:43 2016 @@ -29,7 +29,9 @@ import org.junit.Test; import org.apache.catalina.Context; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.TomcatBaseTest; +import org.apache.tomcat.Jar; import org.apache.tomcat.util.buf.ByteChunk; +import org.apache.tomcat.util.scan.JarFactory; import org.apache.tomcat.util.scan.StandardJarScanner; import org.easymock.EasyMock; @@ -109,7 +111,9 @@ public class TestTldScanner extends Tomc throws Exception { String fullPath = new File(webapp, path).toURI().toString(); URL jarUrl = new URL("jar:" + fullPath + "!/"); - callback.scan(jarUrl, path, true); + try (Jar jar = JarFactory.newInstance(jarUrl)) { + callback.scan(jar, path, true); + } } } Modified: tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/bcel/TesterPerformance.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/bcel/TesterPerformance.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/bcel/TesterPerformance.java (original) +++ tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/bcel/TesterPerformance.java Wed May 4 12:47:43 2016 @@ -27,8 +27,8 @@ import java.util.Set; import org.junit.Assert; import org.junit.Test; +import org.apache.tomcat.Jar; import org.apache.tomcat.util.bcel.classfile.ClassParser; -import org.apache.tomcat.util.scan.Jar; import org.apache.tomcat.util.scan.JarFactory; public class TesterPerformance { Modified: tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/scan/TestStandardJarScanner.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/scan/TestStandardJarScanner.java?rev=1742266&r1=1742265&r2=1742266&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/scan/TestStandardJarScanner.java (original) +++ tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/scan/TestStandardJarScanner.java Wed May 4 12:47:43 2016 @@ -27,6 +27,7 @@ import java.util.List; import org.junit.Assert; import org.junit.Test; +import org.apache.tomcat.Jar; import org.apache.tomcat.JarScanType; import org.apache.tomcat.JarScannerCallback; import org.apache.tomcat.unittest.TesterServletContext; @@ -98,9 +99,9 @@ public class TestStandardJarScanner { List<String> callbacks = new ArrayList<>(); @Override - public void scan(URL jarUrl, String webappPath, + public void scan(Jar jar, String webappPath, boolean isWebapp) throws IOException { - callbacks.add(jarUrl.toString() + "::" + webappPath + "::" + isWebapp); + callbacks.add(jar.getJarFileURL().toString() + "::" + webappPath + "::" + isWebapp); } @Override --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org