Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }