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 18:54:13 UTC
[sling-whiteboard] branch master updated: Added support for Source
Node rename, move and delete
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 ba392aa Added support for Source Node rename, move and delete
ba392aa is described below
commit ba392aa5997d32d297ecf4f3d8b6e0e41311fedc
Author: Andreas Schaefer <sc...@me.com>
AuthorDate: Wed Apr 7 11:54:00 2021 -0700
Added support for Source Node rename, move and delete
---
.../api/DeclarativeDynamicResourceProvider.java | 3 +
.../DeclarativeDynamicResourceManagerService.java | 114 ++++++++++++++++-----
.../DeclarativeDynamicResourceProviderHandler.java | 5 +
3 files changed, 98 insertions(+), 24 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 de02569..cc064c6 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
@@ -47,6 +47,9 @@ public interface DeclarativeDynamicResourceProvider {
/** @return True if this service is active / registered **/
boolean isActive();
+ /** @return The Parent Path of the Declarative Dynamic Resources are served from **/
+ String getProviderRootPath();
+
/** @return The Parent Path of the Declarative Dynamic Resources are bound too **/
String getTargetRootPath();
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 8efd9a0..4c91735 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
@@ -108,7 +108,8 @@ public class DeclarativeDynamicResourceManagerService
private final Logger log = LoggerFactory.getLogger(getClass());
- private Map<String, DeclarativeDynamicResourceProvider> registeredServices = new HashMap<>();
+ private Map<String, DeclarativeDynamicResourceProvider> registeredServicesByProvider = new HashMap<>();
+ private Map<String, DeclarativeDynamicResourceProvider> registeredServicesByTarget = new HashMap<>();
private BundleContext bundleContext;
// Keep the Resource Resolver around otherwise the Event Listener will not work anymore
private ResourceResolver resourceResolver;
@@ -183,28 +184,31 @@ public class DeclarativeDynamicResourceManagerService
}
}
- private void handleDDRSource(Resource ddrSourceResource) {
- if(ddrSourceResource != null) {
- ValueMap properties = ddrSourceResource.getValueMap();
- String ddrTargetPath = properties.get(DDR_TARGET_PROPERTY_NAME, String.class);
- log.info("Found DDR Target Path: '{}'", ddrTargetPath);
- if (ddrTargetPath != null) {
- Resource ddrTargetResource = ddrSourceResource.getResourceResolver().getResource(ddrTargetPath);
+ private void handleDDRSource(Resource resource) {
+ if(resource != null) {
+ // Find the Resource in the tree with the Target Path
+ Resource ddrProvider = findDDRSource(resource);
+ if(ddrProvider != null) {
+ ValueMap properties = ddrProvider.getValueMap();
+ String ddrTargetPath = properties.get(DDR_TARGET_PROPERTY_NAME, String.class);
+ log.info("Found DDR Target Path: '{}'", ddrTargetPath);
+ Resource ddrTargetResource = resource.getResourceResolver().getResource(ddrTargetPath);
if(ddrTargetResource != null) {
// 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) {
+ DeclarativeDynamicResourceProvider resourceProvider = registeredServicesByTarget.get(ddrTargetPath);
+ if (resourceProvider == null) {
DeclarativeDynamicResourceProviderHandler service = new DeclarativeDynamicResourceProviderHandler();
- log.info("Dynamic Target: '{}', Dynamic Provider: '{}'", ddrSourceResource, ddrSourceResource);
+ log.info("Dynamic Target: '{}', Dynamic Provider: '{}'", ddrTargetResource, ddrProvider);
long id = service.registerService(
- bundleContext.getBundle(), ddrTargetPath, ddrSourceResource.getPath(), resourceResolverFactory,
+ bundleContext.getBundle(), ddrTargetPath, ddrProvider.getPath(), resourceResolverFactory,
allowedFilter, prohibitedFilter, followedLinkNames
);
log.info("After Registering Tenant RP: service: '{}', id: '{}'", service, id);
- registeredServices.put(ddrTargetResource.getPath(), service);
+ registeredServicesByTarget.put(ddrTargetResource.getPath(), service);
+ registeredServicesByProvider.put(ddrProvider.getPath(), service);
if (dynamicComponentFilterNotifier != null) {
dynamicComponentFilterNotifier.addDeclarativeDynamicResource(
- ddrTargetPath, ddrSourceResource
+ ddrTargetPath, ddrProvider
);
}
} else {
@@ -215,6 +219,20 @@ public class DeclarativeDynamicResourceManagerService
}
}
+ private Resource findDDRSource(Resource resource) {
+ Resource answer = null;
+ if (resource != null) {
+ ValueMap properties = resource.getValueMap();
+ String ddrTargetPath = properties.get(DDR_TARGET_PROPERTY_NAME, String.class);
+ if (ddrTargetPath == null) {
+ answer = findDDRSource(resource.getParent());
+ } else {
+ answer = resource;
+ }
+ }
+ return answer;
+ }
+
public void update(String dynamicProviderPath) {
try (ResourceResolver resourceResolver = resourceResolverFactory.getServiceResourceResolver(
new HashMap<String, Object>() {{ put(ResourceResolverFactory.SUBSERVICE, DYNAMIC_COMPONENTS_SERVICE_USER); }}
@@ -228,7 +246,7 @@ public class DeclarativeDynamicResourceManagerService
@Deactivate
private void deactivate() {
- for(Entry<String, DeclarativeDynamicResourceProvider> entry: registeredServices.entrySet()) {
+ for(Entry<String, DeclarativeDynamicResourceProvider> entry: registeredServicesByTarget.entrySet()) {
log.info("Before UnRegistering Tenant RP, service: '{}'", entry.getValue());
entry.getValue().unregisterService();
if(dynamicComponentFilterNotifier != null) {
@@ -236,6 +254,8 @@ public class DeclarativeDynamicResourceManagerService
}
log.info("After UnRegistering Tenant RP, service: '{}'", entry.getValue());
}
+ registeredServicesByProvider.clear();
+ registeredServicesByTarget.clear();
if(resourceResolver != null) {
resourceResolver.close();
}
@@ -260,17 +280,35 @@ public class DeclarativeDynamicResourceManagerService
}
log.info("Property Added or Changed, path: '{}'", path);
case Event.NODE_ADDED:
- Resource source = resourceResolver.getResource(path);
- log.info("Source Resource found: '{}'", source);
- if(source != null) {
- handleDDRSource(source);
- }
+ handleNodeAdded(path);
+ break;
+ case Event.NODE_REMOVED:
+ handleNodeRemoved(path);
break;
case Event.NODE_MOVED:
- //AS TODO: Handle later
+ // The only thing to handle here is when the location changed
+ Map info = event.getInfo();
+ Object temp = info.get("srcAbsPath");
+ if(temp instanceof String) {
+ // Source found -> get target and update it
+ String sourcePath = temp.toString();
+ handleNodeRemoved(sourcePath);
+ String destPath = info.get("destAbsPath") + "";
+ handleNodeAdded(destPath);
+ }
+ temp = info.get("destAbsPath");
+ if(temp instanceof String) {
+ // Destination found -> get target and update it
+ String destPath = temp.toString();
+ handleNodeAdded(destPath);
+ }
break;
case Event.PROPERTY_REMOVED:
- //AS TODO: Handle later
+ index = path.lastIndexOf('/');
+ if(index > 0) {
+ String resourcePath = path.substring(0, index);
+ handleNodeAdded(resourcePath);
+ }
// break;
}
}
@@ -279,8 +317,36 @@ public class DeclarativeDynamicResourceManagerService
}
}
- Map<String, DeclarativeDynamicResourceProvider> getRegisteredServices() {
- return Collections.unmodifiableMap(registeredServices);
+ private void handleNodeAdded(String path) {
+ Resource source = resourceResolver.getResource(path);
+ log.info("Source Resource found: '{}'", source);
+ if(source != null) {
+ handleDDRSource(source);
+ }
+ }
+
+ private void handleNodeRemoved(String path) {
+ DeclarativeDynamicResourceProvider toBeRemoved = null;
+ for(Entry<String, DeclarativeDynamicResourceProvider> entry: registeredServicesByProvider.entrySet()) {
+ if(entry.getKey().equals(path)) {
+ // Provider remove -> remove service
+ entry.getValue().unregisterService();
+ toBeRemoved = entry.getValue();
+ break;
+ } else if(path.startsWith(entry.getKey())) {
+ // Sub Provider Node removed -> update Resource Provider
+ entry.getValue().update(path);
+ break;
+ }
+ }
+ if(toBeRemoved != null) {
+ registeredServicesByProvider.remove(toBeRemoved.getProviderRootPath());
+ registeredServicesByTarget.remove(toBeRemoved.getTargetRootPath());
+ }
+ }
+
+ Map<String, DeclarativeDynamicResourceProvider> getRegisteredServicesByTarget() {
+ return Collections.unmodifiableMap(registeredServicesByTarget);
}
}
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 89861f4..63e518e 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
@@ -127,6 +127,11 @@ public class DeclarativeDynamicResourceProviderHandler
return targetRootPath;
}
+ @Override
+ public String getProviderRootPath() {
+ return providerRootPath;
+ }
+
public void update(String path) {
synchronized (lock) {
mappings.clear();