Skip to content

Commit 485d167

Browse files
author
Soroosh Sarabadani
committed
Merge remote-tracking branch 'origin/master' into setup-code-formatter
# Conflicts: # operator-framework/src/main/java/io/javaoperatorsdk/operator/ClassMappingProvider.java # operator-framework/src/main/java/io/javaoperatorsdk/operator/ControllerUtils.java # operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/annotation/AccumulativeMappingWriter.java # operator-framework/src/main/java/io/javaoperatorsdk/operator/processing/annotation/ControllerAnnotationProcessor.java # operator-framework/src/test/java/io/javaoperatorsdk/operator/ControllerUtilsTest.java
2 parents 5a0a100 + b2971d6 commit 485d167

File tree

18 files changed

+368
-374
lines changed

18 files changed

+368
-374
lines changed

operator-framework/pom.xml

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<parent>
77
<groupId>io.javaoperatorsdk</groupId>
88
<artifactId>java-operator-sdk</artifactId>
9-
<version>1.3.1-SNAPSHOT</version>
9+
<version>1.4.1-SNAPSHOT</version>
1010
<relativePath>../pom.xml</relativePath>
1111
</parent>
1212

@@ -45,6 +45,17 @@
4545
<groupId>org.slf4j</groupId>
4646
<artifactId>slf4j-api</artifactId>
4747
</dependency>
48+
<dependency>
49+
<groupId>com.google.auto.service</groupId>
50+
<artifactId>auto-service</artifactId>
51+
<version>1.0-rc7</version>
52+
</dependency>
53+
54+
<dependency>
55+
<groupId>com.squareup</groupId>
56+
<artifactId>javapoet</artifactId>
57+
<version>1.13.0</version>
58+
</dependency>
4859
<dependency>
4960
<groupId>org.junit.jupiter</groupId>
5061
<artifactId>junit-jupiter-api</artifactId>
@@ -85,19 +96,5 @@
8596
<version>0.19</version>
8697
<scope>test</scope>
8798
</dependency>
88-
89-
<dependency>
90-
<groupId>com.google.auto.service</groupId>
91-
<artifactId>auto-service</artifactId>
92-
<version>1.0-rc2</version>
93-
<scope>compile</scope>
94-
</dependency>
95-
96-
<dependency>
97-
<groupId>com.squareup</groupId>
98-
<artifactId>javapoet</artifactId>
99-
<version>1.13.0</version>
100-
<scope>compile</scope>
101-
</dependency>
10299
</dependencies>
103100
</project>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package io.javaoperatorsdk.operator;
2+
3+
import org.apache.commons.lang3.ClassUtils;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
7+
import java.io.BufferedReader;
8+
import java.io.IOException;
9+
import java.io.InputStreamReader;
10+
import java.net.URL;
11+
import java.util.*;
12+
import java.util.stream.Collectors;
13+
14+
15+
class ClassMappingProvider {
16+
private static final Logger log = LoggerFactory.getLogger(ClassMappingProvider.class);
17+
18+
static <T, V> Map<T, V> provide(final String resourcePath, T key, V value) {
19+
Map<T, V> result = new HashMap();
20+
try {
21+
final var classLoader = Thread.currentThread().getContextClassLoader();
22+
final Enumeration<URL> customResourcesMetadataList = classLoader.getResources(resourcePath);
23+
for (Iterator<URL> it = customResourcesMetadataList.asIterator(); it.hasNext(); ) {
24+
URL url = it.next();
25+
26+
List<String> classNamePairs = retrieveClassNamePairs(url);
27+
classNamePairs.forEach(clazzPair -> {
28+
try {
29+
final String[] classNames = clazzPair.split(",");
30+
if (classNames.length != 2) {
31+
throw new IllegalStateException(String.format("%s is not valid Mapping metadata, defined in %s", clazzPair, url.toString()));
32+
}
33+
34+
result.put(
35+
(T) ClassUtils.getClass(classNames[0]),
36+
(V) ClassUtils.getClass(classNames[1])
37+
);
38+
} catch (ClassNotFoundException e) {
39+
throw new RuntimeException(e);
40+
}
41+
});
42+
}
43+
log.debug("Loaded Controller to CustomResource mappings {}", result);
44+
return result;
45+
} catch (IOException e) {
46+
throw new RuntimeException(e);
47+
}
48+
}
49+
50+
private static List<String> retrieveClassNamePairs(URL url) throws IOException {
51+
return new BufferedReader(
52+
new InputStreamReader(url.openStream())
53+
).lines().collect(Collectors.toList());
54+
}
55+
}

