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);
+ }
+ }
+ }
}