package org.onap.cps.ncmp.api.impl;
-import static org.onap.cps.ncmp.api.impl.constants.DmiRegistryConstants.NCMP_DATASPACE_NAME;
-import static org.onap.cps.ncmp.api.impl.constants.DmiRegistryConstants.NCMP_DMI_REGISTRY_ANCHOR;
import static org.onap.cps.ncmp.api.impl.utils.YangDataConverter.convertYangModelCmHandleToNcmpServiceCmHandle;
+import static org.onap.cps.spi.FetchDescendantsOption.FETCH_DIRECT_CHILDREN_ONLY;
import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS;
+import static org.onap.cps.utils.CmHandleQueryRestParametersValidator.validateCpsPathConditionProperties;
import static org.onap.cps.utils.CmHandleQueryRestParametersValidator.validateModuleNameConditionProperties;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.function.Function;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.onap.cps.cpspath.parser.PathParsingException;
import org.onap.cps.ncmp.api.NetworkCmProxyCmHandlerQueryService;
import org.onap.cps.ncmp.api.impl.utils.YangDataConverter;
+import org.onap.cps.ncmp.api.inventory.CmHandleQueries;
+import org.onap.cps.ncmp.api.inventory.InventoryPersistence;
import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle;
-import org.onap.cps.spi.CpsAdminPersistenceService;
-import org.onap.cps.spi.CpsDataPersistenceService;
+import org.onap.cps.spi.exceptions.DataValidationException;
import org.onap.cps.spi.model.Anchor;
import org.onap.cps.spi.model.CmHandleQueryServiceParameters;
import org.onap.cps.spi.model.ConditionProperties;
import org.onap.cps.spi.model.DataNode;
+import org.onap.cps.utils.ValidQueryProperties;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class NetworkCmProxyCmHandlerQueryServiceImpl implements NetworkCmProxyCmHandlerQueryService {
- private static final String PROPERTY_QUERY_NAME = "hasAllProperties";
- private static final String MODULE_QUERY_NAME = "hasAllModules";
- private static final Object NO_QUERY_EXECUTED = null;
- private final CpsDataPersistenceService cpsDataPersistenceService;
- private final CpsAdminPersistenceService cpsAdminPersistenceService;
+ private static final Map<String, NcmpServiceCmHandle> NO_QUERY_TO_EXECUTE = null;
+ private final CmHandleQueries cmHandleQueries;
+ private final InventoryPersistence inventoryPersistence;
/**
* Query and return cm handles that match the given query parameters.
*/
@Override
public Set<NcmpServiceCmHandle> queryCmHandles(
- final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
+ final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
if (cmHandleQueryServiceParameters.getCmHandleQueryParameters().isEmpty()) {
return getAllCmHandles();
}
- final Map<String, NcmpServiceCmHandle> publicPropertyQueryResult
- = executePublicPropertyQueries(cmHandleQueryServiceParameters);
+ final Map<String, NcmpServiceCmHandle> combinedQueryResult = executeInventoryQueries(
+ cmHandleQueryServiceParameters);
- final Map<String, NcmpServiceCmHandle> combinedQueryResult =
- combineWithModuleNameQuery(cmHandleQueryServiceParameters, publicPropertyQueryResult);
-
- return combinedQueryResult == NO_QUERY_EXECUTED
- ? Collections.emptySet() : new HashSet<NcmpServiceCmHandle>(combinedQueryResult.values());
+ return new HashSet<>(combineWithModuleNameQuery(cmHandleQueryServiceParameters, combinedQueryResult).values());
}
/**
*/
@Override
public Set<String> queryCmHandleIds(
- final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
+ final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
if (cmHandleQueryServiceParameters.getCmHandleQueryParameters().isEmpty()) {
return getAllCmHandleIds();
}
- final Map<String, NcmpServiceCmHandle> publicPropertyQueryResult
- = executePublicPropertyQueries(cmHandleQueryServiceParameters);
+ final Map<String, NcmpServiceCmHandle> combinedQueryResult = executeInventoryQueries(
+ cmHandleQueryServiceParameters);
final Collection<String> moduleNamesForQuery =
- getModuleNamesForQuery(cmHandleQueryServiceParameters.getCmHandleQueryParameters());
+ getModuleNamesForQuery(cmHandleQueryServiceParameters.getCmHandleQueryParameters());
if (moduleNamesForQuery.isEmpty()) {
- return publicPropertyQueryResult == NO_QUERY_EXECUTED
- ? Collections.emptySet() : publicPropertyQueryResult.keySet();
+ return combinedQueryResult.keySet();
}
final Set<String> moduleNameQueryResult = getNamesOfAnchorsWithGivenModules(moduleNamesForQuery);
- if (publicPropertyQueryResult == NO_QUERY_EXECUTED) {
+ if (combinedQueryResult == NO_QUERY_TO_EXECUTE) {
return moduleNameQueryResult;
}
- moduleNameQueryResult.retainAll(publicPropertyQueryResult.keySet());
+ moduleNameQueryResult.retainAll(combinedQueryResult.keySet());
return moduleNameQueryResult;
}
- private Map<String, NcmpServiceCmHandle> executePublicPropertyQueries(
- final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
- final Map<String, String> publicPropertyQueryPairs =
- getPublicPropertyPairs(cmHandleQueryServiceParameters.getCmHandleQueryParameters());
- if (publicPropertyQueryPairs.isEmpty()) {
- return null;
- }
- Map<String, NcmpServiceCmHandle> cmHandleIdToNcmpServiceCmHandles = null;
- for (final Map.Entry<String, String> entry : publicPropertyQueryPairs.entrySet()) {
- final String cmHandlePath = "//public-properties[@name='" + entry.getKey() + "' and @value='"
- + entry.getValue() + "']/ancestor::cm-handles";
-
- final Collection<DataNode> dataNodes = queryDataNodes(cmHandlePath);
- if (cmHandleIdToNcmpServiceCmHandles == NO_QUERY_EXECUTED) {
- cmHandleIdToNcmpServiceCmHandles = collectDataNodesToNcmpServiceCmHandles(dataNodes);
- } else {
- final Collection<String> cmHandleIdsToRetain = dataNodes.parallelStream()
- .map(dataNode -> dataNode.getLeaves().get("id").toString()).collect(Collectors.toSet());
- cmHandleIdToNcmpServiceCmHandles.keySet().retainAll(cmHandleIdsToRetain);
- }
- if (cmHandleIdToNcmpServiceCmHandles.isEmpty()) {
- break;
- }
- }
- return cmHandleIdToNcmpServiceCmHandles;
- }
-
private Map<String, NcmpServiceCmHandle> combineWithModuleNameQuery(
- final CmHandleQueryServiceParameters cmHandleQueryServiceParameters,
- final Map<String, NcmpServiceCmHandle> previousQueryResult) {
+ final CmHandleQueryServiceParameters cmHandleQueryServiceParameters,
+ final Map<String, NcmpServiceCmHandle> previousQueryResult) {
final Collection<String> moduleNamesForQuery =
- getModuleNamesForQuery(cmHandleQueryServiceParameters.getCmHandleQueryParameters());
+ getModuleNamesForQuery(cmHandleQueryServiceParameters.getCmHandleQueryParameters());
if (moduleNamesForQuery.isEmpty()) {
return previousQueryResult;
}
return Collections.emptyMap();
}
final Map<String, NcmpServiceCmHandle> queryResult = new HashMap<>(cmHandleIdsByModuleName.size());
- if (previousQueryResult == NO_QUERY_EXECUTED) {
- //TODO Discuss performance/scaling of getting ALL cmHandles here
- getAllCmHandles().forEach(ncmpServiceCmHandle -> {
- if (cmHandleIdsByModuleName.contains(ncmpServiceCmHandle.getCmHandleId())) {
- queryResult.put(ncmpServiceCmHandle.getCmHandleId(), ncmpServiceCmHandle);
- }
- });
+ if (previousQueryResult == NO_QUERY_TO_EXECUTE) {
+ cmHandleIdsByModuleName.forEach(cmHandleId ->
+ queryResult.put(cmHandleId, createNcmpServiceCmHandle(
+ inventoryPersistence.getDataNode("/dmi-registry/cm-handles[@id='" + cmHandleId + "']")))
+ );
return queryResult;
}
previousQueryResult.keySet().retainAll(cmHandleIdsByModuleName);
return queryResult;
}
+ private Map<String, NcmpServiceCmHandle> executeInventoryQueries(
+ final CmHandleQueryServiceParameters cmHandleQueryServiceParameters) {
+ final Map<String, String> cpsPath = getCpsPath(cmHandleQueryServiceParameters.getCmHandleQueryParameters());
+ if (!validateCpsPathConditionProperties(cpsPath)) {
+ return Collections.emptyMap();
+ }
+ final Map<String, NcmpServiceCmHandle> cpsPathQueryResult;
+ if (cpsPath.isEmpty()) {
+ cpsPathQueryResult = NO_QUERY_TO_EXECUTE;
+ } else {
+ try {
+ cpsPathQueryResult = cmHandleQueries.queryCmHandleDataNodesByCpsPath(
+ cpsPath.get("cpsPath"), INCLUDE_ALL_DESCENDANTS)
+ .stream().map(this::createNcmpServiceCmHandle)
+ .collect(Collectors.toMap(NcmpServiceCmHandle::getCmHandleId,
+ Function.identity()));
+ } catch (final PathParsingException pathParsingException) {
+ throw new DataValidationException(pathParsingException.getMessage(), pathParsingException.getDetails(),
+ pathParsingException);
+ }
+ if (cpsPathQueryResult.isEmpty()) {
+ return Collections.emptyMap();
+ }
+ }
+
+ final Map<String, String> publicPropertyQueryPairs =
+ getPublicPropertyPairs(cmHandleQueryServiceParameters.getCmHandleQueryParameters());
+ final Map<String, NcmpServiceCmHandle> propertiesQueryResult = publicPropertyQueryPairs.isEmpty()
+ ? NO_QUERY_TO_EXECUTE : cmHandleQueries.queryCmHandlePublicProperties(publicPropertyQueryPairs);
+
+ return cmHandleQueries.combineCmHandleQueries(cpsPathQueryResult, propertiesQueryResult);
+ }
+
private Set<String> getNamesOfAnchorsWithGivenModules(final Collection<String> moduleNamesForQuery) {
- final Collection<Anchor> anchors =
- cpsAdminPersistenceService.queryAnchors("NFP-Operational", moduleNamesForQuery);
+ final Collection<Anchor> anchors = inventoryPersistence.queryAnchors(moduleNamesForQuery);
return anchors.parallelStream().map(Anchor::getName).collect(Collectors.toSet());
}
- private Map<String, NcmpServiceCmHandle> collectDataNodesToNcmpServiceCmHandles(
- final Collection<DataNode> dataNodes) {
- final Map<String, NcmpServiceCmHandle> cmHandleIdToNcmpServiceCmHandle = new HashMap<>();
- dataNodes.forEach(dataNode -> {
- final NcmpServiceCmHandle ncmpServiceCmHandle = createNcmpServiceCmHandle(dataNode);
- cmHandleIdToNcmpServiceCmHandle.put(ncmpServiceCmHandle.getCmHandleId(), ncmpServiceCmHandle);
- });
- return cmHandleIdToNcmpServiceCmHandle;
+ private Collection<String> getModuleNamesForQuery(final List<ConditionProperties> conditionProperties) {
+ final List<String> result = new ArrayList<>();
+ getConditions(conditionProperties, ValidQueryProperties.HAS_ALL_MODULES.getQueryProperty())
+ .parallelStream().forEach(
+ conditionProperty -> {
+ validateModuleNameConditionProperties(conditionProperty);
+ result.add(conditionProperty.get("moduleName"));
+ }
+ );
+ return result;
+ }
+
+ private Map<String, String> getCpsPath(final List<ConditionProperties> conditionProperties) {
+ final Map<String, String> result = new HashMap<>();
+ getConditions(conditionProperties, ValidQueryProperties.WITH_CPS_PATH.getQueryProperty()).forEach(
+ result::putAll);
+ return result;
+ }
+
+ private Map<String, String> getPublicPropertyPairs(final List<ConditionProperties> conditionProperties) {
+ final Map<String, String> result = new HashMap<>();
+ getConditions(conditionProperties,
+ ValidQueryProperties.HAS_ALL_PROPERTIES.getQueryProperty()).forEach(result::putAll);
+ return result;
}
private List<Map<String, String>> getConditions(final List<ConditionProperties> conditionProperties,
return Collections.emptyList();
}
- private Collection<String> getModuleNamesForQuery(final List<ConditionProperties> conditionProperties) {
- final List<String> result = new ArrayList<>();
- getConditions(conditionProperties, MODULE_QUERY_NAME).parallelStream().forEach(
- conditionProperty -> {
- validateModuleNameConditionProperties(conditionProperty);
- result.add(conditionProperty.get("moduleName"));
- }
- );
- return result;
- }
-
- private Map<String, String> getPublicPropertyPairs(final List<ConditionProperties> conditionProperties) {
- final Map<String, String> result = new HashMap<>();
- getConditions(conditionProperties, PROPERTY_QUERY_NAME).forEach(result::putAll);
- return result;
- }
-
private Set<NcmpServiceCmHandle> getAllCmHandles() {
- return queryDataNodes("/dmi-registry/cm-handles").stream()
- .map(this::createNcmpServiceCmHandle).collect(Collectors.toSet());
+ return inventoryPersistence.getDataNode("/dmi-registry")
+ .getChildDataNodes().stream().map(this::createNcmpServiceCmHandle).collect(Collectors.toSet());
}
private Set<String> getAllCmHandleIds() {
- return cpsAdminPersistenceService.getAnchors("NFP-Operational")
- .parallelStream().map(Anchor::getName).collect(Collectors.toSet());
- }
-
- private List<DataNode> queryDataNodes(final String cmHandlePath) {
- return cpsDataPersistenceService.queryDataNodes(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
- cmHandlePath, INCLUDE_ALL_DESCENDANTS);
+ return inventoryPersistence.getDataNode("/dmi-registry", FETCH_DIRECT_CHILDREN_ONLY)
+ .getChildDataNodes().stream().map(dataNode -> dataNode.getLeaves().get("id").toString())
+ .collect(Collectors.toSet());
}
private NcmpServiceCmHandle createNcmpServiceCmHandle(final DataNode dataNode) {
return convertYangModelCmHandleToNcmpServiceCmHandle(YangDataConverter
- .convertCmHandleToYangModel(dataNode, dataNode.getLeaves().get("id").toString()));
+ .convertCmHandleToYangModel(dataNode, dataNode.getLeaves().get("id").toString()));
}
}