26
26
import io .quarkus .gizmo .ClassOutput ;
27
27
import io .quarkus .gizmo .MethodCreator ;
28
28
import io .quarkus .gizmo .MethodDescriptor ;
29
- import io .quarkus .kubernetes . client . spi . KubernetesClientBuildItem ;
29
+ import io .quarkus .deployment . builditem . nativeimage . ReflectiveClassBuildItem ;
30
30
import java .lang .reflect .Modifier ;
31
31
import java .util .List ;
32
32
import java .util .Optional ;
@@ -63,21 +63,21 @@ void indexSDKDependencies(BuildProducer<IndexDependencyBuildItem> indexDependenc
63
63
}
64
64
65
65
@ BuildStep
66
- @ Record (ExecutionTime .RUNTIME_INIT )
66
+ @ Record (ExecutionTime .STATIC_INIT )
67
67
void createConfigurationServiceAndOperator (
68
68
CombinedIndexBuildItem combinedIndexBuildItem ,
69
69
BuildProducer <GeneratedClassBuildItem > generatedClass ,
70
70
BuildProducer <SyntheticBeanBuildItem > syntheticBeanBuildItemBuildProducer ,
71
71
BuildProducer <AdditionalBeanBuildItem > additionalBeans ,
72
- KubernetesClientBuildItem clientBuildItem ,
72
+ BuildProducer < ReflectiveClassBuildItem > reflectionClasses ,
73
73
ConfigurationServiceRecorder recorder ) {
74
74
final var index = combinedIndexBuildItem .getIndex ();
75
75
final var resourceControllers = index .getAllKnownImplementors (RESOURCE_CONTROLLER );
76
76
77
77
final var classOutput = new GeneratedClassGizmoAdaptor (generatedClass , true );
78
78
final List <ControllerConfiguration > controllerConfigs =
79
79
resourceControllers .stream ()
80
- .map (ci -> createControllerConfiguration (ci , classOutput , additionalBeans ))
80
+ .map (ci -> createControllerConfiguration (ci , classOutput , additionalBeans , reflectionClasses ))
81
81
.collect (Collectors .toList ());
82
82
83
83
final var supplier = recorder .configurationServiceSupplier (controllerConfigs );
@@ -95,7 +95,8 @@ void createConfigurationServiceAndOperator(
95
95
private ControllerConfiguration createControllerConfiguration (
96
96
ClassInfo info ,
97
97
ClassOutput classOutput ,
98
- BuildProducer <AdditionalBeanBuildItem > additionalBeans ) {
98
+ BuildProducer <AdditionalBeanBuildItem > additionalBeans ,
99
+ BuildProducer <ReflectiveClassBuildItem > reflectionClasses ) {
99
100
// first retrieve the custom resource class
100
101
final var rcInterface =
101
102
info .interfaceTypes ().stream ()
@@ -147,9 +148,18 @@ private ControllerConfiguration createControllerConfiguration(
147
148
+ Controller .class .getCanonicalName ()
148
149
+ " annotation" );
149
150
}
151
+
152
+ // load CR class
153
+ final Class <CustomResource > crClass = (Class <CustomResource >) loadClass (crType );
154
+
155
+ // register CR class for introspection
156
+ reflectionClasses .produce (new ReflectiveClassBuildItem (true , true , crClass ));
157
+
150
158
final var crdName =
151
159
valueOrDefault (
152
160
controllerAnnotation , "crdName" , AnnotationValue ::asString , EXCEPTION_SUPPLIER );
161
+
162
+ // create the configuration
153
163
final var configuration =
154
164
new QuarkusControllerConfiguration (
155
165
resourceControllerClassName ,
@@ -193,4 +203,12 @@ private <T> T valueOrDefault(
193
203
Supplier <T > defaultValue ) {
194
204
return Optional .ofNullable (annotation .value (name )).map (converter ).orElseGet (defaultValue );
195
205
}
206
+
207
+ private Class <?> loadClass (String className ) {
208
+ try {
209
+ return Thread .currentThread ().getContextClassLoader ().loadClass (className );
210
+ } catch (ClassNotFoundException e ) {
211
+ throw new IllegalArgumentException ("Couldn't find class " + className );
212
+ }
213
+ }
196
214
}
0 commit comments