Skip to content

Commit 7075ddf

Browse files
author
Soroosh Sarabadani
committed
Generate the class with javapoet
1 parent 2697810 commit 7075ddf

File tree

1 file changed

+22
-14
lines changed

1 file changed

+22
-14
lines changed

operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/ControllerAnnotationProcessor.java

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

33
import com.google.auto.service.AutoService;
4+
import com.squareup.javapoet.*;
45
import com.sun.tools.javac.code.Symbol;
6+
import io.fabric8.kubernetes.api.builder.Function;
7+
import io.fabric8.kubernetes.client.CustomResourceDoneable;
8+
import io.quarkus.runtime.annotations.RegisterForReflection;
59

610
import javax.annotation.processing.*;
711
import javax.lang.model.SourceVersion;
812
import javax.lang.model.element.Element;
13+
import javax.lang.model.element.Modifier;
914
import javax.lang.model.element.TypeElement;
1015
import javax.lang.model.type.DeclaredType;
1116
import javax.lang.model.type.TypeMirror;
@@ -26,31 +31,34 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
2631
= roundEnv.getElementsAnnotatedWith(annotation);
2732
annotatedElements.stream().filter(element -> element instanceof Symbol.ClassSymbol)
2833
.map(e -> (Symbol.ClassSymbol) e)
29-
.forEach(controllerClassSymbol -> {
30-
generateDoneableClass(controllerClassSymbol);
31-
});
34+
.forEach(controllerClassSymbol -> generateDoneableClass(controllerClassSymbol));
3235
}
3336
return false;
3437
}
3538

3639
private void generateDoneableClass(Symbol.ClassSymbol controllerClassSymbol) {
37-
JavaFileObject builderFile = null;
3840
try {
3941
// TODO: the resourceType retrieval logic is currently very fragile, done for testing purposes and need to be improved to cover all possible conditions
4042
final TypeMirror resourceType = ((DeclaredType) controllerClassSymbol.getInterfaces().head).getTypeArguments().get(0);
4143
Symbol.ClassSymbol customerResourceSymbol = (Symbol.ClassSymbol) processingEnv.getElementUtils().getTypeElement(resourceType.toString());
42-
builderFile = processingEnv.getFiler()
44+
JavaFileObject builderFile = processingEnv.getFiler()
4345
.createSourceFile(customerResourceSymbol.className() + "Doneable");
4446
try (PrintWriter out = new PrintWriter(builderFile.openWriter())) {
45-
out.println("package " + customerResourceSymbol.packge().fullname + ";");
46-
out.println("import io.quarkus.runtime.annotations.RegisterForReflection;");
47-
out.println("import io.fabric8.kubernetes.api.builder.Function;");
48-
out.println("import io.fabric8.kubernetes.client.CustomResourceDoneable;");
49-
out.println();
50-
out.println("@RegisterForReflection");
51-
out.println("public class " + customerResourceSymbol.name + "Doneable " + " extends CustomResourceDoneable<" + customerResourceSymbol.name + "> {");
52-
out.println("public " + customerResourceSymbol.name + "Doneable(" + customerResourceSymbol.name + " resource, Function function){ super(resource,function);}");
53-
out.println("}");
47+
final MethodSpec constructor = MethodSpec.constructorBuilder()
48+
.addModifiers(Modifier.PUBLIC)
49+
.addParameter(TypeName.get(resourceType), "resource")
50+
.addParameter(Function.class, "function")
51+
.addStatement("super(resource,function);")
52+
.build();
53+
final TypeSpec typeSpec = TypeSpec.classBuilder(customerResourceSymbol.name + "Doneable")
54+
.addAnnotation(RegisterForReflection.class)
55+
.superclass(ParameterizedTypeName.get(ClassName.get(CustomResourceDoneable.class), TypeName.get(resourceType)))
56+
.addModifiers(Modifier.PUBLIC)
57+
.addMethod(constructor)
58+
.build();
59+
JavaFile file = JavaFile.builder(customerResourceSymbol.packge().fullname.toString(), typeSpec)
60+
.build();
61+
file.writeTo(out);
5462
}
5563
} catch (IOException ioException) {
5664
ioException.printStackTrace();

0 commit comments

Comments
 (0)