operator-framework/src/main/java/io/javaoperatorsdk/operator/ControllerToCustomResourceMappingsProvider.java

Lines changed: 0 additions & 62 deletions
This file was deleted.

operator-framework/src/main/java/io/javaoperatorsdk/operator/ControllerUtils.java

Lines changed: 57 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,69 +4,76 @@
44
import io.fabric8.kubernetes.client.CustomResourceDoneable;
55
import io.javaoperatorsdk.operator.api.Controller;
66
import io.javaoperatorsdk.operator.api.ResourceController;
7+
78
import java.util.Map;
8-
import org.apache.commons.lang3.ClassUtils;
9+
910

1011
public class ControllerUtils {
1112

12-
private static final String FINALIZER_NAME_SUFFIX = "/finalizer";
13-
public static final String CONTROLLERS_RESOURCE_PATH = "javaoperatorsdk/controllers";
14-
private static Map<Class<? extends ResourceController>, Class<? extends CustomResource>>
15-
controllerToCustomResourceMappings;
13+
private static final String FINALIZER_NAME_SUFFIX = "/finalizer";
14+
public static final String CONTROLLERS_RESOURCE_PATH = "javaoperatorsdk/controllers";
15+
public static final String DONEABLES_RESOURCE_PATH = "javaoperatorsdk/doneables";
16+
private static Map<Class<? extends ResourceController>, Class<? extends CustomResource>> controllerToCustomResourceMappings;
17+
private static Map<Class<? extends CustomResource>, Class<? extends CustomResourceDoneable>> resourceToDoneableMappings;
1618

17-
static {
18-
controllerToCustomResourceMappings =
19-
ControllerToCustomResourceMappingsProvider.provide(CONTROLLERS_RESOURCE_PATH);
20-
}
2119

22-
static String getFinalizer(ResourceController controller) {
23-
final String annotationFinalizerName = getAnnotation(controller).finalizerName();
24-
if (!Controller.NULL.equals(annotationFinalizerName)) {
25-
return annotationFinalizerName;
20+
static {
21+
controllerToCustomResourceMappings = ClassMappingProvider
22+
.provide(CONTROLLERS_RESOURCE_PATH,
23+
ResourceController.class,
24+
CustomResource.class);
25+
resourceToDoneableMappings = ClassMappingProvider
26+
.provide(DONEABLES_RESOURCE_PATH,
27+
CustomResource.class,
28+
CustomResourceDoneable.class
29+
);
30+
}
31+
32+
static String getFinalizer(ResourceController controller) {
33+
final String annotationFinalizerName = getAnnotation(controller).finalizerName();
34+
if (!Controller.NULL.equals(annotationFinalizerName)) {
35+
return annotationFinalizerName;
36+
}
37+
return getAnnotation(controller).crdName() + FINALIZER_NAME_SUFFIX;
2638
}
27-
return getAnnotation(controller).crdName() + FINALIZER_NAME_SUFFIX;
28-
}
2939

30-
static boolean getGenerationEventProcessing(ResourceController<?> controller) {
31-
return getAnnotation(controller).generationAwareEventProcessing();
32-
}
40+
static boolean getGenerationEventProcessing(ResourceController<?> controller) {
41+
return getAnnotation(controller).generationAwareEventProcessing();
42+
}
3343

34-
static <R extends CustomResource> Class<R> getCustomResourceClass(
35-
ResourceController<R> controller) {
36-
final Class<? extends CustomResource> customResourceClass =
37-
controllerToCustomResourceMappings.get(controller.getClass());
38-
if (customResourceClass == null) {
39-
throw new IllegalArgumentException(
40-
String.format(
41-
"No custom resource has been found for controller %s",
42-
controller.getClass().getCanonicalName()));
44+
static <R extends CustomResource> Class<R> getCustomResourceClass(ResourceController<R> controller) {
45+
final Class<? extends CustomResource> customResourceClass = controllerToCustomResourceMappings
46+
.get(controller.getClass());
47+
if (customResourceClass == null) {
48+
throw new IllegalArgumentException(
49+
String.format(
50+
"No custom resource has been found for controller %s",
51+
controller.getClass().getCanonicalName()
52+
)
53+
);
54+
}
55+
return (Class<R>) customResourceClass;
4356
}
44-
return (Class<R>) customResourceClass;
45-
}
4657

47-
static String getCrdName(ResourceController controller) {
48-
return getAnnotation(controller).crdName();
49-
}
58+
static String getCrdName(ResourceController controller) {
59+
return getAnnotation(controller).crdName();
60+
}
5061

51-
public static <T extends CustomResource>
52-
Class<? extends CustomResourceDoneable<T>> getCustomResourceDoneableClass(
53-
ResourceController<T> controller) {
54-
try {
55-
final Class<T> customResourceClass = getCustomResourceClass(controller);
56-
return (Class<? extends CustomResourceDoneable<T>>)
57-
ClassUtils.getClass(customResourceClass.getCanonicalName() + "Doneable");
58-
} catch (ClassNotFoundException e) {
59-
e.printStackTrace();
60-
return null;
62+
public static <T extends CustomResource> Class<? extends CustomResourceDoneable<T>>
63+
getCustomResourceDoneableClass(ResourceController<T> controller) {
64+
final Class<T> customResourceClass = getCustomResourceClass(controller);
65+
final Class<? extends CustomResourceDoneable<T>> doneableClass = (Class<? extends CustomResourceDoneable<T>>) resourceToDoneableMappings.get(customResourceClass);
66+
if (doneableClass == null) {
67+
throw new RuntimeException(String.format("No matching Doneable class found for %s", customResourceClass));
68+
}
69+
return doneableClass;
6170
}
62-
}
6371

64-
private static Controller getAnnotation(ResourceController<?> controller) {
65-
return controller.getClass().getAnnotation(Controller.class);
66-
}
72+
private static Controller getAnnotation(ResourceController<?> controller) {
73+
return controller.getClass().getAnnotation(Controller.class);
74+
}
6775

68-
public static boolean hasGivenFinalizer(CustomResource resource, String finalizer) {
69-
return resource.getMetadata().getFinalizers() != null
70-
&& resource.getMetadata().getFinalizers().contains(finalizer);
71-
}
76+
public static boolean hasGivenFinalizer(CustomResource resource, String finalizer) {
77+
return resource.getMetadata().getFinalizers() != null && resource.getMetadata().getFinalizers().contains(finalizer);
78+
}
7279
}
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+
class AccumulativeMappingWriter {
14+
private Map<String, String> mappings = new ConcurrentHashMap<>();
15+
private final String resourcePath;
16+
private final ProcessingEnvironment processingEnvironment;
17+
18+
public AccumulativeMappingWriter(String resourcePath, ProcessingEnvironment processingEnvironment) {
19+
this.resourcePath = resourcePath;
20+
this.processingEnvironment = processingEnvironment;
21+
}
22+
23+
public AccumulativeMappingWriter loadExistingMappings() {
24+
try {
25+
final var readonlyResource = processingEnvironment
26+
.getFiler()
27+
.getResource(StandardLocation.CLASS_OUTPUT, "", resourcePath);
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 AccumulativeMappingWriter add(String key, String value) {
41+
this.mappings.put(key, value);
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, "", resourcePath);
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+
}

0 commit comments

Comments
 (0)