private void processExtendedResourceType()

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