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));
+ }
+ }
}