5eba4fc7ff80d74232998ddbe26734a09119447c
[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 com.google.common.base.Preconditions;\r
21 import org.apache.commons.collections.CollectionUtils;\r
22 import org.apache.commons.lang3.StringUtils;\r
23 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException;\r
24 import org.onap.ccsdk.apps.controllerblueprints.core.data.PropertyDefinition;\r
25 import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils;\r
26 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment;\r
27 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceDefinition;\r
28 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.utils.ResourceDictionaryUtils;\r
29 import org.onap.ccsdk.apps.controllerblueprints.service.domain.ResourceDictionary;\r
30 import org.onap.ccsdk.apps.controllerblueprints.service.model.AutoMapResponse;\r
31 import org.onap.ccsdk.apps.controllerblueprints.service.repository.ResourceDictionaryRepository;\r
32 import org.slf4j.Logger;\r
33 import org.slf4j.LoggerFactory;\r
34 import org.springframework.stereotype.Service;\r
35 \r
36 import java.util.ArrayList;\r
37 import java.util.HashMap;\r
38 import java.util.List;\r
39 import java.util.Map;\r
40 \r
41 /**\r
42  * AutoResourceMappingService.java Purpose: Provide Automapping of Resource Assignments AutoResourceMappingService\r
43  *\r
44  * @author Brinda Santh\r
45  * @version 1.0\r
46  */\r
47 \r
48 @Service\r
49 @SuppressWarnings("unused")\r
50 public class AutoResourceMappingService {\r
51 \r
52     private static Logger log = LoggerFactory.getLogger(AutoResourceMappingService.class);\r
53 \r
54     private ResourceDictionaryRepository dataDictionaryRepository;\r
55 \r
56     /**\r
57      * This is a AutoResourceMappingService constructor\r
58      *\r
59      * @param dataDictionaryRepository dataDictionaryRepository\r
60      */\r
61     public AutoResourceMappingService(ResourceDictionaryRepository dataDictionaryRepository) {\r
62         this.dataDictionaryRepository = dataDictionaryRepository;\r
63     }\r
64 \r
65     /**\r
66      * This is a autoMap service to map the template keys automatically to Dictionary fields.\r
67      *\r
68      * @param resourceAssignments resourceAssignments\r
69      * @return AutoMapResponse\r
70      */\r
71     public AutoMapResponse autoMap(List<ResourceAssignment> resourceAssignments) throws BluePrintException {\r
72         AutoMapResponse autoMapResponse = new AutoMapResponse();\r
73         try {\r
74             if (CollectionUtils.isNotEmpty(resourceAssignments)) {\r
75 \r
76                 // Create the Dictionary definitions for the ResourceAssignment Names\r
77                 Map<String, ResourceDictionary> dictionaryMap = getDictionaryDefinitions(resourceAssignments);\r
78 \r
79                 for (ResourceAssignment resourceAssignment : resourceAssignments) {\r
80                     if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getName())\r
81                             && StringUtils.isBlank(resourceAssignment.getDictionaryName())) {\r
82 \r
83                         populateDictionaryMapping(dictionaryMap, resourceAssignment);\r
84 \r
85                         log.info("Mapped Resource : {}", resourceAssignment);\r
86 \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             ResourceDefinition dictionaryDefinition = JacksonUtils.readValue(dbDataDictionary.getDefinition(), ResourceDefinition.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         for (ResourceAssignment resourceAssignment : resourceAssignments) {\r
170             if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getDictionaryName())) {\r
171                 if (resourceAssignment.getDependencies() != null && !resourceAssignment.getDependencies().isEmpty()) {\r
172                     List<String> dependencieNames = resourceAssignment.getDependencies();\r
173                     for (String dependencieName : dependencieNames) {\r
174                         if (StringUtils.isNotBlank(dependencieName) && !names.contains(dependencieName)\r
175                                 && !checkAssignmentsExists(resourceAssignments, dependencieName)) {\r
176                             names.add(dependencieName);\r
177                         }\r
178                     }\r
179                 }\r
180             }\r
181         }\r
182 \r
183         if (!names.isEmpty()) {\r
184             dictionaries = dataDictionaryRepository.findByNameIn(names);\r
185         }\r
186         if (dictionaries != null) {\r
187             for (ResourceDictionary resourcedictionary : dictionaries) {\r
188                 ResourceDefinition dictionaryDefinition = JacksonUtils.readValue(resourcedictionary.getDefinition(), ResourceDefinition.class);\r
189                 Preconditions.checkNotNull(dictionaryDefinition, "failed to get Resource Definition from dictionary definition");\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                 resourceAssignments.add(resourceAssignment);\r
200             }\r
201         }\r
202         return resourceAssignments;\r
203 \r
204     }\r
205 \r
206 \r
207     private 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