+
+ protected void commonServiceGeneralValidations(Wrapper<Response> responseWrapper, Wrapper<User> userWrapper,
+ Wrapper<UploadServiceInfo> uploadServiceInfoWrapper, ServiceAuthorityTypeEnum serviceAuthorityEnum,
+ String userUserId, String serviceInfoJsonString) {
+ if (responseWrapper.isEmpty()) {
+ validateUserExist(responseWrapper, userWrapper, userUserId);
+ }
+ if (responseWrapper.isEmpty()) {
+ validateUserRole(responseWrapper, userWrapper.getInnerElement(), serviceAuthorityEnum);
+ }
+ if (responseWrapper.isEmpty()) {
+ validateAndFillServiceJson(responseWrapper, uploadServiceInfoWrapper, serviceAuthorityEnum,
+ serviceInfoJsonString);
+ }
+ if (responseWrapper.isEmpty()) {
+ validateToscaTemplatePayloadName(responseWrapper, uploadServiceInfoWrapper.getInnerElement());
+ }
+ }
+
+ protected void validateUserRole(Wrapper<Response> errorResponseWrapper, User user, ServiceAuthorityTypeEnum serviceAuthority) {
+ 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);
+ ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
+ log.debug(AUDIT_BEFORE_SENDING_RESPONSE);
+ Response response = buildErrorResponse(responseFormat);
+ errorResponseWrapper.setInnerElement(response);
+ }
+ } else {
+ validateUserRole(errorResponseWrapper, user);
+ }
+ }
+
+ protected void validateAndFillServiceJson(Wrapper<Response> responseWrapper, Wrapper<UploadServiceInfo> uploadServiceInfoWrapper,
+ ServiceAuthorityTypeEnum serviceAuthorityEnum, String serviceInfo) {
+ boolean isValid;
+ try {
+ log.debug("The received json is {}", serviceInfo);
+ UploadServiceInfo serviceInfoObject = gson.fromJson(serviceInfo, UploadServiceInfo.class);
+ if (serviceInfoObject == null) {
+ isValid = false;
+ } else {
+ if (!serviceAuthorityEnum.isBackEndImport()) {
+ isValid = serviceInfoObject.getPayloadName() != null && !serviceInfoObject.getPayloadName().isEmpty();
+ //only service name is checked
+ } else {
+ isValid = true;
+ }
+ uploadServiceInfoWrapper.setInnerElement(serviceInfoObject);
+ log.debug("get isValid:{},serviceInfoObject get name:{},get tags:{},getContactId:{}," + " getPayloadName:{}", isValid,
+ uploadServiceInfoWrapper.getInnerElement().getName(), uploadServiceInfoWrapper.getInnerElement().getTags(),
+ uploadServiceInfoWrapper.getInnerElement().getContactId(), uploadServiceInfoWrapper.getInnerElement().getPayloadName());
+ }
+ } catch (JsonSyntaxException e) {
+ log.debug("enter validateAndFillServiceJson,Invalid json was received. {}", e.getMessage(), e);
+ isValid = false;
+ }
+ if (!isValid) {
+ 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) {
+ String toscaTemplatePayloadName = uploadServiceInfo.getPayloadName();
+ boolean isValidSuffix = isToscaTemplatePayloadNameValid(toscaTemplatePayloadName);
+ if (!isValidSuffix) {
+ ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_TOSCA_FILE_EXTENSION);
+ Response errorResponse = buildErrorResponse(responseFormat);
+ responseWrapper.setInnerElement(errorResponse);
+ }
+ }
+
+ protected void specificServiceAuthorityValidations(Wrapper<Response> responseWrapper, Wrapper<UploadServiceInfo> uploadServiceInfoWrapper,
+ Wrapper<String> yamlStringWrapper, HttpServletRequest request,
+ String serviceInfoJsonString, ServiceAuthorityTypeEnum serviceAuthorityEnum) {
+ if (responseWrapper.isEmpty()) {
+ // UI Only Validation
+ if (!serviceAuthorityEnum.isBackEndImport()) {
+ importUIValidations(responseWrapper, uploadServiceInfoWrapper.getInnerElement(), request, serviceInfoJsonString);
+ }
+ // User Defined Type Services
+ if (serviceAuthorityEnum.isUserTypeService()
+ && !CsarValidationUtils.isCsarPayloadName(uploadServiceInfoWrapper.getInnerElement().getPayloadName())
+ && responseWrapper.isEmpty()) {
+ validatePayloadNameSpace(responseWrapper, uploadServiceInfoWrapper.getInnerElement(), yamlStringWrapper.getInnerElement());
+ }
+ }
+ }
+
+ protected void importUIValidations(Wrapper<Response> responseWrapper, UploadServiceInfo serviceInfo, HttpServletRequest request,
+ String serviceInfoJsonString) {
+ if (responseWrapper.isEmpty()) {
+ validateMD5(responseWrapper, request, serviceInfoJsonString);
+ }
+ if (responseWrapper.isEmpty() && request != null && request.getMethod() != null && request.getMethod().equals("POST")) {
+ validateServiceDoesNotExist(responseWrapper, serviceInfo.getName());
+ }
+ }
+
+ 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);
+ Either<Map<String, Object>, ResultStatusEnum> toscaElement = ImportUtils
+ .findFirstToscaMapElement(mappedToscaTemplate, TypeUtils.ToscaTagNamesEnum.NODE_TYPES);
+ if (toscaElement.isRight() || toscaElement.left().value().size() != 1) {
+ isValid = false;
+ } else {
+ nameSpace = toscaElement.left().value().keySet().iterator().next();
+ isValid = nameSpace.startsWith(Constants.USER_DEFINED_SERVICE_NAMESPACE_PREFIX);
+ log.debug("enter validatePayloadNameSpace,get nameSpace:{},get Valid is:{}", nameSpace, isValid);
+ }
+ if (!isValid) {
+ ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_SERVICE_NAMESPACE);
+ Response errorResponse = buildErrorResponse(responseFormat);
+ responseWrapper.setInnerElement(errorResponse);
+ } else {
+ String str1 = nameSpace.substring(Constants.USER_DEFINED_SERVICE_NAMESPACE_PREFIX.length());
+ String[] findTypes = str1.split("\\.");
+ if (ResourceTypeEnum.containsName(findTypes[0].toUpperCase())) {
+ String type = findTypes[0].toUpperCase();
+ serviceInfo.setServiceType(type);
+ } else {
+ serviceInfo.setServiceType(ResourceTypeEnum.SERVICE.name());
+ }
+ }
+ }
+
+ protected void validateMD5(Wrapper<Response> responseWrapper, HttpServletRequest request,
+ String serviceInfoJsonString) {
+ boolean isValid;
+ String recievedMD5 = request.getHeader(Constants.MD5_HEADER);
+ if (recievedMD5 == null) {
+ isValid = false;
+ } else {
+ String calculateMD5 = GeneralUtility.calculateMD5Base64EncodedByString(serviceInfoJsonString);
+ isValid = calculateMD5.equals(recievedMD5);
+ }
+ if (!isValid) {
+ ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_SERVICE_CHECKSUM);
+ Response errorResponse = buildErrorResponse(responseFormat);
+ responseWrapper.setInnerElement(errorResponse);
+ }
+ }
+
+ protected void validateServiceDoesNotExist(Wrapper<Response> responseWrapper, String serviceName) {
+ if (serviceImportManager.isServiceExist(serviceName)) {
+ ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.SERVICE_ALREADY_EXISTS);
+ Response errorResponse = buildErrorResponse(responseFormat);
+ responseWrapper.setInnerElement(errorResponse);
+ }
+ }
+
+ 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);
+ }
+ if (importedServiceStatus != null) {
+ Object representation = null;
+ try {
+ representation = RepresentationUtils.toRepresentation(importedServiceStatus.left);
+ } catch (IOException e) {
+ log.debug("Error while building service representation : {}", e.getMessage(), e);
+ }
+ response = buildOkResponse(getComponentsUtils().getResponseFormat(importedServiceStatus.right), representation);
+ }
+ responseWrapper.setInnerElement(response);
+ }
+
+ private ImmutablePair<Service, ActionStatus> importServiceFromUICsar(UploadServiceInfo serviceInfoObject, User user) {
+ Service service = new Service();
+ String payloadName = serviceInfoObject.getPayloadName();
+ fillServiceFromServiceInfoObject(service, serviceInfoObject);
+ Map<String, byte[]> csarUIPayloadRes = getCsarFromPayload(serviceInfoObject);
+ getAndValidateCsarYaml(csarUIPayloadRes, service, user, payloadName);
+ final Service newService = serviceImportManager.getServiceImportBusinessLogic()
+ .createService(service, AuditingActionEnum.CREATE_SERVICE, user, csarUIPayloadRes, payloadName);
+ return new ImmutablePair<>(newService, ActionStatus.CREATED);
+ }
+
+ private void fillServiceFromServiceInfoObject(Service service, UploadServiceInfo serviceInfoObject) {
+ serviceImportManager.populateServiceMetadata(serviceInfoObject, service);
+ fillArtifacts(service, serviceInfoObject);
+ }
+
+ private Map<String, byte[]> getCsarFromPayload(UploadServiceInfo innerElement) {
+ String csarUUID = innerElement.getPayloadName();
+ String payloadData = innerElement.getPayloadData();
+ return getComponentCsarFromPayload(csarUUID, payloadData);
+ }
+
+ private void getAndValidateCsarYaml(Map<String, byte[]> csarUIPayload, Service service, User user, String csarUUID) {
+ getAndValidateComponentCsarYaml(csarUIPayload, service, user, csarUUID);
+ }
+
+ private void fillArtifacts(Service service, UploadServiceInfo serviceInfoObject) {
+ if (service != null && serviceInfoObject != null) {
+ List<UploadArtifactInfo> artifactList = serviceInfoObject.getArtifactList();
+ if (artifactList != null) {
+ Map<String, ArtifactDefinition> artifactsHM = new HashMap<>();
+ buildArtifactsHM(artifactList, artifactsHM);
+ service.setArtifacts(artifactsHM);
+ }
+ }
+ }
+
+ /**
+ * import service payload to postman
+ *
+ * @param responseWrapper
+ * @param uploadServiceInfoWrapper
+ * @param yamlStringWrapper
+ * @param user
+ * @param serviceInfoJsonString
+ * @param serviceAuthorityEnum
+ * @param file
+ * @throws ZipException
+ */
+ protected void fillServicePayload(Wrapper<Response> responseWrapper, Wrapper<UploadServiceInfo> uploadServiceInfoWrapper,
+ Wrapper<String> yamlStringWrapper, User user, String serviceInfoJsonString,
+ ServiceAuthorityTypeEnum serviceAuthorityEnum, File file) throws ZipException {
+ log.debug("enter fillServicePayload");
+ if (responseWrapper.isEmpty()) {
+ log.debug("enter fillServicePayload,get responseWrapper is empty");
+ if (serviceAuthorityEnum.isBackEndImport()) {
+ // PrePayload Validations
+ if (responseWrapper.isEmpty()) {
+ validateDataNotNull(responseWrapper, file, serviceInfoJsonString);
+ }
+ if (responseWrapper.isEmpty()) {
+ log.debug("enter fillServicePayload,responseWrapper is empty");
+ }
+ if (!serviceAuthorityEnum.equals(ServiceAuthorityTypeEnum.CSAR_TYPE_BE)) {
+ if (responseWrapper.isEmpty()) {
+ validateZip(responseWrapper, file, uploadServiceInfoWrapper.getInnerElement().getPayloadName());
+ }
+ // Fill PayLoad From File
+ if (responseWrapper.isEmpty()) {
+ fillToscaTemplateFromZip(yamlStringWrapper, uploadServiceInfoWrapper.getInnerElement().getPayloadName(), file);
+ }
+ } else {
+ log.debug("enter fillServicePayload,ServiceAuthorityTypeEnum is CSAR_TYPE_BE");
+ if (responseWrapper.isEmpty()) {
+ validateCsar(responseWrapper, file, uploadServiceInfoWrapper.getInnerElement().getPayloadName());
+ }
+ if (!responseWrapper.isEmpty()) {
+ log.debug("enter fillServicePayload,get responseWrapper:{}", responseWrapper);
+ }
+ // Fill PayLoad From File
+ if (responseWrapper.isEmpty()) {
+ fillServicePayloadDataFromFile(responseWrapper, uploadServiceInfoWrapper.getInnerElement(), file);
+ }
+ }
+ } else {
+ // Fill PayLoad From JSON
+ if (responseWrapper.isEmpty()) {
+ fillServiceToscaTemplateFromJson(responseWrapper, yamlStringWrapper, user, uploadServiceInfoWrapper.getInnerElement());
+ }
+ }
+ }
+ }
+
+ protected void fillServicePayloadDataFromFile(Wrapper<Response> responseWrapper, UploadServiceInfo uploadServiceInfoWrapper, File file) {
+ try (InputStream fileInputStream = new FileInputStream(file)) {
+ log.debug("enter fillServicePayloadDataFromFile");
+ byte[] data = new byte[(int) file.length()];
+ if (fileInputStream.read(data) == -1) {
+ log.info(INVALID_JSON_WAS_RECEIVED);
+ ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
+ Response errorResp = buildErrorResponse(responseFormat);
+ responseWrapper.setInnerElement(errorResp);
+ }
+ String payloadData = Base64.encodeBase64String(data);
+ uploadServiceInfoWrapper.setPayloadData(payloadData);
+ log.debug("enter fillServicePayloadDataFromFile,get payloadData:{}", uploadServiceInfoWrapper.getPayloadData());
+ log.debug("enter fillServicePayloadDataFromFile,get uploadService:{}", uploadServiceInfoWrapper);
+ } catch (IOException e) {
+ log.info("Invalid json was received or Error while closing input Stream.");
+ log.debug("Invalid json was received or Error while closing input Stream. {}", e.getMessage(), e);
+ ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT);
+ Response errorResp = buildErrorResponse(responseFormat);
+ responseWrapper.setInnerElement(errorResp);
+ }
+ }
+
+ private void fillServiceToscaTemplateFromJson(Wrapper<Response> responseWrapper, Wrapper<String> yamlStringWrapper, User user,
+ UploadServiceInfo serviceInfo) {
+ if (serviceInfo.getPayloadData() == null || serviceInfo.getPayloadData().isEmpty()) {
+ ResponseFormat responseFormat = getComponentsUtils().getResponseFormat(ActionStatus.INVALID_RESOURCE_PAYLOAD);
+ Response errorResponse = buildErrorResponse(responseFormat);
+ getComponentsUtils().auditResource(responseFormat, user, serviceInfo.getName(), AuditingActionEnum.IMPORT_RESOURCE);
+ responseWrapper.setInnerElement(errorResponse);
+ } else {
+ String toscaPayload = serviceInfo.getPayloadData();
+ String decodedPayload = new String(Base64.decodeBase64(toscaPayload));
+ yamlStringWrapper.setInnerElement(decodedPayload);
+ }
+ }