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/06/09 23:56:17 UTC

[tapestry-5] branch better-page-invalidation updated (db8a6f3fe -> 5f2c5f813)

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

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


    from db8a6f3fe TAP5-2742: handling page dependencies better (or at least trying)
     new 0436ffb06 TAP5-2742: specific stylig for superclass and inject page dependencies
     new 6c87ac822 TAP5-2742: showing all dependencies, not just the already loaded pages
     new 6becbe2ec TAP5-2742: fixing dependency file saving and loading
     new 2c465af02 TAP5-2742: removing commented-out code
     new 5f2c5f813 TAP5-2742: preprocessing page classloader context when possible

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../corelib/pages/PageDependencyGraph.java         | 35 ++---------
 .../ComponentDependencyGraphvizGeneratorImpl.java  | 59 ++++++++++++------
 .../services/ComponentDependencyRegistryImpl.java  | 47 ++++++++------
 .../internal/services/PageSourceImpl.java          |  2 +-
 .../apache/tapestry5/modules/PageLoadModule.java   | 22 +++++++
 .../PageClassloaderContextManagerImpl.java         | 71 +++++-----------------
 6 files changed, 114 insertions(+), 122 deletions(-)


[tapestry-5] 03/05: TAP5-2742: fixing dependency file saving and loading

Posted by th...@apache.org.
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

commit 6becbe2ecb7450acb5bba2c67e3ae460c97e775c
Author: Thiago H. de Paula Figueiredo <th...@arsmachina.com.br>
AuthorDate: Fri Jun 9 20:51:34 2023 -0300

    TAP5-2742: fixing dependency file saving and loading
---
 .../services/ComponentDependencyRegistryImpl.java  | 47 +++++++++++++---------
 1 file changed, 28 insertions(+), 19 deletions(-)

diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistryImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistryImpl.java
index 5231ff8a0..ec6d61cb6 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistryImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistryImpl.java
@@ -53,6 +53,7 @@ import org.apache.tapestry5.ioc.Orderable;
 import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.ioc.services.PerthreadManager;
+import org.apache.tapestry5.json.JSONArray;
 import org.apache.tapestry5.json.JSONObject;
 import org.apache.tapestry5.model.ComponentModel;
 import org.apache.tapestry5.model.EmbeddedComponentModel;
@@ -128,26 +129,22 @@ public class ComponentDependencyRegistryImpl implements ComponentDependencyRegis
                     builder.append(line);
                     line = reader.readLine();
                 }
-                JSONObject jsonObject = new JSONObject(builder.toString());
-                for (String className : jsonObject.keySet())
+                JSONArray jsonArray = new JSONArray(builder.toString());
+                for (int i = 0; i < jsonArray.size(); i++)
                 {
-                    final Set<String> dependencies = jsonObject.getJSONArray(className)
-                            .stream()
-                            .map(o -> (String) o)
-                            .collect(Collectors.toSet());
-                    for (String dependency : dependencies) 
-                    {
-                        
-                        // TODO: fix storing and reading dependency file
-//                        add(className, dependency);
-                        alreadyProcessed.add(dependency);
-                    }
+                    final JSONObject jsonObject = jsonArray.getJSONObject(i);
+                    final String className = jsonObject.getString("class");
+                    final DependencyType dependencyType = DependencyType.valueOf(jsonObject.getString("type"));
+                    final String dependency = jsonObject.getString("dependency");
+                    add(className, dependency, dependencyType);
+                    alreadyProcessed.add(dependency);
                     alreadyProcessed.add(className);
                 }
             } catch (IOException e) 
             {
                 throw new TapestryException("Exception trying to read " + FILENAME, e);
             }
+            
         }
         
         storedDependencyInformationPresent = !map.isEmpty();
