Class UpdateLoader

  • All Implemented Interfaces:
    LockOwner

    final class UpdateLoader
    extends java.lang.Object
    implements LockOwner
    UpdateLoader implements then functionality of derby.database.classpath. It manages the ClassLoaders (instances of JarLoader) for each installed jar file. Jar files are installed through the sqlj.install_jar procedure.
    Each JarLoader delegates any request through standard mechanisms to load a class to this object, which will then ask each jarLoader in order of derby.database.classpath to load the class through an internal api. This means if the third jar in derby.database.classpath tries to load a class, say from the class for a procedure's method making some reference to it, then the request is delegated to UpdateLoader. UpdateLoader will then try to load the class from each of the jars in order of derby.database.classpath using the jar's installed JarLoader.
    • Field Detail

      • RESTRICTED_PACKAGES

        private static final java.lang.String[] RESTRICTED_PACKAGES
        List of packages that Derby will not support being loaded from an installed jar file.
      • myLoader

        private final java.lang.ClassLoader myLoader
      • initDone

        private boolean initDone
      • thisClasspath

        private java.lang.String thisClasspath
      • classLoaderLock

        private final ShExLockable classLoaderLock
      • version

        private int version
      • normalizeToUpper

        private boolean normalizeToUpper
      • needReload

        private boolean needReload
    • Method Detail

      • loadClass

        java.lang.Class loadClass​(java.lang.String className,
                                  boolean resolve)
                           throws java.lang.ClassNotFoundException
        Load the class from the class path. Called by JarLoader when it has a request to load a class to fulfill the sematics of derby.database.classpath.

        Enforces two restrictions:

        • Do not allow classes in certain name spaces to be loaded from installed jars, see RESTRICTED_PACKAGES for the list.
        • Referencing Derby's internal classes (those outside the public api) from installed is disallowed. This is to stop user defined routines bypassing security or taking advantage of security holes in Derby. E.g. allowing a routine to call a public method in derby would allow such routines to call public static methods for system procedures without having been granted permission on them, such as setting database properties.
        Throws:
        java.lang.ClassNotFoundException - Class can not be found or the installed jar is restricted from loading it.
      • getResourceAsStream

        java.io.InputStream getResourceAsStream​(java.lang.String name)
      • checkLoaded

        java.lang.Class checkLoaded​(java.lang.String className,
                                    boolean resolve)
      • close

        void close()
      • initLoaders

        private void initLoaders()
      • getClassLoaderVersion

        int getClassLoaderVersion()
      • needReload

        void needReload()
      • noWait

        public boolean noWait()
        Tell the lock manager that we don't want timed waits to time out immediately.
        Specified by:
        noWait in interface LockOwner
        Returns:
        false
      • isNestedOwner

        public boolean isNestedOwner()
        Description copied from interface: LockOwner

        Return true if this is a nested owner, e.g., a nested user transaction.

        Specified by:
        isNestedOwner in interface LockOwner
      • nestsUnder

        public boolean nestsUnder​(LockOwner other)
        Description copied from interface: LockOwner

        Return true if this owner nests under another owner.

        Specified by:
        nestsUnder in interface LockOwner
      • getContextOrNull

        private static Context getContextOrNull​(java.lang.String contextID)
        Privileged lookup of a Context. Must be private so that user code can't call this entry point.
      • getServiceModule

        private static java.lang.Object getServiceModule​(java.lang.Object serviceModule,
                                                         java.lang.String factoryInterface)
        Privileged module lookup. Must be private so that user code can't call this entry point.