Skip to content

Commit 2132c4a

Browse files
committed
fix: avoid unnecessarily loading classes at build time
1 parent 96e6f58 commit 2132c4a

File tree

2 files changed

+37
-84
lines changed

2 files changed

+37
-84
lines changed

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -102,27 +102,28 @@ private ControllerConfigurationBuildItem createControllerConfiguration(ClassInfo
102102
.map(Type::asParameterizedType)
103103
.orElseThrow(); // shouldn't happen since we're only dealing with ResourceController implementors already
104104
final var crType = rcInterface.arguments().get(0).name().toString();
105-
final Class<?> crClass;
106-
try {
107-
crClass = Thread.currentThread().getContextClassLoader().loadClass(crType);
108-
} catch (ClassNotFoundException e) {
109-
throw new IllegalArgumentException("Couldn't find class " + crType);
110-
}
111105

112106
// create ResourceController bean
113-
additionalBeans.produce(AdditionalBeanBuildItem.unremovableOf(info.name().toString()));
107+
final var resourceControllerClassName = info.name().toString();
108+
additionalBeans.produce(AdditionalBeanBuildItem.unremovableOf(resourceControllerClassName));
114109

115110
// generate associated Doneable class
116111
final var doneableClassName = crType + "Doneable";
112+
final var crDoneableClassName = CustomResourceDoneable.class.getName();
117113
try (ClassCreator cc = ClassCreator.builder()
118114
.classOutput(classOutput)
119115
.className(doneableClassName)
120-
.superClass(CustomResourceDoneable.class)
116+
.superClass(crDoneableClassName)
121117
.build()) {
122118

123-
MethodCreator ctor = cc.getMethodCreator("<init>", void.class, crClass);
119+
MethodCreator ctor = cc.getMethodCreator("<init>", void.class.getName(), crType);
124120
ctor.setModifiers(Modifier.PUBLIC);
125-
ctor.invokeSpecialMethod(MethodDescriptor.ofConstructor(CustomResourceDoneable.class, crClass, Function.class), ctor.getThis(), ctor.getMethodParam(0), ctor.invokeStaticMethod(MethodDescriptor.ofMethod(Function.class, "identity", Function.class)));
121+
final var functionName = Function.class.getName();
122+
ctor.invokeSpecialMethod(
123+
MethodDescriptor.ofConstructor(crDoneableClassName, crType, functionName),
124+
ctor.getThis(),
125+
ctor.getMethodParam(0),
126+
ctor.invokeStaticMethod(MethodDescriptor.ofMethod(functionName, "identity", functionName)));
126127
}
127128

128129
// generate configuration
@@ -135,7 +136,7 @@ private ControllerConfigurationBuildItem createControllerConfiguration(ClassInfo
135136
valueOrDefault(controllerAnnotation, "generationAwareEventProcessing", AnnotationValue::asBoolean, () -> true),
136137
valueOrDefault(controllerAnnotation, "isClusterScoped", AnnotationValue::asBoolean, () -> false),
137138
valueOrDefault(controllerAnnotation, "namespaces", AnnotationValue::asStringArray, () -> new String[]{}),
138-
crClass,
139+
crType,
139140
doneableClassName,
140141
null // todo: fix-me
141142
);

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

Lines changed: 25 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -7,36 +7,30 @@
77
import io.fabric8.kubernetes.client.CustomResourceDoneable;
88
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
99
import io.javaoperatorsdk.operator.api.config.RetryConfiguration;
10+
import io.quarkus.runtime.annotations.RecordableConstructor;
1011

1112
public class QuarkusControllerConfiguration<R extends CustomResource> implements ControllerConfiguration<R> {
12-
private String name;
13-
private String crdName;
14-
private String finalizer;
15-
private boolean generationAware;
16-
private boolean clusterScoped;
17-
private Set<String> namespaces;
18-
private Class<R> crClass;
19-
private Class<CustomResourceDoneable<R>> doneableClass;
20-
private boolean watchAllNamespaces;
21-
private RetryConfiguration retryConfiguration;
22-
23-
// For serialization
24-
public QuarkusControllerConfiguration() {
25-
}
26-
27-
public QuarkusControllerConfiguration(String name, String crdName, String finalizer, boolean generationAware, boolean clusterScoped, String[] namespaces, Class crClass, String doneableClass, RetryConfiguration retryConfiguration) {
13+
private final String name;
14+
private final String crdName;
15+
private final String finalizer;
16+
private final boolean generationAware;
17+
private final boolean clusterScoped;
18+
private final Set<String> namespaces;
19+
private final String crClass;
20+
private final String doneableClass;
21+
private final boolean watchAllNamespaces;
22+
private final RetryConfiguration retryConfiguration;
23+
24+
@RecordableConstructor
25+
public QuarkusControllerConfiguration(String name, String crdName, String finalizer, boolean generationAware, boolean clusterScoped, String[] namespaces, String crClass, String doneableClass, RetryConfiguration retryConfiguration) {
2826
this.name = name;
2927
this.crdName = crdName;
3028
this.finalizer = finalizer;
3129
this.generationAware = generationAware;
3230
this.clusterScoped = clusterScoped;
3331
this.namespaces = namespaces == null || namespaces.length == 0 ? Collections.emptySet() : Set.of(namespaces);
3432
this.crClass = crClass;
35-
try {
36-
this.doneableClass = (Class<CustomResourceDoneable<R>>) Thread.currentThread().getContextClassLoader().loadClass(doneableClass);
37-
} catch (ClassNotFoundException e) {
38-
throw new IllegalArgumentException("Couldn't find class " + doneableClass);
39-
}
33+
this.doneableClass = doneableClass;
4034
this.watchAllNamespaces = this.namespaces.contains(WATCH_ALL_NAMESPACES_MARKER);
4135
this.retryConfiguration = retryConfiguration == null ? ControllerConfiguration.super.getRetryConfiguration() : retryConfiguration;
4236
}
@@ -63,12 +57,20 @@ public boolean isGenerationAware() {
6357

6458
@Override
6559
public Class<R> getCustomResourceClass() {
66-
return crClass;
60+
try {
61+
return (Class<R>) Thread.currentThread().getContextClassLoader().loadClass(crClass);
62+
} catch (ClassNotFoundException e) {
63+
throw new IllegalArgumentException("Couldn't find class " + crClass);
64+
}
6765
}
6866

6967
@Override
7068
public Class<? extends CustomResourceDoneable<R>> getDoneableClass() {
71-
return doneableClass;
69+
try {
70+
return (Class<CustomResourceDoneable<R>>) Thread.currentThread().getContextClassLoader().loadClass(doneableClass);
71+
} catch (ClassNotFoundException e) {
72+
throw new IllegalArgumentException("Couldn't find class " + doneableClass);
73+
}
7274
}
7375

7476
@Override
@@ -90,54 +92,4 @@ public boolean watchAllNamespaces() {
9092
public RetryConfiguration getRetryConfiguration() {
9193
return retryConfiguration;
9294
}
93-
94-
// For serialization
95-
public void setName(String name) {
96-
this.name = name;
97-
}
98-
99-
// For serialization
100-
public void setCrdName(String crdName) {
101-
this.crdName = crdName;
102-
}
103-
104-
// For serialization
105-
void setFinalizer(String finalizer) {
106-
this.finalizer = finalizer;
107-
}
108-
109-
// For serialization
110-
public void setGenerationAware(boolean generationAware) {
111-
this.generationAware = generationAware;
112-
}
113-
114-
// For serialization
115-
public void setClusterScoped(boolean clusterScoped) {
116-
this.clusterScoped = clusterScoped;
117-
}
118-
119-
// For serialization
120-
public void setNamespaces(Set<String> namespaces) {
121-
this.namespaces = namespaces;
122-
}
123-
124-
// For serialization
125-
public void setCrClass(Class<R> crClass) {
126-
this.crClass = crClass;
127-
}
128-
129-
// For serialization
130-
public void setDoneableClass(Class<CustomResourceDoneable<R>> doneableClass) {
131-
this.doneableClass = doneableClass;
132-
}
133-
134-
// For serialization
135-
public void setWatchAllNamespaces(boolean watchAllNamespaces) {
136-
this.watchAllNamespaces = watchAllNamespaces;
137-
}
138-
139-
// For serialization
140-
public void setRetryConfiguration(RetryConfiguration retryConfiguration) {
141-
this.retryConfiguration = retryConfiguration;
142-
}
14395
}

0 commit comments

Comments
 (0)