You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by th...@apache.org on 2023/01/07 20:15:12 UTC

[tapestry-5] branch better-page-invalidation updated: TAP5-2742: fixing changes in PageLoaderImpl, plus other changes

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

thiagohp pushed a commit to branch better-page-invalidation
in repository https://gitbox.apache.org/repos/asf/tapestry-5.git


The following commit(s) were added to refs/heads/better-page-invalidation by this push:
     new 3c191477a TAP5-2742: fixing changes in PageLoaderImpl, plus other changes
3c191477a is described below

commit 3c191477abf70b057e6d6dbfd9106423edfbb5d9
Author: Thiago H. de Paula Figueiredo <th...@arsmachina.com.br>
AuthorDate: Sat Jan 7 17:14:53 2023 -0300

    TAP5-2742: fixing changes in PageLoaderImpl, plus other changes
    
    in ComponentClassCache and PropertyConduitSourceImpl
---
 .../services/PropertyConduitSourceImpl.java        | 40 ++++++++++++-
 .../internal/event/InvalidationEventHubImpl.java   |  2 +-
 .../internal/pageload/PageLoaderImpl.java          | 67 ++++++++++++++++------
 .../internal/services/ComponentClassCacheImpl.java | 24 +++++++-
 .../internal/services/RequestErrorFilter.java      |  8 ++-
 .../services/assets/ResourceChangeTrackerImpl.java |  6 --
 .../src/test/resources/GebConfig.groovy            |  2 +-
 7 files changed, 120 insertions(+), 29 deletions(-)

diff --git a/beanmodel/src/main/java/org/apache/tapestry5/beanmodel/internal/services/PropertyConduitSourceImpl.java b/beanmodel/src/main/java/org/apache/tapestry5/beanmodel/internal/services/PropertyConduitSourceImpl.java
index 46641a8f7..8a304a5ce 100644
--- a/beanmodel/src/main/java/org/apache/tapestry5/beanmodel/internal/services/PropertyConduitSourceImpl.java
+++ b/beanmodel/src/main/java/org/apache/tapestry5/beanmodel/internal/services/PropertyConduitSourceImpl.java
@@ -41,9 +41,12 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.antlr.runtime.ANTLRInputStream;
 import org.antlr.runtime.CommonTokenStream;
@@ -1387,9 +1390,42 @@ public class PropertyConduitSourceImpl implements PropertyConduitSource
     @PostInjection
     public void listenForInvalidations(@ComponentClasses InvalidationEventHub hub)
     {
-        hub.clearOnInvalidation(cache);
+        hub.addInvalidationCallback(this::listen);
+    }
+    
+    private List<String> listen(List<String> resources)
+    {
+        
+        if (resources.isEmpty())
+        {
+            cache.clear();
+        }
+        else
+        {
+        
+            final Iterator<Entry<MultiKey, PropertyConduit>> iterator = cache.entrySet().iterator();
+            
+            while (iterator.hasNext())
+            {
+                
+                final Entry<MultiKey, PropertyConduit> entry = iterator.next();
+                
+                for (String resource : resources) {
+                    @SuppressWarnings("rawtypes")
+                    final Class clasz = (Class) entry.getKey().getValues()[0];
+                    if (clasz.getName().equals(resource))
+                    {
+                        iterator.remove();
+                    }   
+                }
+                
+            }
+            
+        }
+        
+        return Collections.emptyList();
+        
     }
-
 
     public PropertyConduit create(Class rootClass, String expression)
     {
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/event/InvalidationEventHubImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/event/InvalidationEventHubImpl.java
index 590ea3b27..a18df83d8 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/event/InvalidationEventHubImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/event/InvalidationEventHubImpl.java
@@ -117,7 +117,7 @@ public class InvalidationEventHubImpl implements InvalidationEventHub
         }
     }
 
