Skip to content

Commit f28a8cd

Browse files
authored
Merge pull request operator-framework#245 from psycho-ir/fix-incremental-compilation-issue
Fix incremental compilation issue
2 parents 618c9e3 + 56ae0c4 commit f28a8cd

File tree

3 files changed

+79
-23
lines changed

3 files changed

+79
-23
lines changed

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

+12-22
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
1-
package io.javaoperatorsdk.operator.processing;
1+
package io.javaoperatorsdk.operator.processing.annotation;
22

33
import com.google.auto.service.AutoService;
44
import com.squareup.javapoet.*;
55
import io.fabric8.kubernetes.api.builder.Function;
66
import io.fabric8.kubernetes.client.CustomResourceDoneable;
77
import io.javaoperatorsdk.operator.api.ResourceController;
8+
89
import javax.annotation.processing.*;
910
import javax.lang.model.SourceVersion;
1011
import javax.lang.model.element.*;
1112
import javax.lang.model.type.DeclaredType;
1213
import javax.lang.model.type.TypeKind;
1314
import javax.lang.model.type.TypeMirror;
1415
import javax.tools.Diagnostic;
15-
import javax.tools.FileObject;
1616
import javax.tools.JavaFileObject;
17-
import javax.tools.StandardLocation;
18-
import java.io.IOException;
1917
import java.io.PrintWriter;
2018
import java.util.ArrayList;
2119
import java.util.HashSet;
@@ -30,23 +28,14 @@
3028
@SupportedSourceVersion(SourceVersion.RELEASE_8)
3129
@AutoService(Processor.class)
3230
public class ControllerAnnotationProcessor extends AbstractProcessor {
33-
private FileObject resource;
34-
PrintWriter printWriter = null;
31+
private ControllersResourceWriter controllersResourceWriter;
3532
private Set<String> generatedDoneableClassFiles = new HashSet<>();
3633

3734
@Override
3835
public synchronized void init(ProcessingEnvironment processingEnv) {
3936
super.init(processingEnv);
40-
try {
41-
resource = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", CONTROLLERS_RESOURCE_PATH);
42-
} catch (IOException e) {
43-
throw new RuntimeException(e);
44-
}
45-
try {
46-
printWriter = new PrintWriter(resource.openOutputStream());
47-
} catch (IOException e) {
48-
throw new RuntimeException(e);
49-
}
37+
controllersResourceWriter = new ControllersResourceWriter(processingEnv);
38+
controllersResourceWriter.loadExistingMappings();
5039
}
5140

5241
@Override
@@ -57,15 +46,17 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
5746
= roundEnv.getElementsAnnotatedWith(annotation);
5847
annotatedElements.stream().filter(element -> element.getKind().equals(ElementKind.CLASS))
5948
.map(e -> (TypeElement) e)
60-
.forEach(e -> this.generateDoneableClass(e, printWriter));
49+
.forEach(e -> this.generateDoneableClass(e));
6150
}
6251
} finally {
63-
printWriter.close();
52+
if (roundEnv.processingOver()) {
53+
controllersResourceWriter.flush();
54+
}
6455
}
6556
return true;
6657
}
6758

