in org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceManagerService.java [190:238]
private void handleDDRSource(Resource resource) {
if(resource != null) {
// Find the Provider Root Resource
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 = registeredServicesByTarget.get(ddrTargetPath);
if (resourceProvider == null) {
DeclarativeDynamicResourceProviderHandler service = new DeclarativeDynamicResourceProviderHandler();
log.info("Dynamic Target: '{}', Dynamic Provider: '{}'", ddrTargetResource, ddrProvider);
long id = service.registerService(
bundleContext.getBundle(), ddrTargetPath, ddrProvider.getPath(), resourceResolver,
this,
allowedFilter, prohibitedFilter, followedLinkNames
);
log.info("After Registering Tenant RP: service: '{}', id: '{}'", service, id);
registeredServicesByTarget.put(ddrTargetResource.getPath(), service);
registeredServicesByProvider.put(ddrProvider.getPath(), service);
if (dynamicComponentFilterNotifier != null) {
dynamicComponentFilterNotifier.addDeclarativeDynamicResource(
ddrTargetPath, ddrProvider
);
}
} else {
resourceProvider.update(ddrTargetPath);
}
}
} else {
// Provider Resource found -> check that this resource was previous target and if so remove it
DeclarativeDynamicResourceProvider toBeRemoved = null;
for(Entry<String, DeclarativeDynamicResourceProvider> entry: registeredServicesByProvider.entrySet()) {
if(resource.getPath().startsWith(entry.getKey())) {
toBeRemoved = entry.getValue();
break;
}
}
if(toBeRemoved != null) {
registeredServicesByProvider.remove(toBeRemoved.getProviderRootPath());
registeredServicesByTarget.remove(toBeRemoved.getTargetRootPath());
toBeRemoved.unregisterService();
}
}
}
}