Class VFSClassLoader


  • public class VFSClassLoader
    extends java.security.SecureClassLoader
    A class loader that can load classes and resources from a search path.

    The search path can consist of VFS FileObjects referring both to folders and JAR files. Any FileObject of type FileType.FILE is assumed to be a JAR and is opened by creating a layered file system with the "jar" scheme.

    TODO - Test this with signed Jars and a SecurityManager.

    See Also:
    FileSystemManager.createFileSystem(org.apache.commons.vfs2.FileObject)
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private java.util.ArrayList<FileObject> resources  
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      private void addFileObjects​(FileSystemManager manager, FileObject[] files)
      Appends the specified FileObjects to the list of FileObjects to search for classes and resources.
      protected void copyPermissions​(java.security.PermissionCollection src, java.security.PermissionCollection dest)
      Copies the permissions from src to dest.
      private java.lang.Class<?> defineClass​(java.lang.String name, Resource res)
      Loads and verifies the class with name and located with res.
      private java.lang.Package definePackage​(java.lang.String name, Resource res)
      Reads attributes for the package and defines it.
      protected java.lang.Class<?> findClass​(java.lang.String name)
      Finds and loads the class with the specified name from the search path.
      protected java.net.URL findResource​(java.lang.String name)
      Finds the resource with the specified name from the search path.
      protected java.util.Enumeration<java.net.URL> findResources​(java.lang.String name)
      Returns an Enumeration of all the resources in the search path with the specified name.
      FileObject[] getFileObjects()
      Provide access to the file objects this class loader represents.
      protected java.security.PermissionCollection getPermissions​(java.security.CodeSource cs)
      Calls super.getPermissions both for the code source and also adds the permissions granted to the parent layers.
      private boolean isSealed​(Resource res)
      Returns true if the we should seal the package where res resides.
      private Resource loadResource​(java.lang.String name)
      Searches through the search path of for the first class or resource with specified name.
      private FileObject lookupFileObject​(java.lang.String name)
      Does a reverse lookup to find the FileObject when we only have the URL.
      • Methods inherited from class java.security.SecureClassLoader

        defineClass, defineClass
      • Methods inherited from class java.lang.ClassLoader

        clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, definePackage, findLibrary, findLoadedClass, findSystemClass, getClassLoadingLock, getPackage, getPackages, getParent, getResource, getResourceAsStream, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, loadClass, loadClass, registerAsParallelCapable, resolveClass, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSigners
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • resources

        private final java.util.ArrayList<FileObject> resources
    • Constructor Detail

      • VFSClassLoader

        public VFSClassLoader​(FileObject file,
                              FileSystemManager manager)
                       throws FileSystemException
        Constructors a new VFSClassLoader for the given file.
        Parameters:
        file - the file to load the classes and resources from.
        manager - the FileManager to use when trying create a layered Jar file system.
        Throws:
        FileSystemException - if an error occurs.
      • VFSClassLoader

        public VFSClassLoader​(FileObject file,
                              FileSystemManager manager,
                              java.lang.ClassLoader parent)
                       throws FileSystemException
        Constructors a new VFSClassLoader for the given file.
        Parameters:
        file - the file to load the classes and resources from.
        manager - the FileManager to use when trying create a layered Jar file system.
        parent - the parent class loader for delegation.
        Throws:
        FileSystemException - if an error occurs.
      • VFSClassLoader

        public VFSClassLoader​(FileObject[] files,
                              FileSystemManager manager)
                       throws FileSystemException
        Constructors a new VFSClassLoader for the given files. The files will be searched in the order specified.
        Parameters:
        files - the files to load the classes and resources from.
        manager - the FileManager to use when trying create a layered Jar file system.
        Throws:
        FileSystemException - if an error occurs.
      • VFSClassLoader

        public VFSClassLoader​(FileObject[] files,
                              FileSystemManager manager,
                              java.lang.ClassLoader parent)
                       throws FileSystemException
        Constructors a new VFSClassLoader for the given FileObjects. The FileObjects will be searched in the order specified.
        Parameters:
        files - the FileObjects to load the classes and resources from.
        manager - the FileManager to use when trying create a layered Jar file system.
        parent - the parent class loader for delegation.
        Throws:
        FileSystemException - if an error occurs.
    • Method Detail

      • getFileObjects

        public FileObject[] getFileObjects()
        Provide access to the file objects this class loader represents.
        Returns:
        An array of FileObjects.
        Since:
        2.0
      • addFileObjects

        private void addFileObjects​(FileSystemManager manager,
                                    FileObject[] files)
                             throws FileSystemException
        Appends the specified FileObjects to the list of FileObjects to search for classes and resources.
        Parameters:
        manager - The FileSystemManager.
        files - the FileObjects to append to the search path.
        Throws:
        FileSystemException - if an error occurs.
      • findClass

        protected java.lang.Class<?> findClass​(java.lang.String name)
                                        throws java.lang.ClassNotFoundException
        Finds and loads the class with the specified name from the search path.
        Overrides:
        findClass in class java.lang.ClassLoader
        Throws:
        java.lang.ClassNotFoundException - if the class is not found.
      • defineClass

        private java.lang.Class<?> defineClass​(java.lang.String name,
                                               Resource res)
                                        throws java.io.IOException
        Loads and verifies the class with name and located with res.
        Throws:
        java.io.IOException
      • getPermissions

        protected java.security.PermissionCollection getPermissions​(java.security.CodeSource cs)
        Calls super.getPermissions both for the code source and also adds the permissions granted to the parent layers.
        Overrides:
        getPermissions in class java.security.SecureClassLoader
        Parameters:
        cs - the CodeSource.
        Returns:
        The PermissionCollections.
      • copyPermissions

        protected void copyPermissions​(java.security.PermissionCollection src,
                                       java.security.PermissionCollection dest)
        Copies the permissions from src to dest.
        Parameters:
        src - The source PermissionCollection.
        dest - The destination PermissionCollection.
      • lookupFileObject

        private FileObject lookupFileObject​(java.lang.String name)
        Does a reverse lookup to find the FileObject when we only have the URL.
      • findResource

        protected java.net.URL findResource​(java.lang.String name)
        Finds the resource with the specified name from the search path. This returns null if the resource is not found.
        Overrides:
        findResource in class java.lang.ClassLoader
        Parameters:
        name - The resource name.
        Returns:
        The URL that matches the resource.
      • findResources

        protected java.util.Enumeration<java.net.URL> findResources​(java.lang.String name)
                                                             throws java.io.IOException
        Returns an Enumeration of all the resources in the search path with the specified name.

        Gets called from ClassLoader.getResources(String) after parent class loader was questioned.

        Overrides:
        findResources in class java.lang.ClassLoader
        Parameters:
        name - The resources to find.
        Returns:
        An Enumeration of the resources associated with the name.
        Throws:
        FileSystemException - if an error occurs.
        java.io.IOException
      • loadResource

        private Resource loadResource​(java.lang.String name)
                               throws FileSystemException
        Searches through the search path of for the first class or resource with specified name.
        Parameters:
        name - The resource to load.
        Returns:
        The Resource.
        Throws:
        FileSystemException - if an error occurs.