code: @Override
      public Optional<String> hash(final Optional<URL> url) throws IOException {
          if (!url.isPresent()) {
              return Optional.absent();
          }
          logger.debug("Calculating md5 hash, url:{}", url);
          if (isHotReloadModeOff()) {
              final String md5 = cache.getIfPresent(url.get());
  
              logger.debug("md5 hash:{}", md5);
  
              if (md5 != null) {
                  return Optional.of(md5);
              }
          }
  
          final InputStream is = url.get().openStream();
          final String md5 = getMD5Checksum(is);
  
          if (isHotReloadModeOff()) {
              logger.debug("caching url:{} with hash:{}", url, md5);
  
              cache.put(url.get(), md5);
          }
  
          return Optional.fromNullable(md5);
      }
docs: Calculates a md5 hash for an url
  
  If a passed in url is absent then this method will return absent as well
  
  @param url - an url to a soy template file
  @return - md5 checksum of a template file
  @throws IOException - in a case there is an IO error calculating md5 checksum