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());