/******************************************************************************* | |
* Copyright (c) 2015 SAP SE | |
* | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v1.0 | |
* and Apache License v2.0 which accompanies this distribution. | |
* The Eclipse Public License is available at | |
* http://www.eclipse.org/legal/epl-v10.html | |
* and the Apache License v2.0 is available at | |
* http://www.opensource.org/licenses/apache2.0.php. | |
* You may elect to redistribute this code under either of these licenses. | |
* | |
* Contributors: | |
* Violeta Georgieva - initial contribution | |
*******************************************************************************/ | |
package org.eclipse.gemini.web.tomcat.internal.bundleresources; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.net.URL; | |
import java.net.URLConnection; | |
import java.util.jar.JarEntry; | |
import java.util.jar.JarFile; | |
import java.util.jar.JarInputStream; | |
import java.util.jar.Manifest; | |
import org.apache.catalina.WebResourceRoot; | |
import org.apache.catalina.webresources.JarResource; | |
final class BundleJarResource extends JarResource { | |
BundleJarResource(WebResourceRoot root, String webAppPath, String base, String baseUrl, JarEntry jarEntry, String internalPath, Manifest manifest) { | |
super(root, webAppPath, base, baseUrl, jarEntry, internalPath, manifest); | |
} | |
@Override | |
protected JarInputStreamWrapper getJarInputStreamWrapper() { | |
URLConnection conn = null; | |
try { | |
conn = new URL(getBase()).openConnection(); | |
} catch (IOException e) { | |
return null; | |
} | |
JarInputStream jarIs = null; | |
JarEntry entry = null; | |
try { | |
// Need to create a new JarEntry so the certificates can be read | |
jarIs = new JarInputStream(conn.getInputStream()); | |
entry = jarIs.getNextJarEntry(); | |
while (entry != null && !entry.getName().equals(getResource().getName())) { | |
entry = jarIs.getNextJarEntry(); | |
} | |
if (entry != null) { | |
return new ExtendedJarInputStreamWrapper(null, entry, jarIs); | |
} else { | |
return null; | |
} | |
} catch (IOException e) { | |
if (getLog().isDebugEnabled()) { | |
getLog().debug( | |
"Unable to obtain an InputStream for the resource [" + getResource().getName() + "] located in the JAR [" + getBaseUrl() + "]", e); | |
} | |
return null; | |
} finally { | |
if (entry == null) { | |
try { | |
jarIs.close(); | |
} catch (IOException ioe) { | |
// Ignore | |
} | |
} | |
} | |
} | |
private class ExtendedJarInputStreamWrapper extends JarInputStreamWrapper { | |
private final InputStream is; | |
public ExtendedJarInputStreamWrapper(JarFile jarFile, JarEntry jarEntry, InputStream is) { | |
super(jarFile, jarEntry, is); | |
this.is = is; | |
} | |
@Override | |
public void close() throws IOException { | |
// Closing the JarInputStream releases the file lock on the JAR and also | |
// closes input stream created from the URLConnection. | |
this.is.close(); | |
} | |
} | |
} |