private static void collectRestActuators(final Collection<? extends Class> subTypes, final File parentPath, final Class annotationClazz) {
        subTypes.forEach(clazz -> {
            var properties = new ArrayList<Map<?, ?>>();
            var endpoint = clazz.getAnnotation(annotationClazz);
            var endpointId = getEndpointId(endpoint, annotationClazz);
            
            var methods = findAnnotatedMethods(clazz, GetMapping.class);
            LOGGER.debug("Checking actuator endpoint (GET) for [{}]", clazz.getName());
            methods.forEach(Unchecked.consumer(method -> {
                var get = method.getAnnotation(GetMapping.class);
                var map = new LinkedHashMap<>();
                var paths = Arrays.stream(get.path())
                    .map(path -> StringUtils.isBlank(path)
                        ? endpointId
                        : endpointId + StringUtils.prependIfMissing(path, "/"))
                    .findFirst()
                    .orElse(null);
                map.put("method", RequestMethod.GET.name());
                map.put("path", Optional.ofNullable(paths).orElse(endpointId));
                map.put("name", endpointId);
                map.put("endpointType", annotationClazz.getSimpleName());

                collectActuatorEndpointMethodMetadata(method, map, endpointId);
                if (get.produces().length > 0) {
                    map.put("produces", get.produces());
                }
                if (get.consumes().length > 0) {
                    map.put("consumes", get.consumes());
                }
                if (get.params().length > 0) {
                    map.put("parameters", get.params());
                }
                if (get.headers().length > 0) {
                    map.put("headers", get.headers());
                }
                if (get.value().length > 0) {
                    map.put("value", get.value());
                }
                properties.add(map);
            }));

            LOGGER.debug("Checking actuator endpoint (DELETE) for [{}]", clazz.getName());
            methods = findAnnotatedMethods(clazz, DeleteMapping.class);
            methods.forEach(Unchecked.consumer(method -> {
                var delete = method.getAnnotation(DeleteMapping.class);
                var map = new LinkedHashMap<>();
                var paths = Arrays.stream(delete.path())
                    .map(path -> StringUtils.isBlank(path) ? endpointId : endpointId
                        + StringUtils.prependIfMissing(path, "/"))
                    .findFirst().orElse(null);
                map.put("method", RequestMethod.DELETE.name());
                map.put("path", Optional.ofNullable(paths).orElse(endpointId));
                map.put("name", endpointId);
                map.put("endpointType", annotationClazz.getSimpleName());
                collectActuatorEndpointMethodMetadata(method, map, endpointId);
                if (delete.produces().length > 0) {
                    map.put("produces", delete.produces());
                }
                if (delete.consumes().length > 0) {
                    map.put("consumes", delete.consumes());
                }
                if (delete.params().length > 0) {
                    map.put("parameters", delete.params());
                }
                if (delete.headers().length > 0) {
                    map.put("headers", delete.headers());
                }
                if (delete.value().length > 0) {
                    map.put("value", delete.value());
                }
                properties.add(map);
            }));

            LOGGER.debug("Checking actuator endpoint (POST) for [{}]", clazz.getName());
            methods = findAnnotatedMethods(clazz, PostMapping.class);
            methods.forEach(Unchecked.consumer(method -> {
                var post = method.getAnnotation(PostMapping.class);
                var map = new LinkedHashMap<>();
                var paths = Arrays.stream(post.path())
                    .map(path -> StringUtils.isBlank(path)
                        ? endpointId
                        : endpointId + StringUtils.prependIfMissing(path, "/"))
                    .findFirst().orElse(null);
                map.put("method", RequestMethod.POST.name());
                map.put("path", Optional.ofNullable(paths).orElse(endpointId));
                map.put("name", endpointId);
                map.put("endpointType", annotationClazz.getSimpleName());
                collectActuatorEndpointMethodMetadata(method, map, endpointId);
                if (post.produces().length > 0) {
                    map.put("produces", post.produces());
                }
                if (post.consumes().length > 0) {
                    map.put("consumes", post.consumes());
                }
                if (post.params().length > 0) {
                    map.put("parameters", post.params());
                }
                if (post.headers().length > 0) {
                    map.put("headers", post.headers());
                }
                if (post.value().length > 0) {
                    map.put("value", post.value());
                }
                properties.add(map);
            }));

            LOGGER.debug("Checking actuator endpoint (PATCH) for [{}]", clazz.getName());
            methods = findAnnotatedMethods(clazz, PatchMapping.class);
            methods.forEach(Unchecked.consumer(method -> {
                var patch = method.getAnnotation(PatchMapping.class);
                var map = new LinkedHashMap<>();
                var paths = Arrays.stream(patch.path())
                    .map(path -> StringUtils.isBlank(path)
                        ? endpointId
                        : endpointId + StringUtils.prependIfMissing(path, "/"))
                    .findFirst().orElse(null);
                map.put("method", RequestMethod.PATCH.name());
                map.put("path", Optional.ofNullable(paths).orElse(endpointId));
                map.put("name", endpointId);
                map.put("endpointType", annotationClazz.getSimpleName());
                collectActuatorEndpointMethodMetadata(method, map, endpointId);
                if (patch.produces().length > 0) {
                    map.put("produces", patch.produces());
                }
                if (patch.consumes().length > 0) {
                    map.put("consumes", patch.consumes());
                }
                if (patch.params().length > 0) {
                    map.put("parameters", patch.params());
                }
                if (patch.headers().length > 0) {
                    map.put("headers", patch.headers());
                }
                if (patch.value().length > 0) {
                    map.put("value", patch.value());
                }
                properties.add(map);
            }));

            LOGGER.debug("Checking actuator endpoint (PUT) for [{}]", clazz.getName());
            methods = findAnnotatedMethods(clazz, PutMapping.class);
            methods.forEach(Unchecked.consumer(method -> {
                var put = method.getAnnotation(PutMapping.class);
                var map = new LinkedHashMap<>();
                var paths = Arrays.stream(put.path())
                    .map(path -> StringUtils.isBlank(path)
                        ? endpointId
                        : endpointId + StringUtils.prependIfMissing(path, "/"))
                    .findFirst().orElse(null);
                map.put("method", RequestMethod.PUT.name());
                map.put("path", Optional.ofNullable(paths).orElse(endpointId));
                map.put("name", endpointId);
                map.put("endpointType", annotationClazz.getSimpleName());
                collectActuatorEndpointMethodMetadata(method, map, endpointId);
                if (put.produces().length > 0) {
                    map.put("produces", put.produces());
                }
                if (put.consumes().length > 0) {
                    map.put("consumes", put.consumes());
                }
                if (put.params().length > 0) {
                    map.put("parameters", put.params());
                }
                if (put.headers().length > 0) {
                    map.put("headers", put.headers());
                }
                if (put.value().length > 0) {
                    map.put("value", put.value());
                }
                properties.add(map);
            }));

            if (!properties.isEmpty()) {
                var destination = new File(parentPath, endpointId);
                if (!destination.mkdirs()) {
                    LOGGER.debug("Unable to create directory [{}]", destination);
                }

                var configFile = new File(destination, "config.yml");
                CasConfigurationMetadataCatalog.export(configFile, properties);
            }
        });
    }
This is {@link CasDocumentationApplication}.

@author Misagh Moayyed
@since 6.4.0
docs/cas-server-documentation-processor/src/main/java/org/apereo/cas/documentation/CasDocumentationApplication.java