diff --git a/build.sbt b/build.sbt index 9211404..378f96c 100644 --- a/build.sbt +++ b/build.sbt @@ -139,18 +139,15 @@ val outputFile = workDir / warName IO jar (contentMappings, outputFile, manifest) - // patch ChecksumHelper to allow sha256 - val hack = classOf[ChecksumHelper] getDeclaredField "algorithms" - hack setAccessible true - val algos = (hack get null).asInstanceOf[java.util.Map[String,String]] - algos put ("sha256", "SHA-256") - // generate checksums - Seq("md5", "sha1", "sha256") foreach { algorithm => - IO.write( - workDir / (warName + "." + algorithm), - ChecksumHelper computeAsString (outputFile, algorithm) - ) + Seq( + "md5" -> "MD5", + "sha1" -> "SHA-1", + "sha256" -> "SHA-256" + ) + .foreach { case (extension, algorithm) => + val checksumFile = workDir / (warName + "." + extension) + Checksums generate (outputFile, checksumFile, algorithm) } // done diff --git a/project/Checksums.scala b/project/Checksums.scala new file mode 100644 index 0000000..dc9d849 --- /dev/null +++ b/project/Checksums.scala @@ -0,0 +1,34 @@ +import java.security.MessageDigest; +import scala.annotation._ +import sbt._ +import sbt.Using._ + +object Checksums { + private val bufferSize = 2048 + + def generate(source:File, target:File, algorithm:String):Unit = + IO write (target, compute(source, algorithm)) + + def compute(file:File, algorithm:String):String = + hex(raw(file, algorithm)) + + def raw(file:File, algorithm:String):Array[Byte] = + (Using fileInputStream file) { is => + val md = MessageDigest getInstance algorithm + val buf = new Array[Byte](bufferSize) + md.reset() + @tailrec + def loop() { + val len = is read buf + if (len != -1) { + md update (buf, 0, len) + loop() + } + } + loop() + md.digest() + } + + def hex(bytes:Array[Byte]):String = + bytes map { it => "%02x" format (it.toInt & 0xff) } mkString "" +}