Revert "Renaming Files having BluePrint to have Blueprint"
[ccsdk/cds.git] / ms / blueprintsprocessor / modules / commons / dmaap-lib / src / main / kotlin / org / onap / ccsdk / cds / blueprintsprocessor / dmaap / BluePrintDmaapLibPropertyService.kt
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - CDS
4  * ================================================================================
5  * Copyright (C) 2019 Huawei Technologies Co., Ltd. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.ccsdk.cds.blueprintsprocessor.dmaap
22
23 import com.fasterxml.jackson.databind.JsonNode
24 import org.onap.ccsdk.cds.blueprintsprocessor.core.BluePrintPropertiesService
25 import org.onap.ccsdk.cds.blueprintsprocessor.dmaap.DmaapLibConstants.Companion.SERVICE_BLUEPRINT_DMAAP_LIB_PROPERTY
26 import org.onap.ccsdk.cds.blueprintsprocessor.dmaap.DmaapLibConstants.Companion.TYPE_HTTP_AAF_AUTH
27 import org.onap.ccsdk.cds.blueprintsprocessor.dmaap.DmaapLibConstants.Companion.TYPE_HTTP_NO_AUTH
28 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
29 import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
30 import org.slf4j.LoggerFactory
31 import org.springframework.beans.factory.annotation.Autowired
32 import org.springframework.context.annotation.Configuration
33 import org.springframework.context.annotation.PropertySource
34 import org.springframework.context.annotation.PropertySources
35 import org.springframework.core.env.ConfigurableEnvironment
36 import org.springframework.core.env.Environment
37 import org.springframework.core.io.support.ResourcePropertySource
38 import org.springframework.stereotype.Service
39 import java.util.Properties
40
41 /**
42  * Representation of DMAAP lib property service to load the properties
43  * according to the connection type to the DMAAP server and returning back
44  * the appropriate DMAAP client to send messages DMAAP client.
45  */
46 @Service(SERVICE_BLUEPRINT_DMAAP_LIB_PROPERTY)
47 @Configuration
48 @PropertySources(PropertySource("classpath:event.properties"))
49 open class BluePrintDmaapLibPropertyService(private var bluePrintPropertiesService: BluePrintPropertiesService) {
50
51     /**
52      * Static variable for logging.
53      */
54     companion object {
55
56         var log = LoggerFactory.getLogger(
57             BluePrintDmaapLibPropertyService::class.java
58         )!!
59     }
60
61     /**
62      * Environment entity to derive it from the system to load a specific
63      * property file.
64      */
65     @Autowired
66     lateinit var env: Environment
67
68     /**
69      * Returns the DMAAP client by providing the input properties as a JSON
70      * node.
71      */
72     fun blueprintDmaapClientService(jsonNode: JsonNode):
73         BluePrintDmaapClientService {
74             val dmaapProps = dmaapClientProperties(jsonNode)
75             return blueprintDmaapClientService(dmaapProps)
76         }
77
78     /**
79      * Returns the DMAAP client by providing the input properties as a
80      * selector string.
81      */
82     fun blueprintDmaapClientService(selector: String):
83         BluePrintDmaapClientService {
84             val prefix = "blueprintsprocessor.dmaapclient.$selector"
85             val dmaapProps = dmaapClientProperties(prefix)
86             return blueprintDmaapClientService(dmaapProps)
87         }
88
89     /**
90      * Returns the DMAAP client properties from the type of connection it
91      * requires.
92      */
93     fun dmaapClientProperties(prefix: String): DmaapClientProperties {
94         val type = bluePrintPropertiesService.propertyBeanType(
95             "$prefix.type", String::class.java
96         )
97         val clientProps: DmaapClientProperties
98
99         when (type) {
100             TYPE_HTTP_NO_AUTH -> {
101                 clientProps = bluePrintPropertiesService.propertyBeanType(
102                     prefix, HttpNoAuthDmaapClientProperties::class.java
103                 )
104                 clientProps.props = parseEventProps()
105             }
106
107             TYPE_HTTP_AAF_AUTH -> {
108                 clientProps = bluePrintPropertiesService.propertyBeanType(
109                     prefix, AafAuthDmaapClientProperties::class.java
110                 )
111                 clientProps.props = parseEventProps()
112             }
113
114             else -> {
115                 throw BluePrintProcessorException(
116                     "DMAAP adaptor($type) is " +
117                         "not supported"
118                 )
119             }
120         }
121         return clientProps
122     }
123
124     /**
125      * Returns the DMAAP client properties from the type of connection it
126      * requires.
127      */
128     fun dmaapClientProperties(jsonNode: JsonNode): DmaapClientProperties {
129         val type = jsonNode.get("type").textValue()
130         val clientProps: DmaapClientProperties
131
132         when (type) {
133             TYPE_HTTP_NO_AUTH -> {
134                 clientProps = JacksonUtils.readValue(
135                     jsonNode,
136                     HttpNoAuthDmaapClientProperties::class.java
137                 )!!
138                 clientProps.props = parseEventProps()
139             }
140
141             TYPE_HTTP_AAF_AUTH -> {
142                 clientProps = JacksonUtils.readValue(
143                     jsonNode,
144                     AafAuthDmaapClientProperties::class.java
145                 )!!
146                 clientProps.props = parseEventProps()
147             }
148
149             else -> {
150                 throw BluePrintProcessorException(
151                     "DMAAP adaptor($type) is " +
152                         "not supported"
153                 )
154             }
155         }
156         return clientProps
157     }
158
159     /**
160      * Returns DMAAP client service according to the type of client properties.
161      */
162     private fun blueprintDmaapClientService(clientProps: DmaapClientProperties):
163         BluePrintDmaapClientService {
164             when (clientProps) {
165                 is HttpNoAuthDmaapClientProperties -> {
166                     return HttpNoAuthDmaapClientService(clientProps)
167                 }
168
169                 is AafAuthDmaapClientProperties -> {
170                     return AafAuthDmaapClientService(clientProps)
171                 }
172
173                 else -> {
174                     throw BluePrintProcessorException(
175                         "Unable to get the DMAAP " +
176                             "client"
177                     )
178                 }
179             }
180         }
181
182     /**
183      * Parses the event.properties file which contains the default values for
184      * the connection required.
185      */
186     private fun parseEventProps(): Properties {
187         val prodProps = Properties()
188         val proProps = (env as ConfigurableEnvironment).propertySources.get(
189             "class path resource [event.properties]"
190         )
191
192         if (proProps != null) {
193             val entries = (proProps as ResourcePropertySource).source.entries
194             for (e in entries) {
195                 prodProps.put(e.key, e.value)
196             }
197         } else {
198             log.error("Unable to load the event.properties file")
199         }
200         return prodProps
201     }
202 }