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>