Merge "Controller Blueprints Microservice"
[ccsdk/apps.git] / ms / controllerblueprints / modules / core / src / main / kotlin / org / onap / ccsdk / apps / controllerblueprints / core / service / BluePrintRepoService.kt
1 /*\r
2  * Copyright © 2017-2018 AT&T Intellectual Property.\r
3  * Modifications Copyright © 2018 IBM.\r
4  *\r
5  * Licensed under the Apache License, Version 2.0 (the "License");\r
6  * you may not use this file except in compliance with the License.\r
7  * You may obtain a copy of the License at\r
8  *\r
9  *     http://www.apache.org/licenses/LICENSE-2.0\r
10  *\r
11  * Unless required by applicable law or agreed to in writing, software\r
12  * distributed under the License is distributed on an "AS IS" BASIS,\r
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14  * See the License for the specific language governing permissions and\r
15  * limitations under the License.\r
16  */\r
17 \r
18 package org.onap.ccsdk.apps.controllerblueprints.core.service\r
19 \r
20 import com.google.common.base.Preconditions\r
21 import org.apache.commons.io.FileUtils\r
22 import org.apache.commons.lang3.StringUtils\r
23 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants\r
24 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException\r
25 import org.onap.ccsdk.apps.controllerblueprints.core.data.*\r
26 import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils\r
27 import org.slf4j.Logger\r
28 import org.slf4j.LoggerFactory\r
29 import reactor.core.publisher.Mono\r
30 import java.io.File\r
31 import java.io.Serializable\r
32 import java.nio.charset.Charset\r
33 \r
34 /**\r
35  * BluePrintRepoFileService\r
36  * @author Brinda Santh\r
37  *\r
38  */\r
39 \r
40 interface BluePrintRepoService : Serializable {\r
41 \r
42     @Throws(BluePrintException::class)\r
43     fun getNodeType(nodeTypeName: String): Mono<NodeType>?\r
44 \r
45     @Throws(BluePrintException::class)\r
46     fun getDataType(dataTypeName: String): Mono<DataType>?\r
47 \r
48     @Throws(BluePrintException::class)\r
49     fun getArtifactType(artifactTypeName: String): Mono<ArtifactType>?\r
50 \r
51     @Throws(BluePrintException::class)\r
52     fun getRelationshipType(relationshipTypeName: String): Mono<RelationshipType>?\r
53 \r
54     @Throws(BluePrintException::class)\r
55     fun getCapabilityDefinition(capabilityDefinitionName: String): Mono<CapabilityDefinition>?\r
56 \r
57 }\r
58 \r
59 \r
60 class BluePrintRepoFileService(val basePath: String) : BluePrintRepoService {\r
61 \r
62     private val log: Logger = LoggerFactory.getLogger(BluePrintRepoFileService::class.java)\r
63 \r
64     private val dataTypePath = basePath.plus(BluePrintConstants.PATH_DIVIDER).plus(BluePrintConstants.MODEL_DEFINITION_TYPE_DATA_TYPE)\r
65     private val nodeTypePath = basePath.plus(BluePrintConstants.PATH_DIVIDER).plus(BluePrintConstants.MODEL_DEFINITION_TYPE_NODE_TYPE)\r
66     private val artifactTypePath = basePath.plus(BluePrintConstants.PATH_DIVIDER).plus(BluePrintConstants.MODEL_DEFINITION_TYPE_ARTIFACT_TYPE)\r
67     private val capabilityTypePath = basePath.plus(BluePrintConstants.PATH_DIVIDER).plus(BluePrintConstants.MODEL_DEFINITION_TYPE_CAPABILITY_TYPE)\r
68     private val relationshipTypePath = basePath.plus(BluePrintConstants.PATH_DIVIDER).plus(BluePrintConstants.MODEL_DEFINITION_TYPE_RELATIONSHIP_TYPE)\r
69     private val extension = ".json"\r
70 \r
71     override fun getDataType(dataTypeName: String): Mono<DataType>? {\r
72         val fileName = dataTypePath.plus(BluePrintConstants.PATH_DIVIDER)\r
73                 .plus(dataTypeName).plus(extension)\r
74         return getModelType(fileName, DataType::class.java)\r
75     }\r
76 \r
77     override fun getNodeType(nodeTypeName: String): Mono<NodeType>? {\r
78         val fileName = nodeTypePath.plus(BluePrintConstants.PATH_DIVIDER).plus(nodeTypeName).plus(extension)\r
79         return getModelType(fileName, NodeType::class.java)\r
80     }\r
81 \r
82     override fun getArtifactType(artifactTypeName: String): Mono<ArtifactType>? {\r
83         val fileName = artifactTypePath.plus(BluePrintConstants.PATH_DIVIDER)\r
84                 .plus(artifactTypeName).plus(extension)\r
85         return getModelType(fileName, ArtifactType::class.java)\r
86     }\r
87 \r
88     override fun getRelationshipType(relationshipTypeName: String): Mono<RelationshipType>? {\r
89         val fileName = relationshipTypePath.plus(BluePrintConstants.PATH_DIVIDER)\r
90                 .plus(relationshipTypeName).plus(extension)\r
91         return getModelType(fileName, RelationshipType::class.java)\r
92     }\r
93 \r
94     override fun getCapabilityDefinition(capabilityDefinitionName: String): Mono<CapabilityDefinition>? {\r
95         val fileName = capabilityTypePath.plus(BluePrintConstants.PATH_DIVIDER)\r
96                 .plus(capabilityDefinitionName).plus(extension)\r
97         return getModelType(fileName, CapabilityDefinition::class.java)\r
98     }\r
99 \r
100     private fun <T> getModelType(fileName: String, valueType: Class<T>): Mono<T> {\r
101         return getFileContent(fileName).map { content ->\r
102             Preconditions.checkArgument(StringUtils.isNotBlank(content),\r
103                     String.format("Failed to get model content for file (%s)", fileName))\r
104 \r
105             JacksonUtils.readValue(content, valueType)\r
106                     ?: throw BluePrintException(String.format("Failed to get model file from content for file (%s)", fileName))\r
107 \r
108         }\r
109     }\r
110 \r
111     private fun getFileContent(fileName: String): Mono<String> {\r
112         return Mono.just(FileUtils.readFileToString(File(fileName), Charset.defaultCharset()))\r
113     }\r
114 }