11package io .javaoperatorsdk .operator .processing ;
22
33import com .google .auto .service .AutoService ;
4+ import com .squareup .javapoet .*;
45import 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
610import javax .annotation .processing .*;
711import javax .lang .model .SourceVersion ;
812import javax .lang .model .element .Element ;
13+ import javax .lang .model .element .Modifier ;
914import javax .lang .model .element .TypeElement ;
1015import javax .lang .model .type .DeclaredType ;
1116import 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