jgvariant-ostree: DeltaPartPayload: Decompress LZMA if needed.
Change-Id: I4a751b7778c30d2e126a058c766edaef7b641415
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 @@
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;
}
diff --git a/jgvariant-parent/pom.xml b/jgvariant-parent/pom.xml
index d209863..a5b330f 100644
--- a/jgvariant-parent/pom.xml
+++ b/jgvariant-parent/pom.xml
@@ -66,6 +66,7 @@
<inject-resources.version>0.3.0</inject-resources.version>
<jetbrains-annotations.version>22.0.0</jetbrains-annotations.version>
<junit-jupiter.version>5.8.2</junit-jupiter.version>
+ <xz.version>1.9</xz.version>
</properties>
<distributionManagement>
@@ -94,6 +95,13 @@
<version>${apiguardian.version}</version>
</dependency>
+ <!-- OSTree compression support -->
+ <dependency>
+ <groupId>org.tukaani</groupId>
+ <artifactId>xz</artifactId>
+ <version>1.9</version>
+ </dependency>
+
<!-- Testing -->
<dependency>
<groupId>org.junit.jupiter</groupId>