private void handleDDRSource()

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