in src/main/java/org/apache/sling/superimposing/impl/SuperimposingManagerImpl.java [172:227]
private boolean registerProvider(Resource superimposingResource) {
String superimposePath = superimposingResource.getPath();
// use JCR API to get properties from superimposing resource to make sure superimposing does not delivery values from source node
final String sourcePath = getJcrStringProperty(superimposePath, PROP_SUPERIMPOSE_SOURCE_PATH);
final boolean registerParent = getJcrBooleanProperty(superimposePath, PROP_SUPERIMPOSE_REGISTER_PARENT);
final boolean overlayable = getJcrBooleanProperty(superimposePath, PROP_SUPERIMPOSE_OVERLAYABLE);
// check if superimposing definition is valid
boolean valid = true;
if (StringUtils.isBlank(sourcePath)) {
valid = false;
}
else {
// check whether the parent of the node should be registered as superimposing provider
if (registerParent) {
superimposePath = ResourceUtil.getParent(superimposePath);
}
// target path is not valid if it equals to a parent or child of the superimposing path, or to the superimposing path itself
if (StringUtils.equals(sourcePath, superimposePath)
|| StringUtils.startsWith(sourcePath, superimposePath + PATH_SEPARATOR)
|| StringUtils.startsWith(superimposePath, sourcePath + PATH_SEPARATOR)) {
valid = false;
}
}
// register valid superimposing
if (valid) {
final SuperimposingResourceProviderImpl srp = new SuperimposingResourceProviderImpl(superimposePath, sourcePath, overlayable);
final SuperimposingResourceProviderImpl oldSrp = superimposingProviders.put(superimposePath, srp);
// unregister in case there was a provider registered before
if (!srp.equals(oldSrp)) {
log.debug("(Re-)registering resource provider {}.", superimposePath);
if (null != oldSrp) {
oldSrp.unregisterService();
}
srp.registerService(bundleContext);
return true;
} else {
log.debug("Skipped re-registering resource provider {} because there were no relevant changes.", superimposePath);
}
}
// otherwise remove previous superimposing resource provider if new superimposing definition is not valid
else {
final SuperimposingResourceProviderImpl oldSrp = superimposingProviders.remove(superimposePath);
if (null != oldSrp) {
log.debug("Unregistering resource provider {}.", superimposePath);
oldSrp.unregisterService();
}
log.warn("Superimposing definition '{}' pointing to '{}' is invalid.", superimposePath, sourcePath);
}
return false;
}