From 9614bd80147b127d2f560f187364eb8812ba984f Mon Sep 17 00:00:00 2001 From: Geert Bevin Date: Thu, 18 Jul 2024 22:14:56 -0400 Subject: [PATCH] Consolidate all hashing and caching into a single properties file instead of multiple files --- lib/bld/bld-wrapper.jar | Bin 29818 -> 29769 bytes src/main/java/rife/bld/BaseProject.java | 70 +----- src/main/java/rife/bld/BldCache.java | 200 ++++++++++++++++++ src/main/java/rife/bld/BuildExecutor.java | 10 +- src/main/java/rife/bld/wrapper/Wrapper.java | 12 +- .../bld/wrapper/WrapperExtensionResolver.java | 93 +------- src/test/java/rife/bld/TestProject.java | 10 +- .../wrapper/TestWrapperExtensionResolver.java | 166 +++++++++------ 8 files changed, 330 insertions(+), 231 deletions(-) create mode 100644 src/main/java/rife/bld/BldCache.java diff --git a/lib/bld/bld-wrapper.jar b/lib/bld/bld-wrapper.jar index 66dad4b5e201406bc6701a0a29ca9b87f9152a8f..70c0de869311ef42e00868c5125e2b8c90d2380c 100644 GIT binary patch delta 15106 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 delta 15177 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 e.getKey() + ":" + e.getValue()).toList())); - for (var repository : repositories()) { - finger_print.append(repository.toString()); - finger_print.append('\n'); - } - for (var entry : dependencies().entrySet()) { - finger_print.append(entry.getKey()); - finger_print.append('\n'); - if (entry.getValue() != null) { - for (var dependency : entry.getValue()) { - finger_print.append(dependency.toString()); - finger_print.append('\n'); - } - } - } - finger_print.append(downloadSources()) - .append('\n') - .append(downloadJavadoc()) - .append('\n'); - - try { - var digest = MessageDigest.getInstance("SHA-1"); - digest.update(finger_print.toString().getBytes(StandardCharsets.UTF_8)); - return StringUtils.encodeHexLower(digest.digest()); - } catch (NoSuchAlgorithmException e) { - // should not happen - throw new RuntimeException(e); - } - } - - private boolean validateHash(File hashFile, String hash) { - try { - if (hashFile.exists()) { - var current_hash = FileUtils.readString(hashFile); - if (current_hash.equals(hash)) { - return true; - } - hashFile.delete(); - } - return false; - } catch (FileUtilsErrorException e) { - throw new RuntimeException(e); - } - } - - private void writeHash(File hashFile, String hash) { - try { - hashFile.getParentFile().mkdirs(); - FileUtils.writeString(hash, hashFile); - } catch (FileUtilsErrorException e) { - throw new RuntimeException(e); - } - } - @Override public int execute(String[] arguments) { if (!offline() && diff --git a/src/main/java/rife/bld/BldCache.java b/src/main/java/rife/bld/BldCache.java new file mode 100644 index 0000000..2fe02d8 --- /dev/null +++ b/src/main/java/rife/bld/BldCache.java @@ -0,0 +1,200 @@ +/* + * Copyright 2001-2023 Geert Bevin (gbevin[remove] at uwyn dot com) + * Licensed under the Apache License, Version 2.0 (the "License") + */ +package rife.bld; + +import rife.bld.dependencies.DependencyScopes; +import rife.bld.dependencies.Repository; +import rife.bld.dependencies.VersionResolution; +import rife.bld.wrapper.Wrapper; +import rife.tools.StringUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Collection; +import java.util.List; +import java.util.Properties; + +/** + * + * @author Geert Bevin (gbevin[remove] at uwyn dot com) + * @since 2.0 + */ +public class BldCache { + public static final String BLD_CACHE = "bld.cache"; + + private static final String PROPERTY_SUFFIX_HASH = ".hash"; + private static final String PROPERTY_SUFFIX_LOCAL = ".local"; + + public static final String WRAPPER_PROPERTIES_HASH = Wrapper.WRAPPER_PROPERTIES + PROPERTY_SUFFIX_HASH; + public static final String BLD_BUILD_HASH = "bld-build" + PROPERTY_SUFFIX_HASH; + + private static final String PROPERTY_EXTENSIONS_PREFIX = "bld.extensions"; + private static final String PROPERTY_EXTENSIONS_HASH = PROPERTY_EXTENSIONS_PREFIX + PROPERTY_SUFFIX_HASH; + private static final String PROPERTY_EXTENSIONS_LOCAL = PROPERTY_EXTENSIONS_PREFIX + PROPERTY_SUFFIX_LOCAL; + + private static final String PROPERTY_DEPENDENCIES_PREFIX = "bld.dependencies"; + private static final String PROPERTY_DEPENDENCIES_HASH = PROPERTY_DEPENDENCIES_PREFIX + PROPERTY_SUFFIX_HASH; + + private final File hashFile_; + private final Properties hashProperties_ = new Properties(); + private final VersionResolution resolution_; + private String extensionsHash_; + private String dependenciesHash_; + + public BldCache(File bldLibDir, VersionResolution resolution) { + hashFile_ = new File(bldLibDir, BLD_CACHE); + resolution_ = resolution; + + new File(bldLibDir, WRAPPER_PROPERTIES_HASH).delete(); + new File(bldLibDir, BLD_BUILD_HASH).delete(); + + if (hashFile_.exists()) { + try { + hashProperties_.load(new FileInputStream(hashFile_)); + } catch (IOException e) { + // no-op, we'll store a new properties file when we're writing the cache + } + } + } + + public void fingerprintExtensions(Collection repositories, Collection extensions, boolean downloadSources, boolean downloadJavadoc) { + try { + var overrides_fp = String.join("\n", resolution_.versionOverrides().entrySet().stream().map(e -> e.getKey() + ":" + e.getValue()).toList()); + var repositories_fp = String.join("\n", repositories); + var extensions_fp = String.join("\n", extensions); + var fingerprint = overrides_fp + "\n" + repositories_fp + "\n" + extensions_fp + "\n" + downloadSources + "\n" + downloadJavadoc; + var digest = MessageDigest.getInstance("SHA-1"); + digest.update(fingerprint.getBytes(StandardCharsets.UTF_8)); + + extensionsHash_ = StringUtils.encodeHexLower(digest.digest()); + } catch (NoSuchAlgorithmException e) { + // should not happen + throw new RuntimeException(e); + } + } + + public void fingerprintDependencies(List repositories, DependencyScopes dependencies, boolean downloadSources, boolean downloadJavadoc) { + var finger_print = new StringBuilder(); + finger_print.append(String.join("\n", resolution_.versionOverrides().entrySet().stream().map(e -> e.getKey() + ":" + e.getValue()).toList())); + for (var repository : repositories) { + finger_print.append(repository.toString()); + finger_print.append('\n'); + } + for (var entry : dependencies.entrySet()) { + finger_print.append(entry.getKey()); + finger_print.append('\n'); + if (entry.getValue() != null) { + for (var dependency : entry.getValue()) { + finger_print.append(dependency.toString()); + finger_print.append('\n'); + } + } + } + finger_print.append(downloadSources) + .append('\n') + .append(downloadJavadoc) + .append('\n'); + + try { + var digest = MessageDigest.getInstance("SHA-1"); + digest.update(finger_print.toString().getBytes(StandardCharsets.UTF_8)); + dependenciesHash_ = StringUtils.encodeHexLower(digest.digest()); + } catch (NoSuchAlgorithmException e) { + // should not happen + throw new RuntimeException(e); + } + } + + public boolean isExtensionHashValid() { + return validateExtensionsHash(extensionsHash_); + } + + private boolean validateExtensionsHash(String hash) { + if (!hashFile_.exists() || hashProperties_.isEmpty()) { + return false; + } + + if (!hash.equals(hashProperties_.getProperty(PROPERTY_EXTENSIONS_HASH))) { + return false; + } + + var local_files = hashProperties_.getProperty(PROPERTY_EXTENSIONS_LOCAL); + if (local_files != null && !local_files.isEmpty()) { + var lines = StringUtils.split(local_files, "\n"); + if (!lines.isEmpty()) { + // other lines are last modified timestamps of local files + // that were dependency artifacts + while (!lines.isEmpty()) { + var line = lines.get(0); + var parts = line.split(":", 2); + // verify that the local file has the same modified timestamp still + if (parts.length == 2) { + var file = new File(parts[1]); + if (!file.exists() || !file.canRead() || file.lastModified() != Long.parseLong(parts[0])) { + break; + } + } else { + break; + } + lines.remove(0); + } + + // there were no invalid lines, so the hash file contents are valid + return lines.isEmpty(); + } + } + + return true; + } + + public boolean isDependenciesHashValid() { + return validateDependenciesHash(dependenciesHash_); + } + + private boolean validateDependenciesHash(String hash) { + if (!hashFile_.exists() || hashProperties_.isEmpty()) { + return false; + } + + return hash.equals(hashProperties_.getProperty(PROPERTY_DEPENDENCIES_HASH)); + } + + public void writeCache() { + writeCache(null); + } + + public void writeCache(List extensionsLocalArtifacts) { + try { + if (extensionsHash_ != null) { + hashProperties_.put(PROPERTY_EXTENSIONS_HASH, extensionsHash_); + } + + if (extensionsLocalArtifacts != null) { + var extensions_local = new StringBuilder(); + for (var file : extensionsLocalArtifacts) { + if (file.exists() && file.canRead()) { + extensions_local.append("\n").append(file.lastModified()).append(':').append(file.getAbsolutePath()); + } + } + hashProperties_.put(PROPERTY_EXTENSIONS_LOCAL, extensions_local.toString()); + } + + if (dependenciesHash_ != null) { + hashProperties_.put(PROPERTY_DEPENDENCIES_HASH, dependenciesHash_); + } + + hashFile_.getParentFile().mkdirs(); + hashProperties_.store(new FileOutputStream(hashFile_), null); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} + diff --git a/src/main/java/rife/bld/BuildExecutor.java b/src/main/java/rife/bld/BuildExecutor.java index cda33b1..2c65ef2 100644 --- a/src/main/java/rife/bld/BuildExecutor.java +++ b/src/main/java/rife/bld/BuildExecutor.java @@ -439,6 +439,7 @@ public boolean executeCommand(String command) // try to find a match for the provided command amongst // the ones that are known + var matched = false; if (definition == null) { // try to find starting matching options var matches = new ArrayList<>(buildCommands().keySet().stream() @@ -463,7 +464,7 @@ public boolean executeCommand(String command) // only proceed if exactly one match was found if (matches.size() == 1) { matched_command = matches.get(0); - System.out.println("Executing matched command: " + matched_command); + matched = true; definition = buildCommands().get(matched_command); } } @@ -473,6 +474,13 @@ public boolean executeCommand(String command) currentCommandName_.set(matched_command); currentCommandDefinition_.set(definition); try { + if (matched) { + System.out.println("Executing matched command: " + matched_command); + } + else { + System.out.println("Executing command: " + currentCommandName_); + } + definition.execute(); } catch (ExitStatusException e) { exitStatus(e.getExitStatus()); diff --git a/src/main/java/rife/bld/wrapper/Wrapper.java b/src/main/java/rife/bld/wrapper/Wrapper.java index bda2868..64454d5 100644 --- a/src/main/java/rife/bld/wrapper/Wrapper.java +++ b/src/main/java/rife/bld/wrapper/Wrapper.java @@ -44,23 +44,23 @@ private enum LaunchMode { public static final String OFFLINE_ARGUMENT = "--offline"; public static final String HELP_COMMAND = "help"; + public static final String WRAPPER_PREFIX = "bld-wrapper"; + public static final String WRAPPER_PROPERTIES = WRAPPER_PREFIX + ".properties"; + static final String MAVEN_CENTRAL = "https://repo1.maven.org/maven2/"; static final String SONATYPE_SNAPSHOTS = "https://s01.oss.sonatype.org/content/repositories/snapshots/"; static final String DOWNLOAD_LOCATION = MAVEN_CENTRAL + "com/uwyn/rife2/bld/${version}/"; static final String DOWNLOAD_LOCATION_SNAPSHOT = SONATYPE_SNAPSHOTS + "com/uwyn/rife2/bld/${version}/"; + static final String BLD_CACHE = "bld.cache"; static final String BLD_FILENAME = "bld-${version}.jar"; static final String BLD_SOURCES_FILENAME = "bld-${version}-sources.jar"; static final String BLD_VERSION = "BLD_VERSION"; - static final String BLD_BUILD_HASH = "bld-build.hash"; - static final String WRAPPER_PREFIX = "bld-wrapper"; - static final String WRAPPER_PROPERTIES = WRAPPER_PREFIX + ".properties"; static final String WRAPPER_JAR = WRAPPER_PREFIX + ".jar"; static final String BLD_PROPERTY_VERSION = "bld.version"; static final String RIFE2_PROPERTY_DOWNLOAD_LOCATION = "rife2.downloadLocation"; static final String BLD_PROPERTY_DOWNLOAD_LOCATION = "bld.downloadLocation"; static final String PROPERTY_REPOSITORIES = "bld.repositories"; static final String PROPERTY_EXTENSION_PREFIX = "bld.extension"; - static final String PROPERTY_EXTENSIONS = "bld.extensions"; static final String PROPERTY_DOWNLOAD_EXTENSION_SOURCES = "bld.downloadExtensionSources"; static final String PROPERTY_DOWNLOAD_EXTENSION_JAVADOC = "bld.downloadExtensionJavadoc"; static final String PROPERTY_SOURCE_DIRECTORIES = "bld.sourceDirectories"; @@ -637,9 +637,9 @@ private void resolveExtensions() { try { var resolver_class = classloader_.loadClass("rife.bld.wrapper.WrapperExtensionResolver"); - var constructor = resolver_class.getConstructor(File.class, File.class, File.class, Properties.class, Properties.class, Collection.class, Collection.class, boolean.class, boolean.class); + var constructor = resolver_class.getConstructor(File.class, File.class, Properties.class, Properties.class, Collection.class, Collection.class, boolean.class, boolean.class); var update_method = resolver_class.getMethod("updateExtensions"); - var resolver = constructor.newInstance(currentDir_, new File(wrapperPropertiesFile_.getAbsolutePath() + ".hash"), libBldDirectory(), + var resolver = constructor.newInstance(currentDir_, libBldDirectory(), jvmProperties_, wrapperProperties_, repositories_, extensions_, downloadExtensionSources_, downloadExtensionJavadoc_); diff --git a/src/main/java/rife/bld/wrapper/WrapperExtensionResolver.java b/src/main/java/rife/bld/wrapper/WrapperExtensionResolver.java index 5f0f9d4..817fa74 100644 --- a/src/main/java/rife/bld/wrapper/WrapperExtensionResolver.java +++ b/src/main/java/rife/bld/wrapper/WrapperExtensionResolver.java @@ -4,17 +4,12 @@ */ package rife.bld.wrapper; +import rife.bld.BldCache; import rife.bld.BuildExecutor; import rife.bld.dependencies.*; import rife.ioc.HierarchicalProperties; -import rife.tools.FileUtils; -import rife.tools.StringUtils; -import rife.tools.exceptions.FileUtilsErrorException; import java.io.File; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.*; import static rife.bld.dependencies.Dependency.CLASSIFIER_JAVADOC; @@ -31,8 +26,7 @@ public class WrapperExtensionResolver { private final VersionResolution resolution_; private final ArtifactRetriever retriever_; - private final File hashFile_; - private final String fingerPrintHash_; + private final BldCache cache_; private final File destinationDirectory_; private final List repositories_ = new ArrayList<>(); private final DependencySet dependencies_ = new DependencySet(); @@ -42,7 +36,7 @@ public class WrapperExtensionResolver { private boolean headerPrinted_ = false; - public WrapperExtensionResolver(File currentDir, File hashFile, File destinationDirectory, + public WrapperExtensionResolver(File currentDir, File destinationDirectory, Properties jvmProperties, Properties wrapperProperties, Collection repositories, Collection extensions, boolean downloadSources, boolean downloadJavadoc) { @@ -56,7 +50,7 @@ public WrapperExtensionResolver(File currentDir, File hashFile, File destination retriever_ = ArtifactRetriever.cachingInstance(); Repository.resolveMavenLocal(properties); - hashFile_ = hashFile; + cache_ = new BldCache(destinationDirectory, resolution_); destinationDirectory_ = destinationDirectory; @@ -68,32 +62,16 @@ public WrapperExtensionResolver(File currentDir, File hashFile, File destination downloadSources_ = downloadSources; downloadJavadoc_ = downloadJavadoc; - fingerPrintHash_ = createHash( - resolution_, + cache_.fingerprintExtensions( repositories_.stream().map(Objects::toString).toList(), dependencies_.stream().map(Objects::toString).toList(), downloadSources, downloadJavadoc); } - private static String createHash(VersionResolution resolution, Collection repositories, Collection extensions, boolean downloadSources, boolean downloadJavadoc) { - try { - var overrides_fp = String.join("\n", resolution.versionOverrides().entrySet().stream().map(e -> e.getKey() + ":" + e.getValue()).toList()); - var repositories_fp = String.join("\n", repositories); - var extensions_fp = String.join("\n", extensions); - var fingerprint = overrides_fp + "\n" + repositories_fp + "\n" + extensions_fp + "\n" + downloadSources + "\n" + downloadJavadoc; - var digest = MessageDigest.getInstance("SHA-1"); - digest.update(fingerprint.getBytes(StandardCharsets.UTF_8)); - return StringUtils.encodeHexLower(digest.digest()); - } catch (NoSuchAlgorithmException e) { - // should not happen - throw new RuntimeException(e); - } - } - public void updateExtensions() { // verify and update the fingerprint hash file, // don't update the extensions if the hash is identical - if (validateHash()) { + if (cache_.isExtensionHashValid()) { return; } @@ -103,68 +81,13 @@ public void updateExtensions() { // purge the files that are not part of the latest extensions anymore purgeExtensionDependencies(filenames); - writeHash(); + cache_.writeCache(localArtifacts_); if (headerPrinted_) { System.out.println(); } } - private boolean validateHash() { - try { - if (hashFile_.exists()) { - var contents = FileUtils.readString(hashFile_); - var lines = StringUtils.split(contents, "\n"); - if (!lines.isEmpty()) { - // first line is the fingerprint hash - if (lines.remove(0).equals(fingerPrintHash_)) { - // other lines are last modified timestamps of local files - // that were dependency artifacts - while (!lines.isEmpty()) { - var line = lines.get(0); - var parts = line.split(":", 2); - // verify that the local file has the same modified timestamp still - if (parts.length == 2) { - var file = new File(parts[1]); - if (!file.exists() || !file.canRead() || file.lastModified() != Long.parseLong(parts[0])) { - break; - } - } else { - break; - } - lines.remove(0); - } - - // there were no invalid lines, so the hash file contents are valid - if (lines.isEmpty()) { - return true; - } - } - } - hashFile_.delete(); - } - return false; - } catch (FileUtilsErrorException e) { - throw new RuntimeException(e); - } - } - - private void writeHash() { - try { - var contents = new StringBuilder(); - contents.append(fingerPrintHash_); - for (var file : localArtifacts_) { - if (file.exists() && file.canRead()) { - contents.append("\n").append(file.lastModified()).append(':').append(file.getAbsolutePath()); - } - } - - FileUtils.writeString(contents.toString(), hashFile_); - } catch (FileUtilsErrorException e) { - throw new RuntimeException(e); - } - } - private Set transferExtensionDependencies() { var filenames = new HashSet(); var dependencies = new DependencySet(); @@ -204,7 +127,7 @@ private Set transferExtensionDependencies() { private void purgeExtensionDependencies(Set filenames) { for (var file : destinationDirectory_.listFiles()) { if (file.getName().startsWith(Wrapper.WRAPPER_PREFIX) || - file.getName().equals(Wrapper.BLD_BUILD_HASH)) { + file.getName().equals(Wrapper.BLD_CACHE)) { continue; } if (!filenames.contains(file.getName())) { diff --git a/src/test/java/rife/bld/TestProject.java b/src/test/java/rife/bld/TestProject.java index 5eb8ce8..26c1b56 100644 --- a/src/test/java/rife/bld/TestProject.java +++ b/src/test/java/rife/bld/TestProject.java @@ -361,7 +361,7 @@ void testAutoDownloadPurge() assertEquals(""" /lib /lib/bld - /lib/bld/bld-build.hash + /lib/bld/bld.cache /lib/compile /lib/compile/rife2-1.5.11.jar /lib/provided @@ -385,7 +385,7 @@ void testAutoDownloadPurge() assertEquals(""" /lib /lib/bld - /lib/bld/bld-build.hash""", FileUtils.generateDirectoryListing(tmp)); + /lib/bld/bld.cache""", FileUtils.generateDirectoryListing(tmp)); project = new CustomProjectAutoPurge(tmp); project.enableAutoDownloadPurge(); @@ -393,7 +393,7 @@ void testAutoDownloadPurge() assertEquals(""" /lib /lib/bld - /lib/bld/bld-build.hash""", FileUtils.generateDirectoryListing(tmp)); + /lib/bld/bld.cache""", FileUtils.generateDirectoryListing(tmp)); project = new CustomProjectAutoPurge(tmp); project.enableAutoDownloadPurge(); @@ -402,7 +402,7 @@ void testAutoDownloadPurge() assertEquals(""" /lib /lib/bld - /lib/bld/bld-build.hash + /lib/bld/bld.cache /lib/compile /lib/compile/rife2-1.5.12.jar /lib/provided @@ -426,7 +426,7 @@ void testAutoDownloadPurge() assertEquals(""" /lib /lib/bld - /lib/bld/bld-build.hash + /lib/bld/bld.cache /lib/compile /lib/compile/rife2-1.5.15.jar /lib/provided diff --git a/src/test/java/rife/bld/wrapper/TestWrapperExtensionResolver.java b/src/test/java/rife/bld/wrapper/TestWrapperExtensionResolver.java index acb56e3..576169e 100644 --- a/src/test/java/rife/bld/wrapper/TestWrapperExtensionResolver.java +++ b/src/test/java/rife/bld/wrapper/TestWrapperExtensionResolver.java @@ -5,6 +5,7 @@ package rife.bld.wrapper; import org.junit.jupiter.api.Test; +import rife.bld.BldCache; import rife.bld.BldVersion; import rife.bld.dependencies.VersionResolution; import rife.tools.FileUtils; @@ -25,7 +26,7 @@ void testNoExtensions() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -34,16 +35,17 @@ void testNoExtensions() bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), Collections.emptySet(), Collections.emptySet(), false, false); + var resolver = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), Collections.emptySet(), Collections.emptySet(), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); var files2 = FileUtils.getFileList(tmp2); - assertEquals(2, files2.size()); + assertEquals(3, files2.size()); Collections.sort(files2); assertEquals(""" bld-wrapper.jar - bld-wrapper.properties""", String.join("\n", files2)); + bld-wrapper.properties + bld.cache""", String.join("\n", files2)); } finally { tmp2.delete(); tmp1.delete(); @@ -58,7 +60,7 @@ void testUpdateExtensions() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -67,14 +69,14 @@ void testUpdateExtensions() bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, + var resolver = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); var files2 = FileUtils.getFileList(tmp2); - assertEquals(9, files2.size()); + assertEquals(10, files2.size()); Collections.sort(files2); assertEquals(""" ST4-4.3.4.jar @@ -83,6 +85,7 @@ void testUpdateExtensions() antlr4-runtime-4.11.1.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1.jar javax.json-1.1.4.jar org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files2)); @@ -100,7 +103,7 @@ void testUpdateExtensionsOverride1() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -111,14 +114,14 @@ void testUpdateExtensionsOverride1() var properties = new Properties(); properties.put(VersionResolution.PROPERTY_OVERRIDE_PREFIX, "org.antlr:antlr4:4.11.0"); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, + var resolver = new WrapperExtensionResolver(tmp1, tmp2, properties, new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); var files2 = FileUtils.getFileList(tmp2); - assertEquals(9, files2.size()); + assertEquals(10, files2.size()); Collections.sort(files2); assertEquals(""" ST4-4.3.4.jar @@ -127,6 +130,7 @@ properties, new Properties(), antlr4-runtime-4.11.0.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1.jar javax.json-1.1.4.jar org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files2)); @@ -144,7 +148,7 @@ void testUpdateExtensionsOverride2() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -155,14 +159,14 @@ void testUpdateExtensionsOverride2() var properties = new Properties(); properties.put(VersionResolution.PROPERTY_OVERRIDE_PREFIX, "org.glassfish:javax.json:1.1.3"); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, + var resolver = new WrapperExtensionResolver(tmp1, tmp2, properties, new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); var files2 = FileUtils.getFileList(tmp2); - assertEquals(10, files2.size()); + assertEquals(11, files2.size()); Collections.sort(files2); assertEquals(""" ST4-4.3.4.jar @@ -171,6 +175,7 @@ properties, new Properties(), antlr4-runtime-4.11.1.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1.jar javax.json-1.1.3.jar javax.json-api-1.1.3.jar @@ -189,7 +194,7 @@ void testUpdateExtensionsSources() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -198,12 +203,12 @@ void testUpdateExtensionsSources() bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), true, false); + var resolver = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), true, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); var files2 = FileUtils.getFileList(tmp2); - assertEquals(16, files2.size()); + assertEquals(17, files2.size()); Collections.sort(files2); assertEquals(""" ST4-4.3.4-sources.jar @@ -216,6 +221,7 @@ void testUpdateExtensionsSources() antlr4-runtime-4.11.1.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1-sources.jar icu4j-71.1.jar javax.json-1.1.4-sources.jar @@ -236,7 +242,7 @@ void testUpdateExtensionsJavadoc() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -245,12 +251,12 @@ void testUpdateExtensionsJavadoc() bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, true); + var resolver = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, true); resolver.updateExtensions(); assertTrue(hash_file.exists()); var files2 = FileUtils.getFileList(tmp2); - assertEquals(16, files2.size()); + assertEquals(17, files2.size()); Collections.sort(files2); assertEquals(""" ST4-4.3.4-javadoc.jar @@ -263,6 +269,7 @@ void testUpdateExtensionsJavadoc() antlr4-runtime-4.11.1.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1-javadoc.jar icu4j-71.1.jar javax.json-1.1.4-javadoc.jar @@ -283,7 +290,7 @@ void testUpdateExtensionsBoth() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -292,12 +299,12 @@ void testUpdateExtensionsBoth() bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), true, true); + var resolver = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), true, true); resolver.updateExtensions(); assertTrue(hash_file.exists()); var files2 = FileUtils.getFileList(tmp2); - assertEquals(23, files2.size()); + assertEquals(24, files2.size()); Collections.sort(files2); assertEquals(""" ST4-4.3.4-javadoc.jar @@ -314,6 +321,7 @@ void testUpdateExtensionsBoth() antlr4-runtime-4.11.1.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1-javadoc.jar icu4j-71.1-sources.jar icu4j-71.1.jar @@ -337,7 +345,7 @@ void testUpdateExtensionsBothOverride() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -348,14 +356,14 @@ void testUpdateExtensionsBothOverride() var properties = new Properties(); properties.put(VersionResolution.PROPERTY_OVERRIDE_PREFIX, "org.antlr:antlr4:4.11.0"); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, + var resolver = new WrapperExtensionResolver(tmp1, tmp2, properties, new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), true, true); resolver.updateExtensions(); assertTrue(hash_file.exists()); var files2 = FileUtils.getFileList(tmp2); - assertEquals(23, files2.size()); + assertEquals(24, files2.size()); Collections.sort(files2); assertEquals(""" ST4-4.3.4-javadoc.jar @@ -372,6 +380,7 @@ properties, new Properties(), antlr4-runtime-4.11.0.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1-javadoc.jar icu4j-71.1-sources.jar icu4j-71.1.jar @@ -395,7 +404,7 @@ void testResolvedRepository() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -407,12 +416,12 @@ void testResolvedRepository() var properties = new File(tmp1, "local.properties"); FileUtils.writeString("bld.repo.testrepo=" + MAVEN_CENTRAL, properties); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of("testrepo"), List.of("org.antlr:antlr4:4.11.1"), false, false); + var resolver = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of("testrepo"), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); var files2 = FileUtils.getFileList(tmp2); - assertEquals(9, files2.size()); + assertEquals(10, files2.size()); Collections.sort(files2); assertEquals(""" ST4-4.3.4.jar @@ -421,6 +430,7 @@ void testResolvedRepository() antlr4-runtime-4.11.1.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1.jar javax.json-1.1.4.jar org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files2)); @@ -438,7 +448,7 @@ void testCheckHash() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -447,31 +457,34 @@ void testCheckHash() bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); + var resolver = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); var files = tmp2.listFiles(); - assertEquals(9, files.length); + assertEquals(10, files.length); Arrays.stream(files).forEach(file -> { - if (!file.getName().startsWith(Wrapper.WRAPPER_PREFIX)) { + if (!file.getName().startsWith(Wrapper.WRAPPER_PREFIX) && + !file.getName().equals(BldCache.BLD_CACHE)) { file.delete(); } }); var files2 = FileUtils.getFileList(tmp2); - assertEquals(2, files2.size()); + assertEquals(3, files2.size()); Collections.sort(files2); assertEquals(""" bld-wrapper.jar - bld-wrapper.properties""", String.join("\n", files2)); + bld-wrapper.properties + bld.cache""", String.join("\n", files2)); resolver.updateExtensions(); var files3 = FileUtils.getFileList(tmp2); - assertEquals(2, files3.size()); + assertEquals(3, files3.size()); Collections.sort(files3); assertEquals(""" bld-wrapper.jar - bld-wrapper.properties""", String.join("\n", files3)); + bld-wrapper.properties + bld.cache""", String.join("\n", files3)); } finally { tmp2.delete(); tmp1.delete(); @@ -486,7 +499,7 @@ void testDeleteHash() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -495,36 +508,39 @@ void testDeleteHash() bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); + var resolver = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); var files = tmp2.listFiles(); - assertEquals(9, files.length); + assertEquals(10, files.length); Arrays.stream(files).forEach(file -> { - if (!file.getName().startsWith(Wrapper.WRAPPER_PREFIX)) { + if (!file.getName().startsWith(Wrapper.WRAPPER_PREFIX) && + !file.getName().equals(BldCache.BLD_CACHE)) { file.delete(); } }); var files2 = FileUtils.getFileList(tmp2); - assertEquals(2, files2.size()); + assertEquals(3, files2.size()); Collections.sort(files2); assertEquals(""" bld-wrapper.jar - bld-wrapper.properties""", String.join("\n", files2)); + bld-wrapper.properties + bld.cache""", String.join("\n", files2)); resolver.updateExtensions(); var files3 = FileUtils.getFileList(tmp2); - assertEquals(2, files3.size()); + assertEquals(3, files3.size()); Collections.sort(files3); assertEquals(""" bld-wrapper.jar - bld-wrapper.properties""", String.join("\n", files3)); + bld-wrapper.properties + bld.cache""", String.join("\n", files3)); hash_file.delete(); resolver.updateExtensions(); var files4 = FileUtils.getFileList(tmp2); - assertEquals(9, files4.size()); + assertEquals(10, files4.size()); Collections.sort(files4); assertEquals(""" ST4-4.3.4.jar @@ -533,6 +549,7 @@ void testDeleteHash() antlr4-runtime-4.11.1.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1.jar javax.json-1.1.4.jar org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files4)); @@ -550,7 +567,7 @@ void testUpdateHash() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -559,36 +576,40 @@ void testUpdateHash() bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); + var resolver = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver.updateExtensions(); assertTrue(hash_file.exists()); var files = tmp2.listFiles(); - assertEquals(9, files.length); + assertEquals(10, files.length); Arrays.stream(files).forEach(file -> { - if (!file.getName().startsWith(Wrapper.WRAPPER_PREFIX)) { + if (!file.getName().startsWith(Wrapper.WRAPPER_PREFIX) && + !file.getName().equals(BldCache.BLD_CACHE)) { file.delete(); } }); var files2 = FileUtils.getFileList(tmp2); - assertEquals(2, files2.size()); + assertEquals(3, files2.size()); Collections.sort(files2); assertEquals(""" bld-wrapper.jar - bld-wrapper.properties""", String.join("\n", files2)); + bld-wrapper.properties + bld.cache""", String.join("\n", files2)); resolver.updateExtensions(); var files3 = FileUtils.getFileList(tmp2); - assertEquals(2, files3.size()); + assertEquals(3, files3.size()); Collections.sort(files3); assertEquals(""" bld-wrapper.jar - bld-wrapper.properties""", String.join("\n", files3)); + bld-wrapper.properties + bld.cache""", String.join("\n", files3)); FileUtils.writeString("updated", hash_file); + resolver = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver.updateExtensions(); var files4 = FileUtils.getFileList(tmp2); - assertEquals(9, files4.size()); + assertEquals(10, files4.size()); Collections.sort(files4); assertEquals(""" ST4-4.3.4.jar @@ -597,6 +618,7 @@ void testUpdateHash() antlr4-runtime-4.11.1.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1.jar javax.json-1.1.4.jar org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files4)); @@ -614,7 +636,7 @@ void testAddExtension() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -623,12 +645,12 @@ void testAddExtension() bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver1 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); + var resolver1 = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver1.updateExtensions(); assertTrue(hash_file.exists()); var files2 = FileUtils.getFileList(tmp2); - assertEquals(9, files2.size()); + assertEquals(10, files2.size()); Collections.sort(files2); assertEquals(""" ST4-4.3.4.jar @@ -637,14 +659,15 @@ void testAddExtension() antlr4-runtime-4.11.1.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1.jar javax.json-1.1.4.jar org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files2)); - var resolver2 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1", "org.jsoup:jsoup:1.15.4"), false, false); + var resolver2 = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1", "org.jsoup:jsoup:1.15.4"), false, false); resolver2.updateExtensions(); var files3 = FileUtils.getFileList(tmp2); - assertEquals(10, files3.size()); + assertEquals(11, files3.size()); Collections.sort(files3); assertEquals(""" ST4-4.3.4.jar @@ -653,6 +676,7 @@ void testAddExtension() antlr4-runtime-4.11.1.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1.jar javax.json-1.1.4.jar jsoup-1.15.4.jar @@ -671,7 +695,7 @@ void testRemoveExtension() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -680,12 +704,12 @@ void testRemoveExtension() bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver1 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1", "org.jsoup:jsoup:1.15.4"), false, false); + var resolver1 = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1", "org.jsoup:jsoup:1.15.4"), false, false); resolver1.updateExtensions(); assertTrue(hash_file.exists()); var files2 = FileUtils.getFileList(tmp2); - assertEquals(10, files2.size()); + assertEquals(11, files2.size()); Collections.sort(files2); assertEquals(""" ST4-4.3.4.jar @@ -694,19 +718,21 @@ void testRemoveExtension() antlr4-runtime-4.11.1.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1.jar javax.json-1.1.4.jar jsoup-1.15.4.jar org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files2)); - var resolver2 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.jsoup:jsoup:1.15.4"), false, false); + var resolver2 = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.jsoup:jsoup:1.15.4"), false, false); resolver2.updateExtensions(); var files3 = FileUtils.getFileList(tmp2); - assertEquals(3, files3.size()); + assertEquals(4, files3.size()); Collections.sort(files3); assertEquals(""" bld-wrapper.jar bld-wrapper.properties + bld.cache jsoup-1.15.4.jar""", String.join("\n", files3)); } finally { tmp2.delete(); @@ -722,7 +748,7 @@ void testOverrideExtension() try { new Wrapper().createWrapperFiles(tmp2, BldVersion.getVersion()); - var hash_file = new File(tmp1, "wrapper.hash"); + var hash_file = new File(tmp2, BldCache.BLD_CACHE); assertFalse(hash_file.exists()); var files1 = FileUtils.getFileList(tmp2); assertEquals(2, files1.size()); @@ -731,14 +757,14 @@ void testOverrideExtension() bld-wrapper.jar bld-wrapper.properties""", String.join("\n", files1)); - var resolver1 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, + var resolver1 = new WrapperExtensionResolver(tmp1, tmp2, new Properties(), new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver1.updateExtensions(); assertTrue(hash_file.exists()); var files2 = FileUtils.getFileList(tmp2); - assertEquals(9, files2.size()); + assertEquals(10, files2.size()); Collections.sort(files2); assertEquals(""" ST4-4.3.4.jar @@ -747,18 +773,19 @@ void testOverrideExtension() antlr4-runtime-4.11.1.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1.jar javax.json-1.1.4.jar org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files2)); var properties = new Properties(); properties.put(VersionResolution.PROPERTY_OVERRIDE_PREFIX, "org.antlr:antlr4:4.11.0"); - var resolver2 = new WrapperExtensionResolver(tmp1, hash_file, tmp2, + var resolver2 = new WrapperExtensionResolver(tmp1, tmp2, properties, new Properties(), List.of(MAVEN_CENTRAL), List.of("org.antlr:antlr4:4.11.1"), false, false); resolver2.updateExtensions(); var files3 = FileUtils.getFileList(tmp2); - assertEquals(9, files3.size()); + assertEquals(10, files3.size()); Collections.sort(files3); assertEquals(""" ST4-4.3.4.jar @@ -767,6 +794,7 @@ properties, new Properties(), antlr4-runtime-4.11.0.jar bld-wrapper.jar bld-wrapper.properties + bld.cache icu4j-71.1.jar javax.json-1.1.4.jar org.abego.treelayout.core-1.0.3.jar""", String.join("\n", files3));