Skip to content

Commit f7b6b9b

Browse files
ted-xiecopybara-github
authored andcommitted
Refactor IdlClass.java to not require JarCreator
PiperOrigin-RevId: 722757040 Change-Id: I5227b25d67a14ec1f42b09feb181f047b743d36e
1 parent 6b60537 commit f7b6b9b

File tree

2 files changed

+42
-24
lines changed

2 files changed

+42
-24
lines changed

src/tools/java/com/google/devtools/build/android/idlclass/BUILD

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
load("@rules_java//java:defs.bzl", "java_binary", "java_import", "java_library")
2-
load("//tools/android:defs.bzl", "run_singlejar")
1+
load("@rules_java//java:defs.bzl", "java_binary", "java_library")
32

43
package(
54
default_applicable_licenses = ["//:license"],
@@ -13,21 +12,6 @@ java_binary(
1312
runtime_deps = [":idlclass_lib"],
1413
)
1514

16-
# NOTE: jarhelper actually exists in @bazel_tools, but its visibility is set too restrictively.
17-
run_singlejar(
18-
name = "jarhelper_jar_gen",
19-
srcs = ["@android_tools//:all_android_tools_deploy.jar"],
20-
out = "jarhelper.jar",
21-
include_prefixes = [
22-
"com/google/devtools/build/buildjar/jarhelper/",
23-
],
24-
)
25-
26-
java_import(
27-
name = "jarhelper_jar",
28-
jars = [":jarhelper.jar"],
29-
)
30-
3115
java_library(
3216
name = "idlclass_lib",
3317
srcs = glob(["*.java"]),
@@ -37,7 +21,6 @@ java_library(
3721
"//src/tools/java/com/google/devtools/build/android:__pkg__",
3822
],
3923
deps = [
40-
":jarhelper_jar",
4124
"//src/tools/java/com/google/devtools/build/android:android_builder_lib",
4225
"//src/tools/java/com/google/devtools/build/android:android_options_utils",
4326
"@bazel_tools//src/main/protobuf:java_compilation_java_proto",

src/tools/java/com/google/devtools/build/android/idlclass/IdlClass.java

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,33 +14,47 @@
1414

1515
package com.google.devtools.build.android.idlclass;
1616

17+
import static java.util.stream.Collectors.toCollection;
18+
1719
import com.beust.jcommander.JCommander;
1820
import com.google.common.annotations.VisibleForTesting;
1921
import com.google.common.base.Preconditions;
2022
import com.google.common.collect.ImmutableSet;
2123
import com.google.common.collect.Lists;
2224
import com.google.common.collect.Sets;
25+
import com.google.common.hash.Hashing;
2326
import com.google.devtools.build.android.AndroidOptionsUtils;
24-
import com.google.devtools.build.buildjar.jarhelper.JarCreator;
2527
import com.google.devtools.build.buildjar.proto.JavaCompilation.CompilationUnit;
2628
import com.google.devtools.build.buildjar.proto.JavaCompilation.Manifest;
29+
import java.io.BufferedOutputStream;
2730
import java.io.IOException;
2831
import java.io.InputStream;
2932
import java.nio.file.Files;
3033
import java.nio.file.Path;
3134
import java.nio.file.Paths;
35+
import java.nio.file.attribute.FileTime;
36+
import java.time.Instant;
37+
import java.time.LocalDateTime;
38+
import java.time.ZoneId;
39+
import java.util.ArrayList;
3240
import java.util.Enumeration;
3341
import java.util.List;
3442
import java.util.Set;
3543
import java.util.jar.JarEntry;
3644
import java.util.jar.JarFile;
45+
import java.util.stream.Stream;
46+
import java.util.zip.ZipEntry;
47+
import java.util.zip.ZipOutputStream;
3748

3849
/**
3950
* IdlClass post-processes the output of a Java compilation, and produces
4051
* a jar containing only the class files for sources that were generated
4152
* from idl processing.
4253
*/
4354
public class IdlClass {
55+
// Cribbed from AarGeneratorAction.java
56+
private static final Instant DEFAULT_TIMESTAMP =
57+
LocalDateTime.of(2010, 1, 1, 0, 0, 0).atZone(ZoneId.systemDefault()).toInstant();
4458

4559
public static void main(String[] args) throws IOException {
4660
IdlClassOptions idlClassOptions = new IdlClassOptions();
@@ -160,10 +174,31 @@ private static void extractIdlClasses(
160174

161175
/** Writes the generated class files to the output jar. */
162176
private static void writeOutputJar(Path outputJar, Path tempDir) throws IOException {
163-
JarCreator output = new JarCreator(outputJar.toString());
164-
output.setCompression(true);
165-
output.setNormalize(true);
166-
output.addDirectory(tempDir.toString());
167-
output.execute();
177+
// Zip up the contents of tempDir into outputJar.
178+
179+
try (final ZipOutputStream zip =
180+
new ZipOutputStream(new BufferedOutputStream(Files.newOutputStream(outputJar)))) {
181+
zip.setMethod(ZipOutputStream.STORED);
182+
183+
List<Path> files;
184+
try (Stream<Path> stream = Files.walk(tempDir).filter(Files::isRegularFile)) {
185+
files = stream.collect(toCollection(ArrayList::new));
186+
}
187+
188+
for (Path path : files) {
189+
ZipEntry entry = new ZipEntry(tempDir.relativize(path).toString());
190+
entry.setTime(DEFAULT_TIMESTAMP.toEpochMilli());
191+
entry.setSize(Files.size(path));
192+
entry.setCompressedSize(Files.size(path));
193+
entry.setCrc(Hashing.crc32().hashBytes(Files.readAllBytes(path)).asInt());
194+
zip.putNextEntry(entry);
195+
zip.write(Files.readAllBytes(path));
196+
zip.closeEntry();
197+
}
198+
zip.close();
199+
} catch (IOException e) {
200+
throw new IOException("Failed to write output jar: " + outputJar, e);
201+
}
202+
Files.setLastModifiedTime(outputJar, FileTime.from(DEFAULT_TIMESTAMP));
168203
}
169204
}

0 commit comments

Comments
 (0)