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 <[email protected]>
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());