@@ -637,14 +634,26 @@ public class ComponentDependencyRegistryImpl implements ComponentDependencyRegis
             try (FileWriter fileWriter = new FileWriter(storedDependencies);
                     BufferedWriter bufferedWriter = new BufferedWriter(fileWriter))
             {
-                JSONObject jsonObject = new JSONObject();
-                for (String className : map.keySet())
+                Set<String> classNames = new HashSet<>(alreadyProcessed.size());
+                classNames.addAll(map.keySet());
+                classNames.addAll(alreadyProcessed);
+                JSONArray jsonArray = new JSONArray();
+                for (String className : classNames)
                 {
-                    // TODO: rewrite this
-//                    final Set<String> dependencies = getDependencies(className);
-//                    jsonObject.put(className, JSONArray.from(dependencies));
+                    for (DependencyType dependencyType : DependencyType.values())
+                    {
+                        final Set<String> dependencies = getDependencies(className, dependencyType);
+                        for (String dependency : dependencies)
+                        {
+                            JSONObject object = new JSONObject();
+                            object.put("class", className);
+                            object.put("type", dependencyType.name());
+                            object.put("dependency", dependency);
+                            jsonArray.add(object);
+                        }
+                    }
                 }
-                bufferedWriter.write(jsonObject.toString());
+                bufferedWriter.write(jsonArray.toString());
             }
             catch (IOException e) 
             {


[tapestry-5] 01/05: TAP5-2742: specific stylig for superclass and inject page dependencies

Posted by th...@apache.org.
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

commit 0436ffb06e72cf41a317d72218dff000c837dbcd
Author: Thiago H. de Paula Figueiredo <th...@arsmachina.com.br>
AuthorDate: Sun Jun 4 20:59:03 2023 -0300

    TAP5-2742: specific stylig for superclass and inject page dependencies
---
 .../ComponentDependencyGraphvizGeneratorImpl.java  | 59 +++++++++++++++-------
 1 file changed, 41 insertions(+), 18 deletions(-)

diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyGraphvizGeneratorImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyGraphvizGeneratorImpl.java
index 005f2a26a..908633b9d 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyGraphvizGeneratorImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyGraphvizGeneratorImpl.java
@@ -49,24 +49,20 @@ public class ComponentDependencyGraphvizGeneratorImpl implements ComponentDepend
         
         final Set<String> allClasses = new HashSet<>();
         
-        for (DependencyType dependencyType : DependencyType.values()) 
+        for (String className : classNames) 
         {
-
-            for (String className : classNames)
+            final Node node = createNode(componentClassResolver.getLogicalName(className), className);
+            dotFile.append(getNodeDefinition(node));
+            for (DependencyType dependencyType : DependencyType.values()) 
             {
                 addDependencies(className, allClasses, dependencyType);
             }
             
             final StringBuilder dependencySection = new StringBuilder();
             
-            for (String className : allClasses) 
+            for (Dependency dependency : node.dependencies)
             {
-                final Node node = createNode(componentClassResolver.getLogicalName(className), className, dependencyType);
-                dotFile.append(getNodeDefinition(node, dependencyType));
-                for (String dependency : node.dependencies)
-                {
-                    dependencySection.append(getNodeDependencyDefinition(node, dependency));
-                }
+                dependencySection.append(getNodeDependencyDefinition(node, dependency.className, dependency.type));
             }
             
             dotFile.append("\n");
@@ -81,15 +77,21 @@ public class ComponentDependencyGraphvizGeneratorImpl implements ComponentDepend
         return dotFile.toString();
     }
     
-    private String getNodeDefinition(Node node, DependencyType dependencyType) 
+    private String getNodeDefinition(Node node) 
     {
-        // TODO: add some diferentiation between dependency types
         return String.format("\t%s [label=\"%s\", tooltip=\"%s\"];\n", node.id, node.label, node.className);
     }
     
-    private String getNodeDependencyDefinition(Node node, String dependency) 
+    private String getNodeDependencyDefinition(Node node, String dependency, DependencyType dependencyType) 
     {
-        return String.format("\t%s -> %s\n", node.id, escapeNodeId(getNodeLabel(dependency)));
+        String extraDefinition;
+        switch (dependencyType)
+        {
+            case INJECT_PAGE: extraDefinition = " [style=dashed]"; break;
+            case SUPERCLASS: extraDefinition = " [arrowhead=empty]"; break;
+            default: extraDefinition = "";
+        }
+        return String.format("\t%s -> %s%s\n", node.id, escapeNodeId(getNodeLabel(dependency)), extraDefinition);
     }
 
     private String getNodeLabel(String className) 
@@ -136,9 +138,30 @@ public class ComponentDependencyGraphvizGeneratorImpl implements ComponentDepend
         }
     }
 
