@@ -53,11 +53,12 @@ public class ModelMapper {
53
53
// Model's api-version midfix to kubernetes api-version
54
54
private static List <String > preBuiltApiVersions = new ArrayList <>();
55
55
56
- private static Map <GroupVersionKind , Class <?>> classesByGVK = new ConcurrentHashMap <>();
57
- private static Map <GroupVersionResource , Class <?>> classesByGVR = new ConcurrentHashMap <>();
56
+ private static BiDirectionalMap <GroupVersionKind , Class <?>> classesByGVK =
57
+ new BiDirectionalMap <>();
58
+
59
+ private static BiDirectionalMap <GroupVersionResource , Class <?>> classesByGVR =
60
+ new BiDirectionalMap <>();
58
61
59
- private static Map <Class <?>, GroupVersionKind > gvkByClasses = new ConcurrentHashMap <>();
60
- private static Map <Class <?>, GroupVersionResource > gvrByClasses = new ConcurrentHashMap <>();
61
62
private static Map <Class <?>, Boolean > isNamespacedByClasses = new ConcurrentHashMap <>();
62
63
63
64
private static Set <Discovery .APIResource > lastAPIDiscovery = new HashSet <>();
@@ -116,11 +117,8 @@ public static void addModelMap(String group, String version, String kind, Class<
116
117
public static void addModelMap (
117
118
String group , String version , String kind , String resourceNamePlural , Class <?> clazz ) {
118
119
// TODO(yue9944882): consistency between bi-directional maps
119
- classesByGVK .put (new GroupVersionKind (group , version , kind ), clazz );
120
- gvkByClasses .put (clazz , new GroupVersionKind (group , version , kind ));
121
-
122
- classesByGVR .put (new GroupVersionResource (group , version , resourceNamePlural ), clazz );
123
- gvrByClasses .put (clazz , new GroupVersionResource (group , version , resourceNamePlural ));
120
+ classesByGVK .add (new GroupVersionKind (group , version , kind ), clazz );
121
+ classesByGVR .add (new GroupVersionResource (group , version , resourceNamePlural ), clazz );
124
122
}
125
123
126
124
/**
@@ -176,7 +174,7 @@ public static Class<?> getApiTypeClass(String apiGroupVersion, String kind) {
176
174
* @return the api type class
177
175
*/
178
176
public static Class <?> getApiTypeClass (String group , String version , String kind ) {
179
- Class <?> clazz = classesByGVK .get (new GroupVersionKind (group , version , kind ));
177
+ Class <?> clazz = classesByGVK .getByK (new GroupVersionKind (group , version , kind ));
180
178
if (clazz != null ) {
181
179
return clazz ;
182
180
}
@@ -190,7 +188,7 @@ public static Class<?> getApiTypeClass(String group, String version, String kind
190
188
* @return the group version kind by class
191
189
*/
192
190
public static GroupVersionKind getGroupVersionKindByClass (Class <?> clazz ) {
193
- return gvkByClasses . get (clazz );
191
+ return classesByGVK . getByV (clazz );
194
192
}
195
193
196
194
/**
@@ -200,7 +198,7 @@ public static GroupVersionKind getGroupVersionKindByClass(Class<?> clazz) {
200
198
* @return the group version kind by class
201
199
*/
202
200
public static GroupVersionResource getGroupVersionResourceByClass (Class <?> clazz ) {
203
- return gvrByClasses . get (clazz );
201
+ return classesByGVR . getByV (clazz );
204
202
}
205
203
206
204
/**
@@ -364,4 +362,22 @@ private static Pair<String, String> getApiVersion(String name) {
364
362
.findFirst ()
365
363
.orElse (new MutablePair (null , name ));
366
364
}
365
+
366
+ static class BiDirectionalMap <K , V > {
367
+ private Map <K , V > kvMap = new HashMap <>();
368
+ private Map <V , K > vkMap = new HashMap <>();
369
+
370
+ synchronized void add (K k , V v ) {
371
+ kvMap .put (k , v );
372
+ vkMap .put (v , k );
373
+ }
374
+
375
+ synchronized V getByK (K k ) {
376
+ return kvMap .get (k );
377
+ }
378
+
379
+ synchronized K getByV (V v ) {
380
+ return vkMap .get (v );
381
+ }
382
+ }
367
383
}
0 commit comments