tools/java/src/stx/libjava/tools/environment/internal/ReflectiveClassLoader.java
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 16 Dec 2014 02:42:06 +0000
changeset 3305 d85c559c01c6
parent 3218 93a3efa06bd1
child 3324 a58245c0e83a
permissions -rw-r--r--
Fixed bug in ReflectiveEnvironment#isPackage() Must convert package name to slashed from before testing set of scanned packages. The set is kept in original slashed from to avoid string copying.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3218
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
/**
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
 * 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
 */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
package stx.libjava.tools.environment.internal;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
3305
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
     6
import java.io.File;
3218
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
import java.lang.reflect.Field;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
import java.util.Iterator;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
import java.util.Vector;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
/**
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    13
 * <code>ReflectiveClassLoader</code> is a simple wrapper on a {@link java.lang.ClassLoader} that provides
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
 * reflective features standard {@link java.lang.ClassLoader} doesn't.
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
 * In particular, it provides {@link #isPackage(String)} which is used
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
 * by {@link stx.libjava.tools.environment.ReflectiveEnvironment}.
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
 * 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    18
 * The way {@link java.lang.ClassLoader} accesses and loads classes differ
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
 * so specialised subclasses exists for individual {@link java.lang.ClassLoader}
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
 * instances in order to provide more accurate answers. Therefore use method 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
 * {@link #forClassLoader(ClassLoader)} to create an instance of a 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
 * <code>ReflectiveClassLoader</code> 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
 *  
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
 * @author Jan Vrany <jan.vrany [at] fit.cvut.cz>
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
 *
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
 */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
@stx.libjava.annotation.Package("stx:libjava/tools")
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
public class ReflectiveClassLoader {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    29
    /** 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
     * Shared cached {@link ReflectiveClassLoader} representing primordial class loader. 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
     * Primordial class loader is not to change during the life-span of a JVM, so it can be
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
     * safely cached.  
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
     * 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
     */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
    protected static ReflectiveClassLoader PRIMORDIAL = new ReflectiveURLClassLoader(null, sun.misc.Launcher.getBootstrapClassPath().getURLs());
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    37
    /**
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    38
     * Cached {@link Field} to access normally inaccessible field {@link java.lang.ClassLoader#classes}. 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    39
     * On OpenJDK based libraries, this field contains a list of loaded classes. This list is used
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
     * to check for loaded classes as a short-circuit (or as the only way for generic class loaders) 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
     */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
    protected static Field FIELD_ClassLoader_Classes;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    43
    
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
    /**
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
     * A real {@link ClassLoader} this {@link ReflectiveClassLoader} reflects on. 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
     * For primordial class loader the value is <code>null</code>.
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
     */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
    protected ClassLoader realClassLoader;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
    
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
    /**
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
     * A cached {@link ReflectiveClassLoader} representing a parent class loader of
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
     * this object. For primordial class loader the value is <code>null</code>.
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
     */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
    protected ReflectiveClassLoader parent;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
    
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
    protected ReflectiveClassLoader(ClassLoader loader) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    57
        realClassLoader = loader;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    58
    }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    59
    
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
    static {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    61
        try {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
            FIELD_ClassLoader_Classes = ClassLoader.class.getDeclaredField("classes");
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
            FIELD_ClassLoader_Classes.setAccessible(true);
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
        } catch (NoSuchFieldException e) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
            FIELD_ClassLoader_Classes = null;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
        } catch (SecurityException e) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
            FIELD_ClassLoader_Classes = null;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
        }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
    }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
        
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
    /**
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
     * Returns a suitable {@link ReflectiveClassLoader} for given (real) {@link ClassLoader}.
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
     * 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
     * @param loader a {@link ClassLoader} on which to reflect.
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
     * @return a {@link ReflectiveClassLoader} for given @param loader. 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
     */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    77
    public static ReflectiveClassLoader forClassLoader(ClassLoader loader) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
        if (loader == null) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
            return PRIMORDIAL;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    80
        }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    81
        /* This is kind of ugly, we should provide a way to register custom subclasses,
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
         * but for now, keep it simple. We'll see if this machinery proves usable at all. 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    83
         */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    84
        if (loader instanceof java.net.URLClassLoader) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    85
            return new ReflectiveURLClassLoader((java.net.URLClassLoader)loader);
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
        }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
        return new ReflectiveClassLoader(loader);
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    88
    }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
    
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
    public ReflectiveClassLoader getParent() {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
        if (realClassLoader == null) return null;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
        if (parent == null) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
            parent = ReflectiveClassLoader.forClassLoader(realClassLoader.getParent());
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
        }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
        return parent;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    96
    }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    97
    
