Class UpdateLoader

java.lang.Object
org.apache.derby.impl.services.reflect.UpdateLoader
All Implemented Interfaces:
LockOwner

final class UpdateLoader extends 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 Details

    • RESTRICTED_PACKAGES

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

      private JarLoader[] jarList
    • vs

      private HeaderPrintWriter vs
    • myLoader

      private final ClassLoader myLoader
    • initDone

      private boolean initDone
    • thisClasspath

      private String thisClasspath
    • lf

      private final LockFactory lf
    • classLoaderLock

      private final ShExLockable classLoaderLock
    • version

      private int version
    • normalizeToUpper

      private boolean normalizeToUpper
    • parent

      private DatabaseClasses parent
    • compat

      private final CompatibilitySpace compat
    • needReload

      private boolean needReload
    • jarReader

      private JarReader jarReader
  • Constructor Details

  • Method Details

    • initializeFromClassPath

      private void initializeFromClassPath(String classpath) throws StandardException
      Throws:
      StandardException
    • loadClass

      Class loadClass(String className, boolean resolve) throws 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:
      ClassNotFoundException - Class can not be found or the installed jar is restricted from loading it.
    • getResourceAsStream

      InputStream getResourceAsStream(String name)
    • modifyClasspath

      void modifyClasspath(String classpath) throws StandardException
      Throws:
      StandardException
    • modifyJar

      void modifyJar(boolean reload) throws StandardException
      Throws:
      StandardException
    • lockClassLoader

      private boolean lockClassLoader(ShExQual qualifier) throws StandardException
      Throws:
      StandardException
    • checkLoaded

      Class checkLoaded(String className, boolean resolve)
    • close

      void close()
    • initLoaders

      private void initLoaders()
    • getClassLoaderVersion

      int getClassLoaderVersion()
    • needReload

      void needReload()
    • reload

      private void reload() throws StandardException
      Throws:
      StandardException
    • getClasspath

      private String getClasspath() throws StandardException
      Throws:
      StandardException
    • getJarReader

      JarReader getJarReader()
    • 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(String contextID)
      Privileged lookup of a Context. Must be private so that user code can't call this entry point.
    • getServiceModule

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