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