2 * Copyright © 2017-2018 AT&T Intellectual Property.
\r
3 * Modifications Copyright © 2018 IBM.
\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
9 * http://www.apache.org/licenses/LICENSE-2.0
\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
18 package org.onap.ccsdk.apps.controllerblueprints.service;
\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
35 import java.util.ArrayList;
\r
36 import java.util.HashMap;
\r
37 import java.util.List;
\r
38 import java.util.Map;
\r
41 * AutoResourceMappingService.java Purpose: Provide Automapping of Resource Assignments AutoResourceMappingService
\r
43 * @author Brinda Santh
\r
48 public class AutoResourceMappingService {
\r
50 private static Logger log = LoggerFactory.getLogger(AutoResourceMappingService.class);
\r
52 private ResourceDictionaryRepository dataDictionaryRepository;
\r
55 * This is a AutoResourceMappingService constructor
\r
57 * @param dataDictionaryRepository
\r
60 public AutoResourceMappingService(ResourceDictionaryRepository dataDictionaryRepository) {
\r
61 this.dataDictionaryRepository = dataDictionaryRepository;
\r
65 * This is a autoMap service to map the template keys automatically to Dictionary fields.
\r
67 * @param resourceAssignments
\r
68 * @return AutoMapResponse
\r
70 public AutoMapResponse autoMap(List<ResourceAssignment> resourceAssignments) throws BluePrintException {
\r
71 AutoMapResponse autoMapResponse = new AutoMapResponse();
\r
73 if (CollectionUtils.isNotEmpty(resourceAssignments)) {
\r
75 // Create the Dictionary definitions for the ResourceAssignment Names
\r
76 Map<String, ResourceDictionary> dictionaryMap = getDictionaryDefinitions(resourceAssignments);
\r
78 for (ResourceAssignment resourceAssignment : resourceAssignments) {
\r
79 if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getName())
\r
80 && StringUtils.isBlank(resourceAssignment.getDictionaryName())) {
\r
82 populateDictionaryMapping(dictionaryMap, resourceAssignment);
\r
84 log.info("Mapped Resource : {}", resourceAssignment);
\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
99 return autoMapResponse;
\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
106 ResourceDefinition dictionaryDefinition = JacksonUtils.readValue(dbDataDictionary.getDefinition(), ResourceDefinition.class);
\r
108 if (dictionaryDefinition != null && StringUtils.isNotBlank(dictionaryDefinition.getName())
\r
109 && StringUtils.isBlank(resourceAssignment.getDictionaryName())) {
\r
111 resourceAssignment.setDictionaryName(dbDataDictionary.getName());
\r
112 ResourceDictionaryUtils.populateSourceMapping(resourceAssignment, dictionaryDefinition);
\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
125 if (CollectionUtils.isNotEmpty(names)) {
\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
136 return dictionaryMap;
\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
146 if (!names.contains(resourceAssignment.getDictionaryName())) {
\r
147 names.add(resourceAssignment.getDictionaryName());
\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
160 if (CollectionUtils.isNotEmpty(names)) {
\r
161 dictionaries = dataDictionaryRepository.findByNameIn(names);
\r
163 return dictionaries;
\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
185 if (!names.isEmpty()) {
\r
186 dictionaries = dataDictionaryRepository.findByNameIn(names);
\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
197 resourceAssignment.setVersion(0);
\r
198 resourceAssignment.setProperty(property);
\r
199 ResourceDictionaryUtils.populateSourceMapping(resourceAssignment, dictionaryDefinition);
\r
200 resourceAssignmentsWithDepencies.add(resourceAssignment);
\r
203 return resourceAssignmentsWithDepencies;
\r
208 public boolean checkAssignmentsExists(List<ResourceAssignment> resourceAssignmentsWithDepencies, String resourceName) {
\r
209 return resourceAssignmentsWithDepencies.stream().anyMatch(names -> names.getName().equalsIgnoreCase(resourceName));
\r