This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/main by this push:
     new 8cce5a86679 CAUSEWAY-3948: fixes webjar resource lookup
8cce5a86679 is described below

commit 8cce5a866791d88900e730ff263d5c16bc226b3b
Author: andi-huber <[email protected]>
AuthorDate: Fri Feb 20 11:57:40 2026 +0100

    CAUSEWAY-3948: fixes webjar resource lookup
    
    - was no issue in IDE, but when deployed using JIB
---
 viewers/commons/model/pom.xml                      |  5 ++
 .../commons/model/src/main/java/module-info.java   |  1 +
 .../commons/model/webjar/WebjarEnumerator.java     | 53 +++++-----------------
 3 files changed, 18 insertions(+), 41 deletions(-)

diff --git a/viewers/commons/model/pom.xml b/viewers/commons/model/pom.xml
index 34c6cbe3bc0..5331ea85fe2 100644
--- a/viewers/commons/model/pom.xml
+++ b/viewers/commons/model/pom.xml
@@ -47,6 +47,11 @@
             <artifactId>causeway-core-runtime</artifactId>
         </dependency>
         
+        <dependency>
+            <groupId>org.webjars</groupId>
+            <artifactId>webjars-locator-core</artifactId>
+        </dependency>
+        
                <dependency>
                        <groupId>org.webjars</groupId>
                        <artifactId>font-awesome</artifactId>
diff --git a/viewers/commons/model/src/main/java/module-info.java 
b/viewers/commons/model/src/main/java/module-info.java
index d962f328310..0b0709b8e7d 100644
--- a/viewers/commons/model/src/main/java/module-info.java
+++ b/viewers/commons/model/src/main/java/module-info.java
@@ -38,4 +38,5 @@
     requires spring.core;
     requires org.apache.causeway.viewer.commons.applib;
     requires org.apache.causeway.core.runtime;
+    requires webjars.locator.core;
 }
\ No newline at end of file
diff --git 
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/webjar/WebjarEnumerator.java
 
b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/webjar/WebjarEnumerator.java
index eac34885f4f..8c7b7069c9d 100644
--- 
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/webjar/WebjarEnumerator.java
+++ 
b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/webjar/WebjarEnumerator.java
@@ -18,20 +18,16 @@
  */
 package org.apache.causeway.viewer.commons.model.webjar;
 
-import java.net.URL;
-import java.util.Enumeration;
 import java.util.Map;
 import java.util.Optional;
-import java.util.Set;
-import java.util.TreeSet;
 import java.util.function.UnaryOperator;
 import java.util.stream.Collectors;
 
+import org.webjars.WebJarAssetLocator;
+import org.webjars.WebJarAssetLocator.WebJarInfo;
+
 import org.apache.causeway.commons.internal.base._Lazy;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
-import org.apache.causeway.commons.io.TextUtils;
-
-import lombok.SneakyThrows;
 
 /**
  * Utility to scan webjar version strings dynamically from class-path under 
{@code META-INF/resources/webjars}.
@@ -53,51 +49,26 @@ public static WebjarResource lookupElseFail(final String 
path) {
                 .noSuchElement("no webjar found on class-path under 
META-INF/resources/webjars matching sub-path '%s'", path));
     }
 
+    // datatables/2.3.6
+    // npm/bootstrap-select/1.14.0-beta3
+    // npm/inputmask/5.0.9
+    // jquery-ui/1.14.1
     public record WebjarResource(
         String path,
         String version) {
 
-        static Optional<WebjarResource> parseFromURL(final String url) {
-            if(url==null
-                    || !url.startsWith("jar:file:")
-                    || !url.contains("/org/webjars/")
-                    || !url.contains(".jar!"))
-                return Optional.empty();
-            // datatables/2.3.6
-            // npm/bootstrap-select/1.14.0-beta3
-            // npm/inputmask/5.0.9
-            // jquery-ui/1.14.1
-            var pathAndVersion = TextUtils.cutter(url)
-                .keepAfter("/org/webjars/")
-                .keepBefore(".jar!")
-                .keepBeforeLast("/");
-            return Optional.of(new WebjarResource(
-                pathAndVersion.keepBeforeLast("/").getValue(),
-                pathAndVersion.keepAfterLast("/").getValue()));
+        static WebjarResource from(final WebJarInfo webJarInfo) {
+            return new WebjarResource(webJarInfo.getArtifactId(), 
webJarInfo.getVersion());
         }
     }
 
     // -- HELPER
 
     private static Map<String, WebjarResource> scanClassPath() {
-        return webjarURLs().stream()
-            .map(WebjarResource::parseFromURL)
-            .filter(Optional::isPresent)
-            .map(Optional::get)
+        var locator = new WebJarAssetLocator();
+        return locator.getAllWebJars().values().stream()
+            .map(WebjarResource::from)
             .collect(Collectors.toMap(WebjarResource::path, 
UnaryOperator.identity()));
     }
 
-    @SneakyThrows
-    private static Set<String> webjarURLs() {
-        Set<String> webjarURLs = new TreeSet<>();
-        Enumeration<URL> resources = WebjarEnumerator.class.getClassLoader()
-                .getResources("META-INF/resources/webjars");
-
-        while (resources.hasMoreElements()) {
-            URL resource = resources.nextElement();
-            webjarURLs.add(resource.toString());
-        }
-        return webjarURLs;
-    }
-
 }

Reply via email to