Skip to content

Commit 5e184e8

Browse files
committed
Add gzip compression support.
Any paths ending in ".gz" will atomatically be compressed on write, and decompressed on read.
1 parent d039798 commit 5e184e8

File tree

7 files changed

+84
-17
lines changed

7 files changed

+84
-17
lines changed

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ dependencies {
3131
//endregion
3232

3333
//region Testing
34-
testImplementation libs.bundles.junit
34+
testImplementation libs.junit.api
35+
testRuntimeOnly libs.bundles.junit.runtime
3536
testImplementation libs.powermock
3637
//endregion
3738
}

settings.gradle

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ dependencyResolutionManagement {
2222
//endregion
2323

2424
//region Testing
25-
version 'junit', '5.10.1'
26-
library 'junit', 'org.junit.jupiter', 'junit-jupiter' versionRef 'junit'
27-
library 'junit-engine', 'org.junit.jupiter', 'junit-jupiter-engine' versionRef 'junit'
28-
bundle 'junit', ['junit', 'junit-engine']
25+
version 'junit', '5.10.2'
26+
library 'junit-api', 'org.junit.jupiter', 'junit-jupiter-api' versionRef 'junit'
27+
library 'junit-engine', 'org.junit.jupiter', 'junit-jupiter-engine' versionRef 'junit'
28+
library 'junit-platform-launcher', 'org.junit.platform', 'junit-platform-launcher' version '1.10.2'
29+
bundle 'junit-runtime', ['junit-engine', 'junit-platform-launcher']
2930

3031
library 'powermock', 'org.powermock', 'powermock-core' version '2.0.9'
3132
//endregion

src/main/java/net/minecraftforge/srgutils/IMappingFile.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@
1414
import java.util.Collection;
1515
import java.util.Locale;
1616
import java.util.Map;
17+
import java.util.zip.GZIPInputStream;
1718

1819
public interface IMappingFile {
1920
public static IMappingFile load(File path) throws IOException {
2021
try (InputStream in = new FileInputStream(path)) {
22+
if (path.getName().endsWith(".gz"))
23+
return load(new GZIPInputStream(in));
2124
return load(in);
2225
}
2326
}

src/main/java/net/minecraftforge/srgutils/INamedMappingFile.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@
99
import java.io.IOException;
1010
import java.io.InputStream;
1111
import java.nio.file.Path;
12-
import java.util.List;
12+
import java.util.List;
13+
import java.util.zip.GZIPInputStream;
1314

1415
import net.minecraftforge.srgutils.IMappingFile.Format;
1516

1617
public interface INamedMappingFile {
1718
public static INamedMappingFile load(File path) throws IOException {
18-
try (InputStream in = new FileInputStream(path)) {
19+
try (InputStream in = new FileInputStream(path)) {
20+
if (path.getName().endsWith(".gz"))
21+
return load(new GZIPInputStream(in));
1922
return load(in);
2023
}
2124
}

src/main/java/net/minecraftforge/srgutils/MappingFile.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
import java.io.BufferedWriter;
88
import java.io.IOException;
9+
import java.io.OutputStream;
10+
import java.io.OutputStreamWriter;
11+
import java.nio.charset.StandardCharsets;
912
import java.nio.file.Files;
1013
import java.nio.file.Path;
1114
import java.util.ArrayList;
@@ -19,6 +22,7 @@
1922
import java.util.concurrent.ConcurrentHashMap;
2023
import java.util.regex.Matcher;
2124
import java.util.regex.Pattern;
25+
import java.util.zip.GZIPOutputStream;
2226

2327
import net.minecraftforge.srgutils.InternalUtils.Element;
2428
import org.jetbrains.annotations.Nullable;
@@ -159,10 +163,15 @@ public void write(Path path, Format format, boolean reversed) throws IOException
159163
}
160164

161165
Files.createDirectories(path.getParent());
162-
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
163-
for (String line : lines) {
164-
writer.write(line);
165-
writer.write('\n');
166+
try (OutputStream fos = Files.newOutputStream(path)) {
167+
OutputStream out = fos;
168+
if (path.getFileName().toString().endsWith(".gz"))
169+
out = new GZIPOutputStream(out);
170+
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8))) {
171+
for (String line : lines) {
172+
writer.write(line);
173+
writer.write('\n');
174+
}
166175
}
167176
}
168177
}

