Refactor the API database building to use a builder

Change-Id: Ida7f602c5b4de7b53db8f3e348d254c2094433b1
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
index 0521f40..0dda84b2 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
@@ -79,8 +79,12 @@
 
   private static GenerateDatabaseResourceFilesResult generateResourcesFiles() throws Exception {
     return generateResourcesFiles(
-        AndroidApiVersionsXmlParser.getParsedApiClasses(
-            ToolHelper.getApiVersionsXmlFile(API_LEVEL).toFile(), API_LEVEL),
+        AndroidApiVersionsXmlParser.builder()
+            .setApiVersionsXml(ToolHelper.getApiVersionsXmlFile(API_LEVEL))
+            .setAndroidJar(ToolHelper.getAndroidJar(API_LEVEL))
+            .setApiLevel(API_LEVEL)
+            .build()
+            .run(),
         API_LEVEL);
   }
 
@@ -98,8 +102,12 @@
     // This tests makes a rudimentary check on the number of classes, fields and methods in
     // api-versions.xml to ensure that the runtime tests do not vacuously succeed.
     List<ParsedApiClass> parsedApiClasses =
-        AndroidApiVersionsXmlParser.getParsedApiClasses(
-            ToolHelper.getApiVersionsXmlFile(API_LEVEL).toFile(), API_LEVEL);
+        AndroidApiVersionsXmlParser.builder()
+            .setApiVersionsXml(ToolHelper.getApiVersionsXmlFile(API_LEVEL))
+            .setAndroidJar(ToolHelper.getAndroidJar(API_LEVEL))
+            .setApiLevel(API_LEVEL)
+            .build()
+            .run();
     IntBox numberOfFields = new IntBox(0);
     IntBox numberOfMethods = new IntBox(0);
     parsedApiClasses.forEach(
@@ -173,8 +181,12 @@
   @Test
   public void testCanLookUpAllParsedApiClassesAndMembers() throws Exception {
     List<ParsedApiClass> parsedApiClasses =
-        AndroidApiVersionsXmlParser.getParsedApiClasses(
-            ToolHelper.getApiVersionsXmlFile(API_LEVEL).toFile(), API_LEVEL);
+        AndroidApiVersionsXmlParser.builder()
+            .setApiVersionsXml(ToolHelper.getApiVersionsXmlFile(API_LEVEL))
+            .setAndroidJar(ToolHelper.getAndroidJar(API_LEVEL))
+            .setApiLevel(API_LEVEL)
+            .build()
+            .run();
     DexItemFactory factory = new DexItemFactory();
     TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
     AndroidApiLevelHashingDatabaseImpl androidApiLevelDatabase =
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
index e87664f..2d09844 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
@@ -6,7 +6,6 @@
 
 import static com.android.tools.r8.utils.FunctionUtils.ignoreArgument;
 
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.FieldReference;
 import com.android.tools.r8.references.MethodReference;
@@ -16,7 +15,7 @@
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.FieldSubject;
-import java.io.File;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.HashSet;
@@ -35,11 +34,48 @@
 
   private final List<ParsedApiClass> classes = new ArrayList<>();
 
-  private final File apiVersionsXml;
+  private final Path apiVersionsXml;
+  private final Path androidJar;
   private final AndroidApiLevel maxApiLevel;
 
-  private AndroidApiVersionsXmlParser(File apiVersionsXml, AndroidApiLevel maxApiLevel) {
+  static class Builder {
+    private Path apiVersionsXml;
+    private Path androidJar;
+    private AndroidApiLevel apiLevel;
+
+    Builder setApiVersionsXml(Path apiVersionsXml) {
+      this.apiVersionsXml = apiVersionsXml;
+      return this;
+    }
+
+    Builder setAndroidJar(Path androidJar) {
+      this.androidJar = androidJar;
+      return this;
+    }
+
+    Builder setApiLevel(AndroidApiLevel apiLevel) {
+      this.apiLevel = apiLevel;
+      return this;
+    }
+
+    AndroidApiVersionsXmlParser build() {
+      return new AndroidApiVersionsXmlParser(apiVersionsXml, androidJar, apiLevel);
+    }
+  }
+
+  public static Builder builder() {
+    return new Builder();
+  }
+
+  public List<ParsedApiClass> run() throws Exception {
+    readApiVersionsXmlFile();
+    return classes;
+  }
+
+  private AndroidApiVersionsXmlParser(
+      Path apiVersionsXml, Path androidJar, AndroidApiLevel maxApiLevel) {
     this.apiVersionsXml = apiVersionsXml;
+    this.androidJar = androidJar;
     this.maxApiLevel = maxApiLevel;
   }
 
@@ -62,9 +98,9 @@
   }
 
   private void readApiVersionsXmlFile() throws Exception {
-    CodeInspector inspector = new CodeInspector(ToolHelper.getAndroidJar(maxApiLevel));
+    CodeInspector inspector = new CodeInspector(androidJar);
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-    Document document = factory.newDocumentBuilder().parse(apiVersionsXml);
+    Document document = factory.newDocumentBuilder().parse(apiVersionsXml.toFile());
     NodeList classes = document.getElementsByTagName("class");
     Set<String> exemptionList = getDeletedTypesMissingRemovedAttribute();
     for (int i = 0; i < classes.getLength(); i++) {
@@ -177,13 +213,6 @@
     return defaultValue.max(getSince(node));
   }
 
-  public static List<ParsedApiClass> getParsedApiClasses(
-      File apiVersionsXml, AndroidApiLevel apiLevel) throws Exception {
-    AndroidApiVersionsXmlParser parser = new AndroidApiVersionsXmlParser(apiVersionsXml, apiLevel);
-    parser.readApiVersionsXmlFile();
-    return parser.classes;
-  }
-
   public static class ParsedApiClass {
 
     private final ClassReference classReference;