/* * ============LICENSE_START======================================================= * Copyright (C) 2021 Nordix Foundation * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ package org.openecomp.sdc.be.model.operations.impl; import fj.data.Either; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.openecomp.sdc.be.config.BeEcompErrorManager; import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity; import org.openecomp.sdc.be.dao.janusgraph.HealingJanusGraphGenericDao; import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus; import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum; import org.openecomp.sdc.be.model.DataTypeDefinition; import org.openecomp.sdc.be.resources.data.DataTypeData; import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component("dataType-operation") public class DataTypeOperation extends AbstractOperation { private static final Logger LOGGER = LoggerFactory.getLogger(DataTypeOperation.class); private final ModelOperation modelOperation; @Autowired public DataTypeOperation(final HealingJanusGraphGenericDao janusGraphGenericDao, final ModelOperation modelOperation) { this.janusGraphGenericDao = janusGraphGenericDao; this.modelOperation = modelOperation; } public List getAllDataTypeNodes() { final List dataTypesFound = new ArrayList<>(); final Either, JanusGraphOperationStatus> getAllDataTypesWithNullModel = janusGraphGenericDao.getByCriteria(NodeTypeEnum.DataType, null, DataTypeData.class); final var dataTypesValidated = validateDataType(getAllDataTypesWithNullModel, null); if (CollectionUtils.isNotEmpty(dataTypesValidated)) { dataTypesFound.addAll(dataTypesValidated); } final List allDataTypeNodesWithModel = getAllDataTypesWithModel(); if(CollectionUtils.isNotEmpty(allDataTypeNodesWithModel)) { dataTypesFound.addAll(allDataTypeNodesWithModel); } return dataTypesFound; } public List getAllDataTypesWithModel() { final List dataTypesWithModel = new ArrayList<>(); modelOperation.findAllModels() .forEach(model -> { final var modelName = model.getName(); final Either, JanusGraphOperationStatus> getAllDataTypesByModel = janusGraphGenericDao .getByCriteriaForModel(NodeTypeEnum.DataType, null, modelName, DataTypeData.class); final var dataTypesValidated = validateDataType(getAllDataTypesByModel, modelName); dataTypesWithModel.addAll(dataTypesValidated); }); return dataTypesWithModel; } private List validateDataType(final Either, JanusGraphOperationStatus> getDataTypes, final String modelName) { if (getDataTypes.isRight() && getDataTypes.right().value() == JanusGraphOperationStatus.NOT_FOUND) { return Collections.emptyList(); } if (getDataTypes.isRight()) { final var status = getDataTypes.right().value(); if (LOGGER.isErrorEnabled()) { final var errorMsg= String.format("Failed to fetch data types from database with model %s. Status is %s", modelName, status); LOGGER.error(String.valueOf(EcompLoggerErrorCode.UNKNOWN_ERROR), DataTypeOperation.class.getName(), errorMsg); BeEcompErrorManager.getInstance().logInternalConnectionError(DataTypeOperation.class.getName(), errorMsg, ErrorSeverity.ERROR); } return Collections.emptyList(); } return getDataTypes.left().value(); } public Map> mapDataTypesDefinitionByModel(final Map allDataTypes) { final Map dataTypesWithNullModelMap = new HashMap<>(); final Map dataTypesWithModelMap = new HashMap<>(); final Map> dataTypesMappedByModel = new HashMap<>(); allDataTypes.values().stream().forEach(dataTypeDefinition -> { final var model = dataTypeDefinition.getModel(); final var dataTypeDefinitionName = dataTypeDefinition.getName(); if (model == null) { dataTypesWithNullModelMap.put(dataTypeDefinitionName, dataTypeDefinition); } else { dataTypesWithModelMap.put(dataTypeDefinitionName, dataTypeDefinition); if (dataTypesMappedByModel.containsKey(model)) { dataTypesMappedByModel.get(model).put(dataTypeDefinitionName, dataTypeDefinition); } else { dataTypesMappedByModel.put(model, dataTypesWithModelMap); } } }); if(MapUtils.isNotEmpty(dataTypesWithNullModelMap)) { dataTypesMappedByModel.put(null, dataTypesWithNullModelMap); } return dataTypesMappedByModel; } }