Skip to content

Commit 9163cdf

Browse files
authored
Add full support for payload flags (#74)
1 parent 069f62f commit 9163cdf

18 files changed

+577
-146
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</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: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,19 @@
3636
<groupId>org.tukaani</groupId>
3737
<artifactId>xz</artifactId>
3838
</dependency>
39-
<!-- enable to have Zstd support on local runs
39+
<!-- enable to have Zstd support on local runs -->
4040
<dependency>
4141
<groupId>com.github.luben</groupId>
4242
<artifactId>zstd-jni</artifactId>
43-
<version>1.5.2-5</version>
44-
<optional>true</optional>
43+
<version>1.5.7-2</version>
44+
<scope>test</scope>
4545
</dependency>
46-
-->
4746
<dependency>
4847
<groupId>org.testcontainers</groupId>
4948
<artifactId>junit-jupiter</artifactId>
5049
<scope>test</scope>
5150
</dependency>
5251
<!-- show log output during tests using logback as the slf4j backend. -->
53-
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
5452
<dependency>
5553
<groupId>ch.qos.logback</groupId>
5654
<artifactId>logback-classic</artifactId>

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.payloadCoding == DEFAULT_PAYLOAD_CODING) ? DEFAULT_PAYLOAD_FLAGS : this.payloadFlags;
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 & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,19 @@
3939
import org.apache.commons.compress.archivers.cpio.CpioArchiveEntry;
4040
import org.apache.commons.compress.archivers.cpio.CpioArchiveOutputStream;
4141
import org.apache.commons.compress.archivers.cpio.CpioConstants;
42-
import org.apache.commons.compress.utils.CharsetNames;
4342
import org.eclipse.packager.rpm.RpmTag;
4443
import org.eclipse.packager.rpm.coding.PayloadCoding;
44+
import org.eclipse.packager.rpm.coding.PayloadFlags;
4545
import org.eclipse.packager.rpm.header.Header;
4646

4747
import com.google.common.io.ByteStreams;
4848
import com.google.common.io.CountingOutputStream;
4949

