Skip to content

Commit 0f110e1

Browse files
author
Soroosh Sarabadani
committed
generate javaoperatorsdk-custom-resources file
1 parent 3121fce commit 0f110e1

File tree

1 file changed

+47
-10
lines changed

1 file changed

+47
-10
lines changed

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

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,13 @@
1313
import javax.lang.model.type.DeclaredType;
1414
import javax.lang.model.type.TypeKind;
1515
import javax.lang.model.type.TypeMirror;
16+
import javax.tools.FileObject;
1617
import javax.tools.JavaFileObject;
18+
import javax.tools.StandardLocation;
19+
import java.io.IOException;
1720
import java.io.PrintWriter;
1821
import java.util.ArrayList;
22+
import java.util.HashSet;
1923
import java.util.List;
2024
import java.util.Set;
2125
import java.util.stream.Collectors;
@@ -25,40 +29,73 @@
2529
@SupportedSourceVersion(SourceVersion.RELEASE_8)
2630
@AutoService(Processor.class)
2731
public class ControllerAnnotationProcessor extends AbstractProcessor {
32+
private FileObject resource;
33+
PrintWriter printWriter = null;
34+
private Set<String> generatedDoneableClassFiles = new HashSet<>();
35+
36+
@Override
37+
public synchronized void init(ProcessingEnvironment processingEnv) {
38+
super.init(processingEnv);
39+
try {
40+
resource = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", "javaoperatorsdk-custom-resources");
41+
} catch (IOException e) {
42+
throw new RuntimeException(e);
43+
}
44+
try {
45+
printWriter = new PrintWriter(resource.openOutputStream());
46+
} catch (IOException e) {
47+
throw new RuntimeException(e);
48+
}
49+
}
50+
2851
@Override
2952
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
30-
for (TypeElement annotation : annotations) {
31-
Set<? extends Element> annotatedElements
32-
= roundEnv.getElementsAnnotatedWith(annotation);
33-
annotatedElements.stream().filter(element -> element.getKind().equals(ElementKind.CLASS))
34-
.map(e -> (TypeElement) e)
35-
.forEach(this::generateDoneableClass);
53+
54+
try {
55+
for (TypeElement annotation : annotations) {
56+
Set<? extends Element> annotatedElements
57+
= roundEnv.getElementsAnnotatedWith(annotation);
58+
annotatedElements.stream().filter(element -> element.getKind().equals(ElementKind.CLASS))
59+
.map(e -> (TypeElement) e)
60+
.forEach(e -> this.generateDoneableClass(e, printWriter));
61+
}
62+
} finally {
63+
printWriter.close();
3664
}
3765
return true;
3866
}
3967

40-
private void generateDoneableClass(TypeElement controllerClassSymbol) {
68+
private void generateDoneableClass(TypeElement controllerClassSymbol, PrintWriter printWriter) {
4169
try {
4270
final TypeMirror resourceType = findResourceType(controllerClassSymbol);
71+
4372
TypeElement customerResourceTypeElement = processingEnv
4473
.getElementUtils()
4574
.getTypeElement(resourceType.toString());
4675

76+
final String doneableClassName = customerResourceTypeElement.getSimpleName() + "Doneable";
4777
final String destinationClassFileName = customerResourceTypeElement.getQualifiedName() + "Doneable";
78+
final TypeName customResourceType = TypeName.get(resourceType);
79+
if (!generatedDoneableClassFiles.add(destinationClassFileName)) {
80+
printWriter.println(controllerClassSymbol.getQualifiedName() + "," + customResourceType.toString());
81+
return;
82+
}
4883
JavaFileObject builderFile = processingEnv.getFiler()
4984
.createSourceFile(destinationClassFileName);
5085

5186
try (PrintWriter out = new PrintWriter(builderFile.openWriter())) {
87+
printWriter.println(controllerClassSymbol.getQualifiedName() + "," + customResourceType.toString());
5288
final MethodSpec constructor = MethodSpec.constructorBuilder()
5389
.addModifiers(Modifier.PUBLIC)
54-
.addParameter(TypeName.get(resourceType), "resource")
90+
.addParameter(customResourceType, "resource")
5591
.addParameter(Function.class, "function")
5692
.addStatement("super(resource,function)")
5793
.build();
5894

59-
final TypeSpec typeSpec = TypeSpec.classBuilder(customerResourceTypeElement.getSimpleName() + "Doneable")
95+
96+
final TypeSpec typeSpec = TypeSpec.classBuilder(doneableClassName)
6097
.addAnnotation(RegisterForReflection.class)
61-
.superclass(ParameterizedTypeName.get(ClassName.get(CustomResourceDoneable.class), TypeName.get(resourceType)))
98+
.superclass(ParameterizedTypeName.get(ClassName.get(CustomResourceDoneable.class), customResourceType))
6299
.addModifiers(Modifier.PUBLIC)
63100
.addMethod(constructor)
64101
.build();

0 commit comments

Comments
 (0)