public void process(File f) throws Exception {
      if (f.isDirectory()) {
        File[] files =
            f.listFiles(
                new FilenameFilter() {

                  @Override
                  public boolean accept(File dir, String name) {
                    return name.matches(FILE_PATTERN);
                  }
                });
        for (File ff : files) {
          byte[] bindingBytes = Files.toByteArray(ff);
          this.addCurrentBinding(bindingBytes, ff.getName(), "file:" + ff.getAbsolutePath());
        }
      } else {
        String digest = new BigInteger(Files.getDigest(f, Digest.MD5.get())).abs().toString(16);
        CURRENT_PROPS.put(BINDING_CACHE_JAR_PREFIX + f.getName(), digest);
        final JarFile jar = new JarFile(f);
        final List<JarEntry> jarList = Collections.list(jar.entries());
        for (final JarEntry j : jarList) {
          try {
            if (j.getName().matches(FILE_PATTERN)) {
              byte[] bindingBytes = ByteStreams.toByteArray(jar.getInputStream(j));
              String bindingName = j.getName();
              String bindingFullPath = "jar:file:" + f.getAbsolutePath() + "!/" + bindingName;
              this.addCurrentBinding(bindingBytes, bindingName, bindingFullPath);
            } else if (j.getName().matches(".*\\.class.{0,1}")) {
              final String classGuess =
                  j.getName().replaceAll("/", ".").replaceAll("\\.class.{0,1}", "");
              final Class candidate = ClassLoader.getSystemClassLoader().loadClass(classGuess);
              if (MSG_BASE_CLASS.isAssignableFrom(candidate)
                  || MSG_DATA_CLASS.isAssignableFrom(candidate)) {
                InputSupplier<InputStream> classSupplier =
                    Resources.newInputStreamSupplier(ClassLoader.getSystemResource(j.getName()));
                File destClassFile = SubDirectory.CLASSCACHE.getChildFile(j.getName());
                if (!destClassFile.exists()) {
                  Files.createParentDirs(destClassFile);
                  Files.copy(classSupplier, destClassFile);
                  Logs.extreme()
                      .debug("Caching: " + j.getName() + " => " + destClassFile.getAbsolutePath());
                }
                BINDING_CLASS_MAP.putIfAbsent(classGuess, candidate);
              }
            }
          } catch (RuntimeException ex) {
            LOG.error(ex, ex);
            jar.close();
            throw ex;
          }
        }
        jar.close();
      }
    }
  public void find(String binFile, List<SourceFileResult> results) {
    File bin = new File(binFile);
    String url = null;
    String fileDownloaded = null;

    try {
      if (canceled) return;
      InputStream is2 = null;
      String md5;
      try {
        md5 = new String(Hex.encodeHex(Files.getDigest(bin, MessageDigest.getInstance("MD5"))));
        String serviceUrl = SERVICE + "/rest/libraries?md5=" + md5;
        is2 = new URL(serviceUrl).openStream();
        String str = IOUtils.toString(is2);
        JSONArray json = JSONArray.fromObject(str);

        for (int i = 0; i < json.size(); i++) {
          if (canceled) return;
          JSONObject obj = (JSONObject) json.get(i);
          JSONObject source = obj.getJSONObject("source");
          if (source != null && !source.isNullObject()) {
            JSONArray ar = source.getJSONArray("urls");
            if (ar != null && !ar.isEmpty()) {
              String url1 = ar.getString(0);
              String tmpFile = new UrlDownloader().download(url1);
              if (tmpFile != null && isSourceCodeFor(tmpFile, bin.getAbsolutePath())) {
                fileDownloaded = tmpFile;
                url = url1;
                break;
              }
            }
          }
        }

        if (url != null && fileDownloaded != null) {
          String name = url.substring(url.lastIndexOf('/') + 1);

          SourceFileResult object = new SourceFileResult(binFile, fileDownloaded, name, 90);
          Logger.debug(this.toString() + " FOUND: " + object, null);
          results.add(object);
        }

      } finally {
        IOUtils.closeQuietly(is2);
      }

    } catch (Exception e) {
      e.printStackTrace();
    }
  }