content: package gadgetinspector.jackson;
  
  import gadgetinspector.ConfigHelper;
  import gadgetinspector.SourceDiscovery;
  import gadgetinspector.data.ClassReference;
  import gadgetinspector.data.GraphCall;
  import gadgetinspector.data.InheritanceMap;
  import gadgetinspector.data.MethodReference;
  import gadgetinspector.data.Source;
  
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.nio.file.Files;
  import java.nio.file.Paths;
  import java.util.HashSet;
  import java.util.Map;
  import java.util.Set;
  
  public class JacksonSourceDiscovery extends SourceDiscovery {
  
      public static final Set<String> skipList = new HashSet<>();
  
      static {
          if (!ConfigHelper.skipSourcesFile.isEmpty()) {
              try(BufferedReader bufferedReader = Files.newBufferedReader(Paths.get(ConfigHelper.skipSourcesFile))) {
                  String line;
                  while ((line = bufferedReader.readLine()) != null) {
                      String c;
                      if (!(c = line.split("#")[0].trim()).isEmpty()) {
                          skipList.add(line.trim());
                      }
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
  
      @Override
      public void discover(Map<ClassReference.Handle, ClassReference> classMap,
                           Map<MethodReference.Handle, MethodReference> methodMap,
                           InheritanceMap inheritanceMap, Map<MethodReference.Handle, Set<GraphCall>> graphCallMap) {
  
          final JacksonSerializableDecider serializableDecider = new JacksonSerializableDecider(methodMap);
  
          for (MethodReference.Handle method : methodMap.keySet()) {
              if (skipList.contains(method.getClassReference().getName())) {
                  continue;
              }
              if (serializableDecider.apply(method.getClassReference())) {
                  if (method.getName().equals("<init>") && method.getDesc().equals("()V")) {
                      addDiscoveredSource(new Source(method, 0));
                  }
                  if (method.getName().startsWith("get") && method.getDesc().startsWith("()")) {
                      addDiscoveredSource(new Source(method, 0));
                  }
                  if (method.getName().startsWith("set") && method.getDesc().matches("\\(L[^;]*;\\)V")) {
                      addDiscoveredSource(new Source(method, 0));
                  }
              }
          }
      }
  
  }
  