-    private Node createNode(String logicalName, String className, DependencyType type) 
+    private Node createNode(String logicalName, String className) 
     {
-        return new Node(logicalName, className, componentDependencyRegistry.getDependencies(className, type));
+        Collection<Dependency> deps = new HashSet<>();
+        for (DependencyType type : DependencyType.values()) 
+        {
+            final Set<String> dependencies = componentDependencyRegistry.getDependencies(className, type);
+            for (String dependency : dependencies) 
+            {
+                deps.add(new Dependency(dependency, type));
+            }
+        }
+        return new Node(logicalName, className, deps);
+    }
+    
+    private static final class Dependency
+    {
+        final private String className;
+        final private DependencyType type;
+        public Dependency(String className, DependencyType type) 
+        {
+            super();
+            this.className = className;
+            this.type = type;
+        }
     }
 
     private static final class Node {
@@ -146,9 +169,9 @@ public class ComponentDependencyGraphvizGeneratorImpl implements ComponentDepend
         final private String id;
         final private String className;
         final private String label;
-        final private Set<String> dependencies = new HashSet<>();
+        final private Set<Dependency> dependencies = new HashSet<>();
         
-        public Node(String logicalName, String className, Collection<String> dependencies) 
+        public Node(String logicalName, String className, Collection<Dependency> dependencies) 
         {
             super();
             this.label = getNodeLabel(className, logicalName, true);


[tapestry-5] 04/05: TAP5-2742: removing commented-out code

Posted by th...@apache.org.
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

commit 2c465af02d36ea897e27c0c1863c544c2d795463
Author: Thiago H. de Paula Figueiredo <th...@arsmachina.com.br>
AuthorDate: Fri Jun 9 20:55:02 2023 -0300

    TAP5-2742: removing commented-out code
---
 .../PageClassloaderContextManagerImpl.java         | 71 +++++-----------------
 1 file changed, 16 insertions(+), 55 deletions(-)

diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/services/pageload/PageClassloaderContextManagerImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/services/pageload/PageClassloaderContextManagerImpl.java
index 91241c661..c257695b8 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/services/pageload/PageClassloaderContextManagerImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/services/pageload/PageClassloaderContextManagerImpl.java
@@ -235,22 +235,6 @@ public class PageClassloaderContextManagerImpl implements PageClassloaderContext
                         )
                 {
                     context = unknownContextProvider.get();
-//                    // Make sure you get a fresh version of the class before processing its
-//                    // dependencies
-//                    PageClassloaderContext throwaway = new PageClassloaderContext(
-//                            "Throwaway", 
-//                            root, 
-//                            Collections.singleton(className), 
-//                            plasticProxyFactoryProvider.apply(root.getClassLoader()));
-//
-//                    Class<?> clasz = loadClass(className, throwaway);
-//                    componentDependencyRegistry.register(clasz);
-//                    
-//                    throwaway.getProxyFactory().clearCache();
-//                    throwaway.getClassNames().clear();
-//                    
-//                    alreadyProcessed.remove(className);
-//                    return processUsingDependencies(className, root, unknownContextProvider, plasticProxyFactoryProvider, classesToInvalidate, alreadyProcessed);
                 }
                 else 
                 {
@@ -337,38 +321,6 @@ public class PageClassloaderContextManagerImpl implements PageClassloaderContext
         }
         context.addClass(className);
         
-        // Merge contexts of circular dependencies into a single one
-        
-//        if (processCircularDependencies && !circularDependencies.isEmpty())
-//        {
-//            Set<PageClassloaderContext> contexts = new HashSet<>(circularDependencies.size() + 1);
-//            contexts.add(context);
-//            for (String circularDependency : circularDependencies) 
-//            {
-//                PageClassloaderContext toMerge = 
-//                    processUsingDependencies(
-//                        circularDependency, root, unknownContextProvider, 
-//                        plasticProxyFactoryProvider, classesToInvalidate, alreadyProcessed,
-//                        false);
-//                contexts.add(toMerge);
-//            }
-//            if (contexts.size() > 1)
-//            {
-//                
-//                context = merge(contexts, plasticProxyFactoryProvider, root, classesToInvalidate);
-//                
-//                // Avoiding an infinite recursion
-//                classesToInvalidate.removeAll(context.getClassNames());
-//                
-//                // Ensure non-page class is initialized in the correct context and classloader
-//                for (String clasz : context.getClassNames()) {
-//                    if (!componentClassResolver.isPage(clasz))
-//                    {
-//                        loadClass(clasz, context);
-//                    }
-//                }
-//            }
-//        }
         return context;
     }
 
