151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1998, 2009, 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 sun.misc; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.EOFException; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.URL; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.InterruptedIOException; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.InputStream; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.CodeSigner; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.jar.Manifest; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.ByteBuffer; 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Arrays; 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.nio.ByteBuffered; 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class is used to represent a Resource that has been loaded 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * from the class path. 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author David Connelly 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.2 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class Resource { 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the name of the Resource. 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract String getName(); 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the URL of the Resource. 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract URL getURL(); 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the CodeSource URL for the Resource. 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract URL getCodeSourceURL(); 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns an InputStream for reading the Resource data. 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract InputStream getInputStream() throws IOException; 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the length of the Resource data, or -1 if unknown. 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract int getContentLength() throws IOException; 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private InputStream cis; 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* Cache result in case getBytes is called after getByteBuffer. */ 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private synchronized InputStream cachedInputStream() throws IOException { 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (cis == null) { 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cis = getInputStream(); 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return cis; 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the Resource data as an array of bytes. 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public byte[] getBytes() throws IOException { 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski byte[] b; 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Get stream before content length so that a FileNotFoundException 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // can propagate upwards without being caught too early 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InputStream in = cachedInputStream(); 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // This code has been uglified to protect against interrupts. 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Even if a thread has been interrupted when loading resources, 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // the IO should not abort, so must carefully retry, failing only 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // if the retry leads to some other IO exception. 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean isInterrupted = Thread.interrupted(); 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int len; 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (;;) { 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski len = getContentLength(); 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (InterruptedIOException iioe) { 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Thread.interrupted(); 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski isInterrupted = true; 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski b = new byte[0]; 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (len == -1) len = Integer.MAX_VALUE; 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int pos = 0; 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (pos < len) { 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int bytesToRead; 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (pos >= b.length) { // Only expand when there's no room 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski bytesToRead = Math.min(len - pos, b.length + 1024); 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (b.length < pos + bytesToRead) { 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski b = Arrays.copyOf(b, pos + bytesToRead); 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski bytesToRead = b.length - pos; 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int cc = 0; 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cc = in.read(b, pos, bytesToRead); 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (InterruptedIOException iioe) { 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Thread.interrupted(); 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski isInterrupted = true; 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (cc < 0) { 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (len != Integer.MAX_VALUE) { 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new EOFException("Detect premature EOF"); 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (b.length != pos) { 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski b = Arrays.copyOf(b, pos); 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski pos += cc; 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } finally { 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski in.close(); 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (InterruptedIOException iioe) { 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski isInterrupted = true; 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (IOException ignore) {} 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (isInterrupted) { 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Thread.currentThread().interrupt(); 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return b; 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the Resource data as a ByteBuffer, but only if the input stream 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * was implemented on top of a ByteBuffer. Return <tt>null</tt> otherwise. 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public ByteBuffer getByteBuffer() throws IOException { 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InputStream in = cachedInputStream(); 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (in instanceof ByteBuffered) { 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ((ByteBuffered)in).getByteBuffer(); 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the Manifest for the Resource, or null if none. 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Manifest getManifest() throws IOException { 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns theCertificates for the Resource, or null if none. 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public java.security.cert.Certificate[] getCertificates() { 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the code signers for the Resource, or null if none. 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public CodeSigner[] getCodeSigners() { 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 188