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