@@ -571,12 +523,10 @@ public class PageClassloaderContextManagerImpl implements PageClassloaderContext
     }
 
     private void markAsNotInvalidatingContext() {
-//        System.out.println("XXXX Mark as NOT invalidating. Current: " + INVALIDATING_CONTEXT.get());
         INVALIDATING_CONTEXT.set(false);
     }
 
     private void markAsInvalidatingContext() {
-//        System.out.println("XXXX Mark as invalidating. Current: " + INVALIDATING_CONTEXT.get());
         INVALIDATING_CONTEXT.set(true);
     }
     
@@ -585,11 +535,22 @@ public class PageClassloaderContextManagerImpl implements PageClassloaderContext
         {
             LOGGER.debug("Invalidating classes {}", classesToInvalidate);
             markAsInvalidatingContext();
-            final ArrayList<String> classesToInvalidateAsList = new ArrayList<>(classesToInvalidate);
-            // TODO: do we really need both invalidation hubs to be invoked here?
-            invalidationHub.fireInvalidationEvent(classesToInvalidateAsList);
-            componentClassesInvalidationEventHub.fireInvalidationEvent(classesToInvalidateAsList);
-            markAsNotInvalidatingContext();
+            final List<String> classesToInvalidateAsList = new ArrayList<>(classesToInvalidate);
+            
+            componentDependencyRegistry.disableInvalidations();
+            
+            try 
+            {
+                // TODO: do we really need both invalidation hubs to be invoked here?
+                invalidationHub.fireInvalidationEvent(classesToInvalidateAsList);
+                componentClassesInvalidationEventHub.fireInvalidationEvent(classesToInvalidateAsList);
+                markAsNotInvalidatingContext();
+            }
+            finally
+            {
+                componentDependencyRegistry.enableInvalidations();
+            }
+            
         }
     }
 


[tapestry-5] 02/05: TAP5-2742: showing all dependencies, not just the already loaded pages

Posted by th...@apache.org.
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

commit 6c87ac8226bf57a3d2199af2a7265a53b4dd4727
Author: Thiago H. de Paula Figueiredo <th...@arsmachina.com.br>
AuthorDate: Sun Jun 4 20:59:39 2023 -0300

    TAP5-2742: showing all dependencies, not just the already loaded pages
---
 .../corelib/pages/PageDependencyGraph.java         | 35 ++++------------------
 1 file changed, 6 insertions(+), 29 deletions(-)

diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/PageDependencyGraph.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/PageDependencyGraph.java
index 134b87e2c..46a86222a 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/PageDependencyGraph.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/PageDependencyGraph.java
@@ -17,15 +17,11 @@ package org.apache.tapestry5.corelib.pages;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.annotations.UnknownActivationContextCheck;
 import org.apache.tapestry5.annotations.WhitelistAccessOnly;
 import org.apache.tapestry5.internal.services.ComponentDependencyGraphvizGenerator;
-import org.apache.tapestry5.internal.services.PageSource;
-import org.apache.tapestry5.internal.structure.Page;
+import org.apache.tapestry5.internal.services.ComponentDependencyRegistry;
 import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.services.ComponentClassResolver;
