123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- /*
- * Javassist, a Java-bytecode translator toolkit.
- * Copyright (C) 1999-2006 Shigeru Chiba. All Rights Reserved.
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. Alternatively, the contents of this file may be used under
- * the terms of the GNU Lesser General Public License Version 2.1 or later.
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- */
-
- package javassist;
-
- import java.io.*;
- import java.net.*;
-
- /**
- * A class search-path specified with URL (http).
- *
- * @see javassist.ClassPath
- * @see ClassPool#insertClassPath(ClassPath)
- * @see ClassPool#appendClassPath(ClassPath)
- */
- public class URLClassPath implements ClassPath {
- protected String hostname;
- protected int port;
- protected String directory;
- protected String packageName;
-
- /**
- * Creates a search path specified with URL (http).
- *
- * <p>This search path is used only if a requested
- * class name starts with the name specified by <code>packageName</code>.
- * If <code>packageName</code> is "mypack" and a requested class is
- * "mypack.sub.Test", then the given URL is used for loading that class.
- * If <code>packageName</code> is <code>null</code>, the URL is used
- * for loading any class.
- *
- * @param host host name
- * @param port port number
- * @param directory directory name ending with "/".
- * It can be "/" (root directory).
- * It must start with "/".
- * @param packageName package name.
- */
- public URLClassPath(String host, int port,
- String directory, String packageName) {
- hostname = host;
- this.port = port;
- this.directory = directory;
- this.packageName = packageName;
- }
-
- public String toString() {
- return hostname + ":" + port + directory;
- }
-
- /**
- * Opens a class file with http.
- *
- * @return null if the class file could not be found.
- */
- public InputStream openClassfile(String classname) {
- try {
- URLConnection con = openClassfile0(classname);
- if (con != null)
- return con.getInputStream();
- }
- catch (IOException e) {}
- return null; // not found
- }
-
- private URLConnection openClassfile0(String classname) throws IOException {
- if (packageName == null || classname.startsWith(packageName)) {
- String jarname
- = directory + classname.replace('.', '/') + ".class";
- return fetchClass0(hostname, port, jarname);
- }
- else
- return null; // not found
- }
-
- /**
- * Returns the URL.
- *
- * @return null if the class file could not be obtained.
- */
- public URL find(String classname) {
- try {
- URLConnection con = openClassfile0(classname);
- InputStream is = con.getInputStream();
- if (is != null) {
- is.close();
- return con.getURL();
- }
- }
- catch (IOException e) {}
- return null;
- }
-
- /**
- * Closes this class path.
- */
- public void close() {}
-
- /**
- * Reads a class file on an http server.
- *
- * @param host host name
- * @param port port number
- * @param directory directory name ending with "/".
- * It can be "/" (root directory).
- * It must start with "/".
- * @param classname fully-qualified class name
- */
- public static byte[] fetchClass(String host, int port,
- String directory, String classname)
- throws IOException
- {
- byte[] b;
- URLConnection con = fetchClass0(host, port,
- directory + classname.replace('.', '/') + ".class");
- int size = con.getContentLength();
- InputStream s = con.getInputStream();
- try {
- if (size <= 0)
- b = ClassPoolTail.readStream(s);
- else {
- b = new byte[size];
- int len = 0;
- do {
- int n = s.read(b, len, size - len);
- if (n < 0)
- throw new IOException("the stream was closed: "
- + classname);
-
- len += n;
- } while (len < size);
- }
- }
- finally {
- s.close();
- }
-
- return b;
- }
-
- private static URLConnection fetchClass0(String host, int port,
- String filename)
- throws IOException
- {
- URL url;
- try {
- url = new URL("http", host, port, filename);
- }
- catch (MalformedURLException e) {
- // should never reache here.
- throw new IOException("invalid URL?");
- }
-
- URLConnection con = url.openConnection();
- con.connect();
- return con;
- }
- }
|