package org.openecomp.sdc.be.components.merge.capability; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Predicate; import java.util.stream.Collectors; import org.apache.commons.collections.CollectionUtils; import org.openecomp.sdc.be.components.merge.utils.MergeInstanceUtils; import org.openecomp.sdc.be.dao.utils.MapUtil; import org.openecomp.sdc.be.model.CapabilityDefinition; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.ComponentInstance; @org.springframework.stereotype.Component public class SimpleCapabilityResolver implements CapabilityResolver { private MergeInstanceUtils mergeInstanceUtils; public SimpleCapabilityResolver(MergeInstanceUtils mergeInstanceUtils) { this.mergeInstanceUtils = mergeInstanceUtils; } @Override public Map resolvePrevCapToNewCapability(Component container, Component prevInstanceOrigNode, String cmptInstanceId, List prevCapabilities) { Map> newCapabilitiesByType = resolveInstanceCapabilities(container, cmptInstanceId).getCapabilities(); Map oldCapOwnerToNewOwner = mapOldToNewCapabilitiesOwnerIds(container, prevInstanceOrigNode, cmptInstanceId, prevCapabilities); return mapOldToNewCapabilities(prevCapabilities, newCapabilitiesByType, oldCapOwnerToNewOwner); } @Override public Map resolvePrevCapIdToNewCapability(ComponentInstance oldInstance, ComponentInstance currInstance) { Map> newCapabilitiesByType = currInstance.getCapabilities(); Map oldCapOwnerToNewOwner = mergeInstanceUtils.mapOldToNewCapabilitiesOwnerIds(oldInstance, currInstance); List prevCapabilities = oldInstance.getCapabilities().values().stream().flatMap(Collection::stream).collect(Collectors.toList()); return mapOldToNewCapabilities(prevCapabilities, newCapabilitiesByType, oldCapOwnerToNewOwner); } private Map mapOldToNewCapabilities(List prevCapabilities, Map> newCapabilitiesByType, Map oldCapOwnerToNewOwner) { Map oldToNewCapability = prevCapabilities .stream() .collect(HashMap::new, (resultMap, prevCap) -> mapOldToNewCapability(newCapabilitiesByType, oldCapOwnerToNewOwner, resultMap, prevCap), HashMap::putAll); removeNotFoundNewCapabilities(oldToNewCapability); return oldToNewCapability; } private CapabilityDefinition mapOldToNewCapability(Map> newCapabilitiesByType, Map oldCapOwnerToNewOwner, Map resultMap, CapabilityDefinition prevCap) { return resultMap.put(prevCap, findCurrCapability(newCapabilitiesByType, prevCap, oldCapOwnerToNewOwner.get(prevCap.getOwnerId()))); } private Map mapOldToNewCapabilitiesOwnerIds(Component container, Component origInstanceNode, String cmptInstanceId, List prevCapabilities) { List prevCapOwnerIds = prevCapabilities.stream().map(CapabilityDefinition::getOwnerId).distinct().collect(Collectors.toList()); return mergeInstanceUtils.mapOldToNewCapabilitiesOwnerIds(container, origInstanceNode, cmptInstanceId, prevCapOwnerIds); } private void removeNotFoundNewCapabilities(Map oldToNewCapMap) { oldToNewCapMap.values().removeIf(Objects::isNull); } private ComponentInstance resolveInstanceCapabilities(Component capabilityOwnerContainer, String cmptInstanceId) { return MapUtil.toMap(capabilityOwnerContainer.getComponentInstances(), ComponentInstance::getUniqueId).get(cmptInstanceId); } private CapabilityDefinition findCurrCapability(Map> capabilitiesByType, CapabilityDefinition oldCap, String newCapOwnerId) { List newCapOfType = capabilitiesByType.get(oldCap.getType()); if (newCapOwnerId == null || CollectionUtils.isEmpty(newCapOfType)) { return null; } return newCapOfType.stream().filter(sameNameAndOwner(oldCap.getName(), newCapOwnerId)) .findFirst().orElse(null); } private Predicate sameNameAndOwner(String capName, String newCapOwnerId) { return newCap -> newCap.getName().equals(capName) && newCap.getOwnerId().equals(newCapOwnerId); } }