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 0ff7a5e92 TAP5-2744: storing component dependency information
0ff7a5e92 is described below

commit 0ff7a5e929d25b994134b14669e27baa8b18b407
Author: Thiago H. de Paula Figueiredo <[email protected]>
AuthorDate: Mon Feb 6 16:47:25 2023 -0300

    TAP5-2744: storing component dependency information
---
 tapestry-core/.gitignore                           |  1 +
 .../tapestry5/corelib/pages/PageCatalog.java       | 13 +++++
 .../services/ComponentDependencyRegistry.java      | 13 ++++-
 .../services/ComponentDependencyRegistryImpl.java  | 66 +++++++++++++++++++++-
 4 files changed, 91 insertions(+), 2 deletions(-)

diff --git a/tapestry-core/.gitignore b/tapestry-core/.gitignore
index f739972ea..248333053 100644
--- a/tapestry-core/.gitignore
+++ b/tapestry-core/.gitignore
@@ -2,3 +2,4 @@ docs
 /.externalToolBuilders
 src/main/generated
 src/test/generated
+/tapestryComponentDependencies.json
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/PageCatalog.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/PageCatalog.java
index 74479881d..e887c0da1 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/PageCatalog.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/PageCatalog.java
@@ -333,6 +333,19 @@ public class PageCatalog
 
         return pagesZone.getBody();
     }
+    
+    Object onActionFromStoreDependencyInformation()
+    {
+        
+        componentDependencyRegistry.writeFile();
+        
+        alertManager.warn(String.format(
+                "Component dependency information written to %s.", 
+                ComponentDependencyRegistry.FILENAME));
+        
+        return pagesZone.getBody();
+        
+    }
 
     Object onActionFromRunGC()
     {
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistry.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistry.java
index 4689b7989..dfa89611d 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistry.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistry.java
@@ -74,5 +74,16 @@ public interface ComponentDependencyRegistry {
      * Signs up this registry to invalidation events from a given hub.
      */
     void listen(InvalidationEventHub invalidationEventHub);
-    
+
+    /**
+     * Writes the current component dependency data to a file so it can be 
reused in a new run later.
+     * @see #FILENAME
+     */
+    void writeFile();
+
+    /**
+     * Name of the file where the dependency information is stored between 
webapp runs.
+     */
+    String FILENAME = "tapestryComponentDependencies.json";
+
 }
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 f3c9bd2ce..1765985b7 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
@@ -13,6 +13,12 @@
 // limitations under the License.
 package org.apache.tapestry5.internal.services;
 
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -27,8 +33,11 @@ import java.util.stream.Collectors;
 import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.annotations.InjectComponent;
 import org.apache.tapestry5.annotations.InjectPage;
+import org.apache.tapestry5.commons.internal.util.TapestryException;
 import org.apache.tapestry5.commons.services.InvalidationEventHub;
 import org.apache.tapestry5.internal.structure.ComponentPageElement;
+import org.apache.tapestry5.json.JSONArray;
+import org.apache.tapestry5.json.JSONObject;
 import org.apache.tapestry5.model.ComponentModel;
 import org.apache.tapestry5.model.EmbeddedComponentModel;
 import org.apache.tapestry5.model.MutableComponentModel;
@@ -41,17 +50,49 @@ public class ComponentDependencyRegistryImpl implements 
ComponentDependencyRegis
     private static final String META_ATTRIBUTE = 
"injectedComponentDependencies";
     
     private static final String META_ATTRIBUTE_SEPARATOR = ",";
-
+    
     // Key is a component, values are the components that depend on it.
     final private Map<String, Set<String>> map;
     
     // Cache to check which classes were already processed or not.
     final private Set<String> alreadyProcessed;
+    
+    final private File storedDependencies;
 
     public ComponentDependencyRegistryImpl()
     {
         map = new HashMap<>();
         alreadyProcessed = new HashSet<>();
+        
+        storedDependencies = new File(FILENAME);
+        if (storedDependencies.exists())
+        {
+            try (FileReader fileReader = new FileReader(storedDependencies);
+                    BufferedReader reader = new BufferedReader(fileReader))
+            {
+                StringBuilder builder = new StringBuilder();
+                String line = reader.readLine();
+                while (line != null)
+                {
+                    builder.append(line);
+                    line = reader.readLine();
+                }
+                JSONObject jsonObject = new JSONObject(builder.toString());
+                for (String className : jsonObject.keySet())
+                {
+                    final Set<String> dependencies = 
jsonObject.getJSONArray(className)
+                            .stream()
+                            .map(o -> (String) o)
+                            .collect(Collectors.toSet());
+                    map.put(className, new HashSet<>(dependencies));
+                    alreadyProcessed.add(className);
+                }
+            } catch (IOException e) 
+            {
+                throw new TapestryException("Exception trying to read " + 
ComponentDependencyRegistry.FILENAME, e);
+            }
+        }
+        
     }
 
     @Override
@@ -251,5 +292,28 @@ public class ComponentDependencyRegistryImpl implements 
ComponentDependencyRegis
         }
         return furtherDependents;
     }
+
+    @Override
+    public void writeFile() 
+    {
+        synchronized (this) 
+        {
+            try (FileWriter fileWriter = new FileWriter(storedDependencies);
+                    BufferedWriter bufferedWriter = new 
BufferedWriter(fileWriter))
+            {
+                JSONObject jsonObject = new JSONObject();
+                for (String className : map.keySet())
+                {
+                    final Set<String> dependencies = 
getDependencies(className);
+                    jsonObject.put(className, JSONArray.from(dependencies));
+                }
+                bufferedWriter.write(jsonObject.toString());
+            }
+            catch (IOException e) 
+            {
+                throw new TapestryException("Exception trying to read " + 
ComponentDependencyRegistry.FILENAME, e);
+            }
+        } 
+    }
     
 }

Reply via email to