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

thiagohp pushed a commit to branch feature/es-module-support
in repository https://gitbox.apache.org/repos/asf/tapestry-5.git

commit 37dcd99502d11cc41189bc5ddd7caa6fc6ffc6e9
Author: Thiago H. de Paula Figueiredo <thi...@arsmachina.com.br>
AuthorDate: Tue Apr 1 18:37:29 2025 -0300

    TAP5-2803: fixing live reloading of files in /META-INF/es-assets
---
 .../services/assets/ResourceChangeTrackerImpl.java  |  3 +--
 .../services/javascript/EsModuleManagerImpl.java    | 16 ++++++++++------
 .../ioc/internal/util/URLChangeTracker.java         | 21 +++++++++++++++++++++
 3 files changed, 32 insertions(+), 8 deletions(-)

diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ResourceChangeTrackerImpl.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ResourceChangeTrackerImpl.java
index 73d4d2644..54e3bc485 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ResourceChangeTrackerImpl.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/ResourceChangeTrackerImpl.java
@@ -92,12 +92,11 @@ public class ResourceChangeTrackerImpl extends 
InvalidationEventHubImpl implemen
 
     public void forceInvalidationEvent()
     {
-        fireInvalidationEvent();
-
         if (tracker != null)
         {
             tracker.clear();
         }
+        fireInvalidationEvent();
     }
 
     public void checkForUpdates()
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImpl.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImpl.java
index dff737ee6..236f72382 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImpl.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImpl.java
@@ -17,6 +17,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.tapestry5.Asset;
 import org.apache.tapestry5.SymbolConstants;
 import org.apache.tapestry5.commons.util.AvailableValues;
 import org.apache.tapestry5.commons.util.CollectionFactory;
@@ -62,6 +63,8 @@ public class EsModuleManagerImpl implements EsModuleManager
     
     private JSONObject importMap;
     
+    private final ResourceChangeTracker resourceChangeTracker;
+    
     private final List<EsModuleConfigurationCallback> globalCallbacks;
 
     public EsModuleManagerImpl(
@@ -72,13 +75,15 @@ public class EsModuleManagerImpl implements EsModuleManager
                              boolean compactJSON,
                              
@Symbol(TapestryHttpSymbolConstants.PRODUCTION_MODE)
                              boolean productionMode,
-                             ClasspathScanner classpathScanner)
+                             ClasspathScanner classpathScanner,
+                             ResourceChangeTracker resourceChangeTracker)
     {
         this.compactJSON = compactJSON;
         this.assetSource = assetSource;
         this.classpathScanner = classpathScanner;
         this.globalCallbacks = globalCallbacks;
         this.productionMode = productionMode;
+        this.resourceChangeTracker = resourceChangeTracker;
         importMap = new JSONObject();
 
         extensions = CollectionFactory.newSet("js");
@@ -94,6 +99,7 @@ public class EsModuleManagerImpl implements EsModuleManager
         JSONObject importMap = new JSONObject();
         JSONObject imports = importMap.in(IMPORTS_ATTRIBUTE);
         
+        resourceChangeTracker.addInvalidationCallback(this::createImportMap);
         cache.clear();
 
         loadBaseModuleList(imports);
@@ -124,7 +130,9 @@ public class EsModuleManagerImpl implements EsModuleManager
                 String id = file.replace(CLASSPATH_ROOT, "");
                 id = id.substring(0, id.lastIndexOf('.'));
                             
-                imports.put(id, 
assetSource.getClasspathAsset(file).toClientURL());
+                final Asset asset = assetSource.getClasspathAsset(file);
+                resourceChangeTracker.trackResource(asset.getResource());
+                imports.put(id, asset.toClientURL());
             }
         } catch (IOException e) 
         {
@@ -136,10 +144,6 @@ public class EsModuleManagerImpl implements EsModuleManager
     public void setupInvalidation(ResourceChangeTracker tracker)
     {
         
-//        Live class reloading of ES modules (failing at the moment)
-        
-        // TODO make invalidations smarter (and work)
-        tracker.addInvalidationCallback(this::createImportMap);
     }
 
     @Override
diff --git 
a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/URLChangeTracker.java
 
b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/URLChangeTracker.java
index 4baafe32c..af365db75 100644
--- 
a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/URLChangeTracker.java
+++ 
b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/util/URLChangeTracker.java
@@ -18,7 +18,10 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -314,6 +317,24 @@ public class URLChangeTracker<T>
         return fileToTimestamp.size();
     }
     
+    public String toString()
+    {
+        StringBuilder builder = new StringBuilder();
+
+        final List<File> files = new ArrayList<>(fileToTimestamp.keySet());
+        Collections.sort(files, (f1, f2) -> 
f1.getName().compareTo(f2.getName()));
+        
+        for (File file : files)
+        {
+            builder.append(file.getName());
+            builder.append(": ");
+            builder.append(fileToTimestamp.get(file));
+            builder.append("\n");
+        }
+        
+        return builder.toString();
+    }
+    
     private final class TrackingInfo
     {
         

Reply via email to