From 404bfc9c50e95df1e75dbf8325fae41bfd96871a Mon Sep 17 00:00:00 2001
From: vasraz <vasyl.razinkov@est.tech>
Date: Mon, 3 Oct 2022 13:34:10 +0100
Subject: Implement API for fetching single data type

Signed-off-by: Vasyl Razinkov <vasyl.razinkov@est.tech>
Change-Id: Icebf660d67d503250e4f6d4d7fd5a2e169cdc951
Issue-ID: SDC-4184
---
 .../files/default/error-configuration.yaml         |   8 +-
 .../be/components/impl/DataTypeBusinessLogic.java  |   6 +-
 .../org/openecomp/sdc/be/impl/ComponentsUtils.java |   4 +-
 .../be/servlets/AbstractValidationsServlet.java    |  88 ++++++++---------
 .../openecomp/sdc/be/servlets/DataTypeServlet.java | 104 +++++++++++++++++++++
 .../openecomp/sdc/be/servlets/ServiceServlet.java  |  10 +-
 .../sdc/be/servlets/TypesFetchServlet.java         |  29 +++---
 .../main/resources/config/error-configuration.yaml |   8 +-
 8 files changed, 181 insertions(+), 76 deletions(-)
 create mode 100644 catalog-be/src/main/java/org/openecomp/sdc/be/servlets/DataTypeServlet.java

(limited to 'catalog-be/src/main')

diff --git a/catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml b/catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml
index 7b3ade82c7..47e2851b8e 100644
--- a/catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml
+++ b/catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml
@@ -2820,4 +2820,10 @@ errors:
     CAPABILITY_NOT_FOUND_IN_COMPONENT:
         code: 400
         message: "Capability '%1' not found in '%2' '%3'."
-        messageId: "SVC4186"
\ No newline at end of file
+        messageId: "SVC4186"
+
+    # %1 - The data type Uid
+    DATA_TYPE_NOT_FOUND:
+        code: 404
+        message: "Data type '%1' was not found."
+        messageId: "SVC4011"
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/DataTypeBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/DataTypeBusinessLogic.java
index 892536ffa7..687004a017 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/DataTypeBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/DataTypeBusinessLogic.java
@@ -91,10 +91,8 @@ public class DataTypeBusinessLogic extends BaseBusinessLogic {
         }
         List<DataTypeDefinition> dataTypes = dataTypesResult.left().value();
         Optional<DataTypeDefinition> findResult = dataTypes.stream().filter(e -> e.getName().equals(dataTypeName)).findAny();
