10
10
******************************************************************************/
11
11
package com.redhat.devtools.intellij.kubernetes.editor
12
12
13
+ import com.fasterxml.jackson.databind.ObjectMapper
14
+ import com.fasterxml.jackson.databind.node.ArrayNode
13
15
import com.intellij.json.JsonFileType
14
16
import com.intellij.openapi.fileTypes.FileType
15
17
import com.redhat.devtools.intellij.kubernetes.model.util.ResourceException
@@ -22,7 +24,6 @@ import org.jetbrains.yaml.YAMLFileType
22
24
object EditorResourceSerialization {
23
25
24
26
const val RESOURCE_SEPARATOR_YAML = " \n ---"
25
- private const val RESOURCE_SEPARATOR_JSON = " ,\n "
26
27
27
28
/* *
28
29
* Returns a list of [HasMetadata] for a given yaml or json string.
@@ -41,32 +42,62 @@ object EditorResourceSerialization {
41
42
* @see JsonFileType.INSTANCE
42
43
*/
43
44
fun deserialize (jsonYaml : String? , fileType : FileType ? , currentNamespace : String? ): List <HasMetadata > {
44
- return if (jsonYaml == null
45
- || ! isSupported(fileType)) {
46
- emptyList()
47
- } else {
48
- val resources = jsonYaml
49
- .split(RESOURCE_SEPARATOR_YAML )
50
- .filter { jsonYaml -> jsonYaml.isNotBlank() }
51
- if (resources.size > 1
52
- && YAMLFileType .YML != fileType) {
53
- throw ResourceException (
54
- " ${fileType?.name ? : " File type" } is not supported for multi-resource documents. Only ${YAMLFileType .YML .name} is." )
45
+ return try {
46
+ when {
47
+ jsonYaml == null ->
48
+ emptyList()
49
+
50
+ YAMLFileType .YML == fileType ->
51
+ yaml2Resources(jsonYaml, currentNamespace)
52
+
53
+ JsonFileType .INSTANCE == fileType ->
54
+ json2Resources(jsonYaml, currentNamespace)
55
+
56
+ else ->
57
+ emptyList()
58
+ }
59
+ } catch (e: RuntimeException ) {
60
+ throw ResourceException (" Invalid kubernetes yaml/json" , e.cause ? : e)
61
+ }
62
+ }
63
+
64
+ private fun yaml2Resources (yaml : String , currentNamespace : String? ): List <HasMetadata > {
65
+ val resources = yaml
66
+ .split(RESOURCE_SEPARATOR_YAML )
67
+ .filter { yaml ->
68
+ yaml.isNotBlank()
69
+ }
70
+ return resources
71
+ .map { yaml ->
72
+ setMissingNamespace(currentNamespace, createResource<GenericKubernetesResource >(yaml))
55
73
}
56
- try {
57
- resources
58
- .map { jsonYaml ->
59
- setMissingNamespace(currentNamespace, createResource<GenericKubernetesResource >(jsonYaml))
74
+ .toList()
75
+ }
76
+
77
+ private fun json2Resources (json : String? , currentNamespace : String? ): List <HasMetadata > {
78
+ val mapper = ObjectMapper ()
79
+ val rootNode = mapper.readTree(json)
80
+ return when {
81
+ rootNode.isArray ->
82
+ (rootNode as ArrayNode )
83
+ .mapNotNull { node ->
84
+ setMissingNamespace(currentNamespace, mapper.treeToValue(node, GenericKubernetesResource ::class .java))
60
85
}
61
86
.toList()
62
- } catch (e: RuntimeException ) {
63
- throw ResourceException (" Invalid kubernetes yaml/json" , e.cause ? : e)
64
- }
87
+ rootNode.isObject ->
88
+ listOf (
89
+ setMissingNamespace(currentNamespace,
90
+ mapper.treeToValue(rootNode, GenericKubernetesResource ::class .java)
91
+ )
92
+ )
93
+ else ->
94
+ emptyList()
65
95
}
66
96
}
67
97
68
98
private fun setMissingNamespace (namespace : String? , resource : HasMetadata ): HasMetadata {
69
- if (resource.metadata.namespace.isNullOrEmpty()
99
+ if (resource.metadata != null
100
+ && resource.metadata.namespace.isNullOrEmpty()
70
101
&& namespace != null ) {
71
102
resource.metadata.namespace = namespace
72
103
}
0 commit comments