Class JarUtil


  • public class JarUtil
    extends Object
    • Constructor Detail

      • JarUtil

        public JarUtil()
    • Method Detail

      • hasJarUri

        public static boolean hasJarUri​(String clazzBinName,
                                        ClassLoader cl)
        Returns true if the Class's "com.jogamp.common.GlueGenVersion" is loaded from a JarFile and hence has a Jar URI like URI jar:sub_protocol:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class".

        sub_protocol may be "file", "http", etc..

        Parameters:
        clazzBinName - "com.jogamp.common.GlueGenVersion"
        cl -
        Returns:
        true if the class is loaded from a Jar file, otherwise false.
      • getJarUri

        public static Uri getJarUri​(String clazzBinName,
                                    ClassLoader cl)
                             throws IllegalArgumentException,
                                    IOException,
                                    URISyntaxException
        The Class's "com.jogamp.common.GlueGenVersion" Uri jar:sub_protocol:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class" will be returned.

        sub_protocol may be "file", "http", etc..

        Parameters:
        clazzBinName - "com.jogamp.common.GlueGenVersion"
        cl - ClassLoader to locate the JarFile
        Returns:
        "jar:sub_protocol:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class"
        Throws:
        IllegalArgumentException - if the Uri doesn't match the expected formatting or null arguments
        IOException - if the class's Jar file could not been found by the ClassLoader
        URISyntaxException - if the Uri could not be translated into a RFC 2396 Uri
      • getJarBasename

        public static Uri.Encoded getJarBasename​(Uri classJarUri)
                                          throws IllegalArgumentException
        The Class's Jar Uri jar:sub_protocol:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class Jar basename gluegen-rt.jar will be returned.

        sub_protocol may be "file", "http", etc..

        Parameters:
        classJarUri - as retrieved w/ getJarUri("com.jogamp.common.GlueGenVersion", cl), i.e. jar:sub_protocol:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class
        Returns:
        gluegen-rt.jar
        Throws:
        IllegalArgumentException - if the Uri doesn't match the expected formatting or is null
      • getJarBasename

        public static Uri.Encoded getJarBasename​(String clazzBinName,
                                                 ClassLoader cl)
                                          throws IllegalArgumentException,
                                                 IOException,
                                                 URISyntaxException
        The Class's com.jogamp.common.GlueGenVersion Uri jar:sub_protocol:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class Jar basename gluegen-rt.jar will be returned.

        sub_protocol may be "file", "http", etc..

        Parameters:
        clazzBinName - com.jogamp.common.GlueGenVersion
        cl -
        Returns:
        gluegen-rt.jar
        Throws:
        IllegalArgumentException - if the Uri doesn't match the expected formatting
        IOException - if the class's Jar file could not been found by the ClassLoader.
        URISyntaxException - if the Uri could not be translated into a RFC 2396 Uri
      • getJarEntry

        public static Uri.Encoded getJarEntry​(Uri classJarUri)
        The Class's Jar Uri jar:sub_protocol:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class Jar file's entry /com/jogamp/common/GlueGenVersion.class will be returned.
        Parameters:
        classJarUri - as retrieved w/ getJarUri("com.jogamp.common.GlueGenVersion", cl), i.e. jar:sub_protocol:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class
        Returns:
        /com/jogamp/common/GlueGenVersion.class
      • getJarFileUri

        public static Uri getJarFileUri​(String clazzBinName,
                                        ClassLoader cl)
                                 throws IllegalArgumentException,
                                        IOException,
                                        URISyntaxException
        The Class's "com.jogamp.common.GlueGenVersion" Uri jar:sub_protocol:/some/path/gluegen-rt.jar!/com/jogamp/common/GlueGenVersion.class" Jar file Uri jar:sub_protocol:/some/path/gluegen-rt.jar!/ will be returned.

        sub_protocol may be "file", "http", etc..

        Parameters:
        clazzBinName - "com.jogamp.common.GlueGenVersion"
        cl -
        Returns:
        "jar:sub_protocol:/some/path/gluegen-rt.jar!/"
        Throws:
        IllegalArgumentException - if the Uri doesn't match the expected formatting or null arguments
        IOException - if the class's Jar file could not been found by the ClassLoader
        URISyntaxException - if the Uri could not be translated into a RFC 2396 Uri
      • getRelativeOf

        public static Uri getRelativeOf​(Class<?> classFromJavaJar,
                                        Uri.Encoded cutOffInclSubDir,
                                        Uri.Encoded relResPath)
                                 throws IllegalArgumentException,
                                        IOException,
                                        URISyntaxException
        Locates the Jar file Uri of a given resource relative to a given class's Jar's Uri.
           class's jar url path + cutOffInclSubDir + relResPath,
         
        or with cutOffInclSubDir being null just
           class's jar url path + relResPath,
         
        Example #1
           classFromJavaJar = com.lighting.Test (in: file:/storage/TestLighting.jar)
           cutOffInclSubDir = null
           relResPath       = LightAssets.jar
           Result           : file:/storage/LightAssets.jar
         
        Example #2
           classFromJavaJar = com.lighting.Test (in: file:/storage/TestLighting.jar)
           cutOffInclSubDir = lights/
           relResPath       = LightAssets.jar
           Result           : file:/storage/lights/LightAssets.jar
         
        Example #3
           classFromJavaJar = com.lighting.Test (in: file:/storage/lights/TestLighting.jar)
           cutOffInclSubDir = lights/
           relResPath       = LightAssets.jar
           Result           : file:/storage/lights/LightAssets.jar
         
        TODO: Enhance documentation!
        Parameters:
        classFromJavaJar - Used to get the root Uri for the class's Jar Uri.
        cutOffInclSubDir - Optional cut off included sub-directory prepending the relative resource path. If the root Uri includes cutOffInclSubDir, it is no more added to the result. Parameter will be ignored if null.
        relResPath - The relative resource path. (Uri encoded)
        Returns:
        The resulting resource Uri, which is not tested.
        Throws:
        IllegalArgumentException
        IOException
        URISyntaxException
      • getNativeLibNames

        public static Map<String,​String> getNativeLibNames​(JarFile jarFile)
        Return a map from native-lib-base-name to entry-name.
      • extract

        public static final int extract​(File dest,
                                        Map<String,​String> nativeLibMap,
                                        JarFile jarFile,
                                        String nativeLibraryPath,
                                        boolean extractNativeLibraries,
                                        boolean extractClassFiles,
                                        boolean extractOtherFiles)
                                 throws IOException
        Extract the files of the given jar file.

        If extractNativeLibraries is true, native libraries are added to the given nativeLibMap with the base name to temp file location.
        A file is identified as a native library, if it's name complies with the running platform's native library naming scheme.
        Root entries are favored over non root entries in case of naming collisions.
        Example on a Unix like machine:

           mylib.jar!/sub1/libsour.so   -> sour  (mapped, unique name)
           mylib.jar!/sub1/libsweet.so           (dropped, root entry favored)
           mylib.jar!/libsweet.so       -> sweet (mapped, root entry favored)
           mylib.jar!/sweet.dll         ->       (dropped, not a unix library name)
         

        In order to be compatible with Java Web Start, we need to extract all root entries from the jar file.
        In this case, set all flags to true extractNativeLibraries . extractClassFiles, extractOtherFiles.

        Parameters:
        dest -
        nativeLibMap -
        jarFile -
        nativeLibraryPath - if not null, only extracts native libraries within this path.
        extractNativeLibraries -
        extractClassFiles -
        extractOtherFiles -
        deepDirectoryTraversal -
        Returns:
        Throws:
        IOException
      • validateCertificates

        public static final void validateCertificates​(Certificate[] rootCerts,
                                                      JarFile jarFile)
                                               throws IOException,
                                                      SecurityException
        Validate the certificates for each native Lib in the jar file. Throws an IOException if any certificate is not valid.
                Certificate[] rootCerts = Something.class.getProtectionDomain().
                                                getCodeSource().getCertificates();
               
        Throws:
        IOException
        SecurityException