3305
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
    98
    /** 
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
    99
     * Return <code>true</code> is package with name @param packageNameDotted exists under
3218
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   100
     * this class loader, <code>false</code> otherwise.  
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   101
     * 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   102
     * A package is considered to exist if there's at least one class in that package. 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   103
     * However, individual {@link ReflectiveClassLoader}s may extend the definition of
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   104
     * {@link #isPackage(String)} For example {@link ReflectiveURLClassLoader} may return
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   105
     * <code>true</code> if a directory exists along it's class path.  
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
     * 
3305
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   107
     * @param packageNameDotted a name of the package (with dots as separator)
3218
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
     * @return <code>true</code> if such package exists, <code>false</code> otherwise
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
     */
3305
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   110
    public boolean isPackage(String packageNameDotted) {
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   111
    	String packageNameSlashed = packageNameDotted.replace('.', '/');
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   112
    	return isPackage(packageNameDotted, packageNameSlashed);
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   113
    }
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   114
    
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   115
    /**
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   116
     * Return <code>true</code> is package with name @param packageNameDotted exists under
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   117
     * this class loader, <code>false</code> otherwise.  
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   118
     * 
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   119
     * A package is considered to exist if there's at least one class in that package. 
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   120
     * However, individual {@link ReflectiveClassLoader}s may extend the definition of
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   121
     * {@link #isPackage(String)} For example {@link ReflectiveURLClassLoader} may return
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   122
     * <code>true</code> if a directory exists along it's class path.  
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   123
     * 
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   124
     * @param packageNameDotted a name of the package (with dots as separator)
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   125
     * @param packageNameSlashed a name of the package (with slashes as separator)
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   126
     * @return <code>true</code> if such package exists, <code>false</code> otherwise
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   127
     */
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   128
    public boolean isPackage(String packageNameDotted, String packageNameSlashed) {
3218
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
        // First, check parent class loader
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
        if (realClassLoader != null) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
            if (realClassLoader.getParent() == null) {
3305
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   132
                if (PRIMORDIAL.isPackage(packageNameDotted, packageNameSlashed)) {
3218
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
                    return true;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   134
                }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   135
            } else {
3305
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   136
                if (getParent().isPackage(packageNameDotted, packageNameSlashed)) {
3218
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   137
                    return true;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   138
                }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   139
            }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   140
        }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   141
        // Second, consult list of already loaded classes.
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   142
        if (realClassLoader != null && FIELD_ClassLoader_Classes != null) {
3305
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   143
            int packageNameLen = packageNameDotted.length();
3218
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   144
            Vector<Class<?>> classes;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   145
            try {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   146
                classes = (Vector<Class<?>>)FIELD_ClassLoader_Classes.get(realClassLoader);
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   147
                if (classes.size() > 0) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   148
                    Iterator<Class<?>> i = classes.iterator();
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   149
                    while (i.hasNext()) {                    
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   150
                        String className = i.next().getName();
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   151
                        int classNameLen = className.length();                  
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   152
                        if ((classNameLen > packageNameLen) &&
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   153
                            (className.charAt(packageNameLen) == '.') &&
3305
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   154
                            (className.startsWith(packageNameDotted))) {
3218
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   155
                            return true;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   156
                        } else if ((classNameLen == packageNameLen) &&
3305
d85c559c01c6 Fixed bug in ReflectiveEnvironment#isPackage()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 3218
diff changeset
   157
                                    className.equals(packageNameDotted)) {
3218
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   158
                            return false;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   159
                        }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   160
                    }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   161
                }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   162
            } catch (IllegalArgumentException e) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   163
                // If we're for whatever reason fobidden access to classes field,
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   164
                // well, just ignore it. 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   165
            } catch (IllegalAccessException e) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   166
                // same as above. 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   167
            }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   168
        }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   169
        // Last, we don't know. For generic ClassLoader, there's no other way
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   170
        // to figure out what packages are there or not. So be conservative...
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   171
        return false;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   172
    }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   173
    
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   174
    public ClassLoader getRealClassLoader() {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   175
        return realClassLoader;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   176
    }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   177
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   178
}