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