Class SHASum

    • Method Detail

      • updateDigest

        public static long updateDigest​(MessageDigest digest,
                                        List<String> filenames)
                                 throws IOException
        Updates the given digest with the bytes contained by the files denoted by the given filenames in the given order.

        To retrieve the list of all files traversing through directories, one may use IOUtil.filesOf(List, List, List).

        The SHA implementation is sensitive to the order of input bytes and hence the given filename order.

        It is advised to pass given list of filenames in lexicographically sorted order to ensure reproducible outcome across all platforms, one may use sort(ArrayList).

        As an example, one could write

         final MessageDigest digest = ...;
         final long totalBytes = updateDigest(digest, sort(IOUtil.filesOf(Arrays.asList("sources"), null, null)));
         

        Parameters:
        digest - to be updated digest
        filenames - list of filenames denoting files, which bytes will be used to update the digest
        Returns:
        total number of bytes read.
        Throws:
        FileNotFoundException - see FileInputStream(String)
        IOException - see InputStream.read(byte[])
      • toHexString

        public static StringBuilder toHexString​(byte[] shasum,
                                                StringBuilder sb)
        Simple helper to print the given byte-array into a string, here appended to StringBuilder
        Parameters:
        shasum - the given byte-array
        sb - optional pre-existing StringBuilder, may be null
        Returns:
        return given or new StringBuilder with appended hex-string
      • sort

        public static List<String> sort​(ArrayList<String> source)
        Returns the sorted list of given strings using String.compareTo(String)'s lexicographically comparison.
        Parameters:
        source - given input strings
        Returns:
        sorted list of given strings
      • compute

        public final byte[] compute​(boolean verbose)
                             throws IOException
        Implementation gathers all files traversing through given paths via IOUtil.filesOf(List, List, List), sorts the resulting file list via sort(ArrayList) and finally calculates the SHA sum over its byte content via updateDigest(MessageDigest, List).

        This ensures identical SHA sums over same contents within given paths across machines.

        This method is heavyweight and performs all operations.

        Parameters:
        verbose - if true, all used files will be dumped as well as the digest result
        Returns:
        the resulting SHA value
        Throws:
        IOException
      • getOrigins

        public final List<String> getOrigins()
      • getExcludes

        public final List<Pattern> getExcludes()
      • getIncludes

        public final List<Pattern> getIncludes()
      • main

        public static void main​(String[] args)
                         throws IOException
        Main entry point taking var-arg path or gnu-arguments with a leading '--'.

        Implementation gathers all files traversing through given paths via IOUtil.filesOf(List, List, List), sorts the resulting file list via sort(ArrayList) and finally calculates the SHA sum over its byte content via updateDigest(MessageDigest, List). This ensures identical SHA sums over same contents within given paths.

        Example to calculate the SHA-256 over our source files as performed for JogampVersion.getImplementationSHASources()

         java -cp build/gluegen-rt.jar com.jogamp.common.util.SHASum --algorithm 256 --exclude ".*\\.log" --exclude "make/lib/toolchain" src jcpp/src make
         

        To validate the implementation, one can gather the sorted list of files (to ensure same order)

         java -cp build/gluegen-rt.jar com.jogamp.common.util.SHASum --listfilesonly --exclude ".*\\.log" --exclude "make/lib/toolchain" src jcpp/src make >& java.sorted.txt
         
        and then calculate the shasum independently
         find `cat java.sorted.txt` -exec cat {} + | shasum -a 256 -b - | awk '{print $1}'
         

        Parameters:
        args -
        Throws:
        IOException
        URISyntaxException
        IllegalArgumentException