diff options
Diffstat (limited to 'cps-ncmp-service/src/main/java')
3 files changed, 59 insertions, 72 deletions
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/AlternateIdChecker.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/AlternateIdChecker.java index 1096980e1d..3600d6da32 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/AlternateIdChecker.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/AlternateIdChecker.java @@ -22,13 +22,12 @@ package org.onap.cps.ncmp.impl.inventory; import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; import java.util.Set; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.onap.cps.ncmp.api.inventory.models.NcmpServiceCmHandle; -import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle; import org.onap.cps.spi.exceptions.DataNodeNotFoundException; import org.springframework.stereotype.Service; @@ -46,59 +45,6 @@ public class AlternateIdChecker { private static final String NO_CURRENT_ALTERNATE_ID = ""; /** - * Check if the alternate can be applied to the given cm handle (id). - * Conditions: - * - proposed alternate is blank (it wil be ignored) - * - proposed alternate is same as current (no change) - * - proposed alternate is not in use for a different cm handle (in the DB) - * - * @param cmHandleId cm handle id - * @param proposedAlternateId proposed alternate id - * @return true if the new alternate id not in use or equal to current alternate id, false otherwise - */ - public boolean canApplyAlternateId(final String cmHandleId, final String proposedAlternateId) { - String currentAlternateId = ""; - try { - final YangModelCmHandle yangModelCmHandle = inventoryPersistence.getYangModelCmHandle(cmHandleId); - currentAlternateId = yangModelCmHandle.getAlternateId(); - } catch (final DataNodeNotFoundException dataNodeNotFoundException) { - // work with blank current alternate id - } - return this.canApplyAlternateId(cmHandleId, currentAlternateId, proposedAlternateId); - } - - /** - * Check if the alternate can be applied to the given cm handle. - * Conditions: - * - proposed alternate is blank (it wil be ignored) - * - proposed alternate is same as current (no change) - * - proposed alternate is not in use for a different cm handle (in the DB) - * - * @param cmHandleId cm handle id - * @param currentAlternateId current alternate id - * @param proposedAlternateId new alternate id - * @return true if the new alternate id not in use or equal to current alternate id, false otherwise - */ - public boolean canApplyAlternateId(final String cmHandleId, - final String currentAlternateId, - final String proposedAlternateId) { - if (StringUtils.isBlank(currentAlternateId)) { - if (alternateIdAlreadyInDb(proposedAlternateId)) { - log.warn("Alternate id update ignored, cannot update cm handle {}, alternate id is already " - + "assigned to a different cm handle", cmHandleId); - return false; - } - return true; - } - if (currentAlternateId.equals(proposedAlternateId)) { - return true; - } - log.warn("Alternate id update ignored, cannot update cm handle {}, already has an alternate id of {}", - cmHandleId, currentAlternateId); - return false; - } - - /** * Check all alternate ids of a batch of cm handles. * Includes cross-checks in the batch itself for duplicates. Only the first entry encountered wil be accepted. * @@ -109,13 +55,13 @@ public class AlternateIdChecker { public Collection<String> getIdsOfCmHandlesWithRejectedAlternateId( final Collection<NcmpServiceCmHandle> newNcmpServiceCmHandles, final Operation operation) { - final Set<String> acceptedAlternateIds = new HashSet<>(newNcmpServiceCmHandles.size()); + final Set<String> assignedAlternateIds = getAlternateIdsAlreadyInDb(newNcmpServiceCmHandles); final Collection<String> rejectedCmHandleIds = new ArrayList<>(); for (final NcmpServiceCmHandle ncmpServiceCmHandle : newNcmpServiceCmHandles) { final String cmHandleId = ncmpServiceCmHandle.getCmHandleId(); final String proposedAlternateId = ncmpServiceCmHandle.getAlternateId(); - if (isProposedAlternateIdAcceptable(proposedAlternateId, operation, acceptedAlternateIds, cmHandleId)) { - acceptedAlternateIds.add(proposedAlternateId); + if (isProposedAlternateIdAcceptable(proposedAlternateId, operation, assignedAlternateIds, cmHandleId)) { + assignedAlternateIds.add(proposedAlternateId); } else { rejectedCmHandleIds.add(cmHandleId); } @@ -124,28 +70,46 @@ public class AlternateIdChecker { } private boolean isProposedAlternateIdAcceptable(final String proposedAlternateId, final Operation operation, - final Set<String> acceptedAlternateIds, final String cmHandleId) { - if (StringUtils.isEmpty(proposedAlternateId)) { + final Set<String> assignedAlternateIds, final String cmHandleId) { + if (StringUtils.isBlank(proposedAlternateId)) { return true; } - if (acceptedAlternateIds.contains(proposedAlternateId)) { - log.warn("Alternate id update ignored, cannot update cm handle {}, alternate id is already " - + "assigned to a different cm handle (in this batch)", cmHandleId); + final String currentAlternateId = getCurrentAlternateId(operation, cmHandleId); + if (currentAlternateId.equals(proposedAlternateId)) { + return true; + } + if (StringUtils.isNotBlank(currentAlternateId)) { + log.warn("Alternate id update ignored, cannot update cm handle {}, already has an alternate id of {}", + cmHandleId, currentAlternateId); return false; } - if (Operation.CREATE.equals(operation)) { - return canApplyAlternateId(cmHandleId, NO_CURRENT_ALTERNATE_ID, proposedAlternateId); + if (assignedAlternateIds.contains(proposedAlternateId)) { + log.warn("Alternate id update ignored, cannot update cm handle {}, alternate id is already " + + "assigned to a different cm handle", cmHandleId); + return false; } - return canApplyAlternateId(cmHandleId, proposedAlternateId); + return true; } - private boolean alternateIdAlreadyInDb(final String alternateId) { - try { - inventoryPersistence.getCmHandleDataNodeByAlternateId(alternateId); - } catch (final DataNodeNotFoundException dataNodeNotFoundException) { - return false; + private Set<String> getAlternateIdsAlreadyInDb(final Collection<NcmpServiceCmHandle> ncmpServiceCmHandles) { + final Set<String> alternateIdsToCheck = ncmpServiceCmHandles.stream() + .map(NcmpServiceCmHandle::getAlternateId) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toSet()); + return inventoryPersistence.getCmHandleDataNodesByAlternateIds(alternateIdsToCheck).stream() + .map(dataNode -> (String) dataNode.getLeaves().get("alternate-id")) + .collect(Collectors.toSet()); + } + + private String getCurrentAlternateId(final Operation operation, final String cmHandleId) { + if (operation == Operation.UPDATE) { + try { + return inventoryPersistence.getYangModelCmHandle(cmHandleId).getAlternateId(); + } catch (final DataNodeNotFoundException dataNodeNotFoundException) { + // work with blank current alternate id + } } - return true; + return NO_CURRENT_ALTERNATE_ID; } } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistence.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistence.java index beef752ef1..a0d3a3eaee 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistence.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistence.java @@ -130,6 +130,14 @@ public interface InventoryPersistence extends NcmpPersistence { DataNode getCmHandleDataNodeByAlternateId(String alternateId); /** + * Get data nodes for the given batch of alternate ids. + * + * @param alternateIds alternate IDs + * @return data nodes + */ + Collection<DataNode> getCmHandleDataNodesByAlternateIds(Collection<String> alternateIds); + + /** * Get collection of data nodes of given cm handles. * * @param cmHandleIds collection of cmHandle IDs diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImpl.java index 083b25db3d..42123f1a26 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImpl.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImpl.java @@ -32,6 +32,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.onap.cps.api.CpsAnchorService; import org.onap.cps.api.CpsDataService; @@ -184,6 +185,15 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv } @Override + public Collection<DataNode> getCmHandleDataNodesByAlternateIds(final Collection<String> alternateIds) { + if (alternateIds.isEmpty()) { + return Collections.emptyList(); + } + final String cpsPathForCmHandlesByAlternateIds = getCpsPathForCmHandlesByAlternateIds(alternateIds); + return cmHandleQueryService.queryNcmpRegistryByCpsPath(cpsPathForCmHandlesByAlternateIds, OMIT_DESCENDANTS); + } + + @Override public Collection<DataNode> getCmHandleDataNodes(final Collection<String> cmHandleIds) { final Collection<String> xpaths = new ArrayList<>(cmHandleIds.size()); cmHandleIds.forEach(cmHandleId -> xpaths.add(getXPathForCmHandleById(cmHandleId))); @@ -212,6 +222,11 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv return NCMP_DMI_REGISTRY_PARENT + "/cm-handles[@alternate-id='" + alternateId + "']"; } + private static String getCpsPathForCmHandlesByAlternateIds(final Collection<String> alternateIds) { + return alternateIds.stream().collect(Collectors.joining("' or @alternate-id='", + NCMP_DMI_REGISTRY_PARENT + "/cm-handles[@alternate-id='", "']")); + } + private static String createStateJsonData(final String state) { return "{\"state\":" + state + "}"; } |