5050
public class PayloadRecorder implements AutoCloseable {
51+
private static final PayloadCoding DEFAULT_PAYLOAD_CODING = PayloadCoding.GZIP;
52+
53+
private static final PayloadFlags DEFAULT_PAYLOAD_FLAGS = new PayloadFlags(DEFAULT_PAYLOAD_CODING, 9);
54+
5155
public static class Result {
5256
private final long size;
5357

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

102106
public PayloadRecorder() throws IOException {
103-
this(PayloadCoding.GZIP, null, DigestAlgorithm.MD5, null);
107+
this(DEFAULT_PAYLOAD_CODING, DEFAULT_PAYLOAD_FLAGS, DigestAlgorithm.MD5, null);
104108
}
105109

106-
public PayloadRecorder(final PayloadCoding payloadCoding, final String payloadFlags, final DigestAlgorithm fileDigestAlgorithm, final List<PayloadProcessor> processors) throws IOException {
110+
public PayloadRecorder(final PayloadCoding payloadCoding, final PayloadFlags payloadFlags, final DigestAlgorithm fileDigestAlgorithm, final List<PayloadProcessor> processors) throws IOException {
107111
this.fileDigestAlgorithm = fileDigestAlgorithm;
108112
if (processors == null) {
109113
this.processors = Collections.emptyList();
@@ -329,25 +333,24 @@ public class Finished implements AutoCloseable, PayloadProvider {
329333

330334
private final PayloadCoding payloadCoding;
331335

332-
private final Optional<String> payloadFlags;
336+
private final PayloadFlags payloadFlags;
333337

334338
private Header<RpmTag> additionalHeader = new Header<>();
335339

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

339343
try {
340344
final OutputStream fileStream = new BufferedOutputStream(Files.newOutputStream(this.tempFile, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING));
341345
this.payloadCounter = new CountingOutputStream(new ProcessorStream(fileStream, PayloadRecorder.this::forEachCompressedData));
342346
this.payloadCoding = payloadCoding;
343-
this.payloadFlags = Optional.ofNullable(payloadFlags);
344-
345-
final OutputStream payloadStream = new ProcessorStream(this.payloadCoding.createProvider().createOutputStream(this.payloadCounter, this.payloadFlags), PayloadRecorder.this::forEachRawData);
347+
this.payloadFlags = payloadFlags;
348+
final OutputStream payloadStream = new ProcessorStream(this.payloadCoding.createProvider().createOutputStream(this.payloadCounter, Optional.ofNullable(this.payloadFlags)), PayloadRecorder.this::forEachRawData);
346349
this.archiveCounter = new CountingOutputStream(payloadStream);
347350

348351
// setup archive stream
349352

350-
this.archiveStream = new CpioArchiveOutputStream(this.archiveCounter, CpioConstants.FORMAT_NEW, 4, CharsetNames.UTF_8);
353+
this.archiveStream = new CpioArchiveOutputStream(this.archiveCounter, CpioConstants.FORMAT_NEW, 4, StandardCharsets.UTF_8.name());
351354
} catch (final IOException e) {
352355
Files.deleteIfExists(this.tempFile);
353356
throw e;
@@ -376,7 +379,7 @@ public PayloadCoding getPayloadCoding() {
376379
}
377380

378381
@Override
379-
public Optional<String> getPayloadFlags() {
382+
public PayloadFlags getPayloadFlags() {
380383
return this.payloadFlags;
381384
}
382385

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
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;
55+
import org.eclipse.packager.rpm.coding.PayloadFlags;
5456
import org.eclipse.packager.rpm.deps.Dependencies;
5557
import org.eclipse.packager.rpm.deps.Dependency;
5658
import org.eclipse.packager.rpm.deps.RpmDependencyFlags;
@@ -716,12 +718,16 @@ private void fillProvides() {
716718
private void fillHeader(final PayloadRecorder.Finished finished) {
717719
this.header.putString(RpmTag.PAYLOAD_FORMAT, "cpio");
718720

719-
if (finished.getPayloadCoding() != null) {
720-
this.header.putString(RpmTag.PAYLOAD_CODING, finished.getPayloadCoding().getValue());
721+
final PayloadCoding payloadCoding = finished.getPayloadCoding();
722+
723+
if (payloadCoding != PayloadCoding.NONE) {
724+
this.header.putString(RpmTag.PAYLOAD_CODING, payloadCoding.toString());
721725
}
722726

723-
if (finished.getPayloadFlags().isPresent()) {
724-
this.header.putString(RpmTag.PAYLOAD_FLAGS, finished.getPayloadFlags().get());
727+
final PayloadFlags payloadFlags = finished.getPayloadFlags();
728+
729+
if (payloadFlags != null) {
730+
this.header.putString(RpmTag.PAYLOAD_FLAGS, payloadFlags.toString());
725731
}
726732

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

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

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
import org.eclipse.packager.rpm.deps.Dependency;
2525
import org.eclipse.packager.rpm.deps.RpmDependencyFlags;
2626

27+
import static org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream.MAX_BLOCKSIZE;
28+
import static org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream.MIN_BLOCKSIZE;
29+
import static org.eclipse.packager.rpm.coding.PayloadFlags.getLevel;
30+
2731
public class BZip2PayloadCoding implements PayloadCodingProvider {
2832
protected BZip2PayloadCoding() {
2933
}
@@ -44,17 +48,11 @@ public InputStream createInputStream(final InputStream in) throws IOException {
4448
}
4549

4650
@Override
47-
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) throws IOException {
48-
final String flags;
49-
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;
56-
}
51+
public OutputStream createOutputStream(final OutputStream out, final Optional<PayloadFlags> optionalPayloadFlags) throws IOException {
52+
final boolean smallMode = optionalPayloadFlags.map(PayloadFlags::getSmallMode).orElse(false);
5753

54+
final int level = getLevel(optionalPayloadFlags, MIN_BLOCKSIZE, MAX_BLOCKSIZE, MAX_BLOCKSIZE);
55+
final int blockSize = (!smallMode || level <= 2) ? level : 2;
5856
return new BZip2CompressorOutputStream(out, blockSize);
5957
}
6058
}

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

Lines changed: 0 additions & 56 deletions
This file was deleted.

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

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@
1818
import java.io.OutputStream;
1919
import java.util.Optional;
2020
import java.util.function.Consumer;
21-
import java.util.zip.Deflater;
2221

2322
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
2423
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
2524
import org.apache.commons.compress.compressors.gzip.GzipParameters;
2625
import org.eclipse.packager.rpm.deps.Dependency;
2726

27+
import static java.util.zip.Deflater.BEST_COMPRESSION;
28+
import static java.util.zip.Deflater.DEFAULT_COMPRESSION;
29+
import static org.eclipse.packager.rpm.coding.PayloadFlags.getLevel;
30+
2831
public class GzipPayloadCoding implements PayloadCodingProvider {
2932
protected GzipPayloadCoding() {
3033
}
@@ -44,20 +47,10 @@ public InputStream createInputStream(final InputStream in) throws IOException {
4447
}
4548

4649
@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;
55-
}
56-
50+
public OutputStream createOutputStream(final OutputStream out, final Optional<PayloadFlags> optionalPayloadFlags) throws IOException {
51+
final int level = getLevel(optionalPayloadFlags, DEFAULT_COMPRESSION, BEST_COMPRESSION, DEFAULT_COMPRESSION);
5752
final GzipParameters parameters = new GzipParameters();
58-
59-
parameters.setCompressionLevel(compressionLevel);
60-
53+
parameters.setCompressionLevel(level);
6154
return new GzipCompressorOutputStream(out, parameters);
6255
}
6356
}

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,12 @@
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;
27+
28+
import static org.eclipse.packager.rpm.coding.PayloadFlags.getLevel;
29+
import static org.tukaani.xz.LZMA2Options.PRESET_DEFAULT;
30+
import static org.tukaani.xz.LZMA2Options.PRESET_MAX;
31+
import static org.tukaani.xz.LZMA2Options.PRESET_MIN;
2632

2733
public class LZMAPayloadCoding implements PayloadCodingProvider {
2834
protected LZMAPayloadCoding() {
@@ -44,7 +50,8 @@ public InputStream createInputStream(final InputStream in) throws IOException {
4450
}
4551

4652
@Override
47-
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) throws IOException {
48-
return new LZMACompressorOutputStream(out);
53+
public OutputStream createOutputStream(final OutputStream out, final Optional<PayloadFlags> optionalPayloadFlags) throws IOException {
54+
final int preset = getLevel(optionalPayloadFlags, PRESET_MIN, PRESET_MAX, PRESET_DEFAULT);
55+
return new LZMACompressorOutputStream.Builder().setOutputStream(out).setLzma2Options(new LZMA2Options(preset)).get();
4956
}
5057
}

0 commit comments

Comments
 (0)