From 17066d446293eb9ab5b2b50d5adf24a46210a7e0 Mon Sep 17 00:00:00 2001 From: SevcikMichal Date: Thu, 11 Sep 2025 12:11:15 +0200 Subject: [PATCH] Fix package cache lookup to allow substring match for canonical URIs --- .../npm/FilesystemPackageCacheManager.java | 2 +- .../npm/FilesystemPackageManagerTests.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/FilesystemPackageCacheManager.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/FilesystemPackageCacheManager.java index bf9f348ac3..ea9e8e8cc3 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/FilesystemPackageCacheManager.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/npm/FilesystemPackageCacheManager.java @@ -779,7 +779,7 @@ public String findCanonicalInLocalCache(String canonicalUrl) { for (String pf : listPackages()) { if (ManagedFileAccess.file(Utilities.path(cacheFolder, pf, "package", "package.json")).exists()) { JsonObject npm = JsonParser.parseObjectFromFile(Utilities.path(cacheFolder, pf, "package", "package.json")); - if (canonicalUrl.equals(npm.asString("canonical"))) { + if (canonicalUrl.contains(npm.asString("canonical"))) { return npm.asString("name"); } } diff --git a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/npm/FilesystemPackageManagerTests.java b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/npm/FilesystemPackageManagerTests.java index 7d39b416a2..e8ed4cf904 100644 --- a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/npm/FilesystemPackageManagerTests.java +++ b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/npm/FilesystemPackageManagerTests.java @@ -206,6 +206,20 @@ public void testReadFromCacheOnlyWaitsForLockDelete() throws IOException, Interr lockThread.join(); } + @Test + public void testCacheHitWithCanonicalSubstringMatch() throws IOException { + File cacheDirectory = ManagedFileAccess.fromPath(Files.createTempDirectory("fpcm-canonicalSubstringTest")); + FilesystemPackageCacheManager pcm = new FilesystemPackageCacheManager.Builder().withCacheFolder(cacheDirectory.getAbsolutePath()).build(); + + pcm.addPackageToCache("example.fhir.uv.myig", "1.2.3", this.getClass().getResourceAsStream("/npm/dummy-package.tgz"), "https://packages.fhir.org/example.fhir.uv.myig/1.2.3"); + + String dependsOnUri = "http://somewhere.org/fhir/uv/myig/ImplementationGuide/hl7.fhir.uv.extensions"; + + String npmPackageName = pcm.findCanonicalInLocalCache(dependsOnUri); + assertThat(npmPackageName).isNotNull(); + assertThat(npmPackageName).isEqualTo("example.fhir.uv.myig"); + } + /** We repeat the same tests multiple times here, in order to catch very rare edge cases. */