in src/main/java/org/apache/sling/caconfig/resource/impl/def/DefaultConfigurationResourceResolvingStrategy.java [134:221]
private Iterator<String> findConfigRefs(final Resource startResource, final Collection<String> bucketNames) {
// collect all context path resources (but filter out those without config reference)
final Iterator<ContextResource> contextResources = new FilterIterator(contextPathStrategy.findContextResources(startResource),
new Predicate() {
@Override
public boolean evaluate(Object object) {
ContextResource contextResource = (ContextResource)object;
return StringUtils.isNotBlank(contextResource.getConfigRef());
}
});
// get config resource path for each context resource, filter out items where not reference could be resolved
final Iterator<String> configPaths = new Iterator<String>() {
private final List<ContextResource> relativePaths = new ArrayList<>();
private String next = seek();
private String useFromRelativePathsWith;
private String seek() {
String val = null;
while ( val == null && (useFromRelativePathsWith != null || contextResources.hasNext()) ) {
if ( useFromRelativePathsWith != null ) {
final ContextResource contextResource = relativePaths.remove(relativePaths.size() - 1);
val = checkPath(contextResource, useFromRelativePathsWith + "/" + contextResource.getConfigRef(), bucketNames);
if (val != null) {
log.trace("+ Found reference for context path {}: {}", contextResource.getResource().getPath(), val);
}
if ( relativePaths.isEmpty() ) {
useFromRelativePathsWith = null;
}
} else {
final ContextResource contextResource = contextResources.next();
val = contextResource.getConfigRef();
// if absolute path found we are (probably) done
if (val != null && val.startsWith("/")) {
val = checkPath(contextResource, val, bucketNames);
}
if (val != null) {
final boolean isAbsolute = val.startsWith("/");
if ( isAbsolute && !relativePaths.isEmpty() ) {
useFromRelativePathsWith = val;
val = null;
} else if ( !isAbsolute ) {
relativePaths.add(0, contextResource);
val = null;
}
}
if (val != null) {
log.trace("+ Found reference for context path {}: {}", contextResource.getResource().getPath(), val);
}
}
}
if ( val == null && !relativePaths.isEmpty() ) {
log.error("Relative references not used as no absolute reference was found: {}", relativePaths);
}
return val;
}
@Override
public boolean hasNext() {
return next != null;
}
@Override
public String next() {
if ( next == null ) {
throw new NoSuchElementException();
}
final String result = next;
next = seek();
return result;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
// expand paths and eliminate duplicates
return new PathEliminateDuplicatesIterator(new PathParentExpandIterator(config.configPath(), configPaths));
}