code: @Nonnull
      public static String getDigestOf(@Nonnull InputStream source) throws IOException {
          try {
              MessageDigest md5 = MessageDigest.getInstance("MD5");
              DigestInputStream in = new DigestInputStream(source, md5);
              // Note: IOUtils.copy() buffers the input internally, so there is no
              // need to use a BufferedInputStream.
              IOUtils.copy(in, NullOutputStream.NULL_OUTPUT_STREAM);
              return toHexString(md5.digest());
          } catch (NoSuchAlgorithmException e) {
              throw new IOException("MD5 not installed",e);    // impossible
          } finally {
              source.close();
          }
          /* JENKINS-18178: confuses Maven 2 runner
          try {
              return DigestUtils.md5Hex(source);
          } finally {
              source.close();
          }
          */
      }
docs: Computes MD5 digest of the given input stream.
  
  @param source
  The stream will be closed by this method at the end of this method.
  @return
  32-char wide string
  @see DigestUtils#md5Hex(InputStream)