3
3
import com .fasterxml .jackson .core .JsonProcessingException ;
4
4
import com .fasterxml .jackson .databind .ObjectMapper ;
5
5
import io .fabric8 .kubernetes .client .CustomResource ;
6
- import java .util .Map ;
6
+ import org .slf4j .Logger ;
7
+ import org .slf4j .LoggerFactory ;
8
+
7
9
import java .util .Optional ;
8
10
import java .util .concurrent .ConcurrentHashMap ;
9
- import java .util .concurrent .locks .Lock ;
10
- import java .util .concurrent .locks .ReentrantLock ;
11
+ import java .util .concurrent .ConcurrentMap ;
11
12
import java .util .function .Predicate ;
12
- import org .slf4j .Logger ;
13
- import org .slf4j .LoggerFactory ;
14
13
14
+ @ SuppressWarnings ("rawtypes" )
15
15
public class CustomResourceCache {
16
16
17
17
private static final Logger log = LoggerFactory .getLogger (CustomResourceCache .class );
18
18
19
19
private final ObjectMapper objectMapper ;
20
- private final Map <String , CustomResource > resources = new ConcurrentHashMap <>();
21
- private final Lock lock = new ReentrantLock ();
20
+ private final ConcurrentMap <String , CustomResource > resources = new ConcurrentHashMap <>();
22
21
23
22
public CustomResourceCache (ObjectMapper objectMapper ) {
24
23
this .objectMapper = objectMapper ;
25
24
}
26
25
27
26
public void cacheResource (CustomResource resource ) {
28
- try {
29
- lock .lock ();
30
- resources .put (KubernetesResourceUtils .getUID (resource ), resource );
31
- } finally {
32
- lock .unlock ();
33
- }
27
+ resources .put (KubernetesResourceUtils .getUID (resource ), resource );
34
28
}
35
29
36
30
public void cacheResource (CustomResource resource , Predicate <CustomResource > predicate ) {
37
- try {
38
- lock .lock ();
39
- if (predicate .test (resources .get (KubernetesResourceUtils .getUID (resource )))) {
40
- log .trace ("Update cache after condition is true: {}" , resource );
41
- resources .put (resource .getMetadata ().getUid (), resource );
31
+ resources .compute (KubernetesResourceUtils .getUID (resource ), (id , prev ) -> {
32
+ if (predicate .test (prev )) {
33
+ log .trace ("Attempting to update cache after condition is true: {}" , resource );
34
+ return resource ;
42
35
}
43
- } finally {
44
- lock .unlock ();
45
- }
36
+ return prev ;
37
+ });
46
38
}
47
39
48
40
/**
@@ -53,24 +45,20 @@ public void cacheResource(CustomResource resource, Predicate<CustomResource> pre
53
45
* @return
54
46
*/
55
47
public Optional <CustomResource > getLatestResource (String uuid ) {
56
- return Optional .ofNullable (clone (resources .get (uuid )));
48
+ return Optional .ofNullable (resources .get (uuid ))
49
+ .map (this ::clone );
50
+ }
51
+
52
+ public CustomResource cleanup (String customResourceUid ) {
53
+ return resources .remove (customResourceUid );
57
54
}
58
55
59
56
private CustomResource clone (CustomResource customResource ) {
60
57
try {
61
- if (customResource == null ) {
62
- return null ;
63
- }
64
- CustomResource clonedObject =
65
- objectMapper .readValue (
58
+ return objectMapper .readValue (
66
59
objectMapper .writeValueAsString (customResource ), customResource .getClass ());
67
- return clonedObject ;
68
60
} catch (JsonProcessingException e ) {
69
61
throw new IllegalStateException (e );
70
62
}
71
63
}
72
-
73
- public CustomResource cleanup (String customResourceUid ) {
74
- return resources .remove (customResourceUid );
75
- }
76
64
}
0 commit comments