1/*
2 * Javassist, a Java-bytecode translator toolkit.
3 * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved.
4 *
5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 (the "License"); you may not use this file except in compliance with
7 * the License.  Alternatively, the contents of this file may be used under
8 * the terms of the GNU Lesser General Public License Version 2.1 or later.
9 *
10 * Software distributed under the License is distributed on an "AS IS" basis,
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 * for the specific language governing rights and limitations under the
13 * License.
14 */
15
16package javassist;
17
18import java.io.InputStream;
19import java.net.URL;
20import java.lang.ref.WeakReference;
21
22/**
23 * A class search-path representing a class loader.
24 *
25 * <p>It is used for obtaining a class file from the given
26 * class loader by <code>getResourceAsStream()</code>.
27 * The <code>LoaderClassPath</code> refers to the class loader through
28 * <code>WeakReference</code>.  If the class loader is garbage collected,
29 * the other search pathes are examined.
30 *
31 * <p>The given class loader must have both <code>getResourceAsStream()</code>
32 * and <code>getResource()</code>.
33 *
34 * @author <a href="mailto:bill@jboss.org">Bill Burke</a>
35 * @author Shigeru Chiba
36 *
37 * @see ClassPool#insertClassPath(ClassPath)
38 * @see ClassPool#appendClassPath(ClassPath)
39 * @see ClassClassPath
40 */
41public class LoaderClassPath implements ClassPath {
42    private WeakReference clref;
43
44    /**
45     * Creates a search path representing a class loader.
46     */
47    public LoaderClassPath(ClassLoader cl) {
48        clref = new WeakReference(cl);
49    }
50
51    public String toString() {
52        Object cl = null;
53        if (clref != null)
54            cl = clref.get();
55
56        return cl == null ? "<null>" : cl.toString();
57    }
58
59    /**
60     * Obtains a class file from the class loader.
61     * This method calls <code>getResourceAsStream(String)</code>
62     * on the class loader.
63     */
64    public InputStream openClassfile(String classname) {
65        String cname = classname.replace('.', '/') + ".class";
66        ClassLoader cl = (ClassLoader)clref.get();
67        if (cl == null)
68            return null;        // not found
69        else
70            return cl.getResourceAsStream(cname);
71    }
72
73    /**
74     * Obtains the URL of the specified class file.
75     * This method calls <code>getResource(String)</code>
76     * on the class loader.
77     *
78     * @return null if the class file could not be found.
79     */
80    public URL find(String classname) {
81        String cname = classname.replace('.', '/') + ".class";
82        ClassLoader cl = (ClassLoader)clref.get();
83        if (cl == null)
84            return null;        // not found
85        else
86            return cl.getResource(cname);
87    }
88
89    /**
90     * Closes this class path.
91     */
92    public void close() {
93        clref = null;
94    }
95}
96