-    public /*final*/ void clearOnInvalidation(final Map<?, ?> map)
+    public final void clearOnInvalidation(final Map<?, ?> map)
     {
         assert map != null;
 
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java
index 781ca7365..ec0566ed0 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/pageload/PageLoaderImpl.java
@@ -12,12 +12,16 @@
 
 package org.apache.tapestry5.internal.pageload;
 
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
 import org.apache.tapestry5.Binding;
 import org.apache.tapestry5.BindingConstants;
 import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.MarkupWriter;
-import org.apache.tapestry5.beanmodel.internal.services.*;
-import org.apache.tapestry5.beanmodel.services.*;
 import org.apache.tapestry5.commons.Location;
 import org.apache.tapestry5.commons.internal.services.StringInterner;
 import org.apache.tapestry5.commons.internal.util.TapestryException;
@@ -26,18 +30,36 @@ import org.apache.tapestry5.commons.util.AvailableValues;
 import org.apache.tapestry5.commons.util.CollectionFactory;
 import org.apache.tapestry5.commons.util.Stack;
 import org.apache.tapestry5.commons.util.UnknownValueException;
-import org.apache.tapestry5.http.services.RequestGlobals;
 import org.apache.tapestry5.internal.InternalComponentResources;
 import org.apache.tapestry5.internal.InternalConstants;
 import org.apache.tapestry5.internal.bindings.LiteralBinding;
-import org.apache.tapestry5.internal.parser.*;
+import org.apache.tapestry5.internal.parser.AttributeToken;
+import org.apache.tapestry5.internal.parser.BlockToken;
+import org.apache.tapestry5.internal.parser.CDATAToken;
+import org.apache.tapestry5.internal.parser.CommentToken;
+import org.apache.tapestry5.internal.parser.ComponentTemplate;
+import org.apache.tapestry5.internal.parser.DTDToken;
+import org.apache.tapestry5.internal.parser.DefineNamespacePrefixToken;
+import org.apache.tapestry5.internal.parser.ExpansionToken;
+import org.apache.tapestry5.internal.parser.ExtensionPointToken;
+import org.apache.tapestry5.internal.parser.ParameterToken;
+import org.apache.tapestry5.internal.parser.StartComponentToken;
+import org.apache.tapestry5.internal.parser.StartElementToken;
+import org.apache.tapestry5.internal.parser.TemplateToken;
+import org.apache.tapestry5.internal.parser.TextToken;
+import org.apache.tapestry5.internal.parser.TokenType;
 import org.apache.tapestry5.internal.services.ComponentInstantiatorSource;
 import org.apache.tapestry5.internal.services.ComponentTemplateSource;
 import org.apache.tapestry5.internal.services.Instantiator;
 import org.apache.tapestry5.internal.services.PageElementFactory;
 import org.apache.tapestry5.internal.services.PageLoader;
 import org.apache.tapestry5.internal.services.PersistentFieldManager;
-import org.apache.tapestry5.internal.structure.*;
+import org.apache.tapestry5.internal.structure.BlockImpl;
+import org.apache.tapestry5.internal.structure.ComponentPageElement;
+import org.apache.tapestry5.internal.structure.ComponentPageElementResources;
+import org.apache.tapestry5.internal.structure.ComponentPageElementResourcesSource;
+import org.apache.tapestry5.internal.structure.Page;
+import org.apache.tapestry5.internal.structure.PageImpl;
 import org.apache.tapestry5.ioc.Invokable;
 import org.apache.tapestry5.ioc.OperationTracker;
 import org.apache.tapestry5.ioc.annotations.ComponentClasses;
@@ -55,10 +77,6 @@ import org.apache.tapestry5.services.MetaDataLocator;
 import org.apache.tapestry5.services.pageload.ComponentResourceSelector;
 import org.slf4j.Logger;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
 /**
  * There's still a lot of room to beef up {@link org.apache.tapestry5.internal.pageload.ComponentAssembler} and
  * {@link org.apache.tapestry5.internal.pageload.EmbeddedComponentAssembler} to perform more static analysis, but
@@ -157,13 +175,11 @@ public class PageLoaderImpl implements PageLoader, ComponentAssemblerSource
 
     private final MetaDataLocator metaDataLocator;
 
-    private final RequestGlobals requestGlobals;
-
     public PageLoaderImpl(ComponentInstantiatorSource instantiatorSource, ComponentTemplateSource templateSource,
                           PageElementFactory elementFactory, ComponentPageElementResourcesSource resourcesSource,
                           ComponentClassResolver componentClassResolver, PersistentFieldManager persistentFieldManager,
                           StringInterner interner, OperationTracker tracker, PerthreadManager perThreadManager,
-                          Logger logger, MetaDataLocator metaDataLocator, RequestGlobals requestGlobals)
+                          Logger logger, MetaDataLocator metaDataLocator)
     {
         this.instantiatorSource = instantiatorSource;
         this.templateSource = templateSource;
@@ -176,7 +192,6 @@ public class PageLoaderImpl implements PageLoader, ComponentAssemblerSource
         this.perThreadManager = perThreadManager;
         this.logger = logger;
         this.metaDataLocator = metaDataLocator;
-        this.requestGlobals = requestGlobals;
     }
 
     @PostInjection
@@ -184,9 +199,29 @@ public class PageLoaderImpl implements PageLoader, ComponentAssemblerSource
                                   @ComponentTemplates InvalidationEventHub templatesHub,
                                   @ComponentMessages InvalidationEventHub messagesHub)
     {
-        classesHub.clearOnInvalidation(cache);
-        templatesHub.clearOnInvalidation(cache);
-        messagesHub.clearOnInvalidation(cache);
+        classesHub.addInvalidationCallback(this::listen);
+        templatesHub.addInvalidationCallback(this::listen);
+        messagesHub.addInvalidationCallback(this::listen);
+    }
+    
+    private List<String> listen(List<String> resources)
+    {
+        
+        final Iterator<Entry<Key, ComponentAssembler>> iterator = cache.entrySet().iterator();
+        
+        while (iterator.hasNext())
+        {
+            final Entry<Key, ComponentAssembler> entry = iterator.next();
+            for (String resource : resources) 
+            {
+                if (resource.equals(entry.getKey().className))
+                {
+                    iterator.remove();
+                }
+            }
+        }
+        
+        return Collections.emptyList();
     }
 
     public void clearCache()
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassCacheImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassCacheImpl.java
index 49655e5a3..f8b4f139c 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassCacheImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentClassCacheImpl.java
@@ -24,7 +24,11 @@ import org.apache.tapestry5.ioc.annotations.ComponentClasses;
 import org.apache.tapestry5.ioc.annotations.ComponentLayer;
 import org.apache.tapestry5.ioc.annotations.PostInjection;
 
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 public class ComponentClassCacheImpl implements ComponentClassCache
 {
@@ -43,7 +47,25 @@ public class ComponentClassCacheImpl implements ComponentClassCache
 
     @PostInjection
     public void setupInvalidation(@ComponentClasses InvalidationEventHub hub) {
-        hub.clearOnInvalidation(cache);
+        hub.addInvalidationCallback(this::listen);;
+    }
+    
+    @SuppressWarnings("rawtypes")
+    private List<String> listen(List<String> resources)
+    {
+        
+        final Iterator<Entry<String, Class>> iterator = cache.entrySet().iterator();
+        
+        while (iterator.hasNext())
+        {
+            final Entry<String, Class> entry = iterator.next();
+            if (resources.contains(entry.getKey()))
+            {
+                iterator.remove();
+            }
+        }
+        
+        return Collections.emptyList();
     }
 
     @SuppressWarnings("unchecked")
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestErrorFilter.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestErrorFilter.java
index 4d87cb5a2..7b5f85cd4 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestErrorFilter.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestErrorFilter.java
@@ -5,6 +5,7 @@ import java.util.Arrays;
 
 import org.apache.tapestry5.commons.services.InvalidationEventHub;
 import org.apache.tapestry5.commons.util.DifferentClassVersionsException;
+import org.apache.tapestry5.http.Link;
 import org.apache.tapestry5.http.services.Request;
 import org.apache.tapestry5.http.services.RequestFilter;
 import org.apache.tapestry5.http.services.RequestHandler;
@@ -24,6 +25,7 @@ public class RequestErrorFilter implements RequestFilter
     private final RequestExceptionHandler exceptionHandler;
     private final InvalidationEventHub classesInvalidationHub;
     private final ComponentEventLinkEncoder componentEventLinkEncoder;
+    private final static String QUERY_PARAMETER = "RequestErrorFilterRedirected";
 
     public RequestErrorFilter(InternalRequestGlobals internalRequestGlobals, RequestExceptionHandler exceptionHandler,
             @ComponentClasses InvalidationEventHub classesInvalidationHub, ComponentEventLinkEncoder componentEventLinkEncoder)
@@ -58,9 +60,11 @@ public class RequestErrorFilter implements RequestFilter
                 DifferentClassVersionsException dcve = (DifferentClassVersionsException) rootCause;
                 classesInvalidationHub.fireInvalidationEvent(Arrays.asList(dcve.getClassName()));
                 final PageRenderRequestParameters pageRenderParameters = componentEventLinkEncoder.decodePageRenderRequest(request);
-                if (pageRenderParameters != null)
+                if (request.getParameter(QUERY_PARAMETER) == null && pageRenderParameters != null)
                 {
-                    response.sendRedirect(componentEventLinkEncoder.createPageRenderLink(pageRenderParameters));
+                    final Link link = componentEventLinkEncoder.createPageRenderLink(pageRenderParameters);
+                    link.addParameter(QUERY_PARAMETER, "tue");
+                    response.sendRedirect(link);
                     return true;
                 }
 //                final ComponentEventRequestParameters componentEventParameters = componentEventLinkEncoder.decodeComponentEventRequest(request);
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 fdd9bf133..a64a02af9 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
@@ -16,7 +16,6 @@ package org.apache.tapestry5.internal.services.assets;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -203,9 +202,4 @@ public class ResourceChangeTrackerImpl extends InvalidationEventHubImpl implemen
                 
     }
     
-    public final void clearOnInvalidation(final Map<?, ?> map)
-    {
-        super.clearOnInvalidation(map);
-    }
-
 }
diff --git a/tapestry-webresources/src/test/resources/GebConfig.groovy b/tapestry-webresources/src/test/resources/GebConfig.groovy
index a45863a02..35515537c 100644
--- a/tapestry-webresources/src/test/resources/GebConfig.groovy
+++ b/tapestry-webresources/src/test/resources/GebConfig.groovy
@@ -1,4 +1,4 @@
-import io.github.bonigarcia.wdm.FirefoxDriverManager
+import io.github.bonigarcia.wdm.managers.FirefoxDriverManager
 
 driver = "firefox"