68-
private void generateDoneableClass(TypeElement controllerClassSymbol, PrintWriter printWriter) {
59+
private void generateDoneableClass(TypeElement controllerClassSymbol) {
6960
try {
7061
final TypeMirror resourceType = findResourceType(controllerClassSymbol);
7162

@@ -84,14 +75,14 @@ private void generateDoneableClass(TypeElement controllerClassSymbol, PrintWrite
8475
destinationClassFileName,
8576
CONTROLLERS_RESOURCE_PATH)
8677
);
87-
printWriter.println(controllerClassSymbol.getQualifiedName() + "," + customResourceType.toString());
78+
controllersResourceWriter.add(controllerClassSymbol.getQualifiedName().toString(), customResourceType.toString());
8879
return;
8980
}
9081
JavaFileObject builderFile = processingEnv.getFiler()
9182
.createSourceFile(destinationClassFileName);
9283

9384
try (PrintWriter out = new PrintWriter(builderFile.openWriter())) {
94-
printWriter.println(controllerClassSymbol.getQualifiedName() + "," + customResourceType.toString());
85+
controllersResourceWriter.add(controllerClassSymbol.getQualifiedName().toString(), customResourceType.toString());
9586
final MethodSpec constructor = MethodSpec.constructorBuilder()
9687
.addModifiers(Modifier.PUBLIC)
9788
.addParameter(customResourceType, "resource")
@@ -125,7 +116,6 @@ private TypeMirror findResourceType(TypeElement controllerClassSymbol) throws Ex
125116
)
126117
.findFirst()
127118
.orElseThrow(() -> new Exception("ResourceController is not implemented by " + controllerClassSymbol.toString()));
128-
129119
return controllerType.getTypeArguments().get(0);
130120
} catch (Exception e) {
131121
e.printStackTrace();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package io.javaoperatorsdk.operator.processing.annotation;
2+
3+
import javax.annotation.processing.ProcessingEnvironment;
4+
import javax.tools.StandardLocation;
5+
import java.io.BufferedReader;
6+
import java.io.IOException;
7+
import java.io.InputStreamReader;
8+
import java.io.PrintWriter;
9+
import java.util.Map;
10+
import java.util.concurrent.ConcurrentHashMap;
11+
import java.util.stream.Collectors;
12+
13+
import static io.javaoperatorsdk.operator.ControllerUtils.CONTROLLERS_RESOURCE_PATH;
14+
15+
class ControllersResourceWriter {
16+
private Map<String, String> mappings = new ConcurrentHashMap<>();
17+
private final ProcessingEnvironment processingEnvironment;
18+
19+
public ControllersResourceWriter(ProcessingEnvironment processingEnvironment) {
20+
this.processingEnvironment = processingEnvironment;
21+
}
22+
23+
public ControllersResourceWriter loadExistingMappings() {
24+
try {
25+
final var readonlyResource = processingEnvironment
26+
.getFiler()
27+
.getResource(StandardLocation.CLASS_OUTPUT, "", CONTROLLERS_RESOURCE_PATH);
28+
29+
final var bufferedReader = new BufferedReader(new InputStreamReader(readonlyResource.openInputStream()));
30+
final var existingLines = bufferedReader
31+
.lines()
32+
.map(l -> l.split(","))
33+
.collect(Collectors.toMap(parts -> parts[0], parts -> parts[1]));
34+
mappings.putAll(existingLines);
35+
} catch (IOException e) {
36+
}
37+
return this;
38+
}
39+
40+
public ControllersResourceWriter add(String controllerClassName, String customResourceTypeName) {
41+
this.mappings.put(controllerClassName, customResourceTypeName);
42+
return this;
43+
}
44+
45+
public void flush() {
46+
PrintWriter printWriter = null;
47+
try {
48+
final var resource = processingEnvironment
49+
.getFiler()
50+
.createResource(StandardLocation.CLASS_OUTPUT, "", CONTROLLERS_RESOURCE_PATH);
51+
printWriter = new PrintWriter(resource.openOutputStream());
52+
53+
54+
for (Map.Entry<String, String> entry : mappings.entrySet()) {
55+
printWriter.println(entry.getKey() + "," + entry.getValue());
56+
}
57+
} catch (IOException e) {
58+
e.printStackTrace();
59+
throw new RuntimeException(e);
60+
} finally {
61+
if (printWriter != null) {
62+
printWriter.close();
63+
}
64+
}
65+
}
66+
}

operator-framework/src/test/java/io/javaoperatorsdk/operator/processing/ControllerAnnotationProcessorTest.java renamed to operator-framework/src/test/java/io/javaoperatorsdk/operator/processing/annotation/ControllerAnnotationProcessorTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.javaoperatorsdk.operator.processing;
1+
package io.javaoperatorsdk.operator.processing.annotation;
22

33
import com.google.testing.compile.*;
44
import com.google.testing.compile.Compiler;

0 commit comments

Comments
 (0)