|
43 | 43 | import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem; |
44 | 44 | import io.quarkus.deployment.builditem.CombinedIndexBuildItem; |
45 | 45 | import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem; |
| 46 | +import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; |
46 | 47 | import io.quarkus.maven.dependency.ArtifactKey; |
47 | 48 | import io.quarkus.runtime.RuntimeValue; |
48 | 49 | import io.smallrye.common.annotation.Identifier; |
@@ -431,6 +432,37 @@ CamelComponentNameResolverBuildItem componentNameResolver( |
431 | 432 | return new CamelComponentNameResolverBuildItem(recorder.createComponentNameResolver(componentNames)); |
432 | 433 | } |
433 | 434 |
|
| 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 | + |
434 | 466 | @Record(ExecutionTime.STATIC_INIT) |
435 | 467 | @BuildStep |
436 | 468 | CamelPackageScanClassResolverBuildItem packageScanClassResolver( |
|
0 commit comments