|
|
|
@ -98,48 +98,48 @@ class JarFileArchiveTests {
|
|
|
|
|
@Test
|
|
|
|
|
void getNestedArchive() throws Exception {
|
|
|
|
|
Entry entry = getEntriesMap(this.archive).get("nested.jar");
|
|
|
|
|
Archive nested = this.archive.getNestedArchive(entry);
|
|
|
|
|
assertThat(nested.getUrl().toString()).isEqualTo("jar:" + this.rootJarFileUrl + "!/nested.jar!/");
|
|
|
|
|
((JarFileArchive) nested).close();
|
|
|
|
|
try (Archive nested = this.archive.getNestedArchive(entry)) {
|
|
|
|
|
assertThat(nested.getUrl().toString()).isEqualTo("jar:" + this.rootJarFileUrl + "!/nested.jar!/");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void getNestedUnpackedArchive() throws Exception {
|
|
|
|
|
setup(true);
|
|
|
|
|
Entry entry = getEntriesMap(this.archive).get("nested.jar");
|
|
|
|
|
Archive nested = this.archive.getNestedArchive(entry);
|
|
|
|
|
assertThat(nested.getUrl().toString()).startsWith("file:");
|
|
|
|
|
assertThat(nested.getUrl().toString()).endsWith("/nested.jar");
|
|
|
|
|
((JarFileArchive) nested).close();
|
|
|
|
|
try (Archive nested = this.archive.getNestedArchive(entry)) {
|
|
|
|
|
assertThat(nested.getUrl().toString()).startsWith("file:");
|
|
|
|
|
assertThat(nested.getUrl().toString()).endsWith("/nested.jar");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void unpackedLocationsAreUniquePerArchive() throws Exception {
|
|
|
|
|
setup(true);
|
|
|
|
|
Entry entry = getEntriesMap(this.archive).get("nested.jar");
|
|
|
|
|
Archive firstNested = this.archive.getNestedArchive(entry);
|
|
|
|
|
URL firstNestedUrl = firstNested.getUrl();
|
|
|
|
|
((JarFileArchive) firstNested).close();
|
|
|
|
|
URL firstNestedUrl;
|
|
|
|
|
try (Archive firstNested = this.archive.getNestedArchive(entry)) {
|
|
|
|
|
firstNestedUrl = firstNested.getUrl();
|
|
|
|
|
}
|
|
|
|
|
this.archive.close();
|
|
|
|
|
setup(true);
|
|
|
|
|
entry = getEntriesMap(this.archive).get("nested.jar");
|
|
|
|
|
Archive secondNested = this.archive.getNestedArchive(entry);
|
|
|
|
|
URL secondNestedUrl = secondNested.getUrl();
|
|
|
|
|
assertThat(secondNestedUrl).isNotEqualTo(firstNestedUrl);
|
|
|
|
|
((JarFileArchive) secondNested).close();
|
|
|
|
|
try (Archive secondNested = this.archive.getNestedArchive(entry)) {
|
|
|
|
|
URL secondNestedUrl = secondNested.getUrl();
|
|
|
|
|
assertThat(secondNestedUrl).isNotEqualTo(firstNestedUrl);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void unpackedLocationsFromSameArchiveShareSameParent() throws Exception {
|
|
|
|
|
setup(true);
|
|
|
|
|
Archive nestedArchive = this.archive.getNestedArchive(getEntriesMap(this.archive).get("nested.jar"));
|
|
|
|
|
File nested = new File(nestedArchive.getUrl().toURI());
|
|
|
|
|
Archive anotherNestedArchive = this.archive
|
|
|
|
|
.getNestedArchive(getEntriesMap(this.archive).get("another-nested.jar"));
|
|
|
|
|
File anotherNested = new File(anotherNestedArchive.getUrl().toURI());
|
|
|
|
|
assertThat(nested.getParent()).isEqualTo(anotherNested.getParent());
|
|
|
|
|
((JarFileArchive) nestedArchive).close();
|
|
|
|
|
((JarFileArchive) anotherNestedArchive).close();
|
|
|
|
|
try (Archive nestedArchive = this.archive.getNestedArchive(getEntriesMap(this.archive).get("nested.jar"));
|
|
|
|
|
Archive anotherNestedArchive = this.archive
|
|
|
|
|
.getNestedArchive(getEntriesMap(this.archive).get("another-nested.jar"))) {
|
|
|
|
|
File nested = new File(nestedArchive.getUrl().toURI());
|
|
|
|
|
File anotherNested = new File(anotherNestedArchive.getUrl().toURI());
|
|
|
|
|
assertThat(nested.getParent()).isEqualTo(anotherNested.getParent());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
@ -156,40 +156,40 @@ class JarFileArchiveTests {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void nestedZip64ArchivesAreHandledGracefully() throws IOException {
|
|
|
|
|
void nestedZip64ArchivesAreHandledGracefully() throws Exception {
|
|
|
|
|
File file = new File(this.tempDir, "test.jar");
|
|
|
|
|
JarOutputStream output = new JarOutputStream(new FileOutputStream(file));
|
|
|
|
|
JarEntry zip64JarEntry = new JarEntry("nested/zip64.jar");
|
|
|
|
|
output.putNextEntry(zip64JarEntry);
|
|
|
|
|
byte[] zip64JarData = writeZip64Jar();
|
|
|
|
|
zip64JarEntry.setSize(zip64JarData.length);
|
|
|
|
|
zip64JarEntry.setCompressedSize(zip64JarData.length);
|
|
|
|
|
zip64JarEntry.setMethod(ZipEntry.STORED);
|
|
|
|
|
CRC32 crc32 = new CRC32();
|
|
|
|
|
crc32.update(zip64JarData);
|
|
|
|
|
zip64JarEntry.setCrc(crc32.getValue());
|
|
|
|
|
output.write(zip64JarData);
|
|
|
|
|
output.closeEntry();
|
|
|
|
|
output.close();
|
|
|
|
|
JarFileArchive jarFileArchive = new JarFileArchive(file);
|
|
|
|
|
Archive nestedArchive = jarFileArchive.getNestedArchive(getEntriesMap(jarFileArchive).get("nested/zip64.jar"));
|
|
|
|
|
Iterator<Entry> it = nestedArchive.iterator();
|
|
|
|
|
for (int i = 0; i < 65537; i++) {
|
|
|
|
|
assertThat(it.hasNext()).as(i + "nth file is present").isTrue();
|
|
|
|
|
it.next();
|
|
|
|
|
try (JarOutputStream output = new JarOutputStream(new FileOutputStream(file))) {
|
|
|
|
|
JarEntry zip64JarEntry = new JarEntry("nested/zip64.jar");
|
|
|
|
|
output.putNextEntry(zip64JarEntry);
|
|
|
|
|
byte[] zip64JarData = writeZip64Jar();
|
|
|
|
|
zip64JarEntry.setSize(zip64JarData.length);
|
|
|
|
|
zip64JarEntry.setCompressedSize(zip64JarData.length);
|
|
|
|
|
zip64JarEntry.setMethod(ZipEntry.STORED);
|
|
|
|
|
CRC32 crc32 = new CRC32();
|
|
|
|
|
crc32.update(zip64JarData);
|
|
|
|
|
zip64JarEntry.setCrc(crc32.getValue());
|
|
|
|
|
output.write(zip64JarData);
|
|
|
|
|
output.closeEntry();
|
|
|
|
|
}
|
|
|
|
|
try (JarFileArchive jarFileArchive = new JarFileArchive(file);
|
|
|
|
|
Archive nestedArchive = jarFileArchive
|
|
|
|
|
.getNestedArchive(getEntriesMap(jarFileArchive).get("nested/zip64.jar"))) {
|
|
|
|
|
Iterator<Entry> it = nestedArchive.iterator();
|
|
|
|
|
for (int i = 0; i < 65537; i++) {
|
|
|
|
|
assertThat(it.hasNext()).as(i + "nth file is present").isTrue();
|
|
|
|
|
it.next();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
((JarFileArchive) nestedArchive).close();
|
|
|
|
|
jarFileArchive.close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private byte[] writeZip64Jar() throws IOException {
|
|
|
|
|
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
|
|
|
|
|
JarOutputStream jarOutput = new JarOutputStream(bytes);
|
|
|
|
|
for (int i = 0; i < 65537; i++) {
|
|
|
|
|
jarOutput.putNextEntry(new JarEntry(i + ".dat"));
|
|
|
|
|
jarOutput.closeEntry();
|
|
|
|
|
try (JarOutputStream jarOutput = new JarOutputStream(bytes)) {
|
|
|
|
|
for (int i = 0; i < 65537; i++) {
|
|
|
|
|
jarOutput.putNextEntry(new JarEntry(i + ".dat"));
|
|
|
|
|
jarOutput.closeEntry();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
jarOutput.close();
|
|
|
|
|
return bytes.toByteArray();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|