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;
20
21/**
22 * A search-path for obtaining a class file
23 * by <code>getResourceAsStream()</code> in <code>java.lang.Class</code>.
24 *
25 * <p>Try adding a <code>ClassClassPath</code> when a program is running
26 * with a user-defined class loader and any class files are not found with
27 * the default <code>ClassPool</code>.  For example,
28 *
29 * <ul><pre>
30 * ClassPool cp = ClassPool.getDefault();
31 * cp.insertClassPath(new ClassClassPath(this.getClass()));
32 * </pre></ul>
33 *
34 * This code snippet permanently adds a <code>ClassClassPath</code>
35 * to the default <code>ClassPool</code>.  Note that the default
36 * <code>ClassPool</code> is a singleton.  The added
37 * <code>ClassClassPath</code> uses a class object representing
38 * the class including the code snippet above.
39 *
40 * @see ClassPool#insertClassPath(ClassPath)
41 * @see ClassPool#appendClassPath(ClassPath)
42 * @see LoaderClassPath
43 */
44public class ClassClassPath implements ClassPath {
45    private Class thisClass;
46
47    /** Creates a search path.
48     *
49     * @param c     the <code>Class</code> object used to obtain a class
50     *              file.  <code>getResourceAsStream()</code> is called on
51     *              this object.
52     */
53    public ClassClassPath(Class c) {
54        thisClass = c;
55    }
56
57    ClassClassPath() {
58        /* The value of thisClass was this.getClass() in early versions:
59         *
60         *     thisClass = this.getClass();
61         *
62         * However, this made openClassfile() not search all the system
63         * class paths if javassist.jar is put in jre/lib/ext/
64         * (with JDK1.4).
65         */
66        this(java.lang.Object.class);
67    }
68
69    /**
70     * Obtains a class file by <code>getResourceAsStream()</code>.
71     */
72    public InputStream openClassfile(String classname) {
73        String jarname = "/" + classname.replace('.', '/') + ".class";
74        return thisClass.getResourceAsStream(jarname);
75    }
76
77    /**
78     * Obtains the URL of the specified class file.
79     *
80     * @return null if the class file could not be found.
81     */
82    public URL find(String classname) {
83        String jarname = "/" + classname.replace('.', '/') + ".class";
84        return thisClass.getResource(jarname);
85    }
86
87    /**
88     * Does nothing.
89     */
90    public void close() {
91    }
92
93    public String toString() {
94        return thisClass.getName() + ".class";
95    }
96}
97