1
1
package io .javaoperatorsdk .operator .processing ;
2
2
3
3
import com .google .auto .service .AutoService ;
4
+ import com .squareup .javapoet .*;
4
5
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 ;
5
9
6
10
import javax .annotation .processing .*;
7
11
import javax .lang .model .SourceVersion ;
8
12
import javax .lang .model .element .Element ;
13
+ import javax .lang .model .element .Modifier ;
9
14
import javax .lang .model .element .TypeElement ;
10
15
import javax .lang .model .type .DeclaredType ;
11
16
import javax .lang .model .type .TypeMirror ;
@@ -26,31 +31,34 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
26
31
= roundEnv .getElementsAnnotatedWith (annotation );
27
32
annotatedElements .stream ().filter (element -> element instanceof Symbol .ClassSymbol )
28
33
.map (e -> (Symbol .ClassSymbol ) e )
29
- .forEach (controllerClassSymbol -> {
30
- generateDoneableClass (controllerClassSymbol );
31
- });
34
+ .forEach (controllerClassSymbol -> generateDoneableClass (controllerClassSymbol ));
32
35
}
33
36
return false ;
34
37
}
35
38
36
39
private void generateDoneableClass (Symbol .ClassSymbol controllerClassSymbol ) {
37
- JavaFileObject builderFile = null ;
38
40
try {
39
41
// TODO: the resourceType retrieval logic is currently very fragile, done for testing purposes and need to be improved to cover all possible conditions
40
42
final TypeMirror resourceType = ((DeclaredType ) controllerClassSymbol .getInterfaces ().head ).getTypeArguments ().get (0 );
41
43
Symbol .ClassSymbol customerResourceSymbol = (Symbol .ClassSymbol ) processingEnv .getElementUtils ().getTypeElement (resourceType .toString ());
42
- builderFile = processingEnv .getFiler ()
44
+ JavaFileObject builderFile = processingEnv .getFiler ()
43
45
.createSourceFile (customerResourceSymbol .className () + "Doneable" );
44
46
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 );
54
62
}
55
63
} catch (IOException ioException ) {
56
64
ioException .printStackTrace ();
0 commit comments