Skip to content

Commit b8e717d

Browse files
committed
Add support for DataTypeTransformer annotation in native mode
1 parent 586591b commit b8e717d

File tree

1 file changed

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

1 file changed

+32
-0
lines changed

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
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;
4647
import io.quarkus.maven.dependency.ArtifactKey;
4748
import io.quarkus.runtime.RuntimeValue;
4849
import io.smallrye.common.annotation.Identifier;
@@ -431,6 +432,37 @@ CamelComponentNameResolverBuildItem componentNameResolver(
431432
return new CamelComponentNameResolverBuildItem(recorder.createComponentNameResolver(componentNames));
432433
}
433434

435+
/**
436+
* Discovers classes annotated with @DataTypeTransformer for package scanning and reflection.
437+
* This enables transformer.scan() to work in native mode.
438+
*/
439+
@BuildStep
440+
void discoverDataTypeTransformers(
441+
CombinedIndexBuildItem combinedIndex,
442+
BuildProducer<CamelPackageScanClassBuildItem> packageScanClass,
443+
BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
444+
445+
IndexView view = combinedIndex.getIndex();
446+
DotName dataTypeTransformer = DotName.createSimple("org.apache.camel.spi.DataTypeTransformer");
447+
448+
Set<String> transformerClasses = view.getAnnotations(dataTypeTransformer)
449+
.stream()
450+
.filter(ai -> ai.target().kind() == org.jboss.jandex.AnnotationTarget.Kind.CLASS)
451+
.map(ai -> ai.target().asClass().name().toString())
452+
.collect(Collectors.toSet());
453+
454+
if (!transformerClasses.isEmpty()) {
455+
LOGGER.debug("Found @DataTypeTransformer annotated classes: {}", transformerClasses);
456+
packageScanClass.produce(new CamelPackageScanClassBuildItem(transformerClasses));
457+
458+
// Register transformer classes for reflection so they can be instantiated at runtime
459+
transformerClasses.forEach(className -> reflectiveClass.produce(
460+
ReflectiveClassBuildItem.builder(className)
461+
.methods()
462+
.build()));
463+
}
464+
}
465+
434466
@Record(ExecutionTime.STATIC_INIT)
435467
@BuildStep
436468
CamelPackageScanClassResolverBuildItem packageScanClassResolver(

0 commit comments

Comments
 (0)