Refactor DataResourceProvider visiting of a zip archive

Change-Id: Ic132aa035e6477db1432ad27f0493ad73edb6da2
diff --git a/src/main/java/com/android/tools/r8/ArchiveClassFileProvider.java b/src/main/java/com/android/tools/r8/ArchiveClassFileProvider.java
index 819cbb5..43fbaa1 100644
--- a/src/main/java/com/android/tools/r8/ArchiveClassFileProvider.java
+++ b/src/main/java/com/android/tools/r8/ArchiveClassFileProvider.java
@@ -29,7 +29,6 @@
 import java.util.Set;
 import java.util.function.Predicate;
 import java.util.zip.ZipEntry;
-import java.util.zip.ZipException;
 import java.util.zip.ZipFile;
 
 /**
@@ -116,29 +115,7 @@
 
   @Override
   public void accept(Visitor resourceBrowser) throws ResourceException {
-    try (ZipFile zipFile = FileUtils.createZipFile(archive.toFile(), StandardCharsets.UTF_8)) {
-      final Enumeration<? extends ZipEntry> entries = zipFile.entries();
-      while (entries.hasMoreElements()) {
-        ZipEntry entry = entries.nextElement();
-        String name = entry.getName();
-        if (!ZipUtils.isClassFile(name)) {
-          if (entry.isDirectory()) {
-            resourceBrowser.visit(DataDirectoryResource.fromZip(zipFile, entry));
-          } else {
-            resourceBrowser.visit(DataEntryResource.fromZip(zipFile, entry));
-          }
-        }
-      }
-    } catch (ZipException e) {
-      throw new ResourceException(
-          origin,
-          new CompilationError("Zip error while reading '" + archive + "': " + e.getMessage(), e));
-    } catch (IOException e) {
-      throw new ResourceException(
-          origin,
-          new CompilationError(
-              "I/O exception while reading '" + archive + "': " + e.getMessage(), e));
-    }
+    ZipUtils.visitWithResourceBrowser(archive, origin, resourceBrowser);
   }
 
   private void reopenZipFile() throws IOException {
diff --git a/src/main/java/com/android/tools/r8/utils/ArchiveResourceProvider.java b/src/main/java/com/android/tools/r8/utils/ArchiveResourceProvider.java
index b73119d..b5b9f3e 100644
--- a/src/main/java/com/android/tools/r8/utils/ArchiveResourceProvider.java
+++ b/src/main/java/com/android/tools/r8/utils/ArchiveResourceProvider.java
@@ -5,8 +5,6 @@
 
 import static com.android.tools.r8.utils.FileUtils.isArchive;
 
-import com.android.tools.r8.DataDirectoryResource;
-import com.android.tools.r8.DataEntryResource;
 import com.android.tools.r8.DataResourceProvider;
 import com.android.tools.r8.ProgramResource;
 import com.android.tools.r8.ProgramResource.Kind;
@@ -117,27 +115,7 @@
 
   @Override
   public void accept(Visitor resourceBrowser) throws ResourceException {
-    try (ZipFile zipFile =
-        FileUtils.createZipFile(archive.getPath().toFile(), StandardCharsets.UTF_8)) {
-      final Enumeration<? extends ZipEntry> entries = zipFile.entries();
-      while (entries.hasMoreElements()) {
-        ZipEntry entry = entries.nextElement();
-        String name = entry.getName();
-        if (archive.matchesFile(name) && !isProgramResourceName(name)) {
-          if (entry.isDirectory()) {
-            resourceBrowser.visit(DataDirectoryResource.fromZip(zipFile, entry));
-          } else {
-            resourceBrowser.visit(DataEntryResource.fromZip(zipFile, entry));
-          }
-        }
-      }
-    } catch (ZipException e) {
-      throw new ResourceException(origin, new CompilationError(
-          "Zip error while reading '" + archive + "': " + e.getMessage(), e));
-    } catch (IOException e) {
-      throw new ResourceException(origin, new CompilationError(
-          "I/O exception while reading '" + archive + "': " + e.getMessage(), e));
-    }
+    ZipUtils.visitWithResourceBrowser(archive.getPath(), origin, resourceBrowser);
   }
 
   private boolean isProgramResourceName(String name) {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalArchiveClassFileProvider.java b/src/main/java/com/android/tools/r8/utils/InternalArchiveClassFileProvider.java
index 7685a95..db5a798 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalArchiveClassFileProvider.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalArchiveClassFileProvider.java
@@ -7,8 +7,6 @@
 import static com.android.tools.r8.utils.FileUtils.isArchive;
 
 import com.android.tools.r8.ClassFileResourceProvider;
-import com.android.tools.r8.DataDirectoryResource;
-import com.android.tools.r8.DataEntryResource;
 import com.android.tools.r8.DataResourceProvider;
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.ProgramResource;
@@ -143,22 +141,6 @@
 
   @Override
   public void accept(Visitor resourceBrowser) throws ResourceException {
-    try {
-      ZipUtils.iterWithZipFile(
-          path,
-          (zipFile, entry) -> {
-            if (!ZipUtils.isClassFile(entry.getName())) {
-              if (entry.isDirectory()) {
-                resourceBrowser.visit(DataDirectoryResource.fromZip(zipFile, entry));
-              } else {
-                resourceBrowser.visit(DataEntryResource.fromZip(zipFile, entry));
-              }
-            }
-          });
-    } catch (IOException e) {
-      throw new ResourceException(
-          origin,
-          new CompilationError("I/O exception while reading '" + path + "': " + e.getMessage(), e));
-    }
+    ZipUtils.visitWithResourceBrowser(path, origin, resourceBrowser);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/utils/ZipUtils.java b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
index fb33e96..253ba73 100644
--- a/src/main/java/com/android/tools/r8/utils/ZipUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
@@ -10,10 +10,12 @@
 import com.android.tools.r8.ByteDataView;
 import com.android.tools.r8.DataDirectoryResource;
 import com.android.tools.r8.DataEntryResource;
+import com.android.tools.r8.DataResourceProvider.Visitor;
 import com.android.tools.r8.ProgramResource;
 import com.android.tools.r8.ResourceException;
 import com.android.tools.r8.androidapi.AndroidApiDataAccess;
 import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.references.ClassReference;
 import com.google.common.io.ByteStreams;
 import com.google.common.io.Closer;
@@ -44,6 +46,7 @@
 import java.util.stream.StreamSupport;
 import java.util.zip.CRC32;
 import java.util.zip.ZipEntry;
+import java.util.zip.ZipException;
 import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
 
@@ -392,4 +395,29 @@
     }
     return -1;
   }
+
+  public static void visitWithResourceBrowser(Path path, Origin origin, Visitor resourceBrowser)
+      throws ResourceException {
+    try {
+      ZipUtils.iterWithZipFile(
+          path,
+          (zipFile, entry) -> {
+            if (!ZipUtils.isClassFile(entry.getName())) {
+              if (entry.isDirectory()) {
+                resourceBrowser.visit(DataDirectoryResource.fromZip(zipFile, entry));
+              } else {
+                resourceBrowser.visit(DataEntryResource.fromZip(zipFile, entry));
+              }
+            }
+          });
+    } catch (ZipException e) {
+      throw new ResourceException(
+          origin,
+          new CompilationError("Zip error while reading '" + path + "': " + e.getMessage(), e));
+    } catch (IOException e) {
+      throw new ResourceException(
+          origin,
+          new CompilationError("I/O exception while reading '" + path + "': " + e.getMessage(), e));
+    }
+  }
 }