Bug 561086: [Resources] add method to calculate a hash over a file added getChecksum() Change-Id: Ic360708f687427394de6c62cbd59e5190406f58f
diff --git a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/ResourcesModule.java b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/ResourcesModule.java index b6db65f..ae3257e 100644 --- a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/ResourcesModule.java +++ b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/ResourcesModule.java
@@ -22,6 +22,9 @@ import java.nio.file.SimpleFileVisitor; import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; +import java.security.DigestInputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -1078,4 +1081,50 @@ return targetDirectory; } + + /** + * Get an MD5 checksum over a readable resource. + * + * @param location + * location of resource to create checksum for + * @return file hash as hex encoded string + * @throws NoSuchAlgorithmException + * when MD5 digest cannot be found + * @throws IOException + * when resource cannot be read + */ + @WrapToScript + public String getChecksum(Object location) throws NoSuchAlgorithmException, IOException { + final Object resolvedLocation = ResourceTools.resolve(location, getScriptEngine().getExecutedFile()); + try (InputStream input = ResourceTools.getInputStream(resolvedLocation)) { + if (input != null) { + final MessageDigest digest = MessageDigest.getInstance("MD5"); + final DigestInputStream digestInputStream = new DigestInputStream(input, digest); + + final byte[] buffer = new byte[8 * 1024]; + int readBytes; + do { + readBytes = digestInputStream.read(buffer); + } while (readBytes > 0); + + return byteArrayToHexString(digest.digest()); + } + + throw new IOException("Location \"" + location + "\" cannot be accessed."); + } + } + + private String byteArrayToHexString(byte[] bytes) { + final StringBuilder builder = new StringBuilder(); + + for (final byte b : bytes) { + final String token = Integer.toHexString(b); + if (token.length() == 1) + builder.append('0'); + + builder.append(token.substring(Math.max(token.length() - 2, 0))); + } + + return builder.toString(); + } }