151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.net; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.jar.JarFile; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.jar.JarEntry; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.jar.Attributes; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.jar.Manifest; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.Permission; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.net.www.ParseUtil; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A URL Connection to a Java ARchive (JAR) file or an entry in a JAR 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * file. 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The syntax of a JAR URL is: 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * jar:<url>!/{entry} 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre> 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>for example: 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p><code> 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class<br> 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </code> 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>Jar URLs should be used to refer to a JAR file or entries in 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a JAR file. The example above is a JAR URL which refers to a JAR 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * entry. If the entry name is omitted, the URL refers to the whole 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * JAR file: 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code> 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * jar:http://www.foo.com/bar/baz.jar!/ 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </code> 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>Users should cast the generic URLConnection to a 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * JarURLConnection when they know that the URL they created is a JAR 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * URL, and they need JAR-specific functionality. For example: 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * URL url = new URL("jar:file:/home/duke/duke.jar!/"); 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * JarURLConnection jarConnection = (JarURLConnection)url.openConnection(); 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Manifest manifest = jarConnection.getManifest(); 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre> 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>JarURLConnection instances can only be used to read from JAR files. 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * It is not possible to get a {@link java.io.OutputStream} to modify or write 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to the underlying JAR file using this class. 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>Examples: 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dl> 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dt>A Jar entry 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dd><code>jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class</code> 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dt>A Jar file 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dd><code>jar:http://www.foo.com/bar/baz.jar!/</code> 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dt>A Jar directory 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dd><code>jar:http://www.foo.com/bar/baz.jar!/COM/foo/</code> 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </dl> 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p><code>!/</code> is refered to as the <em>separator</em>. 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>When constructing a JAR url via <code>new URL(context, spec)</code>, 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the following rules apply: 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <ul> 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>if there is no context URL and the specification passed to the 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * URL constructor doesn't contain a separator, the URL is considered 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to refer to a JarFile. 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>if there is a context URL, the context URL is assumed to refer 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to a JAR file or a Jar directory. 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>if the specification begins with a '/', the Jar directory is 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ignored, and the spec is considered to be at the root of the Jar 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * file. 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>Examples: 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dl> 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dt>context: <b>jar:http://www.foo.com/bar/jar.jar!/</b>, 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * spec:<b>baz/entry.txt</b> 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dd>url:<b>jar:http://www.foo.com/bar/jar.jar!/baz/entry.txt</b> 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dt>context: <b>jar:http://www.foo.com/bar/jar.jar!/baz</b>, 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * spec:<b>entry.txt</b> 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dd>url:<b>jar:http://www.foo.com/bar/jar.jar!/baz/entry.txt</b> 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dt>context: <b>jar:http://www.foo.com/bar/jar.jar!/baz</b>, 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * spec:<b>/entry.txt</b> 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <dd>url:<b>jar:http://www.foo.com/bar/jar.jar!/entry.txt</b> 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </dl> 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </ul> 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.URL 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.URLConnection 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.util.jar.JarFile 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.util.jar.JarInputStream 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.util.jar.Manifest 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.util.zip.ZipEntry 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Benjamin Renaud 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.2 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class JarURLConnection extends URLConnection { 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private URL jarFileURL; 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private String entryName; 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The connection to the JAR file URL, if the connection has been 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * initiated. This should be set by connect. 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected URLConnection jarFileURLConnection; 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates the new JarURLConnection to the specified URL. 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param url the URL 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws MalformedURLException if no legal protocol 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * could be found in a specification string or the 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * string could not be parsed. 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected JarURLConnection(URL url) throws MalformedURLException { 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(url); 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski parseSpecs(url); 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* get the specs for a given url out of the cache, and compute and 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * cache them if they're not there. 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private void parseSpecs(URL url) throws MalformedURLException { 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String spec = url.getFile(); 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int separator = spec.indexOf("!/"); 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * REMIND: we don't handle nested JAR URLs 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (separator == -1) { 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new MalformedURLException("no !/ found in url spec:" + spec); 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jarFileURL = new URL(spec.substring(0, separator++)); 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entryName = null; 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* if ! is the last letter of the innerURL, entryName is null */ 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (++separator != spec.length()) { 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entryName = spec.substring(separator, spec.length()); 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski entryName = ParseUtil.decode (entryName); 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the URL for the Jar file for this connection. 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the URL for the Jar file for this connection. 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public URL getJarFileURL() { 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return jarFileURL; 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the entry name for this connection. This method 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * returns null if the JAR file URL corresponding to this 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connection points to a JAR file and not a JAR file entry. 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the entry name for this connection, if any. 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getEntryName() { 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return entryName; 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the JAR file for this connection. 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the JAR file for this connection. If the connection is 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a connection to an entry of a JAR file, the JAR file object is 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * returned 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if an IOException occurs while trying to 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connect to the JAR file for this connection. 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #connect 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract JarFile getJarFile() throws IOException; 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the Manifest for this connection, or null if none. 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the manifest object corresponding to the JAR file object 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for this connection. 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if getting the JAR file for this 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connection causes an IOException to be trown. 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #getJarFile 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Manifest getManifest() throws IOException { 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getJarFile().getManifest(); 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the JAR entry object for this connection, if any. This 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method returns null if the JAR file URL corresponding to this 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connection points to a JAR file and not a JAR file entry. 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the JAR entry object for this connection, or null if 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the JAR URL for this connection points to a JAR file. 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if getting the JAR file for this 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connection causes an IOException to be trown. 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #getJarFile 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #getJarEntry 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public JarEntry getJarEntry() throws IOException { 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return getJarFile().getJarEntry(entryName); 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the Attributes object for this connection if the URL 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for it points to a JAR file entry, null otherwise. 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the Attributes object for this connection if the URL 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for it points to a JAR file entry, null otherwise. 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if getting the JAR entry causes an 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * IOException to be thrown. 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #getJarEntry 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Attributes getAttributes() throws IOException { 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JarEntry e = getJarEntry(); 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return e != null ? e.getAttributes() : null; 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the main Attributes for the JAR file for this 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connection. 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the main Attributes for the JAR file for this 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connection. 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if getting the manifest causes an 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * IOException to be thrown. 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #getJarFile 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #getManifest 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Attributes getMainAttributes() throws IOException { 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Manifest man = getManifest(); 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return man != null ? man.getMainAttributes() : null; 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the Certificate object for this connection if the URL 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for it points to a JAR file entry, null otherwise. This method 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * can only be called once 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the connection has been completely verified by reading 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * from the input stream until the end of the stream has been 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * reached. Otherwise, this method will return <code>null</code> 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the Certificate object for this connection if the URL 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for it points to a JAR file entry, null otherwise. 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if getting the JAR entry causes an 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * IOException to be thrown. 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #getJarEntry 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public java.security.cert.Certificate[] getCertificates() 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JarEntry e = getJarEntry(); 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return e != null ? e.getCertificates() : null; 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 314