-        if (!findResult.isPresent()) {
-            return Either.right(StorageOperationStatus.NOT_FOUND);
-        }
-        return Either.left(findResult.get());
+        return findResult.<Either<DataTypeDefinition, StorageOperationStatus>>map(Either::left)
+            .orElseGet(() -> Either.right(StorageOperationStatus.NOT_FOUND));
     }
 
     /**
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/impl/ComponentsUtils.java b/catalog-be/src/main/java/org/openecomp/sdc/be/impl/ComponentsUtils.java
index 313a303b61..dec13a94c8 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/impl/ComponentsUtils.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/impl/ComponentsUtils.java
@@ -774,7 +774,6 @@ public class ComponentsUtils {
                 responseEnum = ActionStatus.INVALID_CONTENT;
                 break;
             default:
-                responseEnum = ActionStatus.GENERAL_ERROR;
                 break;
         }
         return responseEnum;
@@ -1193,7 +1192,7 @@ public class ComponentsUtils {
                 responseEnum = ActionStatus.OK;
                 break;
             case ELEMENT_NOT_FOUND:
-                if (elementType != null && elementType == JsonPresentationFields.PROPERTY) {
+                if (elementType == JsonPresentationFields.PROPERTY) {
                     responseEnum = ActionStatus.PROPERTY_NOT_FOUND;
                 }
                 break;
@@ -1208,7 +1207,6 @@ public class ComponentsUtils {
                 responseEnum = ActionStatus.INVALID_ATTRIBUTE;
                 break;
             default:
-                responseEnum = ActionStatus.GENERAL_ERROR;
                 break;
         }
         return responseEnum;
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/AbstractValidationsServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/AbstractValidationsServlet.java
index 1eff7ab5ac..58d1b23bd6 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/AbstractValidationsServlet.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/AbstractValidationsServlet.java
@@ -27,7 +27,6 @@ import com.google.gson.JsonSyntaxException;
 import fj.data.Either;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Type;
@@ -96,13 +95,17 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
         .asList(TOSCA_SIMPLE_YAML_PREFIX + "1_0_0", TOSCA_SIMPLE_YAML_PREFIX + "1_1_0", "tosca_simple_profile_for_nfv_1_0_0",
             TOSCA_SIMPLE_YAML_PREFIX + "1_0", TOSCA_SIMPLE_YAML_PREFIX + "1_1", TOSCA_SIMPLE_YAML_PREFIX + "1_2", TOSCA_SIMPLE_YAML_PREFIX + "1_3");
     private static final List<String> TOSCA_YML_CSAR_VALID_SUFFIX = Arrays.asList(".yml", ".yaml", ".csar", ".meta");
+    private static final String INVALID_JSON_WAS_RECEIVED = "Invalid json was received.";
+    private static final String AUDIT_BEFORE_SENDING_RESPONSE = "audit before sending response";
+    private static final String VALIDATE_USER_ROLE = "validate user role";
+    private static final String USER_IS_NOT_IN_APPROPRIATE_ROLE_TO_PERFORM_ACTION = "user is not in appropriate role to perform action";
     protected final ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
     protected ServletUtils servletUtils;
     protected ResourceImportManager resourceImportManager;
     protected ServiceImportManager serviceImportManager;
 
-    public AbstractValidationsServlet(ComponentInstanceBusinessLogic componentInstanceBL,
-                                      ComponentsUtils componentsUtils, ServletUtils servletUtils, ResourceImportManager resourceImportManager) {
+    protected AbstractValidationsServlet(ComponentInstanceBusinessLogic componentInstanceBL,
+                                         ComponentsUtils componentsUtils, ServletUtils servletUtils, ResourceImportManager resourceImportManager) {
         super(componentsUtils);
         this.servletUtils = servletUtils;
         this.resourceImportManager = resourceImportManager;
@@ -186,11 +189,11 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
     }
 
     protected void validateUserRole(Wrapper<Response> errorResponseWrapper, User user) {
-        log.debug("validate user role");
+        log.debug(VALIDATE_USER_ROLE);
         if (!user.getRole().equals(Role.ADMIN.name()) && !user.getRole().equals(Role.DESIGNER.name())) {
-            log.info("user is not in appropriate role to perform action");
+            log.info(USER_IS_NOT_IN_APPROPRIATE_ROLE_TO_PERFORM_ACTION);
             ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
-            log.debug("audit before sending response");
+            log.debug(AUDIT_BEFORE_SENDING_RESPONSE);
             getComponentsUtils().auditResource(responseFormat, user, "", AuditingActionEnum.IMPORT_RESOURCE);
             Response response = buildErrorResponse(responseFormat);
             errorResponseWrapper.setInnerElement(response);
@@ -251,7 +254,7 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
         try (InputStream fileInputStream = new FileInputStream(file)) {
             byte[] data = new byte[(int) file.length()];
             if (fileInputStream.read(data) == -1) {
-                log.info("Invalid json was received.");
+                log.info(INVALID_JSON_WAS_RECEIVED);
                 ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
                 Response errorResp = buildErrorResponse(responseFormat);
                 responseWrapper.setInnerElement(errorResp);
@@ -268,12 +271,12 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
     }
 
     protected void validateUserRole(Wrapper<Response> errorResponseWrapper, User user, ResourceAuthorityTypeEnum resourceAuthority) {
-        log.debug("validate user role");
+        log.debug(VALIDATE_USER_ROLE);
         if (resourceAuthority == ResourceAuthorityTypeEnum.NORMATIVE_TYPE_BE) {
             if (!user.getRole().equals(Role.ADMIN.name())) {
-                log.info("user is not in appropriate role to perform action");
+                log.info(USER_IS_NOT_IN_APPROPRIATE_ROLE_TO_PERFORM_ACTION);
                 ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
-                log.debug("audit before sending response");
+                log.debug(AUDIT_BEFORE_SENDING_RESPONSE);
                 getComponentsUtils().auditResource(responseFormat, user, "", AuditingActionEnum.IMPORT_RESOURCE);
                 Response response = buildErrorResponse(responseFormat);
                 errorResponseWrapper.setInnerElement(response);
@@ -306,7 +309,7 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
             isValid = false;
         }
         if (!isValid) {
-            log.info("Invalid json was received.");
+            log.info(INVALID_JSON_WAS_RECEIVED);
             ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
             getComponentsUtils().auditResource(responseFormat, user, "", AuditingActionEnum.IMPORT_RESOURCE);
             Response errorResp = buildErrorResponse(responseFormat);
@@ -332,6 +335,7 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
         return getServletUtils().getGson();
     }
 
+    @Override
     public ComponentsUtils getComponentsUtils() {
         return getServletUtils().getComponentsUtils();
     }
@@ -470,7 +474,7 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
 
     private void validateToscaTemplatePayloadName(Wrapper<Response> responseWrapper, UploadResourceInfo uploadResourceInfo, User user) {
         String toscaTemplatePayloadName = uploadResourceInfo.getPayloadName();
-        boolean isValidSuffix = isToscaTemplatePayloadNameValid(responseWrapper, toscaTemplatePayloadName);
+        boolean isValidSuffix = isToscaTemplatePayloadNameValid(toscaTemplatePayloadName);
         if (!isValidSuffix) {
             ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_TOSCA_FILE_EXTENSION);
             Response errorResponse = buildErrorResponse(responseFormat);
@@ -479,7 +483,7 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
         }
     }
 
-    private boolean isToscaTemplatePayloadNameValid(Wrapper<Response> responseWrapper, String toscaTemplatePayloadName) {
+    private boolean isToscaTemplatePayloadNameValid(String toscaTemplatePayloadName) {
         boolean isValidSuffix = false;
         if (toscaTemplatePayloadName != null && !toscaTemplatePayloadName.isEmpty()) {
             for (String validSuffix : TOSCA_YML_CSAR_VALID_SUFFIX) {
@@ -913,21 +917,21 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
             validateUserRole(responseWrapper, userWrapper.getInnerElement(), serviceAuthorityEnum);
         }
         if (responseWrapper.isEmpty()) {
-            validateAndFillServiceJson(responseWrapper, uploadServiceInfoWrapper, userWrapper.getInnerElement(), serviceAuthorityEnum,
+            validateAndFillServiceJson(responseWrapper, uploadServiceInfoWrapper, serviceAuthorityEnum,
                 serviceInfoJsonString);
         }
         if (responseWrapper.isEmpty()) {
-            validateToscaTemplatePayloadName(responseWrapper, uploadServiceInfoWrapper.getInnerElement(), userWrapper.getInnerElement());
+            validateToscaTemplatePayloadName(responseWrapper, uploadServiceInfoWrapper.getInnerElement());
         }
     }
 
     protected void validateUserRole(Wrapper<Response> errorResponseWrapper, User user, ServiceAuthorityTypeEnum serviceAuthority) {
-        log.debug("validate user role");
+        log.debug(VALIDATE_USER_ROLE);
         if (serviceAuthority == ServiceAuthorityTypeEnum.NORMATIVE_TYPE_BE) {
             if (!user.getRole().equals(Role.ADMIN.name())) {
-                log.info("user is not in appropriate role to perform action");
+                log.info(USER_IS_NOT_IN_APPROPRIATE_ROLE_TO_PERFORM_ACTION);
                 ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
-                log.debug("audit before sending response");
+                log.debug(AUDIT_BEFORE_SENDING_RESPONSE);
                 Response response = buildErrorResponse(responseFormat);
                 errorResponseWrapper.setInnerElement(response);
             }
@@ -936,7 +940,7 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
         }
     }
 
-    protected void validateAndFillServiceJson(Wrapper<Response> responseWrapper, Wrapper<UploadServiceInfo> uploadServiceInfoWrapper, User user,
+    protected void validateAndFillServiceJson(Wrapper<Response> responseWrapper, Wrapper<UploadServiceInfo> uploadServiceInfoWrapper,
                                               ServiceAuthorityTypeEnum serviceAuthorityEnum, String serviceInfo) {
         boolean isValid;
         try {
@@ -961,16 +965,16 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
             isValid = false;
         }
         if (!isValid) {
-            log.info("Invalid json was received.");
+            log.info(INVALID_JSON_WAS_RECEIVED);
             ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
             Response errorResp = buildErrorResponse(responseFormat);
             responseWrapper.setInnerElement(errorResp);
         }
     }
 
-    protected void validateToscaTemplatePayloadName(Wrapper<Response> responseWrapper, UploadServiceInfo uploadServiceInfo, User user) {
+    protected void validateToscaTemplatePayloadName(Wrapper<Response> responseWrapper, UploadServiceInfo uploadServiceInfo) {
         String toscaTemplatePayloadName = uploadServiceInfo.getPayloadName();
-        boolean isValidSuffix = isToscaTemplatePayloadNameValid(responseWrapper, toscaTemplatePayloadName);
+        boolean isValidSuffix = isToscaTemplatePayloadNameValid(toscaTemplatePayloadName);
         if (!isValidSuffix) {
             ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_TOSCA_FILE_EXTENSION);
             Response errorResponse = buildErrorResponse(responseFormat);
@@ -979,35 +983,33 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
     }
 
     protected void specificServiceAuthorityValidations(Wrapper<Response> responseWrapper, Wrapper<UploadServiceInfo> uploadServiceInfoWrapper,
-                                                       Wrapper<String> yamlStringWrapper, User user, HttpServletRequest request,
-                                                       String serviceInfoJsonString, ServiceAuthorityTypeEnum serviceAuthorityEnum)
-        throws FileNotFoundException {
+                                                       Wrapper<String> yamlStringWrapper, HttpServletRequest request,
+                                                       String serviceInfoJsonString, ServiceAuthorityTypeEnum serviceAuthorityEnum) {
         if (responseWrapper.isEmpty()) {
             // UI Only Validation
             if (!serviceAuthorityEnum.isBackEndImport()) {
-                importUIValidations(responseWrapper, uploadServiceInfoWrapper.getInnerElement(), user, request, serviceInfoJsonString);
+                importUIValidations(responseWrapper, uploadServiceInfoWrapper.getInnerElement(), request, serviceInfoJsonString);
             }
             // User Defined Type Services
-            if (serviceAuthorityEnum.isUserTypeService() && !CsarValidationUtils
-                .isCsarPayloadName(uploadServiceInfoWrapper.getInnerElement().getPayloadName())) {
-                if (responseWrapper.isEmpty()) {
-                    validatePayloadNameSpace(responseWrapper, uploadServiceInfoWrapper.getInnerElement(), user, yamlStringWrapper.getInnerElement());
-                }
+            if (serviceAuthorityEnum.isUserTypeService()
+                && !CsarValidationUtils.isCsarPayloadName(uploadServiceInfoWrapper.getInnerElement().getPayloadName())
+                && responseWrapper.isEmpty()) {
+                validatePayloadNameSpace(responseWrapper, uploadServiceInfoWrapper.getInnerElement(), yamlStringWrapper.getInnerElement());
             }
         }
     }
 
-    protected void importUIValidations(Wrapper<Response> responseWrapper, UploadServiceInfo serviceInfo, User user, HttpServletRequest request,
+    protected void importUIValidations(Wrapper<Response> responseWrapper, UploadServiceInfo serviceInfo, HttpServletRequest request,
                                        String serviceInfoJsonString) {
         if (responseWrapper.isEmpty()) {
-            validateMD5(responseWrapper, user, serviceInfo, request, serviceInfoJsonString);
+            validateMD5(responseWrapper, request, serviceInfoJsonString);
         }
         if (responseWrapper.isEmpty() && request != null && request.getMethod() != null && request.getMethod().equals("POST")) {
-            validateServiceDoesNotExist(responseWrapper, user, serviceInfo.getName());
+            validateServiceDoesNotExist(responseWrapper, serviceInfo.getName());
         }
     }
 
-    protected void validatePayloadNameSpace(Wrapper<Response> responseWrapper, UploadServiceInfo serviceInfo, User user, String toscaPayload) {
+    protected void validatePayloadNameSpace(Wrapper<Response> responseWrapper, UploadServiceInfo serviceInfo, String toscaPayload) {
         boolean isValid;
         String nameSpace = "";
         Map<String, Object> mappedToscaTemplate = (Map<String, Object>) new Yaml().load(toscaPayload);
@@ -1036,7 +1038,7 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
         }
     }
 
-    protected void validateMD5(Wrapper<Response> responseWrapper, User user, UploadServiceInfo serviceInfo, HttpServletRequest request,
+    protected void validateMD5(Wrapper<Response> responseWrapper, HttpServletRequest request,
                                String serviceInfoJsonString) {
         boolean isValid;
         String recievedMD5 = request.getHeader(Constants.MD5_HEADER);
@@ -1053,7 +1055,7 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
         }
     }
 
-    protected void validateServiceDoesNotExist(Wrapper<Response> responseWrapper, User user, String serviceName) {
+    protected void validateServiceDoesNotExist(Wrapper<Response> responseWrapper, String serviceName) {
         if (serviceImportManager.isServiceExist(serviceName)) {
             ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.SERVICE_ALREADY_EXISTS);
             Response errorResponse = buildErrorResponse(responseFormat);
@@ -1061,13 +1063,12 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
         }
     }
 
-    protected void handleImportService(Wrapper<Response> responseWrapper, User user, UploadServiceInfo serviceInfoObject, String serviceUniqueId)
-        throws ZipException {
+    protected void handleImportService(Wrapper<Response> responseWrapper, User user, UploadServiceInfo serviceInfoObject) {
         Response response = null;
         ImmutablePair<Service, ActionStatus> importedServiceStatus = null;
         if (CsarValidationUtils.isCsarPayloadName(serviceInfoObject.getPayloadName())) {
             log.debug("import service from csar");
-            importedServiceStatus = importServiceFromUICsar(serviceInfoObject, user, serviceUniqueId);
+            importedServiceStatus = importServiceFromUICsar(serviceInfoObject, user);
         }
         if (importedServiceStatus != null) {
             Object representation = null;
@@ -1081,8 +1082,7 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
         responseWrapper.setInnerElement(response);
     }
 
-    private ImmutablePair<Service, ActionStatus> importServiceFromUICsar(UploadServiceInfo serviceInfoObject, User user, String serviceUniqueId)
-        throws ZipException {
+    private ImmutablePair<Service, ActionStatus> importServiceFromUICsar(UploadServiceInfo serviceInfoObject, User user) {
         Service service = new Service();
         String payloadName = serviceInfoObject.getPayloadName();
         fillServiceFromServiceInfoObject(service, serviceInfoObject);
@@ -1098,7 +1098,7 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
         fillArtifacts(service, serviceInfoObject);
     }
 
-    private Map<String, byte[]> getCsarFromPayload(UploadServiceInfo innerElement) throws ZipException {
+    private Map<String, byte[]> getCsarFromPayload(UploadServiceInfo innerElement) {
         String csarUUID = innerElement.getPayloadName();
         String payloadData = innerElement.getPayloadData();
         return getComponentCsarFromPayload(csarUUID, payloadData);
@@ -1180,7 +1180,7 @@ public abstract class AbstractValidationsServlet extends BeGenericServlet {
             log.debug("enter fillServicePayloadDataFromFile");
             byte[] data = new byte[(int) file.length()];
             if (fileInputStream.read(data) == -1) {
-                log.info("Invalid json was received.");
+                log.info(INVALID_JSON_WAS_RECEIVED);
                 ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
                 Response errorResp = buildErrorResponse(responseFormat);
                 responseWrapper.setInnerElement(errorResp);
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/DataTypeServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/DataTypeServlet.java
new file mode 100644
index 0000000000..4456b8346e
--- /dev/null
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/DataTypeServlet.java
@@ -0,0 +1,104 @@
+/*
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2022 Nordix Foundation. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.servlets;
+
+import com.jcabi.aspects.Loggable;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.servers.Server;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import java.util.Optional;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.openecomp.sdc.be.components.impl.aaf.AafPermission;
+import org.openecomp.sdc.be.components.impl.aaf.PermissionAllowed;
+import org.openecomp.sdc.be.config.BeEcompErrorManager;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datatypes.elements.DataTypeDataDefinition;
+import org.openecomp.sdc.be.exception.BusinessException;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.exception.OperationException;
+import org.openecomp.sdc.be.model.operations.impl.DataTypeOperation;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode;
+import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.springframework.stereotype.Controller;
+
+@Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
+@Path("/v1/catalog/data-types")
+@Tag(name = "SDCE-2 APIs")
+@Server(url = "/sdc2/rest")
+@Controller
+public class DataTypeServlet extends BeGenericServlet {
+
+    private static final Logger log = Logger.getLogger(DataTypeServlet.class);
+    private final DataTypeOperation dataTypeOperation;
+
+    public DataTypeServlet(final ComponentsUtils componentsUtils,
+                           final DataTypeOperation dataTypeOperation) {
+        super(componentsUtils);
+        this.dataTypeOperation = dataTypeOperation;
+    }
+
+    @GET
+    @Path("{dataTypeUid}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "Get data types", method = "GET", summary = "Returns data types", responses = {
+        @ApiResponse(content = @Content(schema = @Schema(implementation = DataTypeDataDefinition.class))),
+        @ApiResponse(responseCode = "200", description = "Data type found"),
+        @ApiResponse(responseCode = "403", description = "Restricted operation"),
+        @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
+        @ApiResponse(responseCode = "404", description = "Data types not found")})
+    @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
+    public Response fetchDataType(@Context final HttpServletRequest request,
+                                  @HeaderParam(value = Constants.USER_ID_HEADER) String userId,
+                                  @PathParam("dataTypeUid") String dataTypeUid) {
+        final String url = request.getMethod() + " " + request.getRequestURI();
+        log.debug("Start handle request of {} - modifier id is {}", url, userId);
+        final Optional<DataTypeDataDefinition> dataTypeByUid;
+        try {
+            dataTypeByUid = dataTypeOperation.getDataTypeByUid(dataTypeUid);
+        } catch (final BusinessException e) {
+            throw e;
+        } catch (final Exception ex) {
+            final String errorMsg = "Unexpected error while listing the Tosca DataType";
+            BeEcompErrorManager.getInstance().logBeRestApiGeneralError(errorMsg);
+            log.error(EcompLoggerErrorCode.UNKNOWN_ERROR, this.getClass().getName(), errorMsg, ex);
+            return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+        }
+        if (dataTypeByUid.isEmpty()) {
+            throw new OperationException(ActionStatus.DATA_TYPE_NOT_FOUND, dataTypeUid);
+        }
+        return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), dataTypeByUid);
+    }
+
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceServlet.java
index d3a2f7cca0..d314f6a01d 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceServlet.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/ServiceServlet.java
@@ -678,10 +678,10 @@ public class ServiceServlet extends AbstractValidationsServlet {
         Wrapper<String> yamlStringWrapper = new Wrapper<>();
         ServiceAuthorityTypeEnum serviceAuthorityTypeEnum = ServiceAuthorityTypeEnum.USER_TYPE_UI;
         commonServiceGeneralValidations(responseWrapper, userWrapper, uploadServiceInfoWrapper, serviceAuthorityTypeEnum, userId, data);
-        specificServiceAuthorityValidations(responseWrapper, uploadServiceInfoWrapper, yamlStringWrapper, userWrapper.getInnerElement(), request,
+        specificServiceAuthorityValidations(responseWrapper, uploadServiceInfoWrapper, yamlStringWrapper, request,
             data, serviceAuthorityTypeEnum);
         if (responseWrapper.isEmpty()) {
-            handleImportService(responseWrapper, userWrapper.getInnerElement(), uploadServiceInfoWrapper.getInnerElement(), serviceUniqueId);
+            handleImportService(responseWrapper, userWrapper.getInnerElement(), uploadServiceInfoWrapper.getInnerElement());
         }
         return responseWrapper;
     }
@@ -761,7 +761,7 @@ public class ServiceServlet extends AbstractValidationsServlet {
                 serviceInfoJsonString);
             fillServicePayload(responseWrapper, uploadServiceInfoWrapper, yamlStringWrapper, modifier, serviceInfoJsonString, serviceAuthorityEnum,
                 file);
-            specificServiceAuthorityValidations(responseWrapper, uploadServiceInfoWrapper, yamlStringWrapper, userWrapper.getInnerElement(), request,
+            specificServiceAuthorityValidations(responseWrapper, uploadServiceInfoWrapper, yamlStringWrapper, request,
                 serviceInfoJsonString, serviceAuthorityEnum);
             log.debug("importReplaceService:get payload:{}", uploadServiceInfoWrapper.getInnerElement().getPayloadData());
             ServiceMetadataDataDefinition serviceMetadataDataDefinition = (ServiceMetadataDataDefinition) oldService.getComponentMetadataDefinition()
@@ -773,10 +773,10 @@ public class ServiceServlet extends AbstractValidationsServlet {
             uploadServiceInfoWrapper.getInnerElement().setProjectCode(oldService.getProjectCode());
             if (responseWrapper.isEmpty()) {
                 log.debug("importReplaceService:start handleImportService");
-                handleImportService(responseWrapper, userWrapper.getInnerElement(), uploadServiceInfoWrapper.getInnerElement(), null);
+                handleImportService(responseWrapper, userWrapper.getInnerElement(), uploadServiceInfoWrapper.getInnerElement());
             }
             return responseWrapper.getInnerElement();
-        } catch (IOException | ZipException e) {
+        } catch (final ZipException e) {
             BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Import Service");
             log.debug("import service failed with exception", e);
             return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/TypesFetchServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/TypesFetchServlet.java
index 254bb8c92b..953fcda1bf 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/TypesFetchServlet.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/TypesFetchServlet.java
@@ -28,15 +28,12 @@ import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import io.swagger.v3.oas.annotations.servers.Server;
-import io.swagger.v3.oas.annotations.servers.Servers;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.tags.Tags;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 import javax.inject.Inject;
-import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
@@ -53,7 +50,6 @@ import org.openecomp.sdc.be.components.impl.CapabilitiesBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ComponentBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
 import org.openecomp.sdc.be.components.impl.InterfaceOperationBusinessLogic;
-import org.openecomp.sdc.be.components.impl.PropertyBusinessLogic;
 import org.openecomp.sdc.be.components.impl.RelationshipTypeBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ResourceBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ResourceImportManager;
@@ -83,14 +79,14 @@ import org.springframework.stereotype.Controller;
 
 @Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
 @Path("/v1/catalog")
-@Tags({@Tag(name = "SDCE-2 APIs")})
-@Servers({@Server(url = "/sdc2/rest")})
+@Tag(name = "SDCE-2 APIs")
+@Server(url = "/sdc2/rest")
 @Controller
 public class TypesFetchServlet extends AbstractValidationsServlet {
 
     private static final Logger log = Logger.getLogger(TypesFetchServlet.class);
     private static final String FAILED_TO_GET_ALL_NON_ABSTRACT = "failed to get all non abstract {}";
-    private final PropertyBusinessLogic propertyBusinessLogic;
+    private static final String START_HANDLE_REQUEST_OF_MODIFIER_ID_IS = "Start handle request of {} | modifier id is {}";
     private final RelationshipTypeBusinessLogic relationshipTypeBusinessLogic;
     private final CapabilitiesBusinessLogic capabilitiesBusinessLogic;
     private final InterfaceOperationBusinessLogic interfaceOperationBusinessLogic;
@@ -103,7 +99,6 @@ public class TypesFetchServlet extends AbstractValidationsServlet {
         ComponentsUtils componentsUtils,
         ServletUtils servletUtils,
         ResourceImportManager resourceImportManager,
-        PropertyBusinessLogic propertyBusinessLogic,
         RelationshipTypeBusinessLogic relationshipTypeBusinessLogic,
         CapabilitiesBusinessLogic capabilitiesBusinessLogic,
         InterfaceOperationBusinessLogic interfaceOperationBusinessLogic,
@@ -116,7 +111,6 @@ public class TypesFetchServlet extends AbstractValidationsServlet {
             servletUtils,
             resourceImportManager
         );
-        this.propertyBusinessLogic = propertyBusinessLogic;
         this.relationshipTypeBusinessLogic = relationshipTypeBusinessLogic;
         this.capabilitiesBusinessLogic = capabilitiesBusinessLogic;
         this.interfaceOperationBusinessLogic = interfaceOperationBusinessLogic;
@@ -173,7 +167,7 @@ public class TypesFetchServlet extends AbstractValidationsServlet {
             validateUserExist(responseWrapper, userWrapper, userId);
             if (responseWrapper.isEmpty()) {
                 String url = request.getMethod() + " " + request.getRequestURI();
-                log.info("Start handle request of {} | modifier id is {}", url, userId);
+                log.info(START_HANDLE_REQUEST_OF_MODIFIER_ID_IS, url, userId);
                 Either<Map<String, InterfaceDefinition>, ResponseFormat> allInterfaceLifecycleTypes = interfaceOperationBusinessLogic
                     .getAllInterfaceLifecycleTypes(modelName);
                 if (allInterfaceLifecycleTypes.isRight()) {
@@ -206,7 +200,7 @@ public class TypesFetchServlet extends AbstractValidationsServlet {
     @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
     public Response getAllCapabilityTypesServlet(@Context final HttpServletRequest request,
                                                  @HeaderParam(value = Constants.USER_ID_HEADER) String userId,
-                                                 @Parameter(description = "model", required = false) @QueryParam("model") String modelName) {
+                                                 @Parameter(description = "model") @QueryParam("model") String modelName) {
         Wrapper<Response> responseWrapper = new Wrapper<>();
         Wrapper<User> userWrapper = new Wrapper<>();
         try {
@@ -215,7 +209,7 @@ public class TypesFetchServlet extends AbstractValidationsServlet {
             modelName = ValidationUtils.sanitizeInputString(modelName);
             if (responseWrapper.isEmpty()) {
                 String url = request.getMethod() + " " + request.getRequestURI();
-                log.debug("Start handle request of {} | modifier id is {}", url, userId);
+                log.debug(START_HANDLE_REQUEST_OF_MODIFIER_ID_IS, url, userId);
                 Either<Map<String, CapabilityTypeDefinition>, ResponseFormat> allDataTypes = capabilitiesBusinessLogic.getAllCapabilityTypes(
                     modelName);
                 if (allDataTypes.isRight()) {
@@ -251,7 +245,7 @@ public class TypesFetchServlet extends AbstractValidationsServlet {
     @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
     public Response getAllRelationshipTypesServlet(@Context final HttpServletRequest request,
                                                    @HeaderParam(value = Constants.USER_ID_HEADER) String userId,
-                                                   @Parameter(description = "model", required = false) @QueryParam("model") String modelName) {
+                                                   @Parameter(description = "model") @QueryParam("model") String modelName) {
         Wrapper<Response> responseWrapper = new Wrapper<>();
         Wrapper<User> userWrapper = new Wrapper<>();
         try {
@@ -260,7 +254,7 @@ public class TypesFetchServlet extends AbstractValidationsServlet {
             modelName = ValidationUtils.sanitizeInputString(modelName);
             if (responseWrapper.isEmpty()) {
                 String url = request.getMethod() + " " + request.getRequestURI();
-                log.debug("Start handle request of {} | modifier id is {}", url, userId);
+                log.debug(START_HANDLE_REQUEST_OF_MODIFIER_ID_IS, url, userId);
                 Either<Map<String, RelationshipTypeDefinition>, ResponseFormat> allDataTypes = relationshipTypeBusinessLogic
                     .getAllRelationshipTypes(modelName);
                 if (allDataTypes.isRight()) {
@@ -296,11 +290,10 @@ public class TypesFetchServlet extends AbstractValidationsServlet {
     public Response getAllNodeTypesServlet(
         @Context final HttpServletRequest request,
         @HeaderParam(value = Constants.USER_ID_HEADER) String userId,
-        @Parameter(description = "model", required = false) @QueryParam("model") String modelName
+        @Parameter(description = "model") @QueryParam("model") String modelName
     ) {
         Wrapper<Response> responseWrapper = new Wrapper<>();
         Wrapper<User> userWrapper = new Wrapper<>();
-        ServletContext context = request.getSession().getServletContext();
         Either<Map<String, Component>, Response> response;
         Map<String, Component> componentMap;
         try {
@@ -309,7 +302,7 @@ public class TypesFetchServlet extends AbstractValidationsServlet {
             modelName = ValidationUtils.sanitizeInputString(modelName);
             if (responseWrapper.isEmpty()) {
                 String url = request.getMethod() + " " + request.getRequestURI();
-                log.debug("Start handle request of {} | modifier id is {}", url, userId);
+                log.debug(START_HANDLE_REQUEST_OF_MODIFIER_ID_IS, url, userId);
                 response = getComponent(resourceBusinessLogic, true, userId, modelName);
                 if (response.isRight()) {
                     return response.right().value();
@@ -343,7 +336,7 @@ public class TypesFetchServlet extends AbstractValidationsServlet {
         @ApiResponse(responseCode = "404", description = "Tosca Artifact Types not found")})
     @PermissionAllowed(AafPermission.PermNames.INTERNAL_ALL_VALUE)
     public Response getAllToscaArtifactTypes(@Parameter(description = "Model name") @QueryParam("model") String model,
-                                             @Context final HttpServletRequest request, @HeaderParam("USER_ID") String creator) {
+                                             @Context final HttpServletRequest request, @HeaderParam(Constants.USER_ID_HEADER) String creator) {
         try {
             return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), artifactsBusinessLogic.getAllToscaArtifacts(model));
         } catch (final BusinessException e) {
diff --git a/catalog-be/src/main/resources/config/error-configuration.yaml b/catalog-be/src/main/resources/config/error-configuration.yaml
index d31d4a6203..0081525647 100644
--- a/catalog-be/src/main/resources/config/error-configuration.yaml
+++ b/catalog-be/src/main/resources/config/error-configuration.yaml
@@ -2820,4 +2820,10 @@ errors:
     CAPABILITY_NOT_FOUND_IN_COMPONENT:
         code: 400
         message: "Capability '%1' not found in '%2' '%3'."
-        messageId: "SVC4186"
\ No newline at end of file
+        messageId: "SVC4186"
+
+    # %1 - The data type Uid
+    DATA_TYPE_NOT_FOUND:
+        code: 404
+        message: "Data type '%1' was not found."
+        messageId: "SVC4011"
-- 
cgit 1.2.3-korg