29package com.jogamp.common.util;
31import java.io.BufferedInputStream;
32import java.io.FileInputStream;
33import java.io.IOException;
34import java.io.FileNotFoundException;
35import java.io.InputStream;
36import java.net.URISyntaxException;
37import java.security.MessageDigest;
38import java.security.NoSuchAlgorithmException;
39import java.util.ArrayList;
40import java.util.Arrays;
42import java.util.Locale;
43import java.util.regex.Pattern;
45import com.jogamp.common.util.cache.TempFileCache;
46import com.jogamp.common.util.cache.TempJarCache;
48import jogamp.common.Debug;
74 private static final boolean DEBUG = Debug.debug(
"SHASum");
102 public static long updateDigest(
final MessageDigest digest,
final List<String> filenames)
throws IOException {
104 final byte buffer[] =
new byte[4096];
105 for(
int i=0; i<filenames.size(); i++) {
106 final InputStream in =
new BufferedInputStream(
new FileInputStream(filenames.get(i)));
110 if ((count = in.read(buffer)) == -1) {
113 digest.update(buffer, 0, count);
129 public static StringBuilder
toHexString(
final byte[] shasum, StringBuilder sb) {
131 sb =
new StringBuilder();
133 for(
int i=0; i<shasum.length; i++) {
134 sb.append(String.format((Locale)
null,
"%02x", shasum[i]));
144 public static List<String>
sort(
final ArrayList<String> source) {
145 final String s[] = source.toArray(
new String[source.size()]);
146 Arrays.sort(s, 0, s.length,
null);
147 return Arrays.asList(s);
150 final MessageDigest digest;
151 final List<String> origins;
152 final List<Pattern> excludes, includes;
168 public SHASum(
final MessageDigest digest,
final List<String> origins,
final List<Pattern> excludes,
final List<Pattern> includes) {
169 this.digest = digest;
170 this.origins = origins;
171 this.excludes = excludes;
172 this.includes = includes;
190 public final byte[]
compute(
final boolean verbose)
throws IOException {
193 for(
int i=0; i<fnamesS.size(); i++) {
194 System.err.println(fnamesS.get(i));
198 final byte[] shasum = digest.digest();
200 System.err.println(
"Digested "+numBytes+
" bytes, shasum size "+shasum.length+
" bytes");
201 System.err.println(
"Digested result: "+
SHASum.
toHexString(shasum,
null).toString());
232 public TempJarSHASum(
final MessageDigest digest,
final Class<?> jarclazz,
final List<Pattern> excludes,
final List<Pattern> includes)
233 throws SecurityException, IllegalArgumentException, IOException, URISyntaxException
240 public final String
getOrigin() {
return origins.get(0); }
272 public static void main(
final String[] args)
throws IOException {
273 boolean listFilesOnly =
false;
276 final ArrayList<String> pathU =
new ArrayList<String>();
277 final ArrayList<Pattern> excludes =
new ArrayList<Pattern>();
278 final ArrayList<Pattern> includes =
new ArrayList<Pattern>();
280 for(i=0; i<args.length; i++) {
281 if(
null != args[i]) {
282 if( args[i].startsWith(
"--") ) {
284 if( args[i].equals(
"--algorithm")) {
285 shabits = Integer.parseInt(args[++i]);
286 }
else if( args[i].equals(
"--exclude")) {
287 excludes.add(Pattern.compile(args[++i]));
289 System.err.println(
"adding exclude: <"+args[i]+
"> -> <"+excludes.get(excludes.size()-1)+
">");
291 }
else if( args[i].equals(
"--include")) {
292 includes.add(Pattern.compile(args[++i]));
294 System.err.println(
"adding include: <"+args[i]+
"> -> <"+includes.get(includes.size()-1)+
">");
296 }
else if( args[i].equals(
"--listfilesonly")) {
297 listFilesOnly =
true;
299 System.err.println(
"Abort, unknown argument: "+args[i]);
305 System.err.println(
"adding path: <"+args[i]+
">");
310 if( listFilesOnly ) {
312 for(i=0; i<fnamesS.size(); i++) {
313 System.out.println(fnamesS.get(i));
318 final String shaalgo =
"SHA-"+shabits;
319 final MessageDigest digest;
321 digest = MessageDigest.getInstance(shaalgo);
322 }
catch (
final NoSuchAlgorithmException e) {
323 System.err.println(
"Abort, implementation for "+shaalgo+
" not available: "+e.getMessage());
326 final SHASum shaSum =
new SHASum(digest, pathU, excludes, includes);
static String slashify(final String path, final boolean startWithSlash, final boolean endWithSlash)
static ArrayList< String > filesOf(final List< String > paths, final List< Pattern > excludes, final List< Pattern > includes)
Retrieve the list of all filenames traversing through given paths.
static Uri getJarFileUri(final String clazzBinName, final ClassLoader cl)
The Class's "com.jogamp.common.GlueGenVersion" Uri jar:sub_protocol:/some/path/gluegen-rt....
SHASum specialization utilizing TempJarCache to access jar file content for SHA computation
TempJarSHASum(final MessageDigest digest, final Class<?> jarclazz, final List< Pattern > excludes, final List< Pattern > includes)
Instance to ensure proper compute(boolean) of identical SHA sums over same contents within given path...
Utility class to produce secure hash (SHA) sums over diverse input sources.
final List< String > getOrigins()
final List< Pattern > getIncludes()
final byte[] compute(final boolean verbose)
Implementation gathers all files traversing through given paths via IOUtil#filesOf(List,...
SHASum(final MessageDigest digest, final List< String > origins, final List< Pattern > excludes, final List< Pattern > includes)
Instance to ensure proper compute(boolean) of identical SHA sums over same contents within given path...
static long updateDigest(final MessageDigest digest, final List< String > filenames)
Updates the given digest with the bytes contained by the files denoted by the given filenames in the ...
final List< Pattern > getExcludes()
static List< String > sort(final ArrayList< String > source)
Returns the sorted list of given strings using String#compareTo(String)'s lexicographically compariso...
static StringBuilder toHexString(final byte[] shasum, StringBuilder sb)
Simple helper to print the given byte-array into a string, here appended to StringBuilder.
static void main(final String[] args)
Main entry point taking var-arg path or gnu-arguments with a leading '–'.
File getTempDir()
Temporary directory for individual files (eg.
Static Jar file cache handler using an underlying instance of TempFileCache, see getTempFileCache().
static TempFileCache getTempFileCache()
static synchronized final void addAll(final Class<?> certClass, final Uri jarUri)
Adds all types, native libraries, class files and other files (resources) if not yet added.