Source code: edu/emory/mathcs/util/classloader/ResourceHandle.java
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is the Emory Utilities.
15 *
16 * The Initial Developer of the Original Code is
17 * The Distributed Computing Laboratory, Emory University.
18 * Portions created by the Initial Developer are Copyright (C) 2002
19 * the Initial Developer. All Rights Reserved.
20 *
21 * Alternatively, the contents of this file may be used under the terms of
22 * either the GNU General Public License Version 2 or later (the "GPL"), or
23 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
24 * in which case the provisions of the GPL or the LGPL are applicable instead
25 * of those above. If you wish to allow use of your version of this file only
26 * under the terms of either the GPL or the LGPL, and not to allow others to
27 * use your version of this file under the terms of the MPL, indicate your
28 * decision by deleting the provisions above and replace them with the notice
29 * and other provisions required by the GPL or the LGPL. If you do not delete
30 * the provisions above, a recipient may use your version of this file under
31 * the terms of any one of the MPL, the GPL or the LGPL.
32 *
33 * ***** END LICENSE BLOCK ***** */
34
35 package edu.emory.mathcs.util.classloader;
36
37 import java.io.*;
38 import java.net.*;
39 import java.security.cert.*;
40 import java.util.jar.*;
41
42 /**
43 * This class represents a handle (a connection) to some resource, which may
44 * be a class, native library, text file, image, etc. Handles are returned
45 * by {@link ResourceLoader}'s <i>get</i> methods.
46 * Having the resource handle, in addition to accessing the resource data
47 * (using methods {@link #getInputStream} or {@link #getBytes}) as well as
48 * access resource metadata, such as attributes, certificates, etc.
49 * <p>
50 * As soon as the handle is no longer in use, it should be explicitly
51 * {@link #close}d, similarly to I/O streams.
52 *
53 * @author Dawid Kurzyniec
54 * @version 1.0
55 */
56 public abstract class ResourceHandle {
57
58 /**
59 * Return the name of the resource. The name is a "/"-separated path
60 * name that identifies the resource.
61 */
62 public abstract String getName();
63
64 /**
65 * Returns the URL of the resource.
66 */
67 public abstract URL getURL();
68
69 /**
70 * Returns the CodeSource URL for the class or resource.
71 */
72 public abstract URL getCodeSourceURL();
73
74 /**
75 * Returns and InputStream for reading this resource data.
76 */
77 public abstract InputStream getInputStream() throws IOException;
78
79 /**
80 * Returns the length of this resource data, or -1 if unknown.
81 */
82 public abstract int getContentLength() throws IOException;
83
84 /**
85 * Returns this resource data as an array of bytes.
86 */
87 public byte[] getBytes() throws IOException {
88 byte[] buf;
89 InputStream in = getInputStream();
90 int len = getContentLength();
91 try {
92 if (len != -1) {
93 // read exactly len bytes
94 buf = new byte[len];
95 while (len > 0) {
96 int read = in.read(buf, buf.length - len, len);
97 if (read < 0) {
98 throw new IOException("unexpected EOF");
99 }
100 len -= read;
101 }
102 } else {
103 // read until end of stream is reached
104 buf = new byte[2048];
105 int total = 0;
106 while ((len = in.read(buf, total, buf.length - total)) >= 0) {
107 total += len;
108 if (total >= buf.length) {
109 byte[] aux = new byte[total * 2];
110 System.arraycopy(buf, 0, aux, 0, total);
111 buf = aux;
112 }
113 }
114 // trim if necessary
115 if (total != buf.length) {
116 byte[] aux = new byte[total];
117 System.arraycopy(buf, 0, aux, 0, total);
118 buf = aux;
119 }
120 }
121 } finally {
122 in.close();
123 }
124 return buf;
125 }
126
127 /**
128 * Returns the Manifest of the JAR file from which this resource
129 * was loaded, or null if none.
130 */
131 public Manifest getManifest() throws IOException {
132 return null;
133 }
134
135 /**
136 * Return the Certificates of the resource, or null if none.
137 */
138 public Certificate[] getCertificates() {
139 return null;
140 }
141
142 /**
143 * Return the Attributes of the resource, or null if none.
144 */
145 public Attributes getAttributes() throws IOException {
146 Manifest m = getManifest();
147 if (m == null) return null;
148 String entry = getURL().getFile();
149 return m.getAttributes(entry);
150 }
151
152 /**
153 * Closes a connection to the resource indentified by this handle. Releases
154 * any I/O objects associated with the handle.
155 */
156 public void close() {
157 }
158 //
159 // /**
160 // * Ensures that {@link #release()} method is eventually called when this
161 // * object is finalized.
162 // */
163 // protected void finalize() throws Throwable {
164 // super.finalize();
165 // release();
166 // }
167 }