2c443783e2b80dd99ae2f1542eea41e9e595de0a
[ccsdk/cds.git] /
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.service;\r
19 \r
20 import org.apache.commons.collections.CollectionUtils;\r
21 import org.apache.commons.lang3.StringUtils;\r
22 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException;\r
23 import org.onap.ccsdk.apps.controllerblueprints.core.data.PropertyDefinition;\r
24 import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils;\r
25 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment;\r
26 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceDefinition;\r
27 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.utils.ResourceDictionaryUtils;\r
28 import org.onap.ccsdk.apps.controllerblueprints.service.domain.ResourceDictionary;\r
29 import org.onap.ccsdk.apps.controllerblueprints.service.model.AutoMapResponse;\r
30 import org.onap.ccsdk.apps.controllerblueprints.service.repository.ResourceDictionaryRepository;\r
31 import org.slf4j.Logger;\r
32 import org.slf4j.LoggerFactory;\r
33 import org.springframework.stereotype.Service;\r
34 \r
35 import java.util.ArrayList;\r
36 import java.util.HashMap;\r
37 import java.util.List;\r
38 import java.util.Map;\r
39 \r
40 /**\r
41  * AutoResourceMappingService.java Purpose: Provide Automapping of Resource Assignments AutoResourceMappingService\r
42  *\r
43  * @author Brinda Santh\r
44  * @version 1.0\r
45  */\r
46 \r
47 @Service\r
48 public class AutoResourceMappingService {\r
49 \r
50     private static Logger log = LoggerFactory.getLogger(AutoResourceMappingService.class);\r
51 \r
52     private ResourceDictionaryRepository dataDictionaryRepository;\r
53 \r
54     /**\r
55      * This is a AutoResourceMappingService constructor\r
56      * \r
57      * @param dataDictionaryRepository\r
58      * \r
59      */\r
60     public AutoResourceMappingService(ResourceDictionaryRepository dataDictionaryRepository) {\r
61         this.dataDictionaryRepository = dataDictionaryRepository;\r
62     }\r
63 \r
64     /**\r
65      * This is a autoMap service to map the template keys automatically to Dictionary fields.\r
66      * \r
67      * @param resourceAssignments\r
68      * @return AutoMapResponse\r
69      */\r
70     public AutoMapResponse autoMap(List<ResourceAssignment> resourceAssignments) throws BluePrintException {\r
71         AutoMapResponse autoMapResponse = new AutoMapResponse();\r
72         try {\r
73             if (CollectionUtils.isNotEmpty(resourceAssignments)) {\r
74 \r
75                 // Create the Dictionary definitions for the ResourceAssignment Names\r
76                 Map<String, ResourceDictionary> dictionaryMap = getDictionaryDefinitions(resourceAssignments);\r
77 \r
78                 for (ResourceAssignment resourceAssignment : resourceAssignments) {\r
79                     if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getName())\r
80                             && StringUtils.isBlank(resourceAssignment.getDictionaryName())) {\r
81 \r
82                         populateDictionaryMapping(dictionaryMap, resourceAssignment);\r
83 \r
84                         log.info("Mapped Resource : {}", resourceAssignment);\r
85 \r
86                     } else {\r
87                         // Do nothins\r
88                     }\r
89                 }\r
90             }\r
91             List<ResourceDictionary> dictionaries = getDictionaryDefinitionsList(resourceAssignments);\r
92             List<ResourceAssignment> resourceAssignmentsFinal = getAllAutomapResourceAssignments(resourceAssignments);\r
93             autoMapResponse.setDataDictionaries(dictionaries);\r
94             autoMapResponse.setResourceAssignments(resourceAssignmentsFinal);\r
95         } catch (Exception e) {\r
96             log.error(String.format("Failed in auto process %s", e.getMessage()));\r
97             throw new BluePrintException(e.getMessage(), e);\r
98         }\r
99         return autoMapResponse;\r
100     }\r
101 \r
102     private void populateDictionaryMapping(Map<String, ResourceDictionary> dictionaryMap, ResourceAssignment resourceAssignment) {\r
103         ResourceDictionary dbDataDictionary = dictionaryMap.get(resourceAssignment.getName());\r
104         if (dbDataDictionary != null && StringUtils.isNotBlank(dbDataDictionary.getDefinition())) {\r
105 \r
106             ResourceDefinition dictionaryDefinition = JacksonUtils.readValue(dbDataDictionary.getDefinition(), ResourceDefinition.class);\r
107 \r
108             if (dictionaryDefinition != null && StringUtils.isNotBlank(dictionaryDefinition.getName())\r
109                     && StringUtils.isBlank(resourceAssignment.getDictionaryName())) {\r
110 \r
111                 resourceAssignment.setDictionaryName(dbDataDictionary.getName());\r
112                 ResourceDictionaryUtils.populateSourceMapping(resourceAssignment, dictionaryDefinition);\r
113             }\r
114         }\r
115     }\r
116 \r
117     private Map<String, ResourceDictionary> getDictionaryDefinitions(List<ResourceAssignment> resourceAssignments) {\r
118         Map<String, ResourceDictionary> dictionaryMap = new HashMap<>();\r
119         List<String> names = new ArrayList<>();\r
120         for (ResourceAssignment resourceAssignment : resourceAssignments) {\r
121             if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getName())) {\r
122                 names.add(resourceAssignment.getName());\r
123             }\r
124         }\r
125         if (CollectionUtils.isNotEmpty(names)) {\r
126 \r
127             List<ResourceDictionary> dictionaries = dataDictionaryRepository.findByNameIn(names);\r
128             if (CollectionUtils.isNotEmpty( dictionaries)) {\r
129                 for (ResourceDictionary dataDictionary : dictionaries) {\r
130                     if (dataDictionary != null && StringUtils.isNotBlank(dataDictionary.getName())) {\r
131                         dictionaryMap.put(dataDictionary.getName(), dataDictionary);\r
132                     }\r
133                 }\r
134             }\r
135         }\r
136         return dictionaryMap;\r
137 \r
138     }\r
139 \r
140     private List<ResourceDictionary> getDictionaryDefinitionsList(List<ResourceAssignment> resourceAssignments) {\r
141         List<ResourceDictionary> dictionaries = null;\r
142         List<String> names = new ArrayList<>();\r
143         for (ResourceAssignment resourceAssignment : resourceAssignments) {\r
144             if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getDictionaryName())) {\r
145 \r
146                 if (!names.contains(resourceAssignment.getDictionaryName())) {\r
147                     names.add(resourceAssignment.getDictionaryName());\r
148                 }\r
149 \r
150                 if (resourceAssignment.getDependencies() != null && !resourceAssignment.getDependencies().isEmpty()) {\r
151                     List<String> dependencyNames = resourceAssignment.getDependencies();\r
152                     for (String dependencyName : dependencyNames) {\r
153                         if (StringUtils.isNotBlank(dependencyName) && !names.contains(dependencyName)) {\r
154                             names.add(dependencyName);\r
155                         }\r
156                     }\r
157                 }\r
158             }\r
159         }\r
160         if (CollectionUtils.isNotEmpty(names)) {\r
161             dictionaries = dataDictionaryRepository.findByNameIn(names);\r
162         }\r
163         return dictionaries;\r
164 \r
165     }\r
166 \r
167     private List<ResourceAssignment> getAllAutomapResourceAssignments(List<ResourceAssignment> resourceAssignments) {\r
168         List<ResourceDictionary> dictionaries = null;\r
169         List<String> names = new ArrayList<>();\r
170         List<ResourceAssignment> resourceAssignmentsWithDepencies = resourceAssignments;\r
171         for (ResourceAssignment resourceAssignment : resourceAssignments) {\r
172             if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getDictionaryName())) {\r
173                 if (resourceAssignment.getDependencies() != null && !resourceAssignment.getDependencies().isEmpty()) {\r
174                     List<String> dependencieNames = resourceAssignment.getDependencies();\r
175                     for (String dependencieName : dependencieNames) {\r
176                         if (StringUtils.isNotBlank(dependencieName) && !names.contains(dependencieName)\r
177                                 && !checkAssignmentsExists(resourceAssignmentsWithDepencies, dependencieName)) {\r
178                             names.add(dependencieName);\r
179                         }\r
180                     }\r
181                 }\r
182             }\r
183         }\r
184 \r
185         if (!names.isEmpty()) {\r
186             dictionaries = dataDictionaryRepository.findByNameIn(names);\r
187         }\r
188         if (dictionaries != null) {\r
189             for (ResourceDictionary resourcedictionary : dictionaries) {\r
190                 ResourceDefinition dictionaryDefinition = JacksonUtils.readValue(resourcedictionary.getDefinition(), ResourceDefinition.class);\r
191                 PropertyDefinition property = new PropertyDefinition();\r
192                                 property.setRequired(true);\r
193                                 ResourceAssignment resourceAssignment = new ResourceAssignment();\r
194                                 resourceAssignment.setName(resourcedictionary.getName());\r
195                                 resourceAssignment.setDictionaryName(resourcedictionary\r
196                                                 .getName());\r
197                                 resourceAssignment.setVersion(0);\r
198                                 resourceAssignment.setProperty(property);\r
199                 ResourceDictionaryUtils.populateSourceMapping(resourceAssignment, dictionaryDefinition);\r
200                     resourceAssignmentsWithDepencies.add(resourceAssignment);\r
201             }\r
202         }\r
203         return resourceAssignmentsWithDepencies;\r
204 \r
205     }\r
206 \r
207 \r
208     public boolean checkAssignmentsExists(List<ResourceAssignment> resourceAssignmentsWithDepencies, String resourceName) {\r
209         return resourceAssignmentsWithDepencies.stream().anyMatch(names -> names.getName().equalsIgnoreCase(resourceName));\r
210     }\r
211 \r
212 }\r