Skip to content

Commit 6295b36

Browse files
author
Soroosh Sarabadani
committed
extract findChain
1 parent 0178aec commit 6295b36

File tree

2 files changed

+106
-77
lines changed

2 files changed

+106
-77
lines changed

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

Lines changed: 14 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,17 @@ public class ControllerAnnotationProcessor extends AbstractProcessor {
4949

5050
private AccumulativeMappingWriter controllersResourceWriter;
5151
private AccumulativeMappingWriter doneablesResourceWriter;
52-
private Set<String> generatedDoneableClassFiles = new HashSet<>();
52+
final DeclaredType resourceControllerType =
53+
processingEnv
54+
.getTypeUtils()
55+
.getDeclaredType(
56+
processingEnv
57+
.getElementUtils()
58+
.getTypeElement(ResourceController.class.getCanonicalName()),
59+
processingEnv.getTypeUtils().getWildcardType(null, null));
60+
private final TypeParameterResolver typeParameterResolver = new TypeParameterResolver(
61+
resourceControllerType, 0);
62+
private final Set<String> generatedDoneableClassFiles = new HashSet<>();
5363

5464
@Override
5565
public synchronized void init(ProcessingEnvironment processingEnv) {
@@ -147,7 +157,9 @@ private void generateDoneableClass(TypeElement controllerClassSymbol) {
147157

148158
private TypeMirror findResourceType(TypeElement controllerClassSymbol) throws Exception {
149159
try {
150-
final var chain = findChain((DeclaredType) controllerClassSymbol.asType());
160+
final var chain = typeParameterResolver
161+
.findChain(processingEnv.getTypeUtils(), processingEnv.getElementUtils(),
162+
(DeclaredType) controllerClassSymbol.asType());
151163
final var customResourceClass = getCustomResourceClass(chain);
152164
return customResourceClass;
153165
} catch (Exception e) {
@@ -163,81 +175,6 @@ private String makeQualifiedClassName(String packageName, String className) {
163175
return packageName + "." + className;
164176
}
165177

166-
private List<DeclaredType> findChain(DeclaredType declaredType) {
167-
final var resourceControllerType =
168-
processingEnv
169-
.getTypeUtils()
170-
.getDeclaredType(
171-
processingEnv
172-
.getElementUtils()
173-
.getTypeElement(ResourceController.class.getCanonicalName()),
174-
processingEnv.getTypeUtils().getWildcardType(null, null));
175-
final var result = new ArrayList<DeclaredType>();
176-
result.add(declaredType);
177-
var superElement = ((TypeElement) ((DeclaredType) declaredType).asElement());
178-
var superclass = (DeclaredType) superElement.getSuperclass();
179-
boolean interfaceFound = false;
180-
final var matchingInterfaces =
181-
superElement.getInterfaces().stream()
182-
.filter(
183-
intface ->
184-
processingEnv.getTypeUtils().isAssignable(intface, resourceControllerType))
185-
.map(i -> (DeclaredType) i)
186-
.collect(Collectors.toList());
187-
if (!matchingInterfaces.isEmpty()) {
188-
result.addAll(matchingInterfaces);
189-
interfaceFound = true;
190-
}
191-
192-
while (superclass.getKind() != TypeKind.NONE) {
193-
if (interfaceFound) {
194-
final var lastFoundInterface = result.get(result.size() - 1);
195-
final var marchingInterfaces =
196-
((TypeElement) lastFoundInterface.asElement())
197-
.getInterfaces().stream()
198-
.filter(
199-
intface ->
200-
processingEnv
201-
.getTypeUtils()
202-
.isAssignable(intface, resourceControllerType))
203-
.map(i -> (DeclaredType) i)
204-
.collect(Collectors.toList());
205-
206-
if (marchingInterfaces.size() > 0) {
207-
result.addAll(marchingInterfaces);
208-
continue;
209-
} else {
210-
break;
211-
}
212-
}
213-
214-
if (processingEnv.getTypeUtils().isAssignable(superclass, resourceControllerType)) {
215-
result.add(superclass);
216-
}
217-
218-
superElement = (TypeElement) superclass.asElement();
219-
final var matchedInterfaces =
220-
superElement.getInterfaces().stream()
221-
.filter(
222-
intface ->
223-
processingEnv.getTypeUtils().isAssignable(intface, resourceControllerType))
224-
.map(i -> (DeclaredType) i)
225-
.collect(Collectors.toList());
226-
if (matchedInterfaces.size() > 0) {
227-
result.addAll(matchedInterfaces);
228-
interfaceFound = true;
229-
continue;
230-
}
231-
232-
if (superElement.getSuperclass().getKind() == TypeKind.NONE) {
233-
break;
234-
}
235-
superclass = (DeclaredType) superElement.getSuperclass();
236-
}
237-
238-
return result;
239-
}
240-
241178
private TypeMirror getCustomResourceClass(List<DeclaredType> chain) {
242179
var lastIndex = chain.size() - 1;
243180
String typeName;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package io.javaoperatorsdk.operator.processing.annotation;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.stream.Collectors;
6+
import javax.lang.model.element.TypeElement;
7+
import javax.lang.model.type.DeclaredType;
8+
import javax.lang.model.type.TypeKind;
9+
import javax.lang.model.util.Elements;
10+
import javax.lang.model.util.Types;
11+
12+
class TypeParameterResolver {
13+
14+
private final DeclaredType interestedClass;
15+
private final int interestedTypeArgumentIndex;
16+
17+
public TypeParameterResolver(DeclaredType interestedClass, int interestedTypeArgumentIndex) {
18+
19+
this.interestedClass = interestedClass;
20+
this.interestedTypeArgumentIndex = interestedTypeArgumentIndex;
21+
}
22+
23+
24+
public List<DeclaredType> findChain(Types typeUtils, Elements elementUtils,
25+
DeclaredType declaredType) {
26+
27+
final var result = new ArrayList<DeclaredType>();
28+
result.add(declaredType);
29+
var superElement = ((TypeElement) ((DeclaredType) declaredType).asElement());
30+
var superclass = (DeclaredType) superElement.getSuperclass();
31+
boolean interfaceFound = false;
32+
final var matchingInterfaces =
33+
superElement.getInterfaces().stream()
34+
.filter(
35+
intface ->
36+
typeUtils.isAssignable(intface, interestedClass))
37+
.map(i -> (DeclaredType) i)
38+
.collect(Collectors.toList());
39+
if (!matchingInterfaces.isEmpty()) {
40+
result.addAll(matchingInterfaces);
41+
interfaceFound = true;
42+
}
43+
44+
while (superclass.getKind() != TypeKind.NONE) {
45+
if (interfaceFound) {
46+
final var lastFoundInterface = result.get(result.size() - 1);
47+
final var marchingInterfaces =
48+
((TypeElement) lastFoundInterface.asElement())
49+
.getInterfaces().stream()
50+
.filter(
51+
intface ->
52+
typeUtils
53+
.isAssignable(intface, interestedClass))
54+
.map(i -> (DeclaredType) i)
55+
.collect(Collectors.toList());
56+
57+
if (marchingInterfaces.size() > 0) {
58+
result.addAll(marchingInterfaces);
59+
continue;
60+
} else {
61+
break;
62+
}
63+
}
64+
65+
if (typeUtils.isAssignable(superclass, interestedClass)) {
66+
result.add(superclass);
67+
}
68+
69+
superElement = (TypeElement) superclass.asElement();
70+
final var matchedInterfaces =
71+
superElement.getInterfaces().stream()
72+
.filter(
73+
intface ->
74+
typeUtils.isAssignable(intface, interestedClass))
75+
.map(i -> (DeclaredType) i)
76+
.collect(Collectors.toList());
77+
if (matchedInterfaces.size() > 0) {
78+
result.addAll(matchedInterfaces);
79+
interfaceFound = true;
80+
continue;
81+
}
82+
83+
if (superElement.getSuperclass().getKind() == TypeKind.NONE) {
84+
break;
85+
}
86+
superclass = (DeclaredType) superElement.getSuperclass();
87+
}
88+
89+
return result;
90+
}
91+
92+
}

0 commit comments

Comments
 (0)