in src/main/java/org/apache/sling/scriptingbundle/plugin/processor/FileProcessor.java [81:126]
private void processExtendedResourceType(@NotNull ResourceType resourceType, @NotNull Path extendsFile,
@NotNull Set<ProvidedResourceTypeCapability> providedCapabilities,
@NotNull Set<RequiredResourceTypeCapability> requiredCapabilities, @NotNull String extendedResource) {
Parameters parameters = OSGiHeader.parseHeader(extendedResource);
if (parameters.size() != 1) {
throw new IllegalArgumentException(String.format("The file '%s' must contain one clause only (not multiple ones separated by ',')",
extendsFile));
}
Entry<String, Attrs> extendsParameter = parameters.entrySet().iterator().next();
for (String attributeName : extendsParameter.getValue().keySet()) {
if (!EXTENDS_ALLOWED_ATTRIBUTE_NAMES.contains(attributeName)) {
throw new IllegalArgumentException(String.format("Found unsupported attribute/directive '%s' in file '%s'. Only the following attributes or directives may be used in the extends file: %s", attributeName,
extendsFile, String.join(",", EXTENDS_ALLOWED_ATTRIBUTE_NAMES)));
}
}
String extendedResourceType = FilenameUtils.normalize(extendsParameter.getKey(), true);
boolean isOptional = aQute.bnd.osgi.Constants.OPTIONAL.equals(extendsParameter.getValue().get(aQute.bnd.osgi.Constants.RESOLUTION_DIRECTIVE));
Set<String> searchPathResourceTypes = processSearchPathResourceTypes(resourceType);
Optional<ProvidedResourceTypeCapability> rootCapability = providedCapabilities.stream().filter(capability ->
capability.getResourceTypes().equals(searchPathResourceTypes) && capability.getSelectors().isEmpty() &&
StringUtils.isEmpty(capability.getRequestMethod()) && StringUtils.isEmpty(capability.getRequestExtension())
).findFirst();
rootCapability.ifPresent(capability -> {
providedCapabilities.remove(capability);
ProvidedResourceTypeCapability replacement =
ProvidedResourceTypeCapability.builder().fromCapability(capability)
.withExtendsResourceType(extendedResourceType).build();
providedCapabilities.add(replacement);
});
if (!rootCapability.isPresent()) {
providedCapabilities.add(
ProvidedResourceTypeCapability.builder()
.withResourceTypes(processSearchPathResourceTypes(resourceType))
.withVersion(resourceType.getVersion())
.withExtendsResourceType(extendedResourceType)
.build());
}
RequiredResourceTypeCapability.Builder requiredBuilder =
RequiredResourceTypeCapability.builder().withResourceType(extendedResourceType);
if (isOptional) {
requiredBuilder.withIsOptional();
}
extractVersionRange(extendsFile, requiredBuilder, extendsParameter.getValue().getVersion());
requiredCapabilities.add(requiredBuilder.build());
}