Author: markt
Date: Mon Sep 16 13:08:40 2013
New Revision: 1523623

URL: http://svn.apache.org/r1523623
Log:
Add support for JARs nested in WARs to the Jar abstraction used by the
JAR scanner.

Added:
    tomcat/trunk/java/org/apache/tomcat/util/scan/FileUrlNestedJar.java
Modified:
    tomcat/trunk/java/org/apache/tomcat/util/scan/FileUrlJar.java
    tomcat/trunk/java/org/apache/tomcat/util/scan/JarFactory.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/scan/FileUrlJar.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/scan/FileUrlJar.java?rev=1523623&r1=1523622&r2=1523623&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/scan/FileUrlJar.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/scan/FileUrlJar.java Mon Sep 16 
13:08:40 2013
@@ -26,8 +26,8 @@ import java.util.jar.JarFile;
 import java.util.zip.ZipEntry;
 
 /**
- * Implementation of {@link Jar} that is optimised for file based JAR URLs (e.g
- * URLs of the form jar:file:...).
+ * 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!/) .
  */
 public class FileUrlJar implements Jar {
 

Added: tomcat/trunk/java/org/apache/tomcat/util/scan/FileUrlNestedJar.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/scan/FileUrlNestedJar.java?rev=1523623&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/scan/FileUrlNestedJar.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/util/scan/FileUrlNestedJar.java Mon Sep 
16 13:08:40 2013
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+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
+ * (e.g URLs of the form jar:file: ... .war!/ ... .jar).
+ */
+public class FileUrlNestedJar implements Jar {
+
+    private final JarFile warFile;
+    private final JarEntry jarEntry;
+    private NonClosingJarInputStream jarInputStream = null;
+    private JarEntry entry = null;
+
+    public FileUrlNestedJar(URL url) throws IOException {
+        JarURLConnection jarConn = (JarURLConnection) url.openConnection();
+        jarConn.setUseCaches(false);
+        warFile = jarConn.getJarFile();
+
+        String urlAsString = url.toString();
+        int pathStart = urlAsString.indexOf("!/") + 2;
+        String jarPath = urlAsString.substring(pathStart);
+        jarEntry = warFile.getJarEntry(jarPath);
+
+        jarInputStream = createJarInputStream();
+    }
+
+
+    @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 void close() {
+        closeInner();
+        if (warFile != null) {
+            try {
+                warFile.close();
+            } catch (IOException e) {
+                // Ignore
+            }
+        }
+    }
+
+
+    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() {
+        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 {
+        closeInner();
+        jarInputStream = createJarInputStream();
+    }
+}

Modified: tomcat/trunk/java/org/apache/tomcat/util/scan/JarFactory.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/scan/JarFactory.java?rev=1523623&r1=1523622&r2=1523623&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/scan/JarFactory.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/scan/JarFactory.java Mon Sep 16 
13:08:40 2013
@@ -31,7 +31,11 @@ public class JarFactory {
     public static Jar newInstance(URL url) throws IOException {
         String jarUrl = url.toString();
         if (jarUrl.startsWith("jar:file:")) {
-            return new FileUrlJar(url);
+            if (jarUrl.endsWith("!/")) {
+                return new FileUrlJar(url);
+            } else {
+                return new FileUrlNestedJar(url);
+            }
         } else {
             return new UrlJar(url);
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to