2 * Copyright © 2017-2018 AT&T Intellectual Property.
3 * Modifications Copyright © 2018 IBM.
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 package org.onap.ccsdk.cds.controllerblueprints.service;
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;
35 import java.util.ArrayList;
36 import java.util.HashMap;
37 import java.util.List;
41 * AutoResourceMappingService.java Purpose: Provide Automapping of Resource Assignments AutoResourceMappingService
43 * @author Brinda Santh
48 @SuppressWarnings("unused")
49 public class AutoResourceMappingService {
51 private static EELFLogger log = EELFManager.getInstance().getLogger(AutoResourceMappingService.class);
53 private ResourceDictionaryRepository dataDictionaryRepository;
56 * This is a AutoResourceMappingService constructor
58 * @param dataDictionaryRepository dataDictionaryRepository
60 public AutoResourceMappingService(ResourceDictionaryRepository dataDictionaryRepository) {
61 this.dataDictionaryRepository = dataDictionaryRepository;
65 * This is a autoMap service to map the template keys automatically to Dictionary fields.
67 * @param resourceAssignments resourceAssignments
68 * @return AutoMapResponse
70 public AutoMapResponse autoMap(List<ResourceAssignment> resourceAssignments) throws BluePrintException {
71 AutoMapResponse autoMapResponse = new AutoMapResponse();
73 if (CollectionUtils.isNotEmpty(resourceAssignments)) {
75 // Create the Dictionary definitions for the ResourceAssignment Names
76 Map<String, ResourceDictionary> dictionaryMap = getDictionaryDefinitions(resourceAssignments);
78 for (ResourceAssignment resourceAssignment : resourceAssignments) {
79 if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getName())
80 && StringUtils.isBlank(resourceAssignment.getDictionaryName())) {
82 populateDictionaryMapping(dictionaryMap, resourceAssignment);
84 log.info("Mapped Resource : {}", resourceAssignment);
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);
97 return autoMapResponse;
100 private void populateDictionaryMapping(Map<String, ResourceDictionary> dictionaryMap, ResourceAssignment resourceAssignment) {
101 ResourceDictionary dbDataDictionary = dictionaryMap.get(resourceAssignment.getName());
102 if (dbDataDictionary != null && dbDataDictionary.getDefinition() != null) {
104 ResourceDefinition dictionaryDefinition = dbDataDictionary.getDefinition();
106 if (dictionaryDefinition != null && StringUtils.isNotBlank(dictionaryDefinition.getName())
107 && StringUtils.isBlank(resourceAssignment.getDictionaryName())) {
109 resourceAssignment.setDictionaryName(dbDataDictionary.getName());
110 ResourceDictionaryUtils.populateSourceMapping(resourceAssignment, dictionaryDefinition);
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());
123 if (CollectionUtils.isNotEmpty(names)) {
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);
134 return dictionaryMap;
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())) {
144 if (!names.contains(resourceAssignment.getDictionaryName())) {
145 names.add(resourceAssignment.getDictionaryName());
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);
158 if (CollectionUtils.isNotEmpty(names)) {
159 dictionaries = dataDictionaryRepository.findByNameIn(names);
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);
182 if (!names.isEmpty()) {
183 dictionaries = dataDictionaryRepository.findByNameIn(names);
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
195 resourceAssignment.setVersion(0);
196 resourceAssignment.setProperty(property);
197 ResourceDictionaryUtils.populateSourceMapping(resourceAssignment, dictionaryDefinition);
198 resourceAssignments.add(resourceAssignment);
201 return resourceAssignments;
206 private boolean checkAssignmentsExists(List<ResourceAssignment> resourceAssignmentsWithDepencies, String resourceName) {
207 return resourceAssignmentsWithDepencies.stream().anyMatch(names -> names.getName().equalsIgnoreCase(resourceName));