Skip to content

Commit d969187

Browse files
author
Soroosh Sarabadani
committed
Test annotation processor works correctly with more one interface
1 parent ef3dd1a commit d969187

File tree

5 files changed

+89
-9
lines changed

5 files changed

+89
-9
lines changed

operator-framework/pom.xml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,13 @@
120120
<version>3.27.0-GA</version>
121121
</dependency>
122122

123+
<dependency>
124+
<groupId>com.google.testing.compile</groupId>
125+
<artifactId>compile-testing</artifactId>
126+
<version>0.19</version>
127+
<scope>test</scope>
128+
</dependency>
129+
123130
<dependency>
124131
<groupId>com.google.auto.service</groupId>
125132
<artifactId>auto-service</artifactId>
@@ -140,12 +147,6 @@
140147
<scope>compile</scope>
141148
</dependency>
142149

143-
<dependency>
144-
<groupId>com.google.testing.compile</groupId>
145-
<artifactId>compile-testing</artifactId>
146-
<version>0.19</version>
147-
<scope>test</scope>
148-
</dependency>
149150

150151
</dependencies>
151152
</project>

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@
33
import com.google.auto.service.AutoService;
44
import com.squareup.javapoet.*;
55
import com.sun.tools.javac.code.Symbol;
6+
import com.sun.tools.javac.code.Type;
67
import io.fabric8.kubernetes.api.builder.Function;
78
import io.fabric8.kubernetes.client.CustomResourceDoneable;
9+
import io.javaoperatorsdk.operator.api.ResourceController;
810
import io.quarkus.runtime.annotations.RegisterForReflection;
911

1012
import javax.annotation.processing.*;
1113
import javax.lang.model.SourceVersion;
1214
import javax.lang.model.element.Element;
1315
import javax.lang.model.element.Modifier;
1416
import javax.lang.model.element.TypeElement;
15-
import javax.lang.model.type.DeclaredType;
1617
import javax.lang.model.type.TypeMirror;
1718
import javax.tools.JavaFileObject;
1819
import java.io.IOException;
@@ -39,7 +40,16 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
3940
private void generateDoneableClass(Symbol.ClassSymbol controllerClassSymbol) {
4041
try {
4142
// TODO: the resourceType retrieval logic is currently very fragile, done for testing purposes and need to be improved to cover all possible conditions
42-
final TypeMirror resourceType = ((DeclaredType) controllerClassSymbol.getInterfaces().head).getTypeArguments().get(0);
43+
final Type controllerType = controllerClassSymbol
44+
.getInterfaces()
45+
.stream()
46+
.filter(i -> i.toString()
47+
.startsWith(ResourceController.class.getCanonicalName())
48+
)
49+
.findFirst()
50+
.orElseThrow(() -> new Exception("ResourceController is not implemented by " + controllerClassSymbol.toString()));
51+
52+
final TypeMirror resourceType = controllerType.getTypeArguments().get(0);
4353
Symbol.ClassSymbol customerResourceSymbol = (Symbol.ClassSymbol) processingEnv.getElementUtils().getTypeElement(resourceType.toString());
4454
JavaFileObject builderFile = processingEnv.getFiler()
4555
.createSourceFile(customerResourceSymbol.className() + "Doneable");
@@ -48,7 +58,7 @@ private void generateDoneableClass(Symbol.ClassSymbol controllerClassSymbol) {
4858
.addModifiers(Modifier.PUBLIC)
4959
.addParameter(TypeName.get(resourceType), "resource")
5060
.addParameter(Function.class, "function")
51-
.addStatement("super(resource,function);")
61+
.addStatement("super(resource,function)")
5262
.build();
5363
final TypeSpec typeSpec = TypeSpec.classBuilder(customerResourceSymbol.name + "Doneable")
5464
.addAnnotation(RegisterForReflection.class)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.javaoperatorsdk.operator.processing;
2+
3+
import com.google.testing.compile.*;
4+
import com.google.testing.compile.Compiler;
5+
import org.junit.jupiter.api.Test;
6+
7+
import javax.tools.JavaFileObject;
8+
9+
class ControllerAnnotationProcessorTest {
10+
@Test
11+
public void generateCorrectDoneableClassIfInterfaceIsSecond() {
12+
Compilation compilation = Compiler.javac()
13+
.withProcessors(new ControllerAnnotationProcessor())
14+
.compile(JavaFileObjects.forResource("ControllerImplemented2Interfaces.java"));
15+
CompilationSubject.assertThat(compilation).succeeded();
16+
17+
final JavaFileObject expectedResource = JavaFileObjects.forResource("ControllerImplemented2InterfacesExpected.java");
18+
JavaFileObjectSubject.assertThat(compilation.generatedSourceFiles().get(0)).hasSourceEquivalentTo(expectedResource);
19+
}
20+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io;
2+
3+
import io.fabric8.kubernetes.client.CustomResource;
4+
import io.fabric8.kubernetes.client.CustomResourceDoneable;
5+
import io.javaoperatorsdk.operator.api.Context;
6+
import io.javaoperatorsdk.operator.api.Controller;
7+
import io.javaoperatorsdk.operator.api.ResourceController;
8+
import io.javaoperatorsdk.operator.api.UpdateControl;
9+
import io.fabric8.kubernetes.api.model.Secret;
10+
import io.fabric8.kubernetes.api.model.SecretBuilder;
11+
import io.fabric8.kubernetes.client.KubernetesClient;
12+
import org.apache.commons.lang3.RandomStringUtils;
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
15+
16+
17+
import java.io.Serializable;
18+
19+
import static java.lang.String.format;
20+
21+
@Controller(crdName = "schemas.mysql.sample.javaoperatorsdk")
22+
public class ControllerImplemented2Interfaces implements Serializable, ResourceController<ControllerImplemented2Interfaces.MyCustomResource> {
23+
24+
public static class MyCustomResource extends CustomResource {
25+
26+
}
27+
28+
@Override
29+
public UpdateControl<MyCustomResource> createOrUpdateResource(MyCustomResource customResource, Context<MyCustomResource> context) {
30+
return UpdateControl.updateCustomResource(null);
31+
}
32+
33+
@Override
34+
public boolean deleteResource(MyCustomResource customResource, Context<MyCustomResource> context) {
35+
return false;
36+
}
37+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io;
2+
3+
import io.fabric8.kubernetes.api.builder.Function;
4+
import io.fabric8.kubernetes.client.CustomResourceDoneable;
5+
import io.quarkus.runtime.annotations.RegisterForReflection;
6+
7+
@RegisterForReflection
8+
public class MyCustomResourceDoneable extends CustomResourceDoneable<ControllerImplemented2Interfaces.MyCustomResource> {
9+
public MyCustomResourceDoneable(ControllerImplemented2Interfaces.MyCustomResource resource, Function function) {
10+
super(resource, function);
11+
}
12+
}

0 commit comments

Comments
 (0)