1
1
package io .javaoperatorsdk .quarkus .extension .deployment ;
2
2
3
+ import java .lang .reflect .Modifier ;
3
4
import java .util .Optional ;
4
5
import java .util .function .Function ;
5
6
import java .util .function .Supplier ;
6
7
import java .util .stream .Collectors ;
7
8
9
+ import javax .inject .Singleton ;
10
+
11
+ import io .fabric8 .kubernetes .client .CustomResourceDoneable ;
8
12
import io .javaoperatorsdk .operator .api .ControllerUtils ;
9
13
import io .javaoperatorsdk .operator .api .config .ControllerConfiguration ;
14
+ import io .javaoperatorsdk .quarkus .extension .ConfigurationServiceRecorder ;
10
15
import io .javaoperatorsdk .quarkus .extension .QuarkusConfigurationService ;
11
16
import io .javaoperatorsdk .quarkus .extension .QuarkusControllerConfiguration ;
12
- import io .quarkus .arc .deployment .AdditionalBeanBuildItem ;
17
+ import io .quarkus .arc .deployment .SyntheticBeanBuildItem ;
18
+ import io .quarkus .deployment .GeneratedClassGizmoAdaptor ;
13
19
import io .quarkus .deployment .annotations .BuildProducer ;
14
20
import io .quarkus .deployment .annotations .BuildStep ;
21
+ import io .quarkus .deployment .annotations .ExecutionTime ;
22
+ import io .quarkus .deployment .annotations .Record ;
15
23
import io .quarkus .deployment .builditem .CombinedIndexBuildItem ;
16
24
import io .quarkus .deployment .builditem .FeatureBuildItem ;
25
+ import io .quarkus .deployment .builditem .GeneratedClassBuildItem ;
26
+ import io .quarkus .gizmo .ClassCreator ;
27
+ import io .quarkus .gizmo .ClassOutput ;
28
+ import io .quarkus .gizmo .MethodCreator ;
29
+ import io .quarkus .gizmo .MethodDescriptor ;
17
30
import org .jboss .jandex .AnnotationInstance ;
18
31
import org .jboss .jandex .AnnotationValue ;
19
32
import org .jboss .jandex .ClassInfo ;
@@ -36,18 +49,23 @@ FeatureBuildItem feature() {
36
49
37
50
38
51
@ BuildStep
39
- void createOperator (CombinedIndexBuildItem combinedIndexBuildItem ,
40
- BuildProducer <AdditionalBeanBuildItem > additionalBeanBuildItemBuildItem ) {
52
+ @ Record (ExecutionTime .RUNTIME_INIT )
53
+ void createDoneableClasses (CombinedIndexBuildItem combinedIndexBuildItem ,
54
+ BuildProducer <SyntheticBeanBuildItem > syntheticBeanBuildItemBuildProducer ,
55
+ BuildProducer <GeneratedClassBuildItem > generatedClass ,
56
+ ConfigurationServiceRecorder recorder ) {
41
57
final var index = combinedIndexBuildItem .getIndex ();
42
58
final var resourceControllers = index .getAllKnownImplementors (RESOURCE_CONTROLLER );
43
59
final var controllerConfigs = resourceControllers .stream ()
44
- .map (this :: createControllerConfiguration )
60
+ .map (ci -> createControllerConfiguration ( ci , new GeneratedClassGizmoAdaptor ( generatedClass , true )) )
45
61
.collect (Collectors .toList ());
46
- final var configService = AdditionalBeanBuildItem .unremovableOf (QuarkusConfigurationService .class );
47
- additionalBeanBuildItemBuildItem .produce (configService );
62
+ syntheticBeanBuildItemBuildProducer .produce (SyntheticBeanBuildItem .configure (QuarkusConfigurationService .class )
63
+ .scope (Singleton .class )
64
+ .supplier (recorder .configurationServiceSupplier (controllerConfigs ))
65
+ .done ());
48
66
}
49
67
50
- private ControllerConfiguration createControllerConfiguration (ClassInfo info ) {
68
+ private ControllerConfiguration createControllerConfiguration (ClassInfo info , ClassOutput classOutput ) {
51
69
// first retrieve the custom resource class
52
70
final var rcInterface = info .interfaceTypes ().stream ()
53
71
.filter (t -> t .name ().equals (RESOURCE_CONTROLLER ))
@@ -62,19 +80,18 @@ private ControllerConfiguration createControllerConfiguration(ClassInfo info) {
62
80
throw new IllegalArgumentException ("Couldn't find class " + crType );
63
81
}
64
82
65
-
66
83
// generate associated Doneable class
67
- /* final var doneableClassName = crType + "Doneable";
84
+ final var doneableClassName = crType + "Doneable" ;
68
85
try (ClassCreator cc = ClassCreator .builder ()
69
- // .classOutput(classOutput)
86
+ .classOutput (classOutput )
70
87
.className (doneableClassName )
71
88
.superClass (CustomResourceDoneable .class )
72
89
.build ()) {
73
90
74
91
MethodCreator ctor = cc .getMethodCreator ("<init>" , void .class , crClass );
75
92
ctor .setModifiers (Modifier .PUBLIC );
76
93
ctor .invokeSpecialMethod (MethodDescriptor .ofConstructor (CustomResourceDoneable .class , crClass , Function .class ), ctor .getThis (), ctor .getMethodParam (0 ), ctor .invokeStaticMethod (MethodDescriptor .ofMethod (Function .class , "identity" , Function .class )));
77
- }*/
94
+ }
78
95
79
96
// get Controller annotation
80
97
final var controllerAnnotation = info .classAnnotation (CONTROLLER );
@@ -89,8 +106,8 @@ private ControllerConfiguration createControllerConfiguration(ClassInfo info) {
89
106
valueOrDefault (controllerAnnotation , "isClusterScoped" , AnnotationValue ::asBoolean , () -> false ),
90
107
valueOrDefault (controllerAnnotation , "namespaces" , AnnotationValue ::asStringArray , () -> new String []{}),
91
108
crClass ,
92
- null ,
93
- null
109
+ null , // todo: fix-me
110
+ null // todo: fix-me
94
111
);
95
112
}
96
113
0 commit comments