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