Skip to content

Commit 2dca218

Browse files
committed
Add full support for payload flags
1 parent 89813dc commit 2dca218

18 files changed

+548
-39
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 & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@
5656
<artifactId>logback-classic</artifactId>
5757
<scope>test</scope>
5858
</dependency>
59+
<!-- https://mvnrepository.com/artifact/com.github.luben/zstd-jni -->
60+
<dependency>
61+
<groupId>com.github.luben</groupId>
62+
<artifactId>zstd-jni</artifactId>
63+
<version>1.5.7-2</version>
64+
<scope>test</scope>
65+
</dependency>
5966
</dependencies>
6067

6168
<build>

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,6 @@ private Finished(final PayloadCoding payloadCoding, final String payloadFlags) t
341341
this.payloadCounter = new CountingOutputStream(new ProcessorStream(fileStream, PayloadRecorder.this::forEachCompressedData));
342342
this.payloadCoding = payloadCoding;
343343
this.payloadFlags = Optional.ofNullable(payloadFlags);
344-
345344
final OutputStream payloadStream = new ProcessorStream(this.payloadCoding.createProvider().createOutputStream(this.payloadCounter, this.payloadFlags), PayloadRecorder.this::forEachRawData);
346345
this.archiveCounter = new CountingOutputStream(payloadStream);
347346

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,12 @@ public InputStream createInputStream(final InputStream in) throws IOException {
4545

4646
@Override
4747
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) throws IOException {
48-
final String flags;
48+
final PayloadFlags payloadFlags = new BZip2PayloadFlags();
49+
payloadFlags.parsePayloadFlags(optionalFlags.orElse(null));
50+
final int blockSize = payloadFlags.getOptionalLevel().orElse(BZip2CompressorOutputStream.MAX_BLOCKSIZE);
4951

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;
52+
if (blockSize < BZip2CompressorOutputStream.MIN_BLOCKSIZE || blockSize > BZip2CompressorOutputStream.MAX_BLOCKSIZE) {
53+
throw new IllegalArgumentException("Block size " + blockSize + " must be between " + BZip2CompressorOutputStream.MIN_BLOCKSIZE + " and " + BZip2CompressorOutputStream.MAX_BLOCKSIZE);
5654
}
5755

5856
return new BZip2CompressorOutputStream(out, blockSize);
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright (c) 2015, 2022 Contributors to the Eclipse Foundation
3+
*
4+
* See the NOTICE file(s) distributed with this work for additional
5+
* information regarding copyright ownership.
6+
*
7+
* This program and the accompanying materials are made available under the
8+
* terms of the Eclipse Public License 2.0 which is available at
9+
* http://www.eclipse.org/legal/epl-2.0
10+
*
11+
* SPDX-License-Identifier: EPL-2.0
12+
*/
13+
14+
package org.eclipse.packager.rpm.coding;
15+
16+
/**
17+
* [1-9] is block size (modulo 100K)
18+
* 's' is smallmode
19+
*/
20+
class BZip2PayloadFlags extends PayloadFlags {
21+
@Override
22+
protected void parsePayloadFlags(final String flags) {
23+
if (flags == null || flags.isEmpty()) {
24+
return;
25+
}
26+
27+
int i = 0;
28+
29+
while (i < flags.length()) {
30+
final char c = flags.charAt(i);
31+
32+
if (Character.isDigit(c)) {
33+
level = Integer.parseInt(String.valueOf(c));
34+
} else if (c == 's') {
35+
smallMode = Boolean.TRUE;
36+
}
37+
38+
i++;
39+
}
40+
}
41+
}

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

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,16 @@ public InputStream createInputStream(final InputStream in) throws IOException {
4545

4646
@Override
4747
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) throws IOException {
48-
final String flags;
49-
final int compressionLevel;
48+
final PayloadFlags payloadFlags = new GzipPayloadFlags();
49+
payloadFlags.parsePayloadFlags(optionalFlags.orElse(null));
50+
final int level = payloadFlags.getOptionalLevel().orElse(Deflater.DEFAULT_COMPRESSION);
5051

51-
if (optionalFlags.isPresent() && (flags = optionalFlags.get()).length() > 0) {
52-
compressionLevel = Integer.parseInt(flags.substring(0, 1));
53-
} else {
54-
compressionLevel = Deflater.BEST_COMPRESSION;
52+
if (level < Deflater.DEFAULT_COMPRESSION || level > Deflater.BEST_COMPRESSION) {
53+
throw new IllegalArgumentException("Compression level " + level + " must be between " + Deflater.DEFAULT_COMPRESSION + " and " + Deflater.BEST_COMPRESSION);
5554
}
5655

5756
final GzipParameters parameters = new GzipParameters();
58-
59-
parameters.setCompressionLevel(compressionLevel);
60-
57+
parameters.setCompressionLevel(level);
6158
return new GzipCompressorOutputStream(out, parameters);
6259
}
6360
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Copyright (c) 2015, 2022 Contributors to the Eclipse Foundation
3+
*
4+
* See the NOTICE file(s) distributed with this work for additional
5+
* information regarding copyright ownership.
6+
*
7+
* This program and the accompanying materials are made available under the
8+
* terms of the Eclipse Public License 2.0 which is available at
9+
* http://www.eclipse.org/legal/epl-2.0
10+
*
11+
* SPDX-License-Identifier: EPL-2.0
12+
*/
13+
14+
package org.eclipse.packager.rpm.coding;
15+
16+
import java.util.zip.Deflater;
17+
18+
/**
19+
* [0-9] is compression level
20+
* 'f' is filtered (Z_FILTERED)
21+
* 'h' is Huffman encoding (Z_HUFFMAN_ONLY)
22+
*/
23+
class GzipPayloadFlags extends PayloadFlags {
24+
@Override
25+
protected void parsePayloadFlags(final String flags) {
26+
if (flags == null || flags.isEmpty()) {
27+
return;
28+
}
29+
30+
int i = 0;
31+
32+
while (i < flags.length()) {
33+
final char c = flags.charAt(i);
34+
35+
if (Character.isDigit(c)) {
36+
level = Integer.parseInt(String.valueOf(c));
37+
} else if (c == 'f') {
38+
strategy = Deflater.FILTERED;
39+
} else if (c == 'h') {
40+
strategy = Deflater.HUFFMAN_ONLY;
41+
}
42+
43+
i++;
44+
}
45+
}
46+
}

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

Lines changed: 12 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,16 @@ 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 Optional<String> optionalFlags)
49+
throws IOException {
50+
final PayloadFlags payloadFlags = new LZMAPayloadFlags();
51+
payloadFlags.parsePayloadFlags(optionalFlags.orElse(null));
52+
final int preset = payloadFlags.getOptionalLevel().orElse(LZMA2Options.PRESET_DEFAULT);
53+
54+
if (preset < LZMA2Options.PRESET_MIN || preset > LZMA2Options.PRESET_MAX) {
55+
throw new IllegalArgumentException("Preset " + preset + " must be between " + LZMA2Options.PRESET_MIN + " and " + LZMA2Options.PRESET_MAX);
56+
}
57+
58+
return new LZMACompressorOutputStream.Builder().setOutputStream(out).setLzma2Options(new LZMA2Options(preset)).get();
4959
}
5060
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Copyright (c) 2015, 2022 Contributors to the Eclipse Foundation
3+
*
4+
* See the NOTICE file(s) distributed with this work for additional
5+
* information regarding copyright ownership.
6+
*
7+
* This program and the accompanying materials are made available under the
8+
* terms of the Eclipse Public License 2.0 which is available at
9+
* http://www.eclipse.org/legal/epl-2.0
10+
*
11+
* SPDX-License-Identifier: EPL-2.0
12+
*/
13+
14+
package org.eclipse.packager.rpm.coding;
15+
16+
/**
17+
* [1-9] is level
18+
* 'T([0-9]+)?' is threads
19+
*/
20+
class LZMAPayloadFlags extends PayloadFlags {
21+
@Override
22+
protected void parsePayloadFlags(final String flags) {
23+
if (flags == null || flags.isEmpty()) {
24+
return;
25+
}
26+
27+
int i = 0;
28+
29+
while (i < flags.length()) {
30+
final char c = flags.charAt(i);
31+
32+
if (Character.isDigit(c)) {
33+
level = Integer.parseInt(String.valueOf(c));
34+
i++;
35+
} else if (c == 'T') {
36+
final int start = ++i;
37+
38+
while (i < flags.length() && Character.isDigit(flags.charAt(i))) {
39+
i++;
40+
}
41+
42+
threads = flags.substring(start, i);
43+
}
44+
}
45+
}
46+
}

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

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

16-
import java.io.IOException;
1716
import java.io.InputStream;
1817
import java.io.OutputStream;
1918
import java.util.Optional;
@@ -32,15 +31,20 @@ public String getCoding() {
3231

3332
@Override
3433
public void fillRequirements(final Consumer<Dependency> requirementsConsumer) {
34+
3535
}
3636

3737
@Override
38-
public InputStream createInputStream(final InputStream in) throws IOException {
38+
public InputStream createInputStream(final InputStream in) {
3939
return in;
4040
}
4141

4242
@Override
43-
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) throws IOException {
43+
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) {
44+
if (optionalFlags.isPresent() && !optionalFlags.get().isEmpty()) {
45+
throw new IllegalArgumentException("Null payload coding does not support payload flags");
46+
}
47+
4448
return out;
4549
}
4650
}

0 commit comments

Comments
 (0)