You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by an...@apache.org on 2021/04/07 17:00:13 UTC

[sling-whiteboard] branch master updated: Fixed an issue with adding dynamic sources and restricting the ddr-active flag to root entries

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

andysch pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git


The following commit(s) were added to refs/heads/master by this push:
     new 34651b0  Fixed an issue with adding dynamic sources and restricting the ddr-active flag to root entries
34651b0 is described below

commit 34651b0c9dea5fbf0005d3794d4af469bc3ebc43
Author: Andreas Schaefer <sc...@me.com>
AuthorDate: Wed Apr 7 10:00:00 2021 -0700

    Fixed an issue with adding dynamic sources and restricting the ddr-active flag to root entries
---
 .../api/DeclarativeDynamicResourceProvider.java    |  1 +
 .../ddr/core/DeclarativeDynamicResourceImpl.java   |  6 +-
 .../DeclarativeDynamicResourceManagerService.java  | 28 ++++---
 .../DeclarativeDynamicResourceProviderHandler.java | 86 ++++++++++++++--------
 .../core/DeclarativeDynamicResourceImplTest.java   |  2 +-
 5 files changed, 79 insertions(+), 44 deletions(-)

diff --git a/org.apache.sling.ddr/api/src/main/java/org/apache/sling/ddr/api/DeclarativeDynamicResourceProvider.java b/org.apache.sling.ddr/api/src/main/java/org/apache/sling/ddr/api/DeclarativeDynamicResourceProvider.java
index f4318a5..de02569 100644
--- a/org.apache.sling.ddr/api/src/main/java/org/apache/sling/ddr/api/DeclarativeDynamicResourceProvider.java
+++ b/org.apache.sling.ddr/api/src/main/java/org/apache/sling/ddr/api/DeclarativeDynamicResourceProvider.java
@@ -50,4 +50,5 @@ public interface DeclarativeDynamicResourceProvider {
     /** @return The Parent Path of the Declarative Dynamic Resources are bound too **/
     String getTargetRootPath();
 
+    void update(String path);
 }
diff --git a/org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceImpl.java b/org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceImpl.java
index f2a8eb8..6151770 100644
--- a/org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceImpl.java
+++ b/org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceImpl.java
@@ -53,7 +53,7 @@ public class DeclarativeDynamicResourceImpl
      * @param targetPath Path of the new, dynamic location of the resource
      * @return The Synthetic Resource that will provide the Dynamic Resource
      */
-    public static DeclarativeDynamicResource createSyntheticFromResource(ResourceResolver resourceResolver, Resource source, String targetPath) {
+    public static DeclarativeDynamicResource createSyntheticFromResource(ResourceResolver resourceResolver, Resource source, String targetPath, boolean mark) {
         ValueMap properties = source.getValueMap();
         Map<String,String> parameters = new HashMap<>();
         String resourceSuperType = source.getResourceSuperType();
@@ -62,7 +62,9 @@ public class DeclarativeDynamicResourceImpl
                 parameters.put(entry.getKey(), entry.getValue() + "");
             }
         }
-        parameters.put(DDR_INDICATOR, "true");
+        if(mark) {
+            parameters.put(DDR_INDICATOR, "true");
+        }
         ResourceMetadata metadata = new ResourceMetadataWrapper();
         metadata.setParameterMap(parameters);
         metadata.setResolutionPath(targetPath);
