tools/java/src/stx/libjava/tools/environment/internal/ReflectiveClassLoader.java
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 11 Aug 2014 10:55:57 +0100
changeset 3218 93a3efa06bd1
child 3305 d85c559c01c6
permissions -rw-r--r--
ReflectiveEnvironment#isPackage() refactored to provide better performance. In a nutshell, when a .jar file is opened a full list of package is built so each .jar is opened and scanned only once. Also, this list ot package is cached (as long as .jar is not modified) to avoid multiple scanning among multiple compilation cycles. This makes interactive tools much more responsive as scanning .jar was one of the bottlenecks.
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
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
import java.lang.reflect.Field;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
import java.util.Iterator;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
import java.util.Vector;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
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
 * <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
    13
 * 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
    14
 * 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
    15
 * 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
    16
 * 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
 * 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
    18
 * 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
    19
 * 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
    20
 * {@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
    21
 * <code>ReflectiveClassLoader</code> 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
 *  
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
 * @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
    24
 *
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
@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
    27
public class ReflectiveClassLoader {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
    /** 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    29
     * 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
    30
     * 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
    31
     * safely cached.  
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
     * 
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
    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
    35
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
     * 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
    38
     * 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
    39
     * 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
    40
     */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
    protected static Field FIELD_ClassLoader_Classes;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
    
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
     * 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
    45
     * 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
    46
     */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
    protected ClassLoader realClassLoader;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
    
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
     * 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
    51
     * 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
    52
     */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
    protected ReflectiveClassLoader parent;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
    
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
    protected ReflectiveClassLoader(ClassLoader loader) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
        realClassLoader = loader;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    57
    }
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
    static {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
        try {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    61
            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
    62
            FIELD_ClassLoader_Classes.setAccessible(true);
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
        } catch (NoSuchFieldException e) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
            FIELD_ClassLoader_Classes = null;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
        } catch (SecurityException e) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
            FIELD_ClassLoader_Classes = null;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
        }
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
     * 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
    72
     * 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
     * @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
    74
     * @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
    75
     */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
    public static ReflectiveClassLoader forClassLoader(ClassLoader loader) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    77
        if (loader == null) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
            return PRIMORDIAL;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
        }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    80
        /* 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
    81
         * 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
    82
         */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    83
        if (loader instanceof java.net.URLClassLoader) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    84
            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
    85
        }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
        return new ReflectiveClassLoader(loader);
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
    }
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
    public ReflectiveClassLoader getParent() {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
        if (realClassLoader == null) return null;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
        if (parent == null) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
            parent = ReflectiveClassLoader.forClassLoader(realClassLoader.getParent());
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
        }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
        return parent;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
    }
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
    /**
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    98
     * Return <code>true</code> is package with name @param packageName exists under
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    99
     * 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
   100
     * 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   101
     * 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
   102
     * 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
   103
     * {@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
   104
     * <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
   105
     * 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
     * @param packageName a name of the package
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
     * @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
   108
     */
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
    public boolean isPackage(String packageName) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
        // First, check parent class loader
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
        if (realClassLoader != null) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
            if (realClassLoader.getParent() == null) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   113
                if (PRIMORDIAL.isPackage(packageName)) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   114
                    return true;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   115
                }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   116
            } else {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
                if (getParent().isPackage(packageName)) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
                    return true;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
                }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
            }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   121
        }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
        // 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
   123
        if (realClassLoader != null && FIELD_ClassLoader_Classes != null) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   124
            int packageNameLen = packageName.length();
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
            Vector<Class<?>> classes;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
            try {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
                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
   128
                if (classes.size() > 0) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
                    Iterator<Class<?>> i = classes.iterator();
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
                    while (i.hasNext()) {                    
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
                        String className = i.next().getName();
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   132
                        int classNameLen = className.length();                  
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
                        if ((classNameLen > packageNameLen) &&
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   134
                            (className.charAt(packageNameLen) == '.') &&
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   135
                            (className.startsWith(packageName))) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   136
                            return true;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   137
                        } else if ((classNameLen == packageNameLen) &&
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   138
                                    className.equals(packageName)) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   139
                            return false;
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
                    }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   142
                }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   143
            } catch (IllegalArgumentException e) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   144
                // 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
   145
                // well, just ignore it. 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   146
            } catch (IllegalAccessException e) {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   147
                // same as above. 
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   148
            }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   149
        }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   150
        // 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
   151
        // 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
   152
        return false;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   153
    }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   154
    
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   155
    public ClassLoader getRealClassLoader() {
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   156
        return realClassLoader;
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   157
    }
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   158
93a3efa06bd1 ReflectiveEnvironment#isPackage() refactored to provide better performance.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   159
}