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,60 +42,99 @@ 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()
55
58
}
56
- try {
57
- resources
58
- .map { jsonYaml ->
59
- setMissingNamespace(currentNamespace, createResource<GenericKubernetesResource >(jsonYaml))
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))
73
+ }
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
}
73
104
return resource
74
105
}
75
106
76
107
fun serialize (resources : List <HasMetadata >, fileType : FileType ? ): String? {
77
- if (fileType == null ) {
78
- return null
79
- }
80
- if (resources.size >= 2
81
- && fileType != YAMLFileType .YML ) {
82
- throw UnsupportedOperationException (
83
- " ${fileType.name} is not supported for multi-resource documents. Only ${YAMLFileType .YML .name} is." )
108
+ return try {
109
+ when {
110
+ fileType == null ->
111
+ null
112
+
113
+ YAMLFileType .YML == fileType ->
114
+ resources2yaml(resources)
115
+
116
+ JsonFileType .INSTANCE == fileType ->
117
+ resources2json(resources)
118
+
119
+ else ->
120
+ " "
121
+ }
122
+ } catch (e: RuntimeException ) {
123
+ throw ResourceException (" Invalid kubernetes yaml/json" , e.cause ? : e)
84
124
}
85
- return resources
86
- .mapNotNull { resource -> serialize(resource, fileType) }
87
- .joinToString(" \n " )
125
+ }
88
126
127
+ private fun resources2yaml (resources : List <HasMetadata >): String {
128
+ return resources.joinToString(" \n " ) { resource ->
129
+ Serialization .asYaml(resource).trim()
130
+ }
89
131
}
90
132
91
- private fun serialize (resource : HasMetadata , fileType : FileType ): String? {
92
- return when (fileType) {
93
- YAMLFileType .YML ->
94
- Serialization .asYaml(resource).trim()
95
- JsonFileType .INSTANCE ->
96
- Serialization .asJson(resource).trim()
97
- else -> null
133
+ private fun resources2json (resources : List <HasMetadata >): String {
134
+ return if (resources.size == 1 ) {
135
+ Serialization .asJson(resources.first()).trim()
136
+ } else {
137
+ Serialization .asJson(resources).trim()
98
138
}
99
139
}
100
140
0 commit comments