diff --git a/org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceManagerService.java b/org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceManagerService.java
index 6fc279c..8efd9a0 100644
--- a/org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceManagerService.java
+++ b/org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceManagerService.java
@@ -191,18 +191,24 @@ public class DeclarativeDynamicResourceManagerService
             if (ddrTargetPath != null) {
                 Resource ddrTargetResource = ddrSourceResource.getResourceResolver().getResource(ddrTargetPath);
                 if(ddrTargetResource != null) {
-                    DeclarativeDynamicResourceProviderHandler service = new DeclarativeDynamicResourceProviderHandler();
-                    log.info("Dynamic Target: '{}', Dynamic Provider: '{}'", ddrSourceResource, ddrSourceResource);
-                    long id = service.registerService(
-                        bundleContext.getBundle(), ddrTargetPath, ddrSourceResource.getPath(), resourceResolverFactory,
-                        allowedFilter, prohibitedFilter, followedLinkNames
-                    );
-                    log.info("After Registering Tenant RP: service: '{}', id: '{}'", service, id);
-                    registeredServices.put(ddrTargetResource.getPath(), service);
-                    if(dynamicComponentFilterNotifier != null) {
-                        dynamicComponentFilterNotifier.addDeclarativeDynamicResource(
-                            ddrTargetPath, ddrSourceResource
+                    // Check if we already registered that service and if so update it instead of creating a new one
+                    DeclarativeDynamicResourceProvider resourceProvider = registeredServices.get(ddrTargetPath);
+                    if(resourceProvider == null) {
+                        DeclarativeDynamicResourceProviderHandler service = new DeclarativeDynamicResourceProviderHandler();
+                        log.info("Dynamic Target: '{}', Dynamic Provider: '{}'", ddrSourceResource, ddrSourceResource);
+                        long id = service.registerService(
+                            bundleContext.getBundle(), ddrTargetPath, ddrSourceResource.getPath(), resourceResolverFactory,
+                            allowedFilter, prohibitedFilter, followedLinkNames
                         );
+                        log.info("After Registering Tenant RP: service: '{}', id: '{}'", service, id);
+                        registeredServices.put(ddrTargetResource.getPath(), service);
+                        if (dynamicComponentFilterNotifier != null) {
+                            dynamicComponentFilterNotifier.addDeclarativeDynamicResource(
+                                ddrTargetPath, ddrSourceResource
+                            );
+                        }
+                    } else {
+                        resourceProvider.update(ddrTargetPath);
                     }
                 }
             }
diff --git a/org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceProviderHandler.java b/org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceProviderHandler.java
index ed73040..89861f4 100644
--- a/org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceProviderHandler.java
+++ b/org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceProviderHandler.java
@@ -71,6 +71,7 @@ public class DeclarativeDynamicResourceProviderHandler
     private Map<String, List<String>> prohibitedDDRFilter;
     private List<String> followedLinkNames;
 
+    private Object lock = new Object();
     private Map<String,Reference> mappings = new HashMap<>();
     private Map<String,List<Reference>> childrenMappings = new HashMap<>();
 
@@ -126,6 +127,13 @@ public class DeclarativeDynamicResourceProviderHandler
         return targetRootPath;
     }
 
+    public void update(String path) {
+        synchronized (lock) {
+            mappings.clear();
+            childrenMappings.clear();
+        }
+    }
+
     @Override
     public Resource getResource(ResolveContext ctx, String path, ResourceContext resourceContext, Resource parent) {
         ResourceResolver resourceResolver = ctx.getResourceResolver();
@@ -150,19 +158,28 @@ public class DeclarativeDynamicResourceProviderHandler
             }
             log.info("After Getting Resource from Parent, path: '{}', resource: '{}'", resourcePath, answer);
             if(answer == null) {
-                Reference mappedPath = mappings.get(resourcePath);
-                if(mappedPath == null) {
-                    // Obtain parent path and list children then try to re-obtain the mapping, if not found then there is no mapping
-                    int index = resourcePath.lastIndexOf('/');
-                    if(index > 0 && index < resourcePath.length() - 1) {
-                        String parentPath = resourcePath.substring(0, index);
-                        obtainChildren(resourceResolver, parentPath, false);
-                        mappedPath = mappings.get(resourcePath);
+                synchronized (lock) {
+                    Reference mappedPath = mappings.get(resourcePath);
+                    if (mappedPath == null) {
+                        // Obtain parent path and list children then try to re-obtain the mapping, if not found then there is no mapping
+                        int index = resourcePath.lastIndexOf('/');
+                        if (index > 0 && index < resourcePath.length() - 1) {
+                            String parentPath = resourcePath.substring(0, index);
+                            obtainChildren(resourceResolver, parentPath, false);
+                            mappedPath = mappings.get(resourcePath);
+                        }
+                    }
+                    if (mappedPath != null) {
+                        Resource source = resourceResolver.getResource(mappedPath.getReference());
+                        int index = resourcePath.lastIndexOf('/');
+                        String parentPath = "";
+                        if (index > 0 && index < resourcePath.length() - 1) {
+                            parentPath = resourcePath.substring(0, index);
+                        }
+                        answer = createSyntheticFromResource(
+                            resourceResolver, source, resourcePath, parentPath.equals(targetRootPath)
+                        );
                     }
-                }
-                if(mappedPath != null) {
-                    Resource source = resourceResolver.getResource(mappedPath.getReference());
-                    answer = createSyntheticFromResource(resourceResolver, source, resourcePath);
                 }
             }
         } else {
@@ -196,21 +213,26 @@ public class DeclarativeDynamicResourceProviderHandler
                     }
                 }
             }
