2
2
3
3
import com .google .auto .service .AutoService ;
4
4
import com .squareup .javapoet .*;
5
- import com .sun .tools .javac .code .Symbol ;
6
- import com .sun .tools .javac .code .Type ;
5
+
7
6
import io .fabric8 .kubernetes .api .builder .Function ;
8
7
import io .fabric8 .kubernetes .client .CustomResourceDoneable ;
9
8
import io .javaoperatorsdk .operator .api .ResourceController ;
10
9
import io .quarkus .runtime .annotations .RegisterForReflection ;
11
10
12
11
import javax .annotation .processing .*;
13
12
import javax .lang .model .SourceVersion ;
14
- import javax .lang .model .element .Element ;
15
- import javax .lang .model .element . Modifier ;
16
- import javax .lang .model .element . TypeElement ;
13
+ import javax .lang .model .element .* ;
14
+ import javax .lang .model .type . DeclaredType ;
15
+ import javax .lang .model .type . TypeKind ;
17
16
import javax .lang .model .type .TypeMirror ;
18
17
import javax .tools .JavaFileObject ;
19
- import java .io .IOException ;
20
18
import java .io .PrintWriter ;
21
19
import java .util .ArrayList ;
22
20
import java .util .List ;
23
21
import java .util .Set ;
22
+ import java .util .stream .Collectors ;
24
23
25
24
@ SupportedAnnotationTypes (
26
25
"io.javaoperatorsdk.operator.api.Controller" )
@@ -32,22 +31,22 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
32
31
for (TypeElement annotation : annotations ) {
33
32
Set <? extends Element > annotatedElements
34
33
= roundEnv .getElementsAnnotatedWith (annotation );
35
- annotatedElements .stream ().filter (element -> element instanceof Symbol . ClassSymbol )
36
- .map (e -> (Symbol . ClassSymbol ) e )
34
+ annotatedElements .stream ().filter (element -> element . getKind (). equals ( ElementKind . CLASS ) )
35
+ .map (e -> (TypeElement ) e )
37
36
.forEach (this ::generateDoneableClass );
38
37
}
39
38
return false ;
40
39
}
41
40
42
- private void generateDoneableClass (Symbol . ClassSymbol controllerClassSymbol ) {
41
+ private void generateDoneableClass (TypeElement controllerClassSymbol ) {
43
42
try {
44
43
final TypeMirror resourceType = findResourceType (controllerClassSymbol );
45
- Symbol . ClassSymbol customerResourceSymbol = ( Symbol . ClassSymbol ) processingEnv
44
+ TypeElement customerResourceTypeElement = processingEnv
46
45
.getElementUtils ()
47
46
.getTypeElement (resourceType .toString ());
48
47
49
48
JavaFileObject builderFile = processingEnv .getFiler ()
50
- .createSourceFile (customerResourceSymbol . className () + "Doneable" );
49
+ .createSourceFile (customerResourceTypeElement . getSimpleName () + "Doneable" );
51
50
52
51
try (PrintWriter out = new PrintWriter (builderFile .openWriter ())) {
53
52
final MethodSpec constructor = MethodSpec .constructorBuilder ()
@@ -57,46 +56,42 @@ private void generateDoneableClass(Symbol.ClassSymbol controllerClassSymbol) {
57
56
.addStatement ("super(resource,function)" )
58
57
.build ();
59
58
60
- final TypeSpec typeSpec = TypeSpec .classBuilder (customerResourceSymbol . name + "Doneable" )
59
+ final TypeSpec typeSpec = TypeSpec .classBuilder (customerResourceTypeElement . getSimpleName () + "Doneable" )
61
60
.addAnnotation (RegisterForReflection .class )
62
61
.superclass (ParameterizedTypeName .get (ClassName .get (CustomResourceDoneable .class ), TypeName .get (resourceType )))
63
62
.addModifiers (Modifier .PUBLIC )
64
63
.addMethod (constructor )
65
64
.build ();
66
65
67
- JavaFile file = JavaFile .builder (customerResourceSymbol .packge ().fullname .toString (), typeSpec )
66
+ final PackageElement packageElement = processingEnv .getElementUtils ().getPackageOf (customerResourceTypeElement );
67
+ JavaFile file = JavaFile .builder (packageElement .getQualifiedName ().toString (), typeSpec )
68
68
.build ();
69
69
file .writeTo (out );
70
70
}
71
- } catch (IOException ioException ) {
71
+ } catch (Exception ioException ) {
72
72
ioException .printStackTrace ();
73
- } catch (Exception ex ) {
74
- ex .printStackTrace ();
75
73
}
76
74
}
77
75
78
- private TypeMirror findResourceType (Symbol . ClassSymbol controllerClassSymbol ) throws Exception {
79
- final Type controllerType = collectAllInterfaces (controllerClassSymbol )
76
+ private TypeMirror findResourceType (TypeElement controllerClassSymbol ) throws Exception {
77
+ final DeclaredType controllerType = collectAllInterfaces (controllerClassSymbol )
80
78
.stream ()
81
79
.filter (i -> i .toString ()
82
80
.startsWith (ResourceController .class .getCanonicalName ())
83
81
)
84
82
.findFirst ()
85
83
.orElseThrow (() -> new Exception ("ResourceController is not implemented by " + controllerClassSymbol .toString ()));
86
84
87
- final TypeMirror resourceType = controllerType .getTypeArguments ().get (0 );
88
- return resourceType ;
85
+ return controllerType .getTypeArguments ().get (0 );
89
86
}
90
87
91
- private List <Type > collectAllInterfaces (Symbol .ClassSymbol classSymbol ) {
92
- List <Type > interfaces = new ArrayList <>(classSymbol .getInterfaces ());
93
- Symbol .ClassSymbol superclass = (Symbol .ClassSymbol ) processingEnv .getTypeUtils ().asElement (classSymbol .getSuperclass ());
94
-
95
- while (superclass != null ) {
96
- interfaces .addAll (superclass .getInterfaces ());
97
- superclass = (Symbol .ClassSymbol ) processingEnv .getTypeUtils ().asElement (superclass .getSuperclass ());
88
+ private List <DeclaredType > collectAllInterfaces (TypeElement element ) {
89
+ List <DeclaredType > interfaces = new ArrayList <>(element .getInterfaces ()).stream ().map (t -> (DeclaredType ) t ).collect (Collectors .toList ());
90
+ TypeElement superclass = ((TypeElement ) ((DeclaredType ) element .getSuperclass ()).asElement ());
91
+ while (superclass .getSuperclass ().getKind () != TypeKind .NONE ) {
92
+ interfaces .addAll (superclass .getInterfaces ().stream ().map (t -> (DeclaredType ) t ).collect (Collectors .toList ()));
93
+ superclass = ((TypeElement ) ((DeclaredType ) superclass .getSuperclass ()).asElement ());
98
94
}
99
-
100
95
return interfaces ;
101
96
}
102
97
}
0 commit comments