public class SHASum extends Object
See updateDigest(MessageDigest, List)
This implementation is being utilized at JogAmp build time to produce various
SHA sums over sources, class files and native libraries to ensure their identity.
See JogampVersion.getImplementationSHASources()
,
JogampVersion.getImplementationSHAClasses()
and JogampVersion.getImplementationSHANatives()
.
JogampVersion.getImplementationSHASources()
for module gluegen is produced via:
java -cp build/gluegen-rt.jar com.jogamp.common.util.SHASum --algorithm 256 --exclude ".\*\.log" --exclude "make/lib/toolchain" src jcpp/src make
Modifier and Type | Class and Description |
---|---|
static class |
SHASum.TempJarSHASum
SHASum specialization utilizing TempJarCache to access jar file content for SHA computation |
Constructor and Description |
---|
SHASum(MessageDigest digest,
List<String> origins,
List<Pattern> excludes,
List<Pattern> includes)
Instance to ensure proper
compute(boolean) of identical SHA sums over same contents within given paths across machines. |
Modifier and Type | Method and Description |
---|---|
byte[] |
compute(boolean verbose)
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) . |
List<Pattern> |
getExcludes() |
List<Pattern> |
getIncludes() |
List<String> |
getOrigins() |
static void |
main(String[] args)
Main entry point taking var-arg path or gnu-arguments with a leading '--'.
|
static List<String> |
sort(ArrayList<String> source)
Returns the sorted list of given strings using
String.compareTo(String) 's lexicographically comparison. |
static StringBuilder |
toHexString(byte[] shasum,
StringBuilder sb)
Simple helper to print the given byte-array into a string, here appended to StringBuilder
|
static long |
updateDigest(MessageDigest digest,
List<String> filenames)
Updates the given digest
with the bytes contained by the files denoted by the given filenames in the given order. |
public SHASum(MessageDigest digest, List<String> origins, List<Pattern> excludes, List<Pattern> includes)
compute(boolean)
of identical SHA sums over same contents within given paths across machines.
Instantiation of this class is lightweight, compute(boolean)
performs all operations.
digest
- the SHA algorithmorigins
- the mandatory path origins to be used for IOUtil.filesOf(List, List, List)
excludes
- the optional exclude patterns to be used for IOUtil.filesOf(List, List, List)
includes
- the optional include patterns to be used for IOUtil.filesOf(List, List, List)
IllegalArgumentException
IOException
URISyntaxException
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)));
digest
- to be updated digestfilenames
- list of filenames denoting files, which bytes will be used to update the digestFileNotFoundException
- see FileInputStream.FileInputStream(String)
IOException
- see InputStream.read(byte[])
public static StringBuilder toHexString(byte[] shasum, StringBuilder sb)
shasum
- the given byte-arraysb
- optional pre-existing StringBuilder, may be nullpublic static List<String> sort(ArrayList<String> source)
String.compareTo(String)
's lexicographically comparison.source
- given input stringspublic final byte[] compute(boolean verbose) throws IOException
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.
verbose
- if true, all used files will be dumped as well as the digest resultIOException
public static void main(String[] args) 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.
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.txtand then calculate the shasum independently
find `cat java.sorted.txt` -exec cat {} + | shasum -a 256 -b - | awk '{print $1}'
args
- IOException
URISyntaxException
IllegalArgumentException