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]