diff options
author | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2021-12-30 19:13:49 +0100 |
---|---|---|
committer | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2021-12-30 19:13:49 +0100 |
commit | 50a626db95a56160d8d08a6d0a6bb678b08b78d1 (patch) | |
tree | 1f3fcd3c7e789bc296ac55848caefa4bad1bedd1 /jgvariant-ostree | |
parent | e74b800445cbe502511905105e769a1ca33b8381 (diff) |
jgvariant-ostree: DeltaPartPayload: Decompress LZMA if needed.
Change-Id: I4a751b7778c30d2e126a058c766edaef7b641415
Diffstat (limited to 'jgvariant-ostree')
-rw-r--r-- | jgvariant-ostree/pom.xml | 6 | ||||
-rw-r--r-- | jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java | 25 | ||||
-rw-r--r-- | jgvariant-ostree/src/main/java/module-info.java | 3 |
3 files changed, 30 insertions, 4 deletions
diff --git a/jgvariant-ostree/pom.xml b/jgvariant-ostree/pom.xml index 897efa9..6d67bde 100644 --- a/jgvariant-ostree/pom.xml +++ b/jgvariant-ostree/pom.xml @@ -47,6 +47,12 @@ <artifactId>apiguardian-api</artifactId> </dependency> + <!-- OSTree compression support --> + <dependency> + <groupId>org.tukaani</groupId> + <artifactId>xz</artifactId> + </dependency> + <!-- Testing --> <dependency> <groupId>org.junit.jupiter</groupId> diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java index 99e093d..ed0f4ff 100644 --- a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java @@ -1,9 +1,14 @@ package eu.mulk.jgvariant.ostree; import eu.mulk.jgvariant.core.Decoder; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.List; +import org.tukaani.xz.XZInputStream; /** * A payload file from a static delta. @@ -37,10 +42,24 @@ public record DeltaPartPayload( private static ByteBuffer preparse(ByteBuffer byteBuffer) { byte compressionByte = byteBuffer.get(0); + var dataSlice = byteBuffer.slice(1, byteBuffer.limit() - 1); return switch (compressionByte) { - case 0 -> byteBuffer.slice(1, byteBuffer.limit()); - case (byte) 'x' -> throw new UnsupportedOperationException( - "LZMA compression of static deltas is unsupported"); + case 0 -> dataSlice; + case (byte) 'x' -> { + try { + var dataBytes = new byte[dataSlice.limit()]; + dataSlice.get(dataBytes); + var decompressingInputStream = new XZInputStream(new ByteArrayInputStream(dataBytes)); + + var decompressedOutputStream = new ByteArrayOutputStream(); + decompressingInputStream.transferTo(decompressedOutputStream); + + yield ByteBuffer.wrap(decompressedOutputStream.toByteArray()); + } catch (IOException e) { + // impossible + throw new UncheckedIOException(e); + } + } default -> throw new IllegalArgumentException( "unrecognized compression byte '%d'".formatted(compressionByte)); }; diff --git a/jgvariant-ostree/src/main/java/module-info.java b/jgvariant-ostree/src/main/java/module-info.java index 59b458f..da86412 100644 --- a/jgvariant-ostree/src/main/java/module-info.java +++ b/jgvariant-ostree/src/main/java/module-info.java @@ -77,8 +77,9 @@ module eu.mulk.jgvariant.ostree { requires transitive eu.mulk.jgvariant.core; requires com.google.errorprone.annotations; - requires org.jetbrains.annotations; requires org.apiguardian.api; + requires org.jetbrains.annotations; + requires org.tukaani.xz; exports eu.mulk.jgvariant.ostree; } |