Skip to content

Commit de1e3c6

Browse files
committed
Include empty layers when listing and extracting
Fixes gh-21301
1 parent 5d7df79 commit de1e3c6

File tree

4 files changed

+12
-9
lines changed

4 files changed

+12
-9
lines changed

spring-boot-project/spring-boot-tools/spring-boot-jarmode-layertools/src/main/java/org/springframework/boot/jarmode/layertools/IndexedLayers.java

+7-6
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@
2020
import java.io.IOException;
2121
import java.nio.charset.StandardCharsets;
2222
import java.nio.file.NoSuchFileException;
23+
import java.util.ArrayList;
2324
import java.util.Arrays;
2425
import java.util.Iterator;
26+
import java.util.LinkedHashMap;
2527
import java.util.List;
2628
import java.util.Map;
2729
import java.util.jar.JarFile;
2830
import java.util.zip.ZipEntry;
2931

3032
import org.springframework.util.Assert;
31-
import org.springframework.util.LinkedMultiValueMap;
32-
import org.springframework.util.MultiValueMap;
3333
import org.springframework.util.StreamUtils;
3434
import org.springframework.util.StringUtils;
3535

@@ -41,18 +41,19 @@
4141
*/
4242
class IndexedLayers implements Layers {
4343

44-
private MultiValueMap<String, String> layers = new LinkedMultiValueMap<>();
44+
private final Map<String, List<String>> layers = new LinkedHashMap<>();
4545

4646
IndexedLayers(String indexFile) {
4747
String[] lines = Arrays.stream(indexFile.split("\n")).map((line) -> line.replace("\r", ""))
4848
.filter(StringUtils::hasText).toArray(String[]::new);
49-
String layer = null;
49+
List<String> contents = null;
5050
for (String line : lines) {
5151
if (line.startsWith("- ")) {
52-
layer = line.substring(3, line.length() - 2);
52+
contents = new ArrayList<>();
53+
this.layers.put(line.substring(3, line.length() - 2), contents);
5354
}
5455
else if (line.startsWith(" - ")) {
55-
this.layers.add(layer, line.substring(5, line.length() - 1));
56+
contents.add(line.substring(5, line.length() - 1));
5657
}
5758
else {
5859
throw new IllegalStateException("Layer index file is malformed");

spring-boot-project/spring-boot-tools/spring-boot-jarmode-layertools/src/test/java/org/springframework/boot/jarmode/layertools/ExtractCommandTests.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,11 @@ void setup() throws Exception {
6969
@Test
7070
void runExtractsLayers() throws Exception {
7171
this.command.run(Collections.emptyMap(), Collections.emptyList());
72-
assertThat(this.extract.list()).containsOnly("a", "b", "c");
72+
assertThat(this.extract.list()).containsOnly("a", "b", "c", "d");
7373
assertThat(new File(this.extract, "a/a/a.jar")).exists();
7474
assertThat(new File(this.extract, "b/b/b.jar")).exists();
7575
assertThat(new File(this.extract, "c/c/c.jar")).exists();
76+
assertThat(new File(this.extract, "d")).isDirectory();
7677
}
7778

7879
@Test
@@ -119,7 +120,7 @@ private static class TestLayers implements Layers {
119120

120121
@Override
121122
public Iterator<String> iterator() {
122-
return Arrays.asList("a", "b", "c").iterator();
123+
return Arrays.asList("a", "b", "c", "d").iterator();
123124
}
124125

125126
@Override

spring-boot-project/spring-boot-tools/spring-boot-jarmode-layertools/src/test/java/org/springframework/boot/jarmode/layertools/IndexedLayersTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void createWhenIndexFileIsMalformedThrowsException() throws Exception {
5252
@Test
5353
void iteratorReturnsLayers() throws Exception {
5454
IndexedLayers layers = new IndexedLayers(getIndex());
55-
assertThat(layers).containsExactly("test", "application");
55+
assertThat(layers).containsExactly("test", "empty", "application");
5656
}
5757

5858
@Test

spring-boot-project/spring-boot-tools/spring-boot-jarmode-layertools/src/test/resources/org/springframework/boot/jarmode/layertools/test-layers.idx

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
- "test":
22
- "BOOT-INF/lib/a.jar"
33
- "BOOT-INF/lib/b.jar"
4+
- "empty":
45
- "application":
56
- "BOOT-INF/classes/Demo.class"
67
- "META-INF/"

0 commit comments

Comments
 (0)