diff --git a/CHANGELOG.md b/CHANGELOG.md index a5731fde5..0f725d6b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Supporting new submodel Singlelevelbomasplanned. - Support EDC 7. - Added new files for digital twin access rule support. +- Refactor code for pcf, dt access API, EDC 7. ### Fixed - Remove garbage character from 'edc_request_template' path. Fixed [#147](https://github.com/eclipse-tractusx/managed-simple-data-exchanger-backend/issues/147). diff --git a/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/entity/PcfResponseEntity.java b/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/entity/PcfResponseEntity.java index c1b127503..c5383f379 100644 --- a/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/entity/PcfResponseEntity.java +++ b/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/entity/PcfResponseEntity.java @@ -52,5 +52,8 @@ public class PcfResponseEntity { @Column(name = "last_updated_time") private Long lastUpdatedTime; + + @Column(name = "message", columnDefinition = "TEXT") + private String message; -} +} \ No newline at end of file diff --git a/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/AsyncPushPCFDataForApproveRequest.java b/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/AsyncPushPCFDataForApproveRequest.java index 9fcf6150c..398156966 100644 --- a/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/AsyncPushPCFDataForApproveRequest.java +++ b/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/AsyncPushPCFDataForApproveRequest.java @@ -43,7 +43,7 @@ @SuppressWarnings("unchecked") public class AsyncPushPCFDataForApproveRequest { - private static final String PRODUCT_ID = "product_id"; + private static final String PRODUCT_ID = "productId"; private final PCFRepositoryService pcfRepositoryService; @@ -54,13 +54,15 @@ public void pushPCFDataForApproveRequest(List jsonObjectList, Policy List accessBPNList = PolicyOperationUtil.getAccessBPNList(policy); List productList = jsonObjectList.stream() - .map(ele -> JsonObjectUtility.getValueFromJsonObject(ele, PRODUCT_ID)).toList(); + .map(obj-> obj.get("csv").getAsJsonObject()) + .map(ele -> JsonObjectUtility.getValueFromJsonObject(ele, PRODUCT_ID)) + .toList(); markedPCFDataForPendingProviderRequestAsRequested(productList, jsonObjectList); PagingResponse pcfData = pcfRepositoryService.getPcfData( List.of(PCFRequestStatusEnum.PUSHED, PCFRequestStatusEnum.PUSHED_UPDATED_DATA), PCFTypeEnum.PROVIDER, 0, - 1000); + 100000); List requestList = (List) pcfData.getItems(); if (!requestList.isEmpty()) { @@ -75,9 +77,13 @@ public void pushPCFDataForApproveRequest(List jsonObjectList, Policy request.setStatus(PCFRequestStatusEnum.PUSHING_UPDATED_DATA); JsonObject calculatedPCFValue = jsonObjectList.stream() - .filter(ele -> request.getProductId() - .equals(JsonObjectUtility.getValueFromJsonObject(ele, PRODUCT_ID))) - .findAny().orElseThrow(() -> new NoDataFoundException( + .filter(ele -> { + ele = ele.get("csv").getAsJsonObject(); + return request.getProductId().equals(JsonObjectUtility.getValueFromJsonObject(ele, PRODUCT_ID)); + }) + .map(obj-> obj.get("json").getAsJsonObject()) + .findAny() + .orElseThrow(() -> new NoDataFoundException( "No data found for product_id " + request.getProductId())); PCFRequestStatusEnum status = pcfRepositoryService.identifyRunningStatus(request.getRequestId(), @@ -86,7 +92,7 @@ public void pushPCFDataForApproveRequest(List jsonObjectList, Policy // push api call Runnable runnable = () -> proxyRequestInterface.sendNotificationToConsumer(status, calculatedPCFValue, request.getProductId(), request.getBpnNumber(), - request.getRequestId()); + request.getRequestId(), request.getMessage()); new Thread(runnable).start(); @@ -113,7 +119,7 @@ public void markedPCFDataForPendingProviderRequestAsRequested(List produ List jsonObjectList) { PagingResponse pcfData = pcfRepositoryService - .getPcfData(List.of(PCFRequestStatusEnum.PENDING_DATA_FROM_PROVIDER), PCFTypeEnum.PROVIDER, 0, 1000); + .getPcfData(List.of(PCFRequestStatusEnum.PENDING_DATA_FROM_PROVIDER), PCFTypeEnum.PROVIDER, 0, 100000); List requestList = (List) pcfData.getItems(); if (!requestList.isEmpty()) { @@ -122,7 +128,7 @@ public void markedPCFDataForPendingProviderRequestAsRequested(List produ String msg = ""; try { - JsonObject calculatedPCFValue = jsonObjectList.stream() + jsonObjectList.stream() .filter(ele -> request.getProductId() .equals(JsonObjectUtility.getValueFromJsonObject(ele, PRODUCT_ID))) .findAny().orElseThrow(() -> new NoDataFoundException( @@ -145,4 +151,4 @@ public void markedPCFDataForPendingProviderRequestAsRequested(List produ } } -} +} \ No newline at end of file diff --git a/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/PCFRepositoryService.java b/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/PCFRepositoryService.java index a63b9fefb..3f3ab4db9 100644 --- a/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/PCFRepositoryService.java +++ b/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/PCFRepositoryService.java @@ -71,15 +71,18 @@ public PCFRequestStatusEnum updatePCFPushStatus(PCFRequestStatusEnum status, Str && SUCCESS.equalsIgnoreCase(sendNotificationStatus)) { status = PCFRequestStatusEnum.PUSHED_UPDATED_DATA; sendNotificationStatus ="PCF updated data successfuly pushed"; - } else if (PCFRequestStatusEnum.REJECTED.equals(status) && SUCCESS.equalsIgnoreCase(sendNotificationStatus)) { + } else if ((PCFRequestStatusEnum.REJECTED.equals(status) + || PCFRequestStatusEnum.SENDING_REJECT_NOTIFICATION.equals(status)) + && SUCCESS.equalsIgnoreCase(sendNotificationStatus)) { status = PCFRequestStatusEnum.REJECTED; - sendNotificationStatus ="PCF request rejected successfuly"; + sendNotificationStatus = "PCF request rejected successfuly"; } else if (PCFRequestStatusEnum.APPROVED.equals(status) || PCFRequestStatusEnum.FAILED_TO_PUSH_DATA.equals(status) || PCFRequestStatusEnum.PUSHING_DATA.equals(status) || PCFRequestStatusEnum.PUSHING_UPDATED_DATA.equals(status)) { status = PCFRequestStatusEnum.FAILED_TO_PUSH_DATA; } else if (PCFRequestStatusEnum.REJECTED.equals(status) + || PCFRequestStatusEnum.SENDING_REJECT_NOTIFICATION.equals(status) || PCFRequestStatusEnum.FAILED_TO_SEND_REJECT_NOTIFICATION.equals(status)) status = PCFRequestStatusEnum.FAILED_TO_SEND_REJECT_NOTIFICATION; else { @@ -127,6 +130,7 @@ public PcfRequestEntity savePcfStatus(String requestId, PCFRequestStatusEnum sta log.info(LogUtil.encode("'" + pcfRequestEntity.getProductId() + "' pcf request saved in the database successfully as " + status)); + pcfRequestRepository.save(pcfRequestEntity); return pcfRequestEntity; @@ -147,4 +151,4 @@ public PagingResponse getPcfData(List status, PCFTypeEnum .totalItems(result.getTotalElements()).build(); } -} +} \ No newline at end of file diff --git a/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/PcfExchangeServiceImpl.java b/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/PcfExchangeServiceImpl.java index 04b30bcce..e434da4a7 100644 --- a/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/PcfExchangeServiceImpl.java +++ b/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/PcfExchangeServiceImpl.java @@ -1,6 +1,6 @@ /******************************************************************************** - * Copyright (c) 2024 T-Systems International GmbH - * Copyright (c) 2024 Contributors to the Eclipse Foundation + * Copyright (c) 2023,2024 T-Systems International GmbH + * Copyright (c) 2023,2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -60,8 +60,10 @@ public class PcfExchangeServiceImpl implements IPCFExchangeService { private final PCFRepositoryService pcfRepositoryService; private final PcfReqsponseRepository pcfReqsponseRepository; private final EDCAssetUrlCacheService edcAssetUrlCacheService; + @Qualifier("DatabaseUsecaseHandler") private final DatabaseUsecaseStep databaseUsecaseStep; + private final ProxyRequestInterface proxyRequestInterface; @SneakyThrows @@ -133,14 +135,15 @@ public String actionOnPcfRequestAndSendNotificationToConsumer(PcfRequestModel pc try { JsonObject calculatedPCFValue = databaseUsecaseStep.readCreatedTwinsBySpecifyColomn( - "urn:bamm:io.catenax.pcf", "productId", pcfRequestModel.getProductId()); - + "urn:bamm:io.catenax.pcf", pcfRequestModel.getProductId()).get("json").getAsJsonObject(); + PCFRequestStatusEnum status = pcfRepositoryService.identifyRunningStatus(pcfRequestModel.getRequestId(), pcfRequestModel.getStatus()); // push api call Runnable runnable = () -> proxyRequestInterface.sendNotificationToConsumer(status, calculatedPCFValue, - pcfRequestModel.getProductId(), pcfRequestModel.getBpnNumber(), pcfRequestModel.getRequestId()); + pcfRequestModel.getProductId(), pcfRequestModel.getBpnNumber(), pcfRequestModel.getRequestId(), + pcfRequestModel.getMessage()); new Thread(runnable).start(); @@ -153,7 +156,7 @@ public String actionOnPcfRequestAndSendNotificationToConsumer(PcfRequestModel pc pcfRepositoryService.savePcfRequestData(pcfRequestModel.getRequestId(), pcfRequestModel.getProductId(), pcfRequestModel.getBpnNumber(), pcfRequestModel.getMessage(), PCFTypeEnum.PROVIDER, PCFRequestStatusEnum.FAILED, remark); - log.error(LogUtil.encode(remark)); + log.warn(LogUtil.encode(remark)); throw new ValidationException(e.getMessage()); } catch (Exception e) { pcfRepositoryService.savePcfStatus(pcfRequestModel.getRequestId(), PCFRequestStatusEnum.FAILED); @@ -167,8 +170,7 @@ public PcfRequestModel savePcfRequestData(String requestId, String productId, St PCFRequestStatusEnum status = PCFRequestStatusEnum.REQUESTED; String remark = ""; try { - databaseUsecaseStep.readCreatedTwinsBySpecifyColomn("urn:bamm:io.catenax.pcf", "productId", - productId); + databaseUsecaseStep.readCreatedTwinsBySpecifyColomn("urn:bamm:io.catenax.pcf", productId); } catch (NoDataFoundException e) { String msg = "The PCF calculated value does not exist in system, please upload PCF value for '" + productId + "' in systems using Manual/Recurring Upload"; @@ -180,27 +182,33 @@ public PcfRequestModel savePcfRequestData(String requestId, String productId, St status, remark); } + @SneakyThrows @Override public void recievedPCFData(String productId, String bpnNumber, String requestId, String message, JsonNode pcfData) { - PCFRequestStatusEnum status = PCFRequestStatusEnum.FAILED; - try { - status = PCFRequestStatusEnum.valueOf(message); - } catch (Exception e) { - log.error("Unable to find PCF value status " + e.getMessage()); - } + PCFRequestStatusEnum status = null; - PcfResponseEntity entity = PcfResponseEntity.builder().pcfData(pcfData).requestId(requestId) - .responseId(UUID.randomUUID().toString()).lastUpdatedTime(Instant.now().getEpochSecond()).build(); + PcfResponseEntity entity = PcfResponseEntity.builder() + .pcfData(pcfData) + .requestId(requestId) + .message(message) + .responseId(UUID.randomUUID().toString()) + .lastUpdatedTime(Instant.now().getEpochSecond()) + .build(); pcfReqsponseRepository.save(entity); - if (PCFRequestStatusEnum.APPROVED.equals(status) || PCFRequestStatusEnum.PUSHING_DATA.equals(status) - || PCFRequestStatusEnum.PUSHING_UPDATED_DATA.equals(status)) { + if(StringUtils.isBlank(requestId)) + throw new ServiceException("RequestId not recieved from provider to marked PCF exchange request"); + + if (pcfData != null && !pcfData.isEmpty() && !pcfData.asText().equals("{}")) { status = PCFRequestStatusEnum.RECEIVED; - } - + } else if (StringUtils.isNotBlank(requestId)) { + status = PCFRequestStatusEnum.REJECTED; + } else + status = PCFRequestStatusEnum.FAILED; + pcfRepositoryService.savePcfStatus(requestId, status); } @@ -222,4 +230,4 @@ public PcfResponseEntity viewForPcfDataOffer(String requestId) { return findById.get(); } -} +} \ No newline at end of file diff --git a/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/ProxyRequestInterface.java b/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/ProxyRequestInterface.java index 55c535485..e959d7351 100644 --- a/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/ProxyRequestInterface.java +++ b/modules/pcf-exchange/src/main/java/org/eclipse/tractusx/sde/pcfexchange/service/impl/ProxyRequestInterface.java @@ -98,7 +98,7 @@ public void requestToProviderForPCFValue(String productId, StringBuilder sb, Str @SneakyThrows public void sendNotificationToConsumer(PCFRequestStatusEnum status, JsonObject calculatedPCFValue, - String productId, String bpnNumber, String requestId) { + String productId, String bpnNumber, String requestId, String message) { // 1 fetch EDC connectors and DTR Assets from EDC connectors List pcfExchangeUrlOffers = edcAssetUrlCacheService.getPCFExchangeUrlFromTwin(bpnNumber); @@ -112,9 +112,9 @@ public void sendNotificationToConsumer(PCFRequestStatusEnum status, JsonObject c pcfExchangeUrlOffers.parallelStream().forEach(dtOffer -> { if (PCFRequestStatusEnum.SENDING_REJECT_NOTIFICATION.equals(status)) { - sendNotification(null, productId, bpnNumber, requestId, dtOffer, status); + sendNotification(null, productId, bpnNumber, requestId, dtOffer, status, message); } else { - sendNotification(calculatedPCFValue, productId, bpnNumber, requestId, dtOffer, status); + sendNotification(calculatedPCFValue, productId, bpnNumber, requestId, dtOffer, status, message); } }); @@ -123,11 +123,9 @@ public void sendNotificationToConsumer(PCFRequestStatusEnum status, JsonObject c @SneakyThrows private void sendNotification(JsonObject calculatedPCFValue, String productId, String bpnNumber, String requestId, - QueryDataOfferModel dtOffer, PCFRequestStatusEnum status) { + QueryDataOfferModel dtOffer, PCFRequestStatusEnum status, String message) { String sendNotificationStatus = ""; try { - String message = status.name(); - EDRCachedByIdResponse edrToken = edcAssetUrlCacheService.verifyAndGetToken(bpnNumber, dtOffer); if (edrToken != null) { diff --git a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/configuration/properties/DigitalTwinConfigurationProperties.java b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/configuration/properties/DigitalTwinConfigurationProperties.java index 55802ecf7..877092b73 100644 --- a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/configuration/properties/DigitalTwinConfigurationProperties.java +++ b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/configuration/properties/DigitalTwinConfigurationProperties.java @@ -1,6 +1,6 @@ /******************************************************************************** - #* Copyright (c) 2024 T-Systems International GmbH - #* Copyright (c) 2024 Contributors to the Eclipse Foundation + #* Copyright (c) 2022,2024 T-Systems International GmbH + #* Copyright (c) 2022,2024 Contributors to the Eclipse Foundation #* #* See the NOTICE file(s) distributed with this work for additional #* information regarding copyright ownership. @@ -28,7 +28,7 @@ @Configuration @Data public class DigitalTwinConfigurationProperties { - + @Value("${digital-twins.hostname:default}") private String digitalTwinsHostname; @@ -50,10 +50,10 @@ public class DigitalTwinConfigurationProperties { @Value(value = "${digital-twins.authentication.grantType}") private String digitalTwinsAuthenticationGrantType; - @Value("${digital-twins.registry.uri:/api/v3.0}") + @Value("${digital-twins.registry.uri:/api/v3}") private String digitalTwinsRegistryPath; - @Value("${digital-twins.lookup.uri:/api/v3.0}") + @Value("${digital-twins.lookup.uri:/api/v3}") private String digitalTwinsLookupPath; @Value(value = "${manufacturerId}") @@ -76,4 +76,4 @@ public String getDigitalTwinEdcDataplaneEndpoint() { return this.edcHostname+this.edcDataplaneEndpointpath; } -} +} \ No newline at end of file diff --git a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/constants/CommonConstants.java b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/constants/CommonConstants.java index f508cfd3e..658214f48 100644 --- a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/constants/CommonConstants.java +++ b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/constants/CommonConstants.java @@ -1,7 +1,7 @@ /******************************************************************************** * Copyright (c) 2022 BMW GmbH - * Copyright (c) 2022, 2023 T-Systems International GmbH - * Copyright (c) 2022, 2023 Contributors to the Eclipse Foundation + * Copyright (c) 2022,2024 T-Systems International GmbH + * Copyright (c) 2022,2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -50,7 +50,8 @@ private CommonConstants() { public static final String EXTERNAL_REFERENCE = "ExternalReference"; public static final String GLOBAL_REFERENCE = "GlobalReference"; + public static final String SUBMODEL = "Submodel"; public static final String BODY_ENCODING = "plain"; public static final String INTERFACE = "SUBMODEL-3.0"; -} +} \ No newline at end of file diff --git a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/constants/SubmoduleCommonColumnsConstant.java b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/constants/SubmoduleCommonColumnsConstant.java index 86abaf6a4..20147c6eb 100644 --- a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/constants/SubmoduleCommonColumnsConstant.java +++ b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/constants/SubmoduleCommonColumnsConstant.java @@ -26,6 +26,7 @@ private SubmoduleCommonColumnsConstant() { } public static final String SHELL_ID = "shell_id"; + public static final String SHELL_ACCESS_RULE_IDS = "shell_access_rule_ids"; public static final String SUBMODULE_ID = "sub_model_id"; public static final String ASSET_ID = "asset_id"; public static final String USAGE_POLICY_ID = "usage_policy_id"; @@ -37,4 +38,4 @@ private SubmoduleCommonColumnsConstant() { public static final String UPDATED = "updated"; public static final String MANUFACTURER_PART_ID_FIELD = "manufacturer_part_id"; -} +} \ No newline at end of file diff --git a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/mapper/AspectResponseFactory.java b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/mapper/AspectResponseFactory.java index 01cea5d48..d1487a871 100644 --- a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/mapper/AspectResponseFactory.java +++ b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/mapper/AspectResponseFactory.java @@ -1,6 +1,6 @@ /******************************************************************************** - * Copyright (c) 2024 T-Systems International GmbH - * Copyright (c) 2024 Contributors to the Eclipse Foundation + * Copyright (c) 2023,2024 T-Systems International GmbH + * Copyright (c) 2023,2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -20,13 +20,18 @@ package org.eclipse.tractusx.sde.common.mapper; +import java.util.Map; + import org.springframework.stereotype.Component; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; import lombok.SneakyThrows; @@ -39,9 +44,8 @@ public class AspectResponseFactory { @SneakyThrows public JsonObject maptoReponse(Object csvObject, Object aspectObject) { JsonObject jobj = new JsonObject(); - jobj.add("csv", fasterJsonMapper(csvObject)); - jobj.add("json", gsonMapper(aspectObject)); - + jobj.add("csv", formatJsonRespone(fasterJsonMapper(csvObject))); + jobj.add("json", formatJsonRespone(gsonMapper(aspectObject))); return jobj; } @@ -62,4 +66,41 @@ private JsonObject fasterJsonMapper(Object csvObject) throws JsonProcessingExcep writeValueAsString = writeValueAsString.replace(":null", ": \"\""); return gson.fromJson(writeValueAsString, JsonObject.class); } -} + + private JsonElement formatJsonRespone(JsonElement element) { + if (element.isJsonPrimitive()) { + JsonPrimitive primitive = element.getAsJsonPrimitive(); + if (primitive != null && isNumeric(primitive.getAsString())) { + return new JsonPrimitive(primitive.getAsNumber()); + } else if (primitive != null && isBoolean(primitive.getAsString())) { + return new JsonPrimitive(primitive.getAsBoolean()); + } else { + return primitive; + } + } else if (element.isJsonArray()) { + JsonArray jsonArray = element.getAsJsonArray(); + JsonArray cleanedNewArray = new JsonArray(); + for (JsonElement jsonElement : jsonArray) { + cleanedNewArray.add(formatJsonRespone(jsonElement)); + } + return cleanedNewArray; + } else if (element.isJsonNull()) { + return element.getAsJsonNull(); + } else { + JsonObject obj = element.getAsJsonObject(); + JsonObject encodedJsonObject = new JsonObject(); + for (Map.Entry entry : obj.entrySet()) { + encodedJsonObject.add(entry.getKey(), formatJsonRespone(entry.getValue())); + } + return encodedJsonObject; + } + } + + private boolean isNumeric(String str) { + return str.matches("-?\\d+(\\.\\d+)?"); + } + + private boolean isBoolean(String str) { + return str.equalsIgnoreCase("true") || str.equalsIgnoreCase("false"); + } +} \ No newline at end of file diff --git a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/DatabaseUsecaseStep.java b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/DatabaseUsecaseStep.java index 90bfc5272..9eced0cf2 100644 --- a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/DatabaseUsecaseStep.java +++ b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/DatabaseUsecaseStep.java @@ -38,7 +38,7 @@ public interface DatabaseUsecaseStep { public List readCreatedTwins(String processId, String isDeleted); - public JsonObject readCreatedTwinsBySpecifyColomn(String sematicId, String basedCol, String value); + public JsonObject readCreatedTwinsBySpecifyColomn(String sematicId, String value); public JsonObject readCreatedTwinsDetails(String uuid); diff --git a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/DigitalTwinUsecaseStep.java b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/DigitalTwinUsecaseStep.java index e16978408..6855ee264 100644 --- a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/DigitalTwinUsecaseStep.java +++ b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/DigitalTwinUsecaseStep.java @@ -47,11 +47,6 @@ default void addManufactureIdInSpecificAssetIds(Map specificAsse specificAssetIds.put(CommonConstants.MANUFACTURER_ID, manufacturerId); } - default String getIdentifier(JsonNode jsonObject, String identifierOfModel) { - return JsonObjectUtility.getValueFromJsonObjectAsString(jsonObject, - extractExactFieldName(identifierOfModel)); - } - default String generateShortId(JsonNode jsonObject, JsonArray shortIdSpecsOfModel) { return shortIdSpecsOfModel.asList().stream().map(ele -> JsonObjectUtility .getValueFromJsonObjectAsString(jsonObject, extractExactFieldName(ele.getAsString()))) @@ -105,4 +100,4 @@ default String extractExactFieldName(String str) { } } -} +} \ No newline at end of file diff --git a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/Step.java b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/Step.java index 2ea304c7e..60d9b0a99 100644 --- a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/Step.java +++ b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/Step.java @@ -1,6 +1,6 @@ /******************************************************************************** - * Copyright (c) 2022, 2024 T-Systems International GmbH - * Copyright (c) 2022, 2024 Contributors to the Eclipse Foundation + * Copyright (c) 2022,2024 T-Systems International GmbH + * Copyright (c) 2022,2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -20,6 +20,12 @@ package org.eclipse.tractusx.sde.common.submodel.executor; +import java.util.Arrays; +import java.util.List; + +import org.eclipse.tractusx.sde.common.utils.JsonObjectUtility; + +import com.fasterxml.jackson.databind.JsonNode; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -77,11 +83,29 @@ public JsonObject getAddOnOfModel() { public String getIdentifierOfModel() { return this.getAddOnOfModel().get("identifier").getAsString(); } + + public List getDatabaseIdentifierSpecsOfModel() { + JsonElement jsonElement = this.getAddOnOfModel().get("databaseIdentifierSpecs"); + return jsonElement == null || jsonElement.isJsonNull() + ? List.of(extractExactFieldName(this.getIdentifierOfModel())) + : converJsonArrayToList(jsonElement); + } + + protected List converJsonArrayToList(JsonElement jsonArray) { + return jsonArray.getAsJsonArray().asList().stream().map(ele -> extractExactFieldName(ele.getAsString())) + .toList(); + } public boolean checkShellCreateOption() { JsonElement jsonElement = this.getAddOnOfModel().get("createShellIfNotExist"); return jsonElement == null || jsonElement.isJsonNull() || jsonElement.getAsBoolean(); } + + public boolean checkAppendURNUUIDWithIdentifier() { + JsonElement jsonElement = this.getAddOnOfModel().get("appendURNUUIDWithIdentifier"); + return jsonElement == null || jsonElement.isJsonNull() || jsonElement.getAsBoolean(); + } + public JsonObject checkIsRelationSubmodel() { JsonElement jsonElement = this.getAddOnOfModel().get("isRelationSubmodel"); @@ -134,4 +158,29 @@ protected void logDebug(String message) { protected void logInfo(String message) { log.info(String.format("[%s] %s", this.getClass().getSimpleName(), message)); } -} + + public String getIdentifier(JsonNode jsonObject, String identifierOfModel) { + return JsonObjectUtility.getValueFromJsonObjectAsString(jsonObject, + extractExactFieldName(identifierOfModel)); + } + + protected String getDatabaseIdentifierValues(JsonNode jsonObject, List databaseIdentifier) { + return String.join("@", + databaseIdentifier.stream().map( + str -> JsonObjectUtility.getValueFromJsonObjectAsString(jsonObject, extractExactFieldName(str))) + .toList()); + } + + protected List getIdentifierValuesAsList(String value) { + return Arrays.asList(value.split("@")).stream().map(Object::toString).toList(); + } + + public String extractExactFieldName(String str) { + + if (str.startsWith("${")) { + return str.replace("${", "").replace("}", "").trim(); + } else { + return str; + } + } +} \ No newline at end of file diff --git a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/create/steps/impl/GenerateUrnUUID.java b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/create/steps/impl/GenerateUrnUUID.java index 8c53b854d..db999c0f4 100644 --- a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/create/steps/impl/GenerateUrnUUID.java +++ b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/submodel/executor/create/steps/impl/GenerateUrnUUID.java @@ -1,6 +1,6 @@ /******************************************************************************** - * Copyright (c) 2022, 2024 T-Systems International GmbH - * Copyright (c) 2022, 2024 Contributors to the Eclipse Foundation + * Copyright (c) 2022,2024 T-Systems International GmbH + * Copyright (c) 2022,2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -24,7 +24,6 @@ import org.eclipse.tractusx.sde.common.utils.UUIdGenerator; import org.springframework.stereotype.Component; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.SneakyThrows; @@ -35,18 +34,19 @@ public class GenerateUrnUUID extends Step { @SneakyThrows public ObjectNode run(ObjectNode jsonObject, String processId) { - JsonNode jsonNode = jsonObject.get("uuid"); - if (jsonNode == null || jsonNode.isNull()) - return jsonObject; + String identifierField= extractExactFieldName(getIdentifierOfModel()); + String identifier = getIdentifier(jsonObject, identifierField); - String uUID = jsonNode.asText(); - if (uUID == null || uUID.isBlank() || uUID.equals("null")) { - jsonObject.put("uuid", UUIdGenerator.getUrnUuid()); - } else if (!uUID.startsWith(UUIdGenerator.URN_UUID_PREFIX)) { - String concat = UUIdGenerator.URN_UUID_PREFIX.concat(uUID); - jsonObject.put("uuid", concat); + if(checkAppendURNUUIDWithIdentifier()) { + if (identifier == null || identifier.isBlank() || identifier.equals("null")) { + jsonObject.put(identifierField, UUIdGenerator.getUrnUuid()); + } else if (!identifier.startsWith(UUIdGenerator.URN_UUID_PREFIX)) { + String concat = UUIdGenerator.URN_UUID_PREFIX.concat(identifier); + jsonObject.put(identifierField, concat); + } } + return jsonObject; } -} +} \ No newline at end of file diff --git a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/utils/PolicyOperationUtil.java b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/utils/PolicyOperationUtil.java index 54bea9ab4..e2639952a 100644 --- a/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/utils/PolicyOperationUtil.java +++ b/modules/sde-common/src/main/java/org/eclipse/tractusx/sde/common/utils/PolicyOperationUtil.java @@ -21,21 +21,22 @@ import java.util.List; +import org.apache.commons.lang3.StringUtils; import org.eclipse.tractusx.sde.common.entities.Policies; import org.eclipse.tractusx.sde.common.entities.PolicyModel; public class PolicyOperationUtil { - - private PolicyOperationUtil() {} + + private static final String BUSINESS_PARTNER_NUMBER = "BusinessPartnerNumber"; + + private PolicyOperationUtil() { + } private static List getBPNList(List policies) { - return policies - .stream() - .filter(e -> e.getTechnicalKey().equals("BusinessPartnerNumber")) - .flatMap(e -> e.getValue().stream()) - .toList(); + return policies.stream().filter(e -> e.getTechnicalKey().equals(BUSINESS_PARTNER_NUMBER)) + .flatMap(e -> e.getValue().stream().filter(StringUtils::isNotBlank)).toList(); } - + public static List getAccessBPNList(PolicyModel policy) { return getBPNList(policy.getAccessPolicies()); } @@ -43,5 +44,4 @@ public static List getAccessBPNList(PolicyModel policy) { public static List getUsageBPNList(PolicyModel policy) { return getBPNList(policy.getUsagePolicies()); } - -} +} \ No newline at end of file diff --git a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/configuration/DigitalTwinAssetProvider.java b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/configuration/DigitalTwinAssetProvider.java index 94da68889..15f9b787e 100644 --- a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/configuration/DigitalTwinAssetProvider.java +++ b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/configuration/DigitalTwinAssetProvider.java @@ -1,6 +1,6 @@ /******************************************************************************** - * Copyright (c) 2024 T-Systems International GmbH - * Copyright (c) 2024 Contributors to the Eclipse Foundation + * Copyright (c) 2023,2024 T-Systems International GmbH + * Copyright (c) 2023,2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -26,9 +26,9 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.StringSubstitutor; +import org.eclipse.tractusx.sde.common.configuration.properties.DigitalTwinConfigurationProperties; import org.eclipse.tractusx.sde.common.entities.PolicyModel; import org.eclipse.tractusx.sde.common.utils.UUIdGenerator; -import org.eclipse.tractusx.sde.core.properties.SdeCommonProperties; import org.eclipse.tractusx.sde.core.utils.ValueReplacerUtility; import org.eclipse.tractusx.sde.edc.constants.EDCAssetConstant; import org.eclipse.tractusx.sde.edc.entities.request.asset.AssetEntryRequest; @@ -56,19 +56,19 @@ public class DigitalTwinAssetProvider { private final AssetEntryRequestFactory assetFactory; private final EDCGateway edcGateway; private final CreateEDCAssetFacilator createEDCAssetFacilator; - private final SdeCommonProperties sdeCommonProperties; + private final DigitalTwinConfigurationProperties digitalTwinConfigurationProperties; private final ValueReplacerUtility valueReplacerUtility; @PostConstruct @SneakyThrows public void init() { - if (sdeCommonProperties.getDigitalTwinRegistryURI() - .equals(sdeCommonProperties.getDigitalTwinRegistryLookUpURI())) { - create("registry", sdeCommonProperties.getDigitalTwinRegistryURI()); + if (digitalTwinConfigurationProperties.getDigitalTwinsRegistryPath() + .equals(digitalTwinConfigurationProperties.getDigitalTwinsLookupPath())) { + create("registry", digitalTwinConfigurationProperties.getDigitalTwinsRegistryPath()); } else { - create("regisry-api", sdeCommonProperties.getDigitalTwinRegistryURI()); - create("discovery-api", sdeCommonProperties.getDigitalTwinRegistryLookUpURI()); + create("regisry-api", digitalTwinConfigurationProperties.getDigitalTwinsRegistryPath()); + create("discovery-api", digitalTwinConfigurationProperties.getDigitalTwinsLookupPath()); } } @@ -79,28 +79,28 @@ private void create(String registryType, String registryAPI) throws JsonProcessi AssetEntryRequest assetEntryRequest = assetFactory.getAssetRequest("", "Digital twin registry information", assetId, "1", "", "", "", EDCAssetConstant.DATA_CORE_DIGITAL_TWIN_REGISTRY_TYPE); - String baseUrl = sdeCommonProperties.getDigitalTwinRegistry() + registryAPI; + String baseUrl = digitalTwinConfigurationProperties.getDigitalTwinsHostname() + registryAPI; assetEntryRequest.getProperties().put(registryType, baseUrl); assetEntryRequest.getDataAddress().getProperties().put("baseUrl", baseUrl); assetEntryRequest.getDataAddress().getProperties().put("oauth2:tokenUrl", - sdeCommonProperties.getDigitalTwinTokenUrl()); + digitalTwinConfigurationProperties.getDigitalTwinsAuthenticationUrl()); assetEntryRequest.getDataAddress().getProperties().put("oauth2:clientId", - sdeCommonProperties.getDigitalTwinClientId()); + digitalTwinConfigurationProperties.getDigitalTwinsAuthenticationClientId()); assetEntryRequest.getDataAddress().getProperties().put("oauth2:clientSecret", - sdeCommonProperties.getDigitalTwinClientSecret()); + digitalTwinConfigurationProperties.getDigitalTwinsAuthenticationClientSecret()); if (assetEntryRequest.getDataAddress().getProperties().containsKey("oauth2:clientSecretKey")) { assetEntryRequest.getDataAddress().getProperties().remove("oauth2:clientSecretKey"); } - if (StringUtils.isNotBlank(sdeCommonProperties.getDigitalTwinAuthenticationScope())) { + if (StringUtils.isNotBlank(digitalTwinConfigurationProperties.getDigitalTwinsAuthenticationScope())) { assetEntryRequest.getDataAddress().getProperties().put("oauth2:scope", - sdeCommonProperties.getDigitalTwinAuthenticationScope()); + digitalTwinConfigurationProperties.getDigitalTwinsAuthenticationScope()); } Map inputData = new HashMap<>(); diff --git a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/configuration/PCFExchangeAssetProvider.java b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/configuration/PCFExchangeAssetProvider.java index 39562cd34..1e271d449 100644 --- a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/configuration/PCFExchangeAssetProvider.java +++ b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/configuration/PCFExchangeAssetProvider.java @@ -1,6 +1,6 @@ /******************************************************************************** - * Copyright (c) 2024 T-Systems International GmbH - * Copyright (c) 2024 Contributors to the Eclipse Foundation + * Copyright (c) 2023,2024 T-Systems International GmbH + * Copyright (c) 2023,2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -24,6 +24,8 @@ import java.util.List; import java.util.Map; +import org.eclipse.tractusx.sde.common.configuration.properties.SDEConfigurationProperties; +import org.eclipse.tractusx.sde.common.entities.Policies; import org.eclipse.tractusx.sde.common.entities.PolicyModel; import org.eclipse.tractusx.sde.common.utils.UUIdGenerator; import org.eclipse.tractusx.sde.core.utils.ValueReplacerUtility; @@ -32,7 +34,6 @@ import org.eclipse.tractusx.sde.edc.entities.request.asset.AssetEntryRequestFactory; import org.eclipse.tractusx.sde.edc.facilitator.CreateEDCAssetFacilator; import org.eclipse.tractusx.sde.edc.gateways.external.EDCGateway; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @@ -55,9 +56,7 @@ public class PCFExchangeAssetProvider { private final EDCGateway edcGateway; private final CreateEDCAssetFacilator createEDCAssetFacilator; private final ValueReplacerUtility valueReplacerUtility; - - @Value("${dft.hostname}") - private String sdeHostname; + private final SDEConfigurationProperties sdeConfigurationProperties; @PostConstruct @SneakyThrows @@ -68,9 +67,11 @@ public void init() { AssetEntryRequest assetEntryRequest = assetFactory.getAssetRequest("", "PCF Exchange endpoint information", assetId, "1", "", "", sematicId, EDCAssetConstant.DATA_CORE_PCF_EXCHANGE_ENPOINT_TYPE); - String baseUrl = sdeHostname + "/pcf"; + String baseUrl = sdeConfigurationProperties.getSdeHostname() + "/pcf"; assetEntryRequest.getDataAddress().getProperties().put("baseUrl", baseUrl); assetEntryRequest.getProperties().put(REGISTRY_TYPE, baseUrl); + assetEntryRequest.getProperties().put(EDCAssetConstant.CX_COMMON_VERSION, "1.1"); + Map inputData = new HashMap<>(); inputData.put("baseUrl", baseUrl); @@ -83,9 +84,19 @@ public void init() { if (!edcGateway.assetExistsLookupBasedOnType(requestBody)) { + List usagePolicy = List.of( + Policies.builder() + .technicalKey(EDCAssetConstant.PCF_FRAMEWORK_AGREEMENT_LEFT_OPERAND) + .value(List.of(EDCAssetConstant.PCF_FRAMEWORK_AGREEMENT_RIGHT_OPERAND)) + .build(), + Policies.builder() + .technicalKey(EDCAssetConstant.MEMBERSHIP_LEFT_OPERAND) + .value(List.of(EDCAssetConstant.ACTIVE_VALUE)) + .build()); + PolicyModel policy= PolicyModel.builder() .accessPolicies(List.of()) - .usagePolicies(List.of()) + .usagePolicies(usagePolicy) .build(); Map createEDCAsset = createEDCAssetFacilator.createEDCAsset(assetEntryRequest, policy); @@ -94,4 +105,5 @@ public void init() { log.info("PCF Exchange asset exists in edc connector, so ignoring asset creation"); } } -} + +} \ No newline at end of file diff --git a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/configuration/role/CustomPermissionEvaluator.java b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/configuration/role/CustomPermissionEvaluator.java index 0f963466f..4a4cb1cb5 100644 --- a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/configuration/role/CustomPermissionEvaluator.java +++ b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/configuration/role/CustomPermissionEvaluator.java @@ -1,6 +1,6 @@ /******************************************************************************** - * Copyright (c) 2022, 2023 T-Systems International GmbH - * Copyright (c) 2022, 2023 Contributors to the Eclipse Foundation + * Copyright (c) 2022,2024 T-Systems International GmbH + * Copyright (c) 2022,2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -24,6 +24,7 @@ import java.util.List; import org.eclipse.tractusx.sde.core.service.RoleManagementService; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.PermissionEvaluator; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; @@ -59,6 +60,9 @@ private boolean hasPrivilege(Authentication auth, String permission) { List list = auth.getAuthorities().stream().map(GrantedAuthority::getAuthority).toList(); + if(list.isEmpty()) + throw new AccessDeniedException("No access for configured resources"); + return !roleManagementService.findAll(list, List.of(permissionLs)).isEmpty(); } } \ No newline at end of file diff --git a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/processreport/repository/SubmodelCustomHistoryGenerator.java b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/processreport/repository/SubmodelCustomHistoryGenerator.java index 13f21cd3d..30f91b74b 100644 --- a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/processreport/repository/SubmodelCustomHistoryGenerator.java +++ b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/processreport/repository/SubmodelCustomHistoryGenerator.java @@ -1,6 +1,6 @@ /******************************************************************************** - * Copyright (c) 2022, 2024 T-Systems International GmbH - * Copyright (c) 2022, 2024 Contributors to the Eclipse Foundation + * Copyright (c) 2022,2024 T-Systems International GmbH + * Copyright (c) 2022,2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -123,17 +123,27 @@ private List readData(List colNames, String tableEntityName, S @Modifying @Transactional @SneakyThrows - public List readCreatedTwinsDetails(List colNames, String tableEntityName, String uuid, - String pkColomn) { + public List readCreatedTwinsDetails(List colNames, String tableEntityName, List uuids, + List pkColomn) { String columns = String.join(",", colNames); + + String pkColomns = String.join(" =? AND p.", pkColomn); + + if(pkColomn.size()==1) { + pkColomns = pkColomn.get(0)+ "=?"; + } + Query query = entityManager.createNativeQuery( - "SELECT " + columns + " FROM " + tableEntityName + " as p Where p." + pkColomn + "=? "); - query.setParameter(1, uuid); + "SELECT " + columns + " FROM " + tableEntityName + " as p Where p." + pkColomns + ""); + + AtomicInteger atInt = new AtomicInteger(1); + uuids.stream().forEach(uuid -> query.setParameter(atInt.getAndIncrement(), uuid)); + List resultList = query.getResultList(); if (resultList.isEmpty()) - throw new NoDataFoundException(String.format("No data found for %s ", uuid)); + throw new NoDataFoundException(String.format("No data found for %s ", uuids)); List records = new LinkedList<>(); @@ -142,6 +152,7 @@ public List readCreatedTwinsDetails(List colNames, String ta } return records; } + private JsonObject getJsonNodes(List colNames, Object[] objectArray) { JsonObject innerObject = new JsonObject(); @@ -156,7 +167,7 @@ private JsonObject getJsonNodes(List colNames, Object[] objectArray) { @Transactional @SneakyThrows public int saveSubmodelData(List colNames, String tableEntityName, String processId, JsonNode submodelData, - String pkColomn) { + List pkColomn) { StringBuilder colname = new StringBuilder(); StringBuilder parameters = new StringBuilder(); StringBuilder updateParameters = new StringBuilder(); @@ -171,9 +182,18 @@ public int saveSubmodelData(List colNames, String tableEntityName, Strin updateParameters.append("," + ele + " = EXCLUDED." + ele); } }); + + StringBuilder pkColomns = new StringBuilder(); + pkColomn.forEach(ele -> { + if (pkColomns.isEmpty()) { + pkColomns.append(ele); + } else { + pkColomns.append("," + ele); + } + }); Query query = entityManager.createNativeQuery("INSERT INTO " + tableEntityName + " (" + colname + ") VALUES (" - + parameters + ") ON CONFLICT (" + pkColomn + ") DO " + " UPDATE SET " + updateParameters); + + parameters + ") ON CONFLICT (" + pkColomns + ") DO " + " UPDATE SET " + updateParameters); AtomicInteger i = new AtomicInteger(1); colNames.forEach(col -> query.setParameter(i.getAndIncrement(), @@ -204,7 +224,7 @@ public int countUpdatedRecordCount(String tableEntityName, String updated, Strin } @SneakyThrows - public void checkTableIfNotExistCreate(JsonObject schema, List columns, String tableName, String pkCol) { + public void checkTableIfNotExistCreate(JsonObject schema, List columns, String tableName, String pkCol, List databaseIdentifierCols) { boolean isTableNotExist = false; try (Connection con = DriverManager.getConnection(dataSourceProperties.getUrl(), dataSourceProperties.getUsername(), dataSourceProperties.getPassword())) { @@ -226,16 +246,16 @@ public void checkTableIfNotExistCreate(JsonObject schema, List columns, } } catch (Exception e) { isTableNotExist = true; - log.error(tableName + " is not exist, so creating table"); + log.error(tableName + " is not exist, so creating table becuase "+e.getMessage()); } if (isTableNotExist) { - createTable(schema, columns, tableName, pkCol); + createTable(schema, columns, tableName, pkCol, databaseIdentifierCols); } } @SneakyThrows - public void createTable(JsonObject schema, List columns, String tableName, String pkCol) { + public void createTable(JsonObject schema, List columns, String tableName, String pkCol, List databaseIdentifierCols) { try (Connection con = DriverManager.getConnection(dataSourceProperties.getUrl(), dataSourceProperties.getUsername(), dataSourceProperties.getPassword())) { @@ -260,6 +280,18 @@ public void createTable(JsonObject schema, List columns, String tableNam colname.append(" CONSTRAINT " + tableName + "_pkey PRIMARY KEY (" + pkCol + ")"); + if(databaseIdentifierCols!=null) { + StringBuilder uniqcol = new StringBuilder(); + databaseIdentifierCols.forEach(ele -> { + if (uniqcol.isEmpty()) { + uniqcol.append(ele); + } else { + uniqcol.append("," + ele); + } + }); + colname.append(", CONSTRAINT " + tableName + "_un UNIQUE (" + uniqcol + ")"); + } + try (Statement stmt = con.createStatement()) { stmt.execute("CREATE TABLE " + tableName + " (" + colname + ")"); log.info(tableName + " created successfully"); @@ -283,4 +315,4 @@ private boolean isNumberTypeField(JsonObject jObject) { } return false; } -} +} \ No newline at end of file diff --git a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/registry/SubmodelRegistration.java b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/registry/SubmodelRegistration.java index 86e50e80a..08042f46b 100644 --- a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/registry/SubmodelRegistration.java +++ b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/registry/SubmodelRegistration.java @@ -1,6 +1,6 @@ /******************************************************************************** - * Copyright (c) 2022, 2024 T-Systems International GmbH - * Copyright (c) 2022, 2024 Contributors to the Eclipse Foundation + * Copyright (c) 2022,2024 T-Systems International GmbH + * Copyright (c) 2022,2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -62,7 +62,17 @@ public void register(SubmodelExtension subomdelService) { if (jsonElement != null && !jsonElement.isJsonNull()) { String pkCol = extractExactFieldName(jsonElement.getAsJsonObject().get("identifier").getAsString()); - submodelCustomHistoryGenerator.checkTableIfNotExistCreate(submodel.getSchema(), columns, tableName, pkCol); + + JsonElement databaseIdentifierSpecs = jsonElement.getAsJsonObject().get("databaseIdentifierSpecs"); + + List databaseIdentifierCols= null; + + if (databaseIdentifierSpecs != null && !databaseIdentifierSpecs.isJsonNull()) { + databaseIdentifierCols = databaseIdentifierSpecs.getAsJsonArray().asList().stream() + .map(ele -> extractExactFieldName(ele.getAsString())).toList(); + } + + submodelCustomHistoryGenerator.checkTableIfNotExistCreate(submodel.getSchema(), columns, tableName, pkCol, databaseIdentifierCols); } submodelList.add(submodel); @@ -81,4 +91,4 @@ private String extractExactFieldName(String str) { } } -} +} \ No newline at end of file diff --git a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/service/SubmodelOrchestartorService.java b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/service/SubmodelOrchestartorService.java index 0f0923504..b838c097a 100644 --- a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/service/SubmodelOrchestartorService.java +++ b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/service/SubmodelOrchestartorService.java @@ -1,6 +1,6 @@ /******************************************************************************** - * Copyright (c) 2022, 2024 T-Systems International GmbH - * Copyright (c) 2022, 2024 Contributors to the Eclipse Foundation + * Copyright (c) 2022,2024 T-Systems International GmbH + * Copyright (c) 2022,2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -89,7 +89,6 @@ public class SubmodelOrchestartorService { private final SubmoduleUtility submoduleUtility; private final GenericSubmodelExecutor genericSubmodelExecutor; - private final DatabaseUsecaseHandler databaseUsecaseHandler; ObjectMapper mapper = new ObjectMapper(); @@ -146,7 +145,7 @@ private void processCsv(PolicyModel submodelPolicyRequest, String processId, Sub updatedcount); // Push PCF value which already Approve request of consumer - if (submodelSchemaObject.getId().equalsIgnoreCase("pcf")) { + if (submodelSchemaObject.getId().contains("pcf")) { databaseUsecaseHandler.init(submodelSchemaObject.getSchema()); List readCreatedTwins = databaseUsecaseHandler.readCreatedTwins(processId, null); asyncPushPCFDataForApproveRequest.pushPCFDataForApproveRequest(readCreatedTwins, submodelPolicyRequest); @@ -196,7 +195,7 @@ public void processSubmodel(SubmodelJsonRequest submodelJsonRequest, String proc updatedcount); // Push PCF value which already Approve request of consumer - if (submodelSchemaObject.getId().equalsIgnoreCase("pcf")) { + if (submodelSchemaObject.getId().contains("pcf")) { databaseUsecaseHandler.init(submodelSchemaObject.getSchema()); List readCreatedTwins = databaseUsecaseHandler.readCreatedTwins(processId, null); asyncPushPCFDataForApproveRequest.pushPCFDataForApproveRequest(readCreatedTwins, policy); @@ -229,13 +228,15 @@ public void deleteSubmodelDigitalTwinsAndEDC(String refProcessId, String delProc processReportUseCase.startDeleteProcess(oldProcessReport, refProcessId, submodel, readCreatedTwinsforDelete.size(), delProcessId); - readCreatedTwinsforDelete.stream().forEach(obj -> { + List filterList = readCreatedTwinsforDelete.stream().map(obj-> { + JsonObject rowjObj = obj.get("csv").getAsJsonObject(); int andIncrement = atInt.incrementAndGet(); - obj.addProperty(ROW_NUMBER, andIncrement); - obj.addProperty(PROCESS_ID, refProcessId); - }); + rowjObj.addProperty(ROW_NUMBER, andIncrement); + rowjObj.addProperty(PROCESS_ID, refProcessId); + return rowjObj; + }).toList(); - readCreatedTwinsforDelete.parallelStream().forEach(rowjObj -> { + filterList.parallelStream().forEach(rowjObj -> { try { executor.executeDeleteRecord(rowjObj.get(ROW_NUMBER).getAsInt(), rowjObj, delProcessId, refProcessId); @@ -341,4 +342,5 @@ public Submodel findSubmodel(List columns) { } return foundSubmodelSchemaObject; } + } \ No newline at end of file diff --git a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/service/SubmodelService.java b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/service/SubmodelService.java index 065222bfa..673d3f233 100644 --- a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/service/SubmodelService.java +++ b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/service/SubmodelService.java @@ -1,6 +1,6 @@ /******************************************************************************** - * Copyright (c) 2022, 2024 T-Systems International GmbH - * Copyright (c) 2022, 2024 Contributors to the Eclipse Foundation + * Copyright (c) 2022,2024 T-Systems International GmbH + * Copyright (c) 2022,2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -57,7 +57,7 @@ public List> findAllSubmodels(List usecases) { if (neededSubmodelList.contains(obj.getId()) || usecases == null || usecases.isEmpty()) { Map sbBuild = new LinkedHashMap<>(); sbBuild.put("id", obj.getId()); - sbBuild.put("name", obj.getName() +"-v"+obj.getVersion()); + sbBuild.put("name", obj.getName()); sbBuild.put("version", obj.getVersion()); sbBuild.put("semanticId", obj.getSemanticId()); ls.add(sbBuild); diff --git a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/submodel/executor/GenericSubmodelExecutor.java b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/submodel/executor/GenericSubmodelExecutor.java index 2cd83ee1b..3aa235654 100644 --- a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/submodel/executor/GenericSubmodelExecutor.java +++ b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/submodel/executor/GenericSubmodelExecutor.java @@ -26,6 +26,7 @@ import org.eclipse.tractusx.sde.common.constants.CommonConstants; import org.eclipse.tractusx.sde.common.entities.PolicyModel; import org.eclipse.tractusx.sde.common.entities.csv.RowData; +import org.eclipse.tractusx.sde.common.exception.NoDataFoundException; import org.eclipse.tractusx.sde.common.submodel.executor.BPNDiscoveryUsecaseStep; import org.eclipse.tractusx.sde.common.submodel.executor.DatabaseUsecaseStep; import org.eclipse.tractusx.sde.common.submodel.executor.DigitalTwinUsecaseStep; @@ -52,28 +53,23 @@ public class GenericSubmodelExecutor extends SubmodelExecutor { private final GenerateUrnUUID generateUrnUUID; private final JsonRecordValidate jsonRecordValidate; - @Qualifier("DigitalTwinUseCaseHandler") private final DigitalTwinUsecaseStep digitalTwinUseCaseStep; - @Qualifier("EDCUsecaseHandler") private final EDCUsecaseStep edcUseCaseStep; - @Qualifier("BPNDiscoveryUseCaseHandler") private final BPNDiscoveryUsecaseStep bpnUseCaseTwinStep; - @Qualifier("DatabaseUsecaseHandler") private final DatabaseUsecaseStep databaseUseCaseStep; - @Qualifier("SubmoduleResponseHandler") private final SubmoduleMapperUsecaseStep submodelMapperUseCaseStep; public GenericSubmodelExecutor(CsvParse csvParseStep, JsonRecordFormating jsonRecordformater, GenerateUrnUUID generateUrnUUID, JsonRecordValidate jsonRecordValidate, - @Qualifier("DigitalTwinUseCaseHandler") DigitalTwinUsecaseStep digitalTwinUseCaseStep, - @Qualifier("EDCUsecaseHandler") EDCUsecaseStep edcUseCaseStep, - @Qualifier("BPNDiscoveryUseCaseHandler") BPNDiscoveryUsecaseStep bpnUseCaseTwinStep, - @Qualifier("DatabaseUsecaseHandler") DatabaseUsecaseStep databaseUseCaseStep, - @Qualifier("SubmoduleResponseHandler") SubmoduleMapperUsecaseStep submodelMapperUseCaseStep) { + @Qualifier("digitalTwinUseCaseHandler") DigitalTwinUsecaseStep digitalTwinUseCaseStep, + @Qualifier("eDCUsecaseHandler") EDCUsecaseStep edcUseCaseStep, + @Qualifier("bPNDiscoveryUseCaseHandler") BPNDiscoveryUsecaseStep bpnUseCaseTwinStep, + @Qualifier("databaseUsecaseHandler") DatabaseUsecaseStep databaseUseCaseStep, + @Qualifier("submoduleResponseHandler") SubmoduleMapperUsecaseStep submodelMapperUseCaseStep) { this.csvParseStep = csvParseStep; this.jsonRecordformater = jsonRecordformater; this.generateUrnUUID = generateUrnUUID; @@ -110,6 +106,7 @@ public void executeJsonRecord(Integer rowIndex, ObjectNode jsonObject, String pr @SneakyThrows private void nextSteps(Integer rowIndex, ObjectNode jsonObject, String processId, PolicyModel policy) { + generateUrnUUID.init(getSubmodelSchema()); generateUrnUUID.run(jsonObject, processId); jsonRecordValidate.init(getSubmodelSchema()); @@ -141,7 +138,10 @@ public void executeDeleteRecord(Integer rowIndex, JsonObject jsonObject, String @Override public List readCreatedTwinsforDelete(String refProcessId) { getDatabaseExecutorStep().init(getSubmodelSchema()); - return getDatabaseExecutorStep().readCreatedTwins(refProcessId, CommonConstants.DELETED_Y); + List allSubmoduleAsJsonList= getDatabaseExecutorStep().readCreatedTwins(refProcessId, CommonConstants.DELETED_Y); + if (allSubmoduleAsJsonList.isEmpty()) + throw new NoDataFoundException("No data founds for deletion " + refProcessId); + return allSubmoduleAsJsonList; } @Override diff --git a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/submodel/executor/step/DatabaseUsecaseHandler.java b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/submodel/executor/step/DatabaseUsecaseHandler.java index 125601eb7..3d2cc59d8 100644 --- a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/submodel/executor/step/DatabaseUsecaseHandler.java +++ b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/submodel/executor/step/DatabaseUsecaseHandler.java @@ -29,9 +29,12 @@ import org.eclipse.tractusx.sde.common.model.Submodel; import org.eclipse.tractusx.sde.common.submodel.executor.DatabaseUsecaseStep; import org.eclipse.tractusx.sde.common.submodel.executor.Step; +import org.eclipse.tractusx.sde.common.submodel.executor.SubmoduleMapperUsecaseStep; +import org.eclipse.tractusx.sde.common.utils.LogUtil; import org.eclipse.tractusx.sde.core.processreport.repository.SubmodelCustomHistoryGenerator; import org.eclipse.tractusx.sde.core.service.SubmodelService; import org.eclipse.tractusx.sde.core.utils.SubmoduleUtility; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.JsonNode; @@ -43,7 +46,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j -@Service("DatabaseUsecaseHandler") +@Service("databaseUsecaseHandler") @RequiredArgsConstructor public class DatabaseUsecaseHandler extends Step implements DatabaseUsecaseStep { @@ -51,8 +54,13 @@ public class DatabaseUsecaseHandler extends Step implements DatabaseUsecaseStep private final SubmodelService submodelService; private final SubmoduleUtility submoduleUtility; + + @Qualifier("submoduleResponseHandler") + private final SubmoduleMapperUsecaseStep submoduleResponseHandler; + @SneakyThrows + @Override public JsonNode run(Integer rowIndex, ObjectNode jsonObject, String processId, PolicyModel policy) { Submodel schemaObj = submodelService.findSubmodelByNameAsSubmdelObject(getNameOfModel()); @@ -60,7 +68,7 @@ public JsonNode run(Integer rowIndex, ObjectNode jsonObject, String processId, P String tableName = submoduleUtility.getTableName(schemaObj); submodelCustomHistoryGenerator.saveSubmodelData(columns, tableName, processId, jsonObject, - extractExactFieldName(getIdentifierOfModel())); + getDatabaseIdentifierSpecsOfModel()); return jsonObject; } @@ -70,68 +78,77 @@ public JsonNode run(Integer rowIndex, ObjectNode jsonObject, String processId, P public void saveSubmoduleWithDeleted(Integer rowIndex, JsonObject jsonObject, String delProcessId, String refProcessId) { - String uuid = jsonObject.get(extractExactFieldName(getIdentifierOfModel())).getAsString(); + String identifier = extractExactFieldName(getIdentifierOfModel()); + String uuid = jsonObject.get(identifier).getAsString(); Submodel schemaObj = submodelService.findSubmodelByNameAsSubmdelObject(getNameOfModel()); String tableName = submoduleUtility.getTableName(schemaObj); - - submodelCustomHistoryGenerator.saveAspectWithDeleted(uuid, tableName, - extractExactFieldName(getIdentifierOfModel())); + submodelCustomHistoryGenerator.saveAspectWithDeleted(uuid, tableName, identifier); } @SneakyThrows + @Override public List readCreatedTwins(String refProcessId, String fetchNotDeletedRecord) { Submodel schemaObj = submodelService.findSubmodelByNameAsSubmdelObject(getNameOfModel()); List columns = submoduleUtility.getTableColomnHeader(schemaObj); String tableName = submoduleUtility.getTableName(schemaObj); - - List allSubmoduleAsJsonList = submodelCustomHistoryGenerator.findAllSubmoduleAsJsonList(columns, - tableName, refProcessId, fetchNotDeletedRecord); - - if (allSubmoduleAsJsonList.isEmpty()) - throw new NoDataFoundException("No data founds for deletion " + refProcessId); - - return allSubmoduleAsJsonList; + + submoduleResponseHandler.init(schemaObj.getSchema()); + + return submodelCustomHistoryGenerator.findAllSubmoduleAsJsonList(columns, + tableName, refProcessId, fetchNotDeletedRecord) + .stream() + .map(submoduleResponseHandler::mapJsonbjectToFormatedResponse).toList(); } @SneakyThrows - public JsonObject readCreatedTwinsBySpecifyColomn(String sematicId, String basedCol, String value) { + @Override + public JsonObject readCreatedTwinsBySpecifyColomn(String sematicId, String value) { List allSubmodels = submodelService.getAllSubmodels(); List list = allSubmodels.stream().filter(ele -> ele.getSemanticId().startsWith(sematicId)).toList(); List jsonObjectList = list.stream().flatMap(schemaObj -> { try { + this.init(schemaObj.getSchema()); + submoduleResponseHandler.init(schemaObj.getSchema()); + List columns = submoduleUtility.getTableColomnHeader(schemaObj); String tableName = submoduleUtility.getTableName(schemaObj); - return submodelCustomHistoryGenerator.readCreatedTwinsDetails(columns, tableName, value, basedCol).stream(); + + return submodelCustomHistoryGenerator + .readCreatedTwinsDetails(columns, tableName, getIdentifierValuesAsList(value), + getDatabaseIdentifierSpecsOfModel()) + .stream().map(submoduleResponseHandler::mapJsonbjectToFormatedResponse); } catch (Exception e) { - log.debug("Exception for {}, {}, {}, {}", sematicId, basedCol, value, e.getMessage()); + log.debug(LogUtil.encode("Exception for " + sematicId +", " + value + ", " + e.getMessage())); } return null; - }) - .filter(ele-> Optional.ofNullable(ele).isPresent()) - .toList(); - + }).filter(ele -> Optional.ofNullable(ele).isPresent()).toList(); + if (jsonObjectList.isEmpty()) - throw new NoDataFoundException("No data founds for "+sematicId +", " + value); + throw new NoDataFoundException("No data founds for " + sematicId + ", " + value); else return jsonObjectList.get(0); } @SneakyThrows + @Override public JsonObject readCreatedTwinsDetails(String uuid) { + Submodel schemaObj = submodelService.findSubmodelByNameAsSubmdelObject(getNameOfModel()); List columns = submoduleUtility.getTableColomnHeader(schemaObj); String tableName = submoduleUtility.getTableName(schemaObj); - return submodelCustomHistoryGenerator.readCreatedTwinsDetails(columns, tableName, uuid, - extractExactFieldName(getIdentifierOfModel())).get(0); + + return submodelCustomHistoryGenerator.readCreatedTwinsDetails(columns, tableName, + getIdentifierValuesAsList(uuid), getDatabaseIdentifierSpecsOfModel()).get(0); } @SneakyThrows + @Override public int getUpdatedData(String processId) { Submodel schemaObj = submodelService.findSubmodelByNameAsSubmdelObject(getNameOfModel()); String tableName = submoduleUtility.getTableName(schemaObj); return submodelCustomHistoryGenerator.countUpdatedRecordCount(tableName, CommonConstants.UPDATED_Y, processId); } -} +} \ No newline at end of file diff --git a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/constants/EDCAssetConstant.java b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/constants/EDCAssetConstant.java index bdb586606..6c8e7e03c 100644 --- a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/constants/EDCAssetConstant.java +++ b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/constants/EDCAssetConstant.java @@ -33,14 +33,21 @@ public final class EDCAssetConstant { public static final String ASSET_PROP_FILENAME = "fileName"; public static final String ASSET_PROP_TYPE = "type"; public static final String ASSET_PROP_POLICYID = "policy-id"; - public static final String ASSET_PROP_TWIN_VERSION = "1.0.0"; + public static final String ASSET_PROP_COMMON_VERSION = "1.0.0"; + public static final String ASSET_PROP_DCAT_VERSION="1.0.0"; public static final String ASSET_PROP_TYPE_VALUE = "data.core.digitalTwin.submodel"; - public static final String DATA_CORE_DIGITAL_TWIN_REGISTRY_TYPE = "data.core.digitalTwinRegistry"; - public static final String DATA_CORE_PCF_EXCHANGE_ENPOINT_TYPE = "data.pcf.exchangeEndpoint"; + public static final String DATA_CORE_DIGITAL_TWIN_REGISTRY_TYPE = "DigitalTwinRegistry"; + public static final String DATA_CORE_PCF_EXCHANGE_ENPOINT_TYPE = "PcfExchange"; public static final String CX_TAXO_PREFIX = "cx-taxo:"; public static final String TX_AUTH_PREFIX = "tx-auth:"; + public static final String CX_POLICY_PREFIX = "cx-policy:"; + + public static final String PCF_FRAMEWORK_AGREEMENT_LEFT_OPERAND = CX_POLICY_PREFIX+"FrameworkAgreement"; + public static final String PCF_FRAMEWORK_AGREEMENT_RIGHT_OPERAND = "PCF:1.0"; + public static final String MEMBERSHIP_LEFT_OPERAND = CX_POLICY_PREFIX+"Membership"; + public static final String ACTIVE_VALUE = "active"; public static final String DCT_TYPE = "dct:type"; public static final String AAS_SEMANTICS_SEMANTIC_ID = "aas-semantics:semanticId"; diff --git a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/asset/AssetEntryRequestFactory.java b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/asset/AssetEntryRequestFactory.java index c923073bc..334a3bd76 100644 --- a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/asset/AssetEntryRequestFactory.java +++ b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/asset/AssetEntryRequestFactory.java @@ -1,7 +1,7 @@ /******************************************************************************** * Copyright (c) 2022 BMW GmbH - * Copyright (c) 2022, 2024 T-Systems International GmbH - * Copyright (c) 2022, 2024 Contributors to the Eclipse Foundation + * Copyright (c) 2022,2024 T-Systems International GmbH + * Copyright (c) 2022,2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -71,7 +71,9 @@ public AssetEntryRequest getAssetRequest(String submodel, String assetName, Stri } private String subModelPayloadUrl(String submodel, String submoduleUriPath, String uuid) { - return UriComponentsBuilder.fromHttpUrl(dftHostname).path("/" + submodel + "/" + submoduleUriPath).path(uuid) + return UriComponentsBuilder.fromHttpUrl(dftHostname) + .path("/" + submodel + "/" + submoduleUriPath) + .path("/" + uuid) .toUriString(); } @@ -84,8 +86,8 @@ private HashMap getAssetProperties(String assetId, String assetN assetProperties.put(EDCAssetConstant.ASSET_PROP_VERSION, EDCAssetConstant.ASSET_PROP_VERSION_VALUE); assetProperties.put(EDCAssetConstant.RDFS_LABEL, assetName); assetProperties.put(EDCAssetConstant.RDFS_COMMENT, assetName); - assetProperties.put(EDCAssetConstant.DCAT_VERSION, EDCAssetConstant.ASSET_PROP_TWIN_VERSION); - assetProperties.put(EDCAssetConstant.CX_COMMON_VERSION, EDCAssetConstant.ASSET_PROP_TWIN_VERSION); + assetProperties.put(EDCAssetConstant.DCAT_VERSION, EDCAssetConstant.ASSET_PROP_DCAT_VERSION); + assetProperties.put(EDCAssetConstant.CX_COMMON_VERSION, EDCAssetConstant.ASSET_PROP_COMMON_VERSION); if (StringUtils.isNotBlank(sematicId)) assetProperties.put(EDCAssetConstant.AAS_SEMANTICS_SEMANTIC_ID, Map.of("@id", sematicId)); @@ -115,4 +117,5 @@ private HashMap getDataAddressProperties(String shellId, String dataAddressProperties.put("contentType", EDCAssetConstant.ASSET_PROP_CONTENT_TYPE); return dataAddressProperties; } + } \ No newline at end of file