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 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
36 import java.util.ArrayList;
\r
37 import java.util.HashMap;
\r
38 import java.util.List;
\r
39 import java.util.Map;
\r
42 * AutoResourceMappingService.java Purpose: Provide Automapping of Resource Assignments AutoResourceMappingService
\r
44 * @author Brinda Santh
\r
49 @SuppressWarnings("unused")
\r
50 public class AutoResourceMappingService {
\r
52 private static Logger log = LoggerFactory.getLogger(AutoResourceMappingService.class);
\r
54 private ResourceDictionaryRepository dataDictionaryRepository;
\r
57 * This is a AutoResourceMappingService constructor
\r
59 * @param dataDictionaryRepository dataDictionaryRepository
\r
61 public AutoResourceMappingService(ResourceDictionaryRepository dataDictionaryRepository) {
\r
62 this.dataDictionaryRepository = dataDictionaryRepository;
\r
66 * This is a autoMap service to map the template keys automatically to Dictionary fields.
\r
68 * @param resourceAssignments resourceAssignments
\r
69 * @return AutoMapResponse
\r
71 public AutoMapResponse autoMap(List<ResourceAssignment> resourceAssignments) throws BluePrintException {
\r
72 AutoMapResponse autoMapResponse = new AutoMapResponse();
\r
74 if (CollectionUtils.isNotEmpty(resourceAssignments)) {
\r
76 // Create the Dictionary definitions for the ResourceAssignment Names
\r
77 Map<String, ResourceDictionary> dictionaryMap = getDictionaryDefinitions(resourceAssignments);
\r
79 for (ResourceAssignment resourceAssignment : resourceAssignments) {
\r
80 if (resourceAssignment != null && StringUtils.isNotBlank(resourceAssignment.getName())
\r
81 && StringUtils.isBlank(resourceAssignment.getDictionaryName())) {
\r
83 populateDictionaryMapping(dictionaryMap, resourceAssignment);
\r
85 log.info("Mapped Resource : {}", resourceAssignment);
\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
98 return autoMapResponse;
\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
105 ResourceDefinition dictionaryDefinition = JacksonUtils.readValue(dbDataDictionary.getDefinition(), ResourceDefinition.class);
\r
107 if (dictionaryDefinition != null && StringUtils.isNotBlank(dictionaryDefinition.getName())
\r
108 && StringUtils.isBlank(resourceAssignment.getDictionaryName())) {
\r
110 resourceAssignment.setDictionaryName(dbDataDictionary.getName());
\r
111 ResourceDictionaryUtils.populateSourceMapping(resourceAssignment, dictionaryDefinition);
\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
124 if (CollectionUtils.isNotEmpty(names)) {
\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
135 return dictionaryMap;
\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
145 if (!names.contains(resourceAssignment.getDictionaryName())) {
\r
146 names.add(resourceAssignment.getDictionaryName());
\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
159 if (CollectionUtils.isNotEmpty(names)) {
\r
160 dictionaries = dataDictionaryRepository.findByNameIn(names);
\r
162 return dictionaries;
\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
183 if (!names.isEmpty()) {
\r
184 dictionaries = dataDictionaryRepository.findByNameIn(names);
\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
196 resourceAssignment.setVersion(0);
\r
197 resourceAssignment.setProperty(property);
\r
198 ResourceDictionaryUtils.populateSourceMapping(resourceAssignment, dictionaryDefinition);
\r
199 resourceAssignments.add(resourceAssignment);
\r
202 return resourceAssignments;
\r
207 private boolean checkAssignmentsExists(List<ResourceAssignment> resourceAssignmentsWithDepencies, String resourceName) {
\r
208 return resourceAssignmentsWithDepencies.stream().anyMatch(names -> names.getName().equalsIgnoreCase(resourceName));
\r