Skip to content

Commit 91aed41

Browse files
committed
Add full support for payload flags
1 parent 89813dc commit 91aed41

17 files changed

+455
-102
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676

7777
<assertj.version>3.25.3</assertj.version>
7878
<bouncycastle.version>1.78</bouncycastle.version>
79-
<commons-compress.version>1.26.1</commons-compress.version>
79+
<commons-compress.version>1.28.0-SNAPSHOT</commons-compress.version>
8080
<commons-codec.version>1.16.1</commons-codec.version>
8181
<guava.version>33.1.0-jre</guava.version>
8282
<junit.jupiter.version>5.10.2</junit.jupiter.version>

rpm/pom.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,18 @@
5050
<scope>test</scope>
5151
</dependency>
5252
<!-- show log output during tests using logback as the slf4j backend. -->
53-
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
5453
<dependency>
5554
<groupId>ch.qos.logback</groupId>
5655
<artifactId>logback-classic</artifactId>
5756
<scope>test</scope>
5857
</dependency>
58+
<!-- enable zstd support during tests. -->
59+
<dependency>
60+
<groupId>com.github.luben</groupId>
61+
<artifactId>zstd-jni</artifactId>
62+
<version>1.5.7-2</version>
63+
<scope>test</scope>
64+
</dependency>
5965
</dependencies>
6066

6167
<build>

rpm/src/main/java/org/eclipse/packager/rpm/build/BuilderOptions.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.List;
2525

2626
import org.eclipse.packager.rpm.coding.PayloadCoding;
27+
import org.eclipse.packager.rpm.coding.PayloadFlags;
2728