src/main/java/net/minecraftforge/srgutils/NamedMappingFile.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
import java.io.BufferedWriter;
88
import java.io.IOException;
9+
import java.io.OutputStream;
10+
import java.io.OutputStreamWriter;
11+
import java.nio.charset.StandardCharsets;
912
import java.nio.file.Files;
1013
import java.nio.file.Path;
1114
import java.util.ArrayList;
@@ -20,6 +23,7 @@
2023
import java.util.concurrent.ConcurrentHashMap;
2124
import java.util.regex.Matcher;
2225
import java.util.stream.Stream;
26+
import java.util.zip.GZIPOutputStream;
2327

2428
import net.minecraftforge.srgutils.IMappingFile.Format;
2529
import org.jetbrains.annotations.Nullable;
@@ -123,10 +127,15 @@ public void write(Path path, Format format, String... order) throws IOException
123127
}
124128

125129
Files.createDirectories(path.getParent());
126-
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
127-
for (String line : lines) {
128-
writer.write(line);
129-
writer.write('\n');
130+
try (OutputStream fos = Files.newOutputStream(path)) {
131+
OutputStream out = fos;
132+
if (path.getFileName().toString().endsWith(".gz"))
133+
out = new GZIPOutputStream(out);
134+
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8))) {
135+
for (String line : lines) {
136+
writer.write(line);
137+
writer.write('\n');
138+
}
130139
}
131140
}
132141
}

src/test/java/net/minecraftforge/srgutils/test/MappingTest.java

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
* SPDX-License-Identifier: LGPL-2.1-only
44
*/
55
package net.minecraftforge.srgutils.test;
6-
6+
7+
import java.io.ByteArrayInputStream;
78
import java.io.IOException;
89
import java.io.InputStream;
910
import java.nio.charset.StandardCharsets;
@@ -169,7 +170,6 @@ void tinyV2NamedTest(INamedMappingFile named, String left, String right) {
169170
void tinyV2OptionalAndLVs() throws IOException {
170171
INamedMappingFile named = INamedMappingFile.load(getStream("./tiny_v2_09_2024_edition.tiny"));
171172
assertIterableEquals(Arrays.asList("source", "same", "rename"), named.getNames());
172-
173173
}
174174
*/
175175

@@ -191,5 +191,46 @@ void tsrg2NamedWriteReordered() throws IOException {
191191
lines,
192192
"Invalid ordering"
193193
);
194+
}
195+
196+
@Test
197+
void testCompression() throws IOException {
198+
final String compressable = "easilyCompressableAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
199+
byte[] stringData = ("cls " + compressable).getBytes(StandardCharsets.UTF_8);
200+
201+
IMappingFile map = IMappingFile.load(new ByteArrayInputStream(stringData));
202+
203+
Path path = temp.resolve("map.tsrg.gz");
204+
map.write(path, Format.TSRG2, false);
205+
206+
byte[] fileData = Files.readAllBytes(path);
207+
assertTrue(fileData.length < stringData.length, "Expected the file data to be compressed, was not");
208+
209+
IMappingFile read = IMappingFile.load(path.toFile());
210+
IMappingFile.IClass cls = read.getClass("cls");
211+
assertNotNull(cls, "Expected to find \"cls\" mapping");
212+
213+
assertEquals(compressable, cls.getMapped());
214+
}
215+
216+
@Test
217+
void testNamedCompression() throws IOException {
218+
final String compressable = "easilyCompressableAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
219+
byte[] stringData = ("cls " + compressable).getBytes(StandardCharsets.UTF_8);
220+
221+
INamedMappingFile map = INamedMappingFile.load(new ByteArrayInputStream(stringData));
222+
223+
Path path = temp.resolve("map.tsrg.gz");
224+
map.write(path, Format.TSRG2, "left", "right");
225+
226+
byte[] fileData = Files.readAllBytes(path);
227+
assertTrue(fileData.length < stringData.length, "Expected the file data to be compressed, was not");
228+
229+
INamedMappingFile named = INamedMappingFile.load(path.toFile());
230+
IMappingFile read = named.getMap("left", "right");
231+
IMappingFile.IClass cls = read.getClass("cls");
232+
assertNotNull(cls, "Expected to find \"cls\" mapping");
233+
234+
assertEquals(compressable, cls.getMapped());
194235
}
195236
}

0 commit comments

Comments
 (0)