Skip to content

Commit a9cd7d9

Browse files
committed
A support for Transfomer in native with discovery of Transformer implementations
1 parent b143124 commit a9cd7d9

File tree

1 file changed

+47
-0
lines changed
  • extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment

1 file changed

+47
-0
lines changed

extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelProcessor.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
4444
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
4545
import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
46+
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
47+
import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
4648
import io.quarkus.maven.dependency.ArtifactKey;
4749
import io.quarkus.runtime.RuntimeValue;
4850
import io.smallrye.common.annotation.Identifier;
@@ -108,6 +110,8 @@ class CamelProcessor {
108110
"org.apache.camel.Predicate");
109111
private static final DotName CONVERTER_TYPE = DotName.createSimple(
110112
"org.apache.camel.Converter");
113+
private static final DotName TRANSFORMER_TYPE = DotName.createSimple(
114+
"org.apache.camel.spi.Transformer");
111115

112116
private static final Set<DotName> UNREMOVABLE_BEANS_TYPES = CamelSupport.setOf(
113117
ROUTES_BUILDER_TYPE,
@@ -431,6 +435,49 @@ CamelComponentNameResolverBuildItem componentNameResolver(
431435
return new CamelComponentNameResolverBuildItem(recorder.createComponentNameResolver(componentNames));
432436
}
433437

438+
/**
439+
* Discovers all Transformer implementations for package scanning and reflection.
440+
* This enables transformer.scan() to work in native mode.
441+
*/
442+
@BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
443+
void discoverTransformers(
444+
ApplicationArchivesBuildItem applicationArchives,
445+
CombinedIndexBuildItem combinedIndex,
446+
BuildProducer<CamelPackageScanClassBuildItem> packageScanClass,
447+
BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
448+
449+
IndexView index = combinedIndex.getIndex();
450+
451+
Set<String> internalTransformers = new HashSet<>();
452+
// Ignore all Transformer implementations from org.apache.camel:camel-* dependencies
453+
for (ApplicationArchive archive : applicationArchives.getAllApplicationArchives()) {
454+
ArtifactKey artifactKey = archive.getKey();
455+
if (artifactKey != null && "org.apache.camel".equals(artifactKey.getGroupId())
456+
&& artifactKey.getArtifactId().startsWith("camel-")) {
457+
internalTransformers.addAll(archive.getIndex().getAllKnownSubclasses(TRANSFORMER_TYPE)
458+
.stream()
459+
.map(classInfo -> classInfo.name().toString())
460+
.collect(Collectors.toSet()));
461+
}
462+
}
463+
464+
Set<String> transformerClasses = index.getAllKnownSubclasses(TRANSFORMER_TYPE)
465+
.stream()
466+
.map(classInfo -> classInfo.name().toString())
467+
.filter(className -> !internalTransformers.contains(className))
468+
.collect(Collectors.toSet());
469+
470+
if (!transformerClasses.isEmpty()) {
471+
LOGGER.debug("Found Transformer classes: {}", transformerClasses);
472+
packageScanClass.produce(new CamelPackageScanClassBuildItem(transformerClasses));
473+
474+
// Register transformer classes for reflection so they can be instantiated at runtime
475+
transformerClasses.forEach(className -> reflectiveClass.produce(
476+
ReflectiveClassBuildItem.builder(className)
477+
.build()));
478+
}
479+
}
480+
434481
@Record(ExecutionTime.STATIC_INIT)
435482
@BuildStep
436483
CamelPackageScanClassResolverBuildItem packageScanClassResolver(

0 commit comments

Comments
 (0)