Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1054)

Unified Diff: build/android/java_assertion_enabler/java/org/chromium/javaassertionenabler/AssertionEnabler.java

Issue 2517203002: Reland of Add GN build rules to allow java_assertion_enabler to enable Java asserts. (Closed)
Patch Set: format nit Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: build/android/java_assertion_enabler/java/org/chromium/javaassertionenabler/AssertionEnabler.java
diff --git a/build/android/java_assertion_enabler/java/org/chromium/javaassertionenabler/AssertionEnabler.java b/build/android/java_assertion_enabler/java/org/chromium/javaassertionenabler/AssertionEnabler.java
index e800a3941395b34a4afc96938c6dac999b3b86c4..beb26facda44e40dc31ec9ced6e18415803a29c9 100644
--- a/build/android/java_assertion_enabler/java/org/chromium/javaassertionenabler/AssertionEnabler.java
+++ b/build/android/java_assertion_enabler/java/org/chromium/javaassertionenabler/AssertionEnabler.java
@@ -4,8 +4,6 @@
package org.chromium.javaassertionenabler;
-import com.google.common.io.ByteStreams;
-
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
@@ -14,21 +12,30 @@ import org.objectweb.asm.Opcodes;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.util.Collections;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.jar.JarOutputStream;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
/**
* An application that enables Java ASSERT statements by modifying Java bytecode. It takes in a JAR
* file, modifies bytecode of classes that use ASSERT, and outputs the bytecode to a new JAR file.
*/
class AssertionEnabler {
+ static final String ASSERTION_DISABLED_NAME = "$assertionsDisabled";
static final String CLASS_FILE_SUFFIX = ".class";
static final String STATIC_INITIALIZER_NAME = "<clinit>";
- static final String ASSERTION_DISABLED_NAME = "$assertionsDisabled";
+ static final String TEMPORARY_FILE_SUFFIX = ".temp";
+
+ static final int BUFFER_SIZE = 16384;
static class AssertionEnablerVisitor extends ClassVisitor {
AssertionEnablerVisitor(ClassWriter writer) {
@@ -68,33 +75,53 @@ class AssertionEnabler {
}
}
+ static byte[] readAllBytes(InputStream inputStream) throws IOException {
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ int numRead = 0;
+ byte[] data = new byte[BUFFER_SIZE];
+ while ((numRead = inputStream.read(data, 0, data.length)) != -1) {
+ buffer.write(data, 0, numRead);
+ }
+
+ return buffer.toByteArray();
+ }
+
static void enableAssertionInJar(String inputJarPath, String outputJarPath) {
- try (JarOutputStream outputStream = new JarOutputStream(
- new BufferedOutputStream(new FileOutputStream(outputJarPath)))) {
- JarFile jarFile = new JarFile(inputJarPath);
- for (JarEntry entry : Collections.list(jarFile.entries())) {
- try (BufferedInputStream inputStream = new BufferedInputStream(
- jarFile.getInputStream(entry))) {
- byte[] byteCode = ByteStreams.toByteArray(inputStream);
+ String tempJarPath = outputJarPath + TEMPORARY_FILE_SUFFIX;
+ try (ZipInputStream inputStream = new ZipInputStream(
+ new BufferedInputStream(new FileInputStream(inputJarPath)));
+ ZipOutputStream tempStream = new ZipOutputStream(
+ new BufferedOutputStream(new FileOutputStream(tempJarPath)))) {
+ ZipEntry entry = null;
- if (entry.isDirectory() || !entry.getName().endsWith(CLASS_FILE_SUFFIX)) {
- outputStream.putNextEntry(entry);
- outputStream.write(byteCode);
- outputStream.closeEntry();
- continue;
- }
- ClassReader reader = new ClassReader(byteCode);
- ClassWriter writer = new ClassWriter(reader, 0);
- reader.accept(new AssertionEnablerVisitor(writer), 0);
- byte[] patchedByteCode = writer.toByteArray();
- outputStream.putNextEntry(new JarEntry(entry.getName()));
- outputStream.write(patchedByteCode);
- outputStream.closeEntry();
+ while ((entry = inputStream.getNextEntry()) != null) {
+ byte[] byteCode = readAllBytes(inputStream);
+
+ if (entry.isDirectory() || !entry.getName().endsWith(CLASS_FILE_SUFFIX)) {
+ tempStream.putNextEntry(entry);
+ tempStream.write(byteCode);
+ tempStream.closeEntry();
+ continue;
}
+ ClassReader reader = new ClassReader(byteCode);
+ ClassWriter writer = new ClassWriter(reader, 0);
+ reader.accept(new AssertionEnablerVisitor(writer), 0);
+ byte[] patchedByteCode = writer.toByteArray();
+ tempStream.putNextEntry(new ZipEntry(entry.getName()));
+ tempStream.write(patchedByteCode);
+ tempStream.closeEntry();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
+
+ try {
+ Path src = Paths.get(tempJarPath);
+ Path dest = Paths.get(outputJarPath);
+ Files.move(src, dest, StandardCopyOption.REPLACE_EXISTING);
+ } catch (IOException ioException) {
+ throw new RuntimeException(ioException);
+ }
}
public static void main(String[] args) {

Powered by Google App Engine
This is Rietveld 408576698