-import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
 
 /**
  * Shows graph showing the dependencies of all already loaded pages and its compnoents, mixins and base classes.
@@ -35,37 +31,18 @@ import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
 public class PageDependencyGraph
 {
 
-    @Inject
-    private ComponentClassResolver resolver;
-    
     @Inject
     private ComponentDependencyGraphvizGenerator componentDependencyGraphvizGenerator;
     
     @Inject
-    private PageSource pageSource;
-
-    @Inject
-    private ComponentClassResolver componentClassResolver;
-
-    @Inject
-    private AjaxResponseRenderer ajaxResponseRenderer;
-    
-    @Property
-    private Page page;
+    private ComponentDependencyRegistry componentDependencyRegistry;
     
-    private String getClassName(Page page) 
-    {
-        return page.getRootComponent().getComponentResources().getComponentModel().getComponentClassName();
-    }
-
     public String getGraphvizValue()
     {
-        final Set<Page> allPages = pageSource.getAllPages();
-        return componentDependencyGraphvizGenerator.generate(
-                allPages.stream()
-                    .map(this::getClassName)
-                    .collect(Collectors.toList())
-                    .toArray(new String[allPages.size()]));
+        final Set<String> pages = componentDependencyRegistry.getClassNames().stream()
+                .filter(c -> c.contains(".pages"))
+                .collect(Collectors.toSet());
+        return componentDependencyGraphvizGenerator.generate(pages.toArray(new String[pages.size()]));
     }
     
 }


[tapestry-5] 05/05: TAP5-2742: preprocessing page classloader context when possible

Posted by th...@apache.org.
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

commit 5f2c5f813ee96c88bccb2c7224c9e87704845661
Author: Thiago H. de Paula Figueiredo <th...@arsmachina.com.br>
AuthorDate: Fri Jun 9 20:55:39 2023 -0300

    TAP5-2742: preprocessing page classloader context when possible
---
 .../internal/services/PageSourceImpl.java          |  2 +-
 .../apache/tapestry5/modules/PageLoadModule.java   | 22 ++++++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageSourceImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageSourceImpl.java
index ebf86306e..f0c5936dd 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageSourceImpl.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageSourceImpl.java
@@ -232,7 +232,7 @@ public class PageSourceImpl implements PageSource
     }
 
     private void preprocessPageClassLoaderContexts(String className, final List<String> pageDependencies) {
-        for (int i = 0; i < 2; i++)
+        for (int i = 0; i < 5; i++)
         {
             pageClassloaderContextManager.get(className);
             for (String pageClassName : pageDependencies)
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/PageLoadModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/PageLoadModule.java
index a55a05833..a431900f5 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/PageLoadModule.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/modules/PageLoadModule.java
@@ -17,6 +17,7 @@ import org.apache.tapestry5.http.TapestryHttpSymbolConstants;
 import org.apache.tapestry5.internal.pageload.DefaultComponentRequestSelectorAnalyzer;
 import org.apache.tapestry5.internal.pageload.DefaultComponentResourceLocator;
 import org.apache.tapestry5.internal.pageload.PagePreloaderImpl;
+import org.apache.tapestry5.internal.services.ComponentDependencyRegistry;
 import org.apache.tapestry5.internal.services.ComponentTemplateSource;
 import org.apache.tapestry5.internal.services.ComponentTemplateSourceImpl;
 import org.apache.tapestry5.ioc.ServiceBinder;
@@ -58,4 +59,25 @@ public class PageLoadModule
             preloader.preloadPages();
         }
     }
+    
+    @Startup
+    public void preloadPageClassLoaderContexts(
+            PageClassloaderContextManager pageClassloaderContextManager,
+            ComponentDependencyRegistry componentDependencyRegistry,
+            @Symbol(SymbolConstants.PRODUCTION_MODE) boolean productionMode)
+    {
+        if (!productionMode)
+        {
+            // Preload the page activation context tree for the already known classes
+            for (int i = 0; i < 5; i++)
+            {
+                System.out.println();
+                for (String className : componentDependencyRegistry.getClassNames()) 
+                {
+                    pageClassloaderContextManager.get(className);
+                }
+            }
+        }
+    }
+
 }