-            // Obtain the matching resource from the provider
-            List<Reference> childrenList = childrenMappings.get(resourcePath);
-            log.info("Resource Path: '{}', Children List: '{}'", resourcePath, childrenList);
-            if(childrenList != null) {
-                for(Reference childPath: childrenList) {
-                    Resource child = resourceResolver.getResource(childPath.getReference());
-                    int index = childPath.getSource().lastIndexOf('/');
-                    String childName = childPath.getSource().substring(index);
-                    items.add(
-                        createSyntheticFromResource(resourceResolver, child,
-                            resourcePath + childName)
-                    );
+            synchronized (lock) {
+                // Obtain the matching resource from the provider
+                List<Reference> childrenList = childrenMappings.get(resourcePath);
+                log.info("Resource Path: '{}', Children List: '{}'", resourcePath, childrenList);
+                if (childrenList != null) {
+                    for (Reference childPath : childrenList) {
+                        Resource child = resourceResolver.getResource(childPath.getReference());
+                        int index = childPath.getSource().lastIndexOf('/');
+                        String childName = childPath.getSource().substring(index);
+                        items.add(
+                            createSyntheticFromResource(
+                                resourceResolver, child,
+                                resourcePath + childName,
+                                resourcePath.equals(targetRootPath)
+                            )
+                        );
+                    }
+                } else {
+                    items = obtainChildren(resourceResolver, resourcePath, true);
                 }
-            } else {
-                items = obtainChildren(resourceResolver, resourcePath, true);
             }
             answer = items.iterator();
         } else {
@@ -302,12 +324,14 @@ public class DeclarativeDynamicResourceProviderHandler
                             if (reference != null && !reference.isResourceType(RESOURCE_TYPE_NON_EXISTING)) {
                                 log.info("Add Path: '{}' to children list", resourcePath);
                                 childrenList.add(new Reference(child.getPath(), referencePath));
-                                mappings.put(targetRootPath + SLASH + (postfix.isEmpty() ? "" : postfix + SLASH) + child.getName(), new Reference(child.getPath(), referencePath));
+                                String parentPath = targetRootPath + (postfix.isEmpty() ? "" : SLASH + postfix);
+                                mappings.put(parentPath + SLASH + child.getName(), new Reference(child.getPath(), referencePath));
                                 if(returnChildren) {
                                     answer.add(
                                         createSyntheticFromResource(
                                             resourceResolver, reference,
-                                            targetRootPath + SLASH + (postfix.isEmpty() ? "" : postfix + SLASH) + child.getName()
+                                            parentPath + SLASH + child.getName(),
+                                            parentPath.equals(targetRootPath)
                                         )
                                     );
                                 }
@@ -327,12 +351,14 @@ public class DeclarativeDynamicResourceProviderHandler
                             newRef = new Reference(child.getPath());
                         }
                         childrenList.add(newRef);
-                        mappings.put(targetRootPath + SLASH + (postfix.isEmpty() ? "" : postfix + SLASH) + child.getName(), newRef);
+                        String parentPath = targetRootPath + (postfix.isEmpty() ? "" : SLASH + postfix);
+                        mappings.put(parentPath + SLASH + child.getName(), newRef);
                         if(returnChildren) {
                             answer.add(
                                 createSyntheticFromResource(
                                     resourceResolver, child,
-                                    targetRootPath + SLASH + (postfix.isEmpty() ? "" : postfix + SLASH) + child.getName()
+                                    parentPath + SLASH + child.getName(),
+                                    parentPath.equals(targetRootPath)
                                 )
                             );
                         }
diff --git a/org.apache.sling.ddr/core/src/test/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceImplTest.java b/org.apache.sling.ddr/core/src/test/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceImplTest.java
index 51e1a21..32cdb0e 100644
--- a/org.apache.sling.ddr/core/src/test/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceImplTest.java
+++ b/org.apache.sling.ddr/core/src/test/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceImplTest.java
@@ -62,7 +62,7 @@ public class DeclarativeDynamicResourceImplTest {
             resourceResolver
         );
         DeclarativeDynamicResource declarativeDynamicResource = DeclarativeDynamicResourceImpl.createSyntheticFromResource(
-            resourceResolver, source, dynamicResourceRoot + "/" + resourceName
+            resourceResolver, source, dynamicResourceRoot + "/" + resourceName, true
         );
         assertEquals("Wrong DD-Resource Name", resourceName, declarativeDynamicResource.getName());
         assertEquals("Wrong Resource Type", resourceType, declarativeDynamicResource.getResourceType());