Skip to content

Commit 6f6260e

Browse files
author
Soroosh Sarabadani
committed
Use reflection to get getCustomResourceDoneableClass
1 parent 0ffe8ef commit 6f6260e

File tree

1 file changed

+12
-35
lines changed

1 file changed

+12
-35
lines changed

operator-framework/src/main/java/io/javaoperatorsdk/operator/ControllerUtils.java

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
package io.javaoperatorsdk.operator;
22

3-
import io.javaoperatorsdk.operator.api.Controller;
4-
import io.javaoperatorsdk.operator.api.ResourceController;
5-
import io.fabric8.kubernetes.api.builder.Function;
63
import io.fabric8.kubernetes.client.CustomResource;
74
import io.fabric8.kubernetes.client.CustomResourceDoneable;
8-
import javassist.*;
9-
import org.slf4j.Logger;
10-
import org.slf4j.LoggerFactory;
5+
import io.javaoperatorsdk.operator.api.Controller;
6+
import io.javaoperatorsdk.operator.api.ResourceController;
7+
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
118

9+
import java.lang.reflect.ParameterizedType;
10+
import java.util.Arrays;
1211
import java.util.HashMap;
1312
import java.util.Map;
1413

@@ -37,7 +36,8 @@ static boolean getGenerationEventProcessing(ResourceController controller) {
3736
}
3837

3938
static <R extends CustomResource> Class<R> getCustomResourceClass(ResourceController<R> controller) {
40-
return (Class<R>) getAnnotation(controller).customResourceClass();
39+
final Class<R> type = Arrays.stream(controller.getClass().getGenericInterfaces()).filter(i -> i instanceof ParameterizedType).map(i -> (ParameterizedTypeImpl) i).findFirst().map(i -> (Class<R>) i.getActualTypeArguments()[0]).get();
40+
return type;
4141
}
4242

4343
static String getCrdName(ResourceController controller) {
@@ -48,34 +48,11 @@ static String getCrdName(ResourceController controller) {
4848
public static <T extends CustomResource> Class<? extends CustomResourceDoneable<T>>
4949
getCustomResourceDoneableClass(ResourceController<T> controller) {
5050
try {
51-
Class<? extends CustomResource> customResourceClass = getAnnotation(controller).customResourceClass();
52-
String className = customResourceClass.getPackage().getName() + "." + customResourceClass.getSimpleName() + "CustomResourceDoneable";
53-
54-
if (doneableClassCache.containsKey(customResourceClass)) {
55-
return (Class<? extends CustomResourceDoneable<T>>) doneableClassCache.get(customResourceClass);
56-
}
57-
58-
ClassPool pool = ClassPool.getDefault();
59-
pool.appendClassPath(new LoaderClassPath(Thread.currentThread().getContextClassLoader()));
60-
61-
CtClass superClass = pool.get(CustomResourceDoneable.class.getName());
62-
CtClass function = pool.get(Function.class.getName());
63-
CtClass customResource = pool.get(customResourceClass.getName());
64-
CtClass[] argTypes = {customResource, function};
65-
CtClass customDoneable = pool.makeClass(className, superClass);
66-
CtConstructor ctConstructor = CtNewConstructor.make(argTypes, null, "super($1, $2);", customDoneable);
67-
customDoneable.addConstructor(ctConstructor);
68-
69-
Class<? extends CustomResourceDoneable<T>> doneableClass;
70-
if (JAVA_VERSION >= 9) {
71-
doneableClass = (Class<? extends CustomResourceDoneable<T>>) customDoneable.toClass(customResourceClass);
72-
} else {
73-
doneableClass = (Class<? extends CustomResourceDoneable<T>>) customDoneable.toClass();
74-
}
75-
doneableClassCache.put(customResourceClass, doneableClass);
76-
return doneableClass;
77-
} catch (CannotCompileException | NotFoundException e) {
78-
throw new IllegalStateException(e);
51+
final Class<T> customResourceClass = getCustomResourceClass(controller);
52+
return (Class<? extends CustomResourceDoneable<T>>) Class.forName(customResourceClass.getCanonicalName() + "Doneable");
53+
} catch (ClassNotFoundException e) {
54+
e.printStackTrace();
55+
return null;
7956
}
8057
}
8158

0 commit comments

Comments
 (0)