diff --git a/CHANGELOG.md b/CHANGELOG.md index 3371df6a6..af0890127 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,12 +32,17 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Refactor code for pcf, dt access API, EDC 7. - Dt access api use in digital twin processing. - Added test cases for PCF and policy controller. +- Refactor code to make stable release ### Fixed - Remove garbage character from 'edc_request_template' path. Fixed [#147](https://github.com/eclipse-tractusx/managed-simple-data-exchanger-backend/issues/147). - Dependabot bump version fix in pom.xml and DEPENDENCIES file update. - Dockerfile image update. [#117](https://github.com/eclipse-tractusx/managed-simple-data-exchanger-backend/pull/117) +## [2.3.7] - 2024-05-09 +### Fixed +- Rename edc_request_template directory. +- This is fixed for issue #147. ## [2.3.6] - 2024-03-06 ### Fixed diff --git a/build/Dockerfile b/build/Dockerfile index 7b1a1f40c..0a2d67b1e 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -27,7 +27,9 @@ COPY ../pom.xml ./pom.xml COPY ../modules ./modules # build for release -RUN mvn clean install +#Commeting this because workflow job already building jar file +#As SDE its require some docker enviroment to run test cases so avoid it +#RUN mvn clean install # our final base image diff --git a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/submodel/executor/step/EDCUsecaseHandler.java b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/submodel/executor/step/EDCUsecaseHandler.java index f3e275c9c..87a7515f4 100644 --- a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/submodel/executor/step/EDCUsecaseHandler.java +++ b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/submodel/executor/step/EDCUsecaseHandler.java @@ -58,7 +58,8 @@ public ObjectNode run(Integer rowNumber, ObjectNode objectNode, String processId SubmoduleCommonColumnsConstant.SHELL_ID); String subModelId = JsonObjectUtility.getValueFromJsonObjectAsString(objectNode, SubmoduleCommonColumnsConstant.SUBMODULE_ID); - String uuid = JsonObjectUtility.getValueFromJsonObjectAsString(objectNode, getIdentifierOfModel()); + + String uuid = getDatabaseIdentifierValues(objectNode, getDatabaseIdentifierSpecsOfModel()); AssetEntryRequest assetEntryRequest = assetFactory.getAssetRequest(submodule, getSubmodelShortDescriptionOfModel(), shellId, subModelId, getSubmoduleUriPathOfSubmodule(), uuid, diff --git a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/utils/SubmoduleUtility.java b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/utils/SubmoduleUtility.java index 2c8c27d3d..5ccc08680 100644 --- a/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/utils/SubmoduleUtility.java +++ b/modules/sde-core/src/main/java/org/eclipse/tractusx/sde/core/utils/SubmoduleUtility.java @@ -47,6 +47,7 @@ public List getTableColomnHeader(Submodel schemaObj) { tableColomnHeader.add(SubmoduleCommonColumnsConstant.PROCESS_ID); tableColomnHeader.add(SubmoduleCommonColumnsConstant.DELETED); tableColomnHeader.add(SubmoduleCommonColumnsConstant.UPDATED); + tableColomnHeader.add(SubmoduleCommonColumnsConstant.SHELL_ACCESS_RULE_IDS); return tableColomnHeader; } diff --git a/modules/sde-core/src/main/resources/application.properties b/modules/sde-core/src/main/resources/application.properties index 835090129..a2f03f7cc 100644 --- a/modules/sde-core/src/main/resources/application.properties +++ b/modules/sde-core/src/main/resources/application.properties @@ -64,10 +64,12 @@ logging.level.root=info ## Digital Twins digital-twins.hostname= digital-twins.authentication.url= -digital-twins.api=/api/v3.0 +digital-twins.registry.uri= +digital-twins.registry.lookup.uri= digital-twins.authentication.clientId= digital-twins.authentication.clientSecret= digital-twins.authentication.grantType=client_credentials +digital-twins.authentication.scope= ## EDC Provider edc.hostname= @@ -76,6 +78,8 @@ edc.apiKeyHeader= edc.apiKey= edc.dsp.endpointpath=/api/v1/dsp edc.dataplane.endpointpath=/api/public +edc.managementpath.apiversion=/v2 +edc.managementpath.apiversion.asset=/v3 ## EDC Consumer edc.consumer.hostname= diff --git a/modules/sde-core/src/main/resources/edc_request_template/edc_asset_lookup.json b/modules/sde-core/src/main/resources/edc_request_template/edc_asset_lookup.json index 2f1479b54..653b4df29 100644 --- a/modules/sde-core/src/main/resources/edc_request_template/edc_asset_lookup.json +++ b/modules/sde-core/src/main/resources/edc_request_template/edc_asset_lookup.json @@ -11,12 +11,12 @@ { "edc:operandLeft": "https://w3id.org/edc/v0.0.1/ns/type", "edc:operator": "=", - "edc:operandRight": "data.core.digitalTwinRegistry" + "edc:operandRight": "${assetType}" }, { - "edc:operandLeft": "https://w3id.org/edc/v0.0.1/ns/registry", + "edc:operandLeft": "https://w3id.org/edc/v0.0.1/ns/${registryType}", "edc:operator": "=", - "edc:operandRight": "${digitalTwinRegistry}" + "edc:operandRight": "${baseUrl}" } ] } \ No newline at end of file diff --git a/modules/sde-core/src/main/resources/edc_request_template/edc_asset_lookup_for_exchange.json b/modules/sde-core/src/main/resources/edc_request_template/edc_asset_lookup_for_exchange.json index ac1334f44..f4b571575 100644 --- a/modules/sde-core/src/main/resources/edc_request_template/edc_asset_lookup_for_exchange.json +++ b/modules/sde-core/src/main/resources/edc_request_template/edc_asset_lookup_for_exchange.json @@ -3,7 +3,7 @@ { "operandLeft": "https://w3id.org/edc/v0.0.1/ns/type", "operator": "=", - "operandRight": "data.core.digitalTwinRegistry" + "operandRight": "${type}" } ] } \ No newline at end of file diff --git a/modules/sde-core/src/test/java/org/eclipse/tractusx/sde/controllers/ConsumerControllerTest.java b/modules/sde-core/src/test/java/org/eclipse/tractusx/sde/controllers/ConsumerControllerTest.java index e2ca2e924..c4cd2c56e 100644 --- a/modules/sde-core/src/test/java/org/eclipse/tractusx/sde/controllers/ConsumerControllerTest.java +++ b/modules/sde-core/src/test/java/org/eclipse/tractusx/sde/controllers/ConsumerControllerTest.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. @@ -27,7 +27,9 @@ import static org.mockito.Mockito.when; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.eclipse.tractusx.sde.common.entities.Policies; import org.eclipse.tractusx.sde.core.controller.ConsumerController; @@ -66,7 +68,7 @@ class ConsumerControllerTest { @Test void testQueryOnDataOfferWithoutOfferModel() throws Exception { when(consumerControlPanelService.queryOnDataOffers((String) any(), (String) any(), (String) any(), anyInt(), - anyInt())).thenReturn(new ArrayList<>()); + anyInt())).thenReturn(new HashSet<>()); MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/query-data-offers") .param("bpnNumber", "foo"); @@ -78,7 +80,7 @@ void testQueryOnDataOfferWithoutOfferModel() throws Exception { @Test void testQueryOnDataOffersWithOfferModel() throws Exception { - ArrayList queryDataOfferModelList = new ArrayList<>(); + Set queryDataOfferModelList = new HashSet<>(); queryDataOfferModelList.add(QueryDataOfferModel.builder() .assetId("foo") .connectorId("test") diff --git a/modules/sde-core/src/test/java/org/eclipse/tractusx/sde/controllers/PolicyControllerTest.java b/modules/sde-core/src/test/java/org/eclipse/tractusx/sde/controllers/PolicyControllerTest.java index bc022bbcd..f56faeb96 100644 --- a/modules/sde-core/src/test/java/org/eclipse/tractusx/sde/controllers/PolicyControllerTest.java +++ b/modules/sde-core/src/test/java/org/eclipse/tractusx/sde/controllers/PolicyControllerTest.java @@ -54,73 +54,98 @@ @EnablePostgreSQL class PolicyControllerTest { - @Autowired - private MockMvc mvc; - @Autowired - private PolicyRepository policyRepository; - - @Autowired - private PolicyService policyService; - - private final ObjectMapper objectMapper = new ObjectMapper(); - - @BeforeEach - public void init() { - policyRepository.deleteAll(); - } - - //@Test - void testSaveAndRetrievePolicy() throws Exception { - mvc.perform(MockMvcRequestBuilders.post("/policy").contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(getPolicy("new_policy")))).andExpect(status().isOk()); - - Assertions.assertEquals(1, policyRepository.findAll().size()); - List entities = policyRepository.findAll(); - String uuid = entities.get(0).getUuid(); - - mvc.perform(MockMvcRequestBuilders.get("/policy/{uuid}", uuid).contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()); - - } - - //@Test - void testUniquePolicies() throws Exception { - mvc.perform(MockMvcRequestBuilders.post("/policy").contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(getPolicy("new_policy")))).andExpect(status().isOk()); - - Assertions.assertEquals(1, policyRepository.findAll().size()); - - mvc.perform(MockMvcRequestBuilders.post("/policy").contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(getPolicy("new_policy")))).andExpect(status().isBadRequest()); - - Assertions.assertEquals(1, policyRepository.findAll().size()); - - } - - //@Test - void findMatchingPolicyBasedOnFileName() throws Exception { - - String fileName = "Mysubmodel_new_policy.csv"; - mvc.perform(MockMvcRequestBuilders.post("/policy").contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(getPolicy("new_policy")))).andExpect(status().isOk()); - - List findMatchingPolicyBasedOnFileName = policyService.findMatchingPolicyBasedOnFileName(fileName); - Assertions.assertEquals(1, findMatchingPolicyBasedOnFileName.size()); - Assertions.assertEquals("new_policy", findMatchingPolicyBasedOnFileName.get(0).getPolicyName()); - - } - - private PolicyModel getPolicy(String policyName) { - - List accessPolicies = List.of( - Policies.builder().technicalKey("BusinessPartnerNumber") - .value(List.of("BPNL00000005PROV", "BPNL00000005PROW", "BPNL00000005PROB")).build(), - Policies.builder().technicalKey("Membership").value(List.of("active")).build()); - - Policies usagePolicies = Policies.builder().technicalKey("Membership").value(List.of("active")).build(); - - return PolicyModel.builder().policyName(policyName).accessPolicies(accessPolicies) - .usagePolicies(List.of(usagePolicies)).build(); - } + @Autowired + private MockMvc mvc; + + @Autowired + private PolicyRepository policyRepository; + + @Autowired + private PolicyService policyService; + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @BeforeEach + public void init() { + policyRepository.deleteAll(); + } + + @Test + void testSaveAndRetrievePolicy() throws Exception { + mvc.perform(MockMvcRequestBuilders + .post("/policy") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(getPolicy("new_policy")))) + .andExpect(status().isOk()); + + Assertions.assertEquals(1, policyRepository.findAll().size()); + List entities = policyRepository.findAll(); + String uuid = entities.get(0).getUuid(); + + mvc.perform(MockMvcRequestBuilders + .get("/policy/{uuid}", uuid) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + + } + + @Test + void testUniquePolicies() throws Exception { + mvc.perform(MockMvcRequestBuilders + .post("/policy") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(getPolicy("new_policy")))) + .andExpect(status().isOk()); + + Assertions.assertEquals(1, policyRepository.findAll().size()); + + mvc.perform(MockMvcRequestBuilders + .post("/policy") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(getPolicy("new_policy")))) + .andExpect(status().isBadRequest()); + + Assertions.assertEquals(1, policyRepository.findAll().size()); + + } + + @Test + void findMatchingPolicyBasedOnFileName() throws Exception { + + String fileName = "Mysubmodel_new_policy.csv"; + mvc.perform(MockMvcRequestBuilders + .post("/policy") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(getPolicy("new_policy")))) + .andExpect(status().isOk()); + + List findMatchingPolicyBasedOnFileName = policyService.findMatchingPolicyBasedOnFileName(fileName); + Assertions.assertEquals(1, findMatchingPolicyBasedOnFileName.size()); + Assertions.assertEquals("new_policy", findMatchingPolicyBasedOnFileName.get(0).getPolicyName()); + + } + + + private PolicyModel getPolicy(String policyName) { + + List accessPolicies = List.of(Policies.builder() + .technicalKey("BusinessPartnerNumber") + .value(List.of("BPNL00000005PROV", "BPNL00000005PROW", "BPNL00000005PROB")) + .build(),Policies.builder() + .technicalKey("Membership") + .value(List.of("active")) + .build()); + + Policies usagePolicies = Policies.builder() + .technicalKey("Membership") + .value(List.of("active")) + .build(); + + return PolicyModel.builder() + .policyName(policyName) + .accessPolicies(accessPolicies) + .usagePolicies(List.of(usagePolicies)) + .build(); + } } \ No newline at end of file diff --git a/modules/sde-core/src/test/java/org/eclipse/tractusx/sde/service/ConsumerControlPanelServiceTest.java b/modules/sde-core/src/test/java/org/eclipse/tractusx/sde/service/ConsumerControlPanelServiceTest.java index ed19685ce..d7175281e 100644 --- a/modules/sde-core/src/test/java/org/eclipse/tractusx/sde/service/ConsumerControlPanelServiceTest.java +++ b/modules/sde-core/src/test/java/org/eclipse/tractusx/sde/service/ConsumerControlPanelServiceTest.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.UUID; import org.eclipse.tractusx.sde.bpndiscovery.handler.BpnDiscoveryProxyService; @@ -143,7 +144,7 @@ public void setup() { void testQueryOnDataOfferEmpty() throws Exception { - List queryOnDataOffers = consumerControlPanelService.queryOnDataOffers("example", "", "", + Set queryOnDataOffers = consumerControlPanelService.queryOnDataOffers("example", "", "", 0, 0); assertTrue(queryOnDataOffers.isEmpty()); } diff --git a/modules/sde-core/src/test/resource/application-test.properties b/modules/sde-core/src/test/resources/application-test.properties similarity index 92% rename from modules/sde-core/src/test/resource/application-test.properties rename to modules/sde-core/src/test/resources/application-test.properties index 5f2f80790..5651f211b 100644 --- a/modules/sde-core/src/test/resource/application-test.properties +++ b/modules/sde-core/src/test/resources/application-test.properties @@ -106,7 +106,7 @@ portal.backend.clientSecret=test portal.backend.grantType=client_credentials ## bpn & discovery finder -bpndiscovery.hostname=http://test +bpndiscovery.hostname=test discovery.authentication.url=test discovery.clientId=test discovery.clientSecret=test @@ -115,6 +115,18 @@ discovery.grantType=client_credentials springdoc.api-docs.path=/api-docs springdoc.swagger-ui.oauth.client-id=test +## Notification Email server info +mail.smtp.username=test +mail.smtp.password=test +mail.smtp.host=test +mail.smtp.port=587 +mail.from.address=test +mail.to.address=test +mail.cc.address=test +mail.replyto.address=test +mail.smtp.starttls.enable=true +mail.smtp.auth=true + # policy-hub config policy.hub.hostname=test policy.hub.authentication.url=test diff --git a/modules/sde-external-services/README.md b/modules/sde-external-services/README.md index 5df0c77af..c15abaa28 100644 --- a/modules/sde-external-services/README.md +++ b/modules/sde-external-services/README.md @@ -11,5 +11,4 @@ Currenlty SDE consume below Downstearm services API's to perform the Asset creat - edc - digital-twins - portal -- bpn-discovery -- policy-nub \ No newline at end of file +- bpn-discovery \ No newline at end of file diff --git a/modules/sde-external-services/bpn-discovery/src/main/java/org/eclipse/tractusx/sde/bpndiscovery/handler/BPNDiscoveryUseCaseHandler.java b/modules/sde-external-services/bpn-discovery/src/main/java/org/eclipse/tractusx/sde/bpndiscovery/handler/BPNDiscoveryUseCaseHandler.java index 49a7c5fb2..8540aefc8 100644 --- a/modules/sde-external-services/bpn-discovery/src/main/java/org/eclipse/tractusx/sde/bpndiscovery/handler/BPNDiscoveryUseCaseHandler.java +++ b/modules/sde-external-services/bpn-discovery/src/main/java/org/eclipse/tractusx/sde/bpndiscovery/handler/BPNDiscoveryUseCaseHandler.java @@ -96,7 +96,7 @@ public void delete(Integer rowIndex, JsonObject jsonObject, String delProcessId, private Map generateBPNDiscoveryIdentifiersIds(JsonNode jsonObject) { return getBPNDiscoverySpecsOfModel().entrySet().stream().map(entry -> { - String value = JsonObjectUtility.getValueFromJsonObjectAsString(jsonObject, entry.getValue().getAsString()); + String value = JsonObjectUtility.getValueFromJsonObjectAsString(jsonObject, extractExactFieldName(entry.getValue().getAsString())); if (StringUtils.isBlank(value)) { value = entry.getValue().getAsString(); } diff --git a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/policies/PolicyConstraintBuilderService.java b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/policies/PolicyConstraintBuilderService.java index 684be2878..39efa93bb 100644 --- a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/policies/PolicyConstraintBuilderService.java +++ b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/policies/PolicyConstraintBuilderService.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. @@ -29,6 +29,7 @@ import org.eclipse.tractusx.sde.common.entities.Policies; import org.eclipse.tractusx.sde.common.entities.PolicyModel; import org.eclipse.tractusx.sde.common.mapper.JsonObjectMapper; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.JsonNode; @@ -39,29 +40,83 @@ @RequiredArgsConstructor public class PolicyConstraintBuilderService { + private static final String BUSINESS_PARTNER_NUMBER = "BusinessPartnerNumber"; + private final PolicyRequestFactory policyRequestFactory; private final JsonObjectMapper jsonobjectMapper; + @Value("${manufacturerId}") + private String manufacturerId; + +// private final IPolicyHubProxyService policyHubProxyService; +// +// public JsonNode getAccessPolicy(String assetId, PolicyModel policy) { +// +// return policyRequestFactory.setPolicyIdAndGetObject(assetId, +// policyHubProxyService.getPolicyContent( +// mapPolicy(PolicyTypeIdEnum.ACCESS, ConstraintOperandIdEnum.OR, policy.getAccessPolicies())), +// "a"); +// } +// +// public JsonNode getUsagePolicy(String assetId, PolicyModel policy) { +// +// return policyRequestFactory.setPolicyIdAndGetObject(assetId, +// policyHubProxyService.getPolicyContent( +// mapPolicy(PolicyTypeIdEnum.USAGE, ConstraintOperandIdEnum.AND, policy.getUsagePolicies())), +// "u"); +// } + +// private PolicyContentRequest mapPolicy(PolicyTypeIdEnum policyType, ConstraintOperandIdEnum constraintOperandId, +// List policies) { +// +// List constraintsList = new ArrayList<>(); +// policies.forEach(policy -> { +// +// List valueList = getAndOwnerBPNIfNotExist(policy); +// +// OperatorIdEnum operator = OperatorIdEnum.EQUALS; +// +// if (valueList.size() > 1) { +// operator = OperatorIdEnum.IN; +// } +// +// for (String value : valueList) { +// constraintsList.add( +// Constraint.builder() +// .key(policy.getTechnicalKey()) +// .operator(operator) +// .value(value) +// .build()); +// } +// }); +// +// return PolicyContentRequest.builder() +// .policyType(policyType) +// .constraintOperand(constraintOperandId) +// .constraints(constraintsList) +// .build(); +// } + public JsonNode getAccessPolicy(String assetId, PolicyModel policy) { return jsonobjectMapper.objectToJsonNode(policyRequestFactory.getPolicy(assetId, - getPoliciesConstraints(policy.getAccessPolicies(), "odrl:or"), Collections.emptyMap(), "a")); + getPoliciesConstraints(policy.getAccessPolicies(), "odrl:or", "a"), Collections.emptyMap(), "a")); } public JsonNode getUsagePolicy(String assetId, PolicyModel policy) { return jsonobjectMapper.objectToJsonNode(policyRequestFactory.getPolicy(assetId, - getPoliciesConstraints(policy.getUsagePolicies(), "odrl:and"), Collections.emptyMap(), "u")); + getPoliciesConstraints(policy.getUsagePolicies(), "odrl:and", "u"), Collections.emptyMap(), "u")); } public ActionRequest getUsagePoliciesConstraints(List policies) { - return getPoliciesConstraints(policies, "odrl:and"); + return getPoliciesConstraints(policies, "odrl:and", "u"); } - public ActionRequest getPoliciesConstraints(List usagePolicies, String operator) { + public ActionRequest getPoliciesConstraints(List usagePolicies, String operator, String type) { List constraintList = new ArrayList<>(); if (usagePolicies != null && !usagePolicies.isEmpty()) { - usagePolicies.forEach(policy -> preparePolicyConstraint(constraintList, policy)); + usagePolicies.forEach(policy -> preparePolicyConstraint(constraintList, policy, type)); } constraintList.sort(Comparator.comparing(ConstraintRequest::getLeftOperand)); @@ -76,24 +131,40 @@ public ActionRequest getPoliciesConstraints(List usagePolicies, String } - private void preparePolicyConstraint(List policies, Policies policy) { + private void preparePolicyConstraint(List policies, Policies policy, String type) { String operator = "odrl:eq"; - for (String value : policy.getValue()) { + + List values = policy.getValue(); + + if (type.equals("a")) + values = getAndOwnerBPNIfNotExist(policy, values); + + for (String value : values) { if (StringUtils.isNotBlank(value)) { - - if(policy.getTechnicalKey().contains("FrameworkAgreement")) { - value="active"; - } - ConstraintRequest request = ConstraintRequest.builder() .leftOperand(policy.getTechnicalKey()) .operator(Operator.builder().id(operator).build()) - .rightOperand(value) - .build(); + .rightOperand(value).build(); policies.add(request); } } } + private List getAndOwnerBPNIfNotExist(Policies policy, List values) { + + if (policy.getTechnicalKey().equals(BUSINESS_PARTNER_NUMBER) && !values.isEmpty() + && !values.contains(manufacturerId) && (values.size() == 1 && !values.get(0).equals(""))) { + + List temp = new ArrayList<>(); + values.stream().forEach(temp::add); + temp.add(manufacturerId); + values = temp; + + } + + return values; + + } + } diff --git a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/policies/PolicyRequest.java b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/policies/PolicyRequest.java index ea4733750..a14ac8148 100644 --- a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/policies/PolicyRequest.java +++ b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/policies/PolicyRequest.java @@ -56,6 +56,9 @@ public class PolicyRequest { @JsonProperty("@id") private String id; + @JsonProperty("profile") + private String profile; + @JsonProperty("odrl:permission") private Object permissions; diff --git a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/policies/PolicyRequestFactory.java b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/policies/PolicyRequestFactory.java index 148ad60d2..6c44ad835 100644 --- a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/policies/PolicyRequestFactory.java +++ b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/entities/request/policies/PolicyRequestFactory.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. @@ -25,34 +25,57 @@ import java.util.List; import java.util.Map; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + @Service public class PolicyRequestFactory { + @Value("${edc.policy.profile:noprofile}") + private String cxPolicyProfile; + public PolicyDefinitionRequest getPolicy(String assetId, ActionRequest action, Map extensibleProperties, String type) { List permissions = getPermissions(assetId, action); + + if (cxPolicyProfile != null && cxPolicyProfile.equals("noprofile")) { + cxPolicyProfile = "cx-policy:profile2405"; + } PolicyRequest policyRequest = PolicyRequest.builder() .permissions(permissions) + .profile(cxPolicyProfile) .obligations(new ArrayList<>()) .extensibleProperties(extensibleProperties) .prohibitions(new ArrayList<>()).build(); //Use submodel id to generate unique policy id for asset use policy type as prefix asset/usage - String submodelId = assetId; - if (assetId.indexOf("urn:uuid") != -1) { - submodelId = assetId.substring(assetId.indexOf("urn:uuid", 9)); - submodelId =submodelId.replace("urn:uuid:", ""); - } + String policyId = getGeneratedPolicyId(assetId, type); return PolicyDefinitionRequest.builder() - .id(type +"-"+ submodelId) + .id(policyId) .policyRequest(policyRequest).build(); } + public JsonNode setPolicyIdAndGetObject(String assetId, JsonNode jsonNode, String type) { + String policyId = getGeneratedPolicyId(assetId, type); + return ((ObjectNode) jsonNode).put("@id", policyId); + } + + private String getGeneratedPolicyId(String assetId, String type) { + String submodelId = assetId; + if (assetId.length() > 45) { + submodelId = assetId.substring(46); + submodelId = submodelId.replace("urn:uuid:", ""); + } + return type + "-" + submodelId; + } + + public List getPermissions(String assetId, ActionRequest action) { ArrayList permissions = new ArrayList<>(); diff --git a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/model/response/QueryDataOfferModel.java b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/model/response/QueryDataOfferModel.java index a7beae993..3451661d3 100644 --- a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/model/response/QueryDataOfferModel.java +++ b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/model/response/QueryDataOfferModel.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,8 @@ package org.eclipse.tractusx.sde.edc.model.response; +import java.util.Objects; + import org.eclipse.tractusx.sde.common.entities.PolicyModel; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -73,4 +75,24 @@ public class QueryDataOfferModel { private PolicyModel policy; -} \ No newline at end of file + @Override + public boolean equals(Object obj) { + + if (this == obj) + return true; + + if (obj == null || obj.getClass() != this.getClass()) + return false; + + // type casting of the argument. + QueryDataOfferModel offer = (QueryDataOfferModel) obj; + + return (offer.assetId.equals(this.assetId) && offer.connectorOfferUrl.equals(this.connectorOfferUrl)); + } + + @Override + public int hashCode() { + return Objects.hash(this.assetId.hashCode()); + } + +} diff --git a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/services/ConsumerControlPanelService.java b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/services/ConsumerControlPanelService.java index 440aa4dce..90f23f775 100644 --- a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/services/ConsumerControlPanelService.java +++ b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/services/ConsumerControlPanelService.java @@ -21,12 +21,14 @@ package org.eclipse.tractusx.sde.edc.services; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReference; @@ -81,10 +83,10 @@ public class ConsumerControlPanelService { private final ContractNegotiationService contractNegotiationService; private final LookUpDTTwin lookUpDTTwin; - public List queryOnDataOffers(String manufacturerPartId, String searchBpnNumber, + public Set queryOnDataOffers(String manufacturerPartId, String searchBpnNumber, String submodel, Integer offset, Integer limit) { - List queryOnDataOffers = new ArrayList<>(); + List queryOnDataOffers = new LinkedList<>(); List bpnList = null; // 1 find bpn if empty using BPN discovery @@ -122,7 +124,7 @@ public List queryOnDataOffers(String manufacturerPartId, St } } } - return queryOnDataOffers; + return new HashSet<>(queryOnDataOffers); } diff --git a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/services/LookUpDTTwin.java b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/services/LookUpDTTwin.java index b2e99360d..1be1d37a0 100644 --- a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/services/LookUpDTTwin.java +++ b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/services/LookUpDTTwin.java @@ -30,6 +30,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; +import org.eclipse.tractusx.sde.common.configuration.properties.SDEConfigurationProperties; import org.eclipse.tractusx.sde.common.constants.CommonConstants; import org.eclipse.tractusx.sde.digitaltwins.entities.common.KeyValuePair; import org.eclipse.tractusx.sde.digitaltwins.entities.common.MultiLanguage; @@ -43,7 +44,6 @@ import org.eclipse.tractusx.sde.edc.model.edr.EDRCachedByIdResponse; import org.eclipse.tractusx.sde.edc.model.request.QueryDataOfferRequest; import org.eclipse.tractusx.sde.edc.model.response.QueryDataOfferModel; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import feign.FeignException; @@ -62,11 +62,7 @@ public class LookUpDTTwin { private final CatalogResponseBuilder catalogResponseBuilder; - @Value(value = "${digital-twins.managed.thirdparty:false}") - private boolean managedThirdParty; - - @Value(value = "${manufacturerId}") - private String manufacturerId; + private final SDEConfigurationProperties sdeConfigurationProperties; String filterExpressionTemplate = """ "filterExpression": [ @@ -88,8 +84,8 @@ public List lookUpTwin(EDRCachedByIdResponse edrToken, Quer header.put("authorization", edrToken.getAuthorization()); submodel = StringUtils.isBlank(submodel) ? "" : submodel; - if (StringUtils.isNotBlank(bpnNumber)) - header.put("Edc-Bpn", bpnNumber); + if (StringUtils.isNotBlank(sdeConfigurationProperties.getManufacturerId())) + header.put("Edc-Bpn", sdeConfigurationProperties.getManufacturerId()); if (StringUtils.isBlank(manufacturerPartId)) { return lookUpAllShellForBPN(submodel, endpoint, dtOfferUrl, header, offset, limit); diff --git a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/util/EDCAssetLookUp.java b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/util/EDCAssetLookUp.java index 87ded8bc4..67e805d33 100644 --- a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/util/EDCAssetLookUp.java +++ b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/util/EDCAssetLookUp.java @@ -45,9 +45,9 @@ public class EDCAssetLookUp { private String filterExpressionTemplate = """ "filterExpression": [{ - "operandLeft": "https://w3id.org/edc/v0.0.1/ns/type", - "operator": "=", - "operandRight": "%s" + "operandLeft": "'http://purl.org/dc/terms/type'.'@id'", + "operator": "=", + "operandRight": "https://w3id.org/catenax/taxonomy#%s" }]"""; public List getEDCAssetsByType(String bpnNumber, String assetType) { diff --git a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/util/PCFExchangeAssetUtils.java b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/util/PCFExchangeAssetUtils.java index ee242a0f3..349ac4ba9 100644 --- a/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/util/PCFExchangeAssetUtils.java +++ b/modules/sde-external-services/edc/src/main/java/org/eclipse/tractusx/sde/edc/util/PCFExchangeAssetUtils.java @@ -22,6 +22,7 @@ import java.util.List; import org.eclipse.tractusx.sde.common.utils.LogUtil; +import org.eclipse.tractusx.sde.edc.constants.EDCAssetConstant; import org.eclipse.tractusx.sde.edc.model.response.QueryDataOfferModel; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; @@ -39,7 +40,7 @@ public class PCFExchangeAssetUtils { @Cacheable(value = "bpn-pcfexchange", key = "#bpnNumber") public List getPCFExchangeUrl(String bpnNumber) { - return edcAssetLookUp.getEDCAssetsByType(bpnNumber, "data.pcf.exchangeEndpoint"); + return edcAssetLookUp.getEDCAssetsByType(bpnNumber, EDCAssetConstant.DATA_CORE_PCF_EXCHANGE_ENPOINT_TYPE); } @CacheEvict(value = "bpn-pcfexchange", key = "#bpnNumber") diff --git a/modules/sde-submodules/pcf/src/main/resources/pcf-v6.0.0.json b/modules/sde-submodules/pcf/src/main/resources/pcf-v6.0.0.json index 96ec30481..b031f5d39 100644 --- a/modules/sde-submodules/pcf/src/main/resources/pcf-v6.0.0.json +++ b/modules/sde-submodules/pcf/src/main/resources/pcf-v6.0.0.json @@ -959,6 +959,7 @@ ], "addOn": { "identifier": "${id}", + "appendURNUUIDWithIdentifier": false, "lookupShellSpecificAssetIdsSpecs": { "assetLifecyclePhase": "${assetLifeCyclePhase}", "manufacturerPartId": "${productId}", @@ -971,6 +972,7 @@ "bpnDiscoverySpecs": { "manufacturerPartId": "${productId}" }, + "databaseIdentifierSpecs": ["${productId}"], "responseTemplate": { "specVersion": "${specVersion}", "companyIds": [ diff --git a/modules/sde-submodules/single-level-usage-as-built/src/main/resources/single-level-usage-as-built-v1.0.1.json b/modules/sde-submodules/single-level-usage-as-built/src/main/resources/single-level-usage-as-built-v1.0.1.json index e0ea87bfd..69f53b13e 100644 --- a/modules/sde-submodules/single-level-usage-as-built/src/main/resources/single-level-usage-as-built-v1.0.1.json +++ b/modules/sde-submodules/single-level-usage-as-built/src/main/resources/single-level-usage-as-built-v1.0.1.json @@ -239,7 +239,7 @@ } ] }, - "createShellIfNotExist": false, + "createShellIfNotExist": true, "createShellSpecificAssetIdsSpecs": { "partInstanceId": "${part_instance_id}", "manufacturerPartId": "${manufacturer_part_id}", diff --git a/modules/sde-submodules/single-level-usage-as-built/src/main/resources/single-level-usage-as-built-v3.0.0.json b/modules/sde-submodules/single-level-usage-as-built/src/main/resources/single-level-usage-as-built-v3.0.0.json index e6f3691c1..03e890f2a 100644 --- a/modules/sde-submodules/single-level-usage-as-built/src/main/resources/single-level-usage-as-built-v3.0.0.json +++ b/modules/sde-submodules/single-level-usage-as-built/src/main/resources/single-level-usage-as-built-v3.0.0.json @@ -278,7 +278,7 @@ } ] }, - "createShellIfNotExist": false, + "createShellIfNotExist": true, "createShellSpecificAssetIdsSpecs": { "partInstanceId": "${part_instance_id}", "manufacturerPartId": "${manufacturer_part_id}", diff --git a/modules/sde-submodules/submodules.md b/modules/sde-submodules/submodules.md index 3bb98ef05..983728f82 100644 --- a/modules/sde-submodules/submodules.md +++ b/modules/sde-submodules/submodules.md @@ -12,6 +12,7 @@ Currently SDE supports below submodels. #### [batch in Version 2.0.0] #### [assembly-part-relationship in Version 1.1.1] #### [partAsPlanned in Version 1.0.0] +#### [PartTypeInformation in Version 1.0.0] #### [singleLevelBoMAsPlanned in Version 1.0.1] #### [partSiteInformationAsPlanned in Version 1.0.0] #### [SingleLevelUsageAsBuilt in Version 1.0.1] diff --git a/pom.xml b/pom.xml index 330135856..d9f4423ad 100644 --- a/pom.xml +++ b/pom.xml @@ -307,4 +307,4 @@ - \ No newline at end of file +