2829
/**
2930
* Options which control the build process of the {@link RpmBuilder}
@@ -33,6 +34,11 @@
3334
* </p>
3435
*/
3536
public class BuilderOptions {
37+
private static final PayloadCoding DEFAULT_PAYLOAD_CODING = PayloadCoding.gzip;
38+
39+
private static final PayloadFlags DEFAULT_PAYLOAD_FLAGS = new PayloadFlags(DEFAULT_PAYLOAD_CODING, 9);
40+
41+
3642
private LongMode longMode = LongMode.DEFAULT;
3743

3844
private OpenOption[] openOptions;
@@ -41,7 +47,7 @@ public class BuilderOptions {
4147

4248
private PayloadCoding payloadCoding;
4349

44-
private String payloadFlags;
50+
private PayloadFlags payloadFlags;
4551

4652
private DigestAlgorithm fileDigestAlgorithm = DigestAlgorithm.MD5;
4753

@@ -98,18 +104,18 @@ public void setFileNameProvider(final RpmFileNameProvider fileNameProvider) {
98104
}
99105

100106
public PayloadCoding getPayloadCoding() {
101-
return this.payloadCoding != null ? this.payloadCoding : PayloadCoding.GZIP;
107+
return this.payloadCoding != null ? this.payloadCoding : DEFAULT_PAYLOAD_CODING;
102108
}
103109

104110
public void setPayloadCoding(final PayloadCoding payloadCoding) {
105111
this.payloadCoding = payloadCoding;
106112
}
107113

108-
public String getPayloadFlags() {
109-
return this.payloadFlags;
114+
public PayloadFlags getPayloadFlags() {
115+
return this.payloadFlags != null ? this.payloadFlags : DEFAULT_PAYLOAD_FLAGS;
110116
}
111117

112-
public void setPayloadFlags(final String payloadFlags) {
118+
public void setPayloadFlags(final PayloadFlags payloadFlags) {
113119
this.payloadFlags = payloadFlags;
114120
}
115121

rpm/src/main/java/org/eclipse/packager/rpm/build/PayloadProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import org.eclipse.packager.rpm.RpmTag;
2121
import org.eclipse.packager.rpm.coding.PayloadCoding;
22+
import org.eclipse.packager.rpm.coding.PayloadFlags;
2223
import org.eclipse.packager.rpm.header.Header;
2324

2425
public interface PayloadProvider {
@@ -61,7 +62,7 @@ public interface PayloadProvider {
6162
*
6263
* @return the compression flags for this compressed archive file, if any
6364
*/
64-
Optional<String> getPayloadFlags();
65+
PayloadFlags getPayloadFlags();
6566

6667
/**
6768
* The algorithm used for generating file checksum digests whose ordinal is

rpm/src/main/java/org/eclipse/packager/rpm/build/PayloadRecorder.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import java.util.ArrayList;
3434
import java.util.Collections;
3535
import java.util.List;
36-
import java.util.Optional;
36+
import java.util.Objects;
3737
import java.util.function.Consumer;
3838

3939
import org.apache.commons.compress.archivers.cpio.CpioArchiveEntry;
@@ -42,12 +42,17 @@
4242
import org.apache.commons.compress.utils.CharsetNames;
4343
import org.eclipse.packager.rpm.RpmTag;
4444
import org.eclipse.packager.rpm.coding.PayloadCoding;
45+
import org.eclipse.packager.rpm.coding.PayloadFlags;
4546
import org.eclipse.packager.rpm.header.Header;
4647

4748
import com.google.common.io.ByteStreams;
4849
import com.google.common.io.CountingOutputStream;
4950

5051
public class PayloadRecorder implements AutoCloseable {
52+
private static final PayloadCoding DEFAULT_PAYLOAD_CODING = PayloadCoding.gzip;
53+
54+
private static final PayloadFlags DEFAULT_PAYLOAD_FLAGS = new PayloadFlags(DEFAULT_PAYLOAD_CODING, 9);
55+
5156
public static class Result {
5257
private final long size;
5358

@@ -100,10 +105,10 @@ public void write(byte[] b, int off, int len) throws IOException {
100105
private Finished finished;
101106

102107
public PayloadRecorder() throws IOException {
103-
this(PayloadCoding.GZIP, null, DigestAlgorithm.MD5, null);
108+
this(DEFAULT_PAYLOAD_CODING, DEFAULT_PAYLOAD_FLAGS, DigestAlgorithm.MD5, null);
104109
}
105110

106-
public PayloadRecorder(final PayloadCoding payloadCoding, final String payloadFlags, final DigestAlgorithm fileDigestAlgorithm, final List<PayloadProcessor> processors) throws IOException {
111+
public PayloadRecorder(final PayloadCoding payloadCoding, final PayloadFlags payloadFlags, final DigestAlgorithm fileDigestAlgorithm, final List<PayloadProcessor> processors) throws IOException {
107112
this.fileDigestAlgorithm = fileDigestAlgorithm;
108113
if (processors == null) {
109114
this.processors = Collections.emptyList();
@@ -329,25 +334,24 @@ public class Finished implements AutoCloseable, PayloadProvider {
329334

330335
private final PayloadCoding payloadCoding;
331336

332-
private final Optional<String> payloadFlags;
337+
private final PayloadFlags payloadFlags;
333338

334339
private Header<RpmTag> additionalHeader = new Header<>();
335340

336-
private Finished(final PayloadCoding payloadCoding, final String payloadFlags) throws IOException {
341+
private Finished(final PayloadCoding payloadCoding, final PayloadFlags payloadFlags) throws IOException {
337342
this.tempFile = Files.createTempFile("rpm-", null);
338343

339344
try {
340345
final OutputStream fileStream = new BufferedOutputStream(Files.newOutputStream(this.tempFile, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING));
341346
this.payloadCounter = new CountingOutputStream(new ProcessorStream(fileStream, PayloadRecorder.this::forEachCompressedData));
342347
this.payloadCoding = payloadCoding;
343-
this.payloadFlags = Optional.ofNullable(payloadFlags);
344-
348+
this.payloadFlags = Objects.requireNonNullElseGet(payloadFlags, () -> (payloadCoding != PayloadCoding.none ? DEFAULT_PAYLOAD_FLAGS : new PayloadFlags()));
345349
final OutputStream payloadStream = new ProcessorStream(this.payloadCoding.createProvider().createOutputStream(this.payloadCounter, this.payloadFlags), PayloadRecorder.this::forEachRawData);
346350
this.archiveCounter = new CountingOutputStream(payloadStream);
347351

348352
// setup archive stream
349353

350-
this.archiveStream = new CpioArchiveOutputStream(this.archiveCounter, CpioConstants.FORMAT_NEW, 4, CharsetNames.UTF_8);
354+
this.archiveStream = new CpioArchiveOutputStream(this.archiveCounter, CpioConstants.FORMAT_NEW, 4, StandardCharsets.UTF_8.name());
351355
} catch (final IOException e) {
352356
Files.deleteIfExists(this.tempFile);
353357
throw e;
@@ -376,7 +380,7 @@ public PayloadCoding getPayloadCoding() {
376380
}
377381

378382
@Override
379-
public Optional<String> getPayloadFlags() {
383+
public PayloadFlags getPayloadFlags() {
380384
return this.payloadFlags;
381385
}
382386

rpm/src/main/java/org/eclipse/packager/rpm/build/RpmBuilder.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import org.eclipse.packager.rpm.Rpms;
5252
import org.eclipse.packager.rpm.VerifyFlags;
5353
import org.eclipse.packager.rpm.build.PayloadRecorder.Result;
54+
import org.eclipse.packager.rpm.coding.PayloadCoding;
5455
import org.eclipse.packager.rpm.deps.Dependencies;
5556
import org.eclipse.packager.rpm.deps.Dependency;
5657
import org.eclipse.packager.rpm.deps.RpmDependencyFlags;
@@ -716,12 +717,12 @@ private void fillProvides() {
716717
private void fillHeader(final PayloadRecorder.Finished finished) {
717718
this.header.putString(RpmTag.PAYLOAD_FORMAT, "cpio");
718719

719-
if (finished.getPayloadCoding() != null) {
720-
this.header.putString(RpmTag.PAYLOAD_CODING, finished.getPayloadCoding().getValue());
720+
if (finished.getPayloadCoding() != null && finished.getPayloadCoding() != PayloadCoding.none) {
721+
this.header.putString(RpmTag.PAYLOAD_CODING, finished.getPayloadCoding().toString());
721722
}
722723

723-
if (finished.getPayloadFlags().isPresent()) {
724-
this.header.putString(RpmTag.PAYLOAD_FLAGS, finished.getPayloadFlags().get());
724+
if (finished.getPayloadFlags() != null) {
725+
this.header.putString(RpmTag.PAYLOAD_FLAGS, finished.getPayloadFlags().toString());
725726
}
726727

727728
this.header.putStringArray(100, "C");

rpm/src/main/java/org/eclipse/packager/rpm/coding/BZip2PayloadCoding.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,11 @@ public InputStream createInputStream(final InputStream in) throws IOException {
4444
}
4545

4646
@Override
47-
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) throws IOException {
48-
final String flags;
47+
public OutputStream createOutputStream(final OutputStream out, final PayloadFlags flags) throws IOException {
48+
final int blockSize = Optional.ofNullable(flags.getLevel()).orElse(BZip2CompressorOutputStream.MAX_BLOCKSIZE);
4949

50-
final int blockSize;
51-
52-
if (optionalFlags.isPresent() && (flags = optionalFlags.get()).length() > 0) {
53-
blockSize = Integer.parseInt(flags.substring(0, 1));
54-
} else {
55-
blockSize = BZip2CompressorOutputStream.MAX_BLOCKSIZE;
50+
if (blockSize < BZip2CompressorOutputStream.MIN_BLOCKSIZE || blockSize > BZip2CompressorOutputStream.MAX_BLOCKSIZE) {
51+
throw new IllegalArgumentException("Block size " + blockSize + " must be between " + BZip2CompressorOutputStream.MIN_BLOCKSIZE + " and " + BZip2CompressorOutputStream.MAX_BLOCKSIZE);
5652
}
5753

5854
return new BZip2CompressorOutputStream(out, blockSize);

rpm/src/main/java/org/eclipse/packager/rpm/coding/GzipPayloadCoding.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,20 +44,15 @@ public InputStream createInputStream(final InputStream in) throws IOException {
4444
}
4545

4646
@Override
47-
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) throws IOException {
48-
final String flags;
49-
final int compressionLevel;
50-
51-
if (optionalFlags.isPresent() && (flags = optionalFlags.get()).length() > 0) {
52-
compressionLevel = Integer.parseInt(flags.substring(0, 1));
53-
} else {
54-
compressionLevel = Deflater.BEST_COMPRESSION;
47+
public OutputStream createOutputStream(final OutputStream out, final PayloadFlags flags) throws IOException {
48+
final int level = Optional.ofNullable(flags.getLevel()).orElse(Deflater.DEFAULT_COMPRESSION);
49+
50+
if (level < Deflater.DEFAULT_COMPRESSION || level > Deflater.BEST_COMPRESSION) {
51+
throw new IllegalArgumentException("Compression level " + level + " must be between " + Deflater.DEFAULT_COMPRESSION + " and " + Deflater.BEST_COMPRESSION);
5552
}
5653

5754
final GzipParameters parameters = new GzipParameters();
58-
59-
parameters.setCompressionLevel(compressionLevel);
60-
55+
parameters.setCompressionLevel(level);
6156
return new GzipCompressorOutputStream(out, parameters);
6257
}
6358
}

rpm/src/main/java/org/eclipse/packager/rpm/coding/LZMAPayloadCoding.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.apache.commons.compress.compressors.lzma.LZMACompressorOutputStream;
2424
import org.eclipse.packager.rpm.deps.Dependency;
2525
import org.eclipse.packager.rpm.deps.RpmDependencyFlags;
26+
import org.tukaani.xz.LZMA2Options;
2627

2728
public class LZMAPayloadCoding implements PayloadCodingProvider {
2829
protected LZMAPayloadCoding() {
@@ -44,7 +45,13 @@ public InputStream createInputStream(final InputStream in) throws IOException {
4445
}
4546

4647
@Override
47-
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) throws IOException {
48-
return new LZMACompressorOutputStream(out);
48+
public OutputStream createOutputStream(final OutputStream out, final PayloadFlags flags) throws IOException {
49+
final int preset = Optional.ofNullable(flags.getLevel()).orElse(LZMA2Options.PRESET_DEFAULT);
50+
51+
if (preset < LZMA2Options.PRESET_MIN || preset > LZMA2Options.PRESET_MAX) {
52+
throw new IllegalArgumentException("Preset " + preset + " must be between " + LZMA2Options.PRESET_MIN + " and " + LZMA2Options.PRESET_MAX);
53+
}
54+
55+
return new LZMACompressorOutputStream.Builder().setOutputStream(out).setLzma2Options(new LZMA2Options(preset)).get();
4956
}
5057
}

rpm/src/main/java/org/eclipse/packager/rpm/coding/NullPayloadCoding.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@
1313

1414
package org.eclipse.packager.rpm.coding;
1515

16-
import java.io.IOException;
1716
import java.io.InputStream;
1817
import java.io.OutputStream;
19-
import java.util.Optional;
2018
import java.util.function.Consumer;
2119

2220
import org.eclipse.packager.rpm.deps.Dependency;
@@ -32,15 +30,16 @@ public String getCoding() {
3230

3331
@Override
3432
public void fillRequirements(final Consumer<Dependency> requirementsConsumer) {
33+
3534
}
3635

3736
@Override
38-
public InputStream createInputStream(final InputStream in) throws IOException {
37+
public InputStream createInputStream(final InputStream in) {
3938
return in;
4039
}
4140

4241
@Override
43-
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) throws IOException {
42+
public OutputStream createOutputStream(final OutputStream out, final PayloadFlags flags) {
4443
return out;
4544
}
4645
}

0 commit comments

Comments
 (0)