void kameletNativeModeSupport()

in extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletProcessor.java [68:154]


    void kameletNativeModeSupport(
            CurateOutcomeBuildItem curateOutcome,
            BuildProducer<NativeImageResourcePatternsBuildItem> nativeImagePatterns,
            BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
            KameletConfiguration kameletConfig) {

        // The locations where kamelets are stored
        List<String> kameletLocations = ConfigProvider.getConfig()
                .getOptionalValues("camel.component.kamelet.location", String.class)
                .orElse(List.of("classpath:kamelets"));

        Set<String> identifiers = kameletConfig.identifiers()
                .stream()
                .map(String::trim)
                .map(identifier -> identifier.replace(KAMELET_FILE_EXTENSION, ""))
                .map(identifier -> identifier + KAMELET_FILE_EXTENSION)
                .collect(Collectors.toUnmodifiableSet());

        List<String> kameletResources = new ArrayList<>();
        Set<String> kameletClasspathPatterns = new HashSet<>();
        for (String kameletLocation : kameletLocations) {
            String scheme = StringHelper.before(kameletLocation, ":");
            String location = StringHelper.after(kameletLocation, ":", kameletLocation);
            if (ObjectHelper.isEmpty(scheme) || scheme.equals(CLASSPATH_PREFIX)) {
                identifiers.forEach(identifier -> kameletClasspathPatterns
                        .add(FileUtil.stripLeadingSeparator(location) + "/" + identifier));
            } else if (scheme.equals(FILE_PREFIX)) {
                boolean isDefaultIdentifier = identifiers.size() == 1 && identifiers.contains("*." + KAMELET_FILE_EXTENSION);

                Path kameletsDir = Paths.get(location);
                if (Files.isDirectory(kameletsDir)) {
                    try {
                        Files.walkFileTree(kameletsDir, new SimpleFileVisitor<>() {
                            @Override
                            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                                if (Files.isReadable(file)) {
                                    String fileName = file.getFileName().toString();
                                    if ((isDefaultIdentifier && fileName.endsWith(KAMELET_FILE_EXTENSION))
                                            || (identifiers.contains(fileName))) {
                                        kameletResources.add(FILE_PREFIX + ":" + file.toAbsolutePath());
                                    }
                                }
                                return FileVisitResult.CONTINUE;
                            }

                            @Override
                            public FileVisitResult visitFileFailed(Path file, IOException e) {
                                return FileVisitResult.CONTINUE;
                            }
                        });
                    } catch (IOException e) {
                        LOGGER.debugf(e, "Failed to walk kamelet directory %s", location);
                    }
                }
            }
        }

        if (!kameletClasspathPatterns.isEmpty()) {
            nativeImagePatterns.produce(NativeImageResourcePatternsBuildItem.builder()
                    .includeGlobs(kameletClasspathPatterns)
                    .build());

            PathFilter pathFilter = PathFilter.forIncludes(kameletClasspathPatterns);
            PathVisitor pathVisitor = visit -> kameletResources.add(CLASSPATH_PREFIX + ":" + sanitizePath(visit.getPath()));

            // Discover Kamelets in the application artifact
            ApplicationModel applicationModel = curateOutcome.getApplicationModel();
            ResolvedDependency appArtifact = applicationModel.getAppArtifact();
            appArtifact.getContentTree(pathFilter).walk(pathVisitor);

            // Discover Kamelets in other runtime dependencies
            for (ResolvedDependency dependency : applicationModel.getRuntimeDependencies()) {
                dependency.getContentTree(pathFilter).walk(pathVisitor);
            }
        }

        // Automatically register kamelet beans for reflection
        if (!kameletResources.isEmpty()) {
            Set<String> kameletBeanClasses = resolveKameletBeanClasses(kameletResources);
            if (!kameletBeanClasses.isEmpty()) {
                reflectiveClass.produce(ReflectiveClassBuildItem.builder(kameletBeanClasses.toArray(new String[0]))
                        .fields()
                        .methods()
                        .build());
            }
        }
    }