Skip to content

Commit 61a271b

Browse files
committed
feat: switch to SyntheticBean (sync commit)
1 parent 32a4dd7 commit 61a271b

File tree

5 files changed

+130
-14
lines changed

5 files changed

+130
-14
lines changed

quarkus-extension/deployment/src/main/java/io/javaoperatorsdk/quarkus/extension/deployment/QuarkusExtensionProcessor.java

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,32 @@
11
package io.javaoperatorsdk.quarkus.extension.deployment;
22

3+
import java.lang.reflect.Modifier;
34
import java.util.Optional;
45
import java.util.function.Function;
56
import java.util.function.Supplier;
67
import java.util.stream.Collectors;
78

9+
import javax.inject.Singleton;
10+
11+
import io.fabric8.kubernetes.client.CustomResourceDoneable;
812
import io.javaoperatorsdk.operator.api.ControllerUtils;
913
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
14+
import io.javaoperatorsdk.quarkus.extension.ConfigurationServiceRecorder;
1015
import io.javaoperatorsdk.quarkus.extension.QuarkusConfigurationService;
1116
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;
1319
import io.quarkus.deployment.annotations.BuildProducer;
1420
import io.quarkus.deployment.annotations.BuildStep;
21+
import io.quarkus.deployment.annotations.ExecutionTime;
22+
import io.quarkus.deployment.annotations.Record;
1523
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
1624
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;
1730
import org.jboss.jandex.AnnotationInstance;
1831
import org.jboss.jandex.AnnotationValue;
1932
import org.jboss.jandex.ClassInfo;
@@ -36,18 +49,23 @@ FeatureBuildItem feature() {
3649

3750

3851
@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) {
4157
final var index = combinedIndexBuildItem.getIndex();
4258
final var resourceControllers = index.getAllKnownImplementors(RESOURCE_CONTROLLER);
4359
final var controllerConfigs = resourceControllers.stream()
44-
.map(this::createControllerConfiguration)
60+
.map(ci -> createControllerConfiguration(ci, new GeneratedClassGizmoAdaptor(generatedClass, true)))
4561
.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());
4866
}
4967

50-
private ControllerConfiguration createControllerConfiguration(ClassInfo info) {
68+
private ControllerConfiguration createControllerConfiguration(ClassInfo info, ClassOutput classOutput) {
5169
// first retrieve the custom resource class
5270
final var rcInterface = info.interfaceTypes().stream()
5371
.filter(t -> t.name().equals(RESOURCE_CONTROLLER))
@@ -62,19 +80,18 @@ private ControllerConfiguration createControllerConfiguration(ClassInfo info) {
6280
throw new IllegalArgumentException("Couldn't find class " + crType);
6381
}
6482

65-
6683
// generate associated Doneable class
67-
/*final var doneableClassName = crType + "Doneable";
84+
final var doneableClassName = crType + "Doneable";
6885
try (ClassCreator cc = ClassCreator.builder()
69-
// .classOutput(classOutput)
86+
.classOutput(classOutput)
7087
.className(doneableClassName)
7188
.superClass(CustomResourceDoneable.class)
7289
.build()) {
7390

7491
MethodCreator ctor = cc.getMethodCreator("<init>", void.class, crClass);
7592
ctor.setModifiers(Modifier.PUBLIC);
7693
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+
}
7895

7996
// get Controller annotation
8097
final var controllerAnnotation = info.classAnnotation(CONTROLLER);
@@ -89,8 +106,8 @@ private ControllerConfiguration createControllerConfiguration(ClassInfo info) {
89106
valueOrDefault(controllerAnnotation, "isClusterScoped", AnnotationValue::asBoolean, () -> false),
90107
valueOrDefault(controllerAnnotation, "namespaces", AnnotationValue::asStringArray, () -> new String[]{}),
91108
crClass,
92-
null,
93-
null
109+
null, // todo: fix-me
110+
null // todo: fix-me
94111
);
95112
}
96113

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Copyright 2020 Red Hat, Inc. and/or its affiliates.
3+
*
4+
* <p>
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
* <p>
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
* <p>
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package io.javaoperatorsdk.quarkus.extension.deployment;
18+
19+
import io.quarkus.builder.item.MultiBuildItem;
20+
21+
/**
22+
* @author <a href="[email protected]">Christophe Laprun</a>
23+
*/
24+
public class ResourceControllerBuildItem extends MultiBuildItem {
25+
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.javaoperatorsdk.quarkus.extension;
2+
3+
import java.util.List;
4+
import java.util.function.Supplier;
5+
6+
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
7+
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
8+
import io.quarkus.runtime.annotations.Recorder;
9+
10+
@Recorder
11+
public class ConfigurationServiceRecorder {
12+
13+
public Supplier<ConfigurationService> configurationServiceSupplier(List<ControllerConfiguration> controllerConfigs) {
14+
return () -> new QuarkusConfigurationService(controllerConfigs);
15+
}
16+
}

quarkus-extension/runtime/src/main/java/io/javaoperatorsdk/quarkus/extension/QuarkusConfigurationService.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package io.javaoperatorsdk.quarkus.extension;
22

3+
import java.util.Collections;
4+
import java.util.List;
5+
import java.util.Map;
36
import java.util.Optional;
7+
import java.util.concurrent.ConcurrentHashMap;
48

59
import javax.enterprise.inject.Produces;
610
import javax.inject.Inject;
@@ -20,9 +24,20 @@ public class QuarkusConfigurationService implements ConfigurationService {
2024
@Inject
2125
io.fabric8.kubernetes.client.KubernetesClient client;
2226

27+
private final Map<String, ControllerConfiguration> controllerConfigurations;
28+
29+
public QuarkusConfigurationService(List<ControllerConfiguration> configurations) {
30+
if (configurations != null && !configurations.isEmpty()) {
31+
controllerConfigurations = new ConcurrentHashMap<>(configurations.size());
32+
configurations.forEach(c -> controllerConfigurations.put(c.getName(), c));
33+
} else {
34+
controllerConfigurations = Collections.emptyMap();
35+
}
36+
}
37+
2338
@Override
2439
public <R extends CustomResource> ControllerConfiguration<R> getConfigurationFor(ResourceController<R> controller) {
25-
return null;
40+
return controllerConfigurations.get(controller.getName());
2641
}
2742

2843
@Override
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* Copyright 2020 Red Hat, Inc. and/or its affiliates.
3+
*
4+
* <p>
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
* <p>
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
* <p>
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package io.javaoperatorsdk.operator.sample;
18+
19+
import io.fabric8.kubernetes.client.CustomResource;
20+
import io.javaoperatorsdk.operator.api.Context;
21+
import io.javaoperatorsdk.operator.api.DeleteControl;
22+
import io.javaoperatorsdk.operator.api.ResourceController;
23+
import io.javaoperatorsdk.operator.api.UpdateControl;
24+
25+
/**
26+
* @author <a href="[email protected]">Christophe Laprun</a>
27+
*/
28+
public class TestResourceController implements ResourceController<TestResourceController.TestResource> {
29+
30+
@Override
31+
public DeleteControl deleteResource(TestResource resource, Context<TestResource> context) {
32+
return null;
33+
}
34+
35+
@Override
36+
public UpdateControl<TestResource> createOrUpdateResource(TestResource resource, Context<TestResource> context) {
37+
return null;
38+
}
39+
40+
public static class TestResource extends CustomResource {
41+
}
42+
}

0 commit comments

Comments
 (0)