From 219aeeeec456dd73c717d68b3152017803f8fa85 Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Tue, 7 May 2024 15:25:12 +0200 Subject: [PATCH 01/18] feat(edc7): enabled the new edc configuration and updates --- .../listeners/AppListener.java | 3 +- .../managers/DtrSearchManager.java | 8 ++- .../models/edc/AssetSearch.java | 16 ++++++ .../models/negotiation/DidDocument.java | 4 ++ .../negotiation/catalog/CatalogRequest.java | 56 +++++++++++++++++++ .../negotiation/request/TransferRequest.java | 13 +++++ .../services/AasService.java | 2 +- .../services/ContractService.java | 10 +++- .../services/DataTransferService.java | 52 ++++++++++------- .../services/DataTransferServiceTest.java | 2 +- 10 files changed, 136 insertions(+), 30 deletions(-) diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/listeners/AppListener.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/listeners/AppListener.java index 4266d0f82..fc189afe0 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/listeners/AppListener.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/listeners/AppListener.java @@ -113,8 +113,7 @@ public void started() { LogUtil.printMessage( "[ EDC Connection Test ] EDC consumer is ready and accessible!"); if(bpnCheck) { - String bpnNumber = dataTransferService.getEdcConnectorBpn(); - if (!participantId.equals(bpnNumber)) { + if (!dataTransferService.isApplicationEdc(participantId)) { throw new Exception("[" + this.getClass().getName() + ".onStartUp] Incorrect BPN Number configuration, expected the same participant id as the EDC consumer!"); } diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java index 5f573f917..2db272b9a 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java @@ -206,7 +206,7 @@ public void run() { public void searchEndpoint(String processId, String bpn, String endpoint) { //Search Digital Twin Catalog for each connectionURL with a timeout time - SearchDtrCatalog searchDtrCatalog = new SearchDtrCatalog(endpoint); + SearchDtrCatalog searchDtrCatalog = new SearchDtrCatalog(endpoint, bpn); Thread asyncThread = ThreadUtil.runThread(searchDtrCatalog, "SearchEndpoint-" + processId + "-" + bpn + "-" + endpoint); Dtr dtr = new Dtr("", endpoint, "", bpn, DateTimeUtil.addHoursToCurrentTimestamp(dtrConfig.getTemporaryStorage().getLifetime()), true); try { @@ -339,9 +339,11 @@ public String getDataModelDir() { public class SearchDtrCatalog implements Runnable { Boolean error = true; String connectionUrl; + String bpn; - SearchDtrCatalog(String connectionUrl) { + public SearchDtrCatalog(String connectionUrl, String bpn) { this.connectionUrl = connectionUrl; + this.bpn = bpn; } public Boolean isError() { @@ -351,7 +353,7 @@ public Boolean isError() { @Override public void run() { try { - Catalog catalog = dataTransferService.searchDigitalTwinCatalog(connectionUrl); + Catalog catalog = dataTransferService.searchDigitalTwinCatalog(connectionUrl, bpn); if (catalog == null) { return; } diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/edc/AssetSearch.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/edc/AssetSearch.java index 0300662f3..0e15ccb9e 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/edc/AssetSearch.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/edc/AssetSearch.java @@ -39,6 +39,9 @@ public class AssetSearch { /** ATTRIBUTES **/ @JsonProperty("assetId") String assetId; + + @JsonProperty("bpn") + String bpn; @JsonProperty("connectorAddress") String connectorAddress; @@ -52,6 +55,12 @@ public AssetSearch(String assetId, String connectorAddress) { this.connectorAddress = connectorAddress; } + public AssetSearch(String assetId, String bpn, String connectorAddress) { + this.assetId = assetId; + this.bpn = bpn; + this.connectorAddress = connectorAddress; + } + /** GETTERS AND SETTERS **/ public String getAssetId() { @@ -67,4 +76,11 @@ public void setConnectorAddress(String connectorAddress) { this.connectorAddress = connectorAddress; } + public String getBpn() { + return bpn; + } + + public void setBpn(String bpn) { + this.bpn = bpn; + } } diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/DidDocument.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/DidDocument.java index 8ad30b4f4..f4875f41b 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/DidDocument.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/DidDocument.java @@ -69,6 +69,10 @@ public DidDocument(String type) { public DidDocument(JsonNode context) { this.context = context; } + public DidDocument(JsonNode context, String type) { + this.context = context; + this.type = type; + } /** GETTERS AND SETTERS **/ public String getId() { diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/CatalogRequest.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/CatalogRequest.java index 92d19d49b..475817bca 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/CatalogRequest.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/CatalogRequest.java @@ -46,6 +46,8 @@ public class CatalogRequest extends DidDocument { String protocol; @JsonProperty("counterPartyAddress") String counterPartyAddress; + @JsonProperty("counterPartyId") + String counterPartyId; @JsonProperty("querySpec") QuerySpec querySpec; @@ -67,6 +69,52 @@ public CatalogRequest(JsonNode context, String protocol, String counterPartyAddr public CatalogRequest() { } + public CatalogRequest(String id, String type, String protocol, String counterPartyAddress, String counterPartyId, QuerySpec querySpec) { + super(id, type); + this.protocol = protocol; + this.counterPartyAddress = counterPartyAddress; + this.counterPartyId = counterPartyId; + this.querySpec = querySpec; + } + + public CatalogRequest(String protocol, String counterPartyAddress, String counterPartyId, QuerySpec querySpec) { + this.protocol = protocol; + this.counterPartyAddress = counterPartyAddress; + this.counterPartyId = counterPartyId; + this.querySpec = querySpec; + } + + public CatalogRequest(String id, String type, JsonNode context, String protocol, String counterPartyAddress, String counterPartyId, QuerySpec querySpec) { + super(id, type, context); + this.protocol = protocol; + this.counterPartyAddress = counterPartyAddress; + this.counterPartyId = counterPartyId; + this.querySpec = querySpec; + } + + public CatalogRequest(String type, String protocol, String counterPartyAddress, String counterPartyId, QuerySpec querySpec) { + super(type); + this.protocol = protocol; + this.counterPartyAddress = counterPartyAddress; + this.counterPartyId = counterPartyId; + this.querySpec = querySpec; + } + + public CatalogRequest(JsonNode context, String protocol, String counterPartyAddress, String counterPartyId, QuerySpec querySpec) { + super(context); + this.protocol = protocol; + this.counterPartyAddress = counterPartyAddress; + this.counterPartyId = counterPartyId; + this.querySpec = querySpec; + } + public CatalogRequest(JsonNode context, String protocol, String counterPartyAddress, String counterPartyId, QuerySpec querySpec, String type) { + super(context, type); + this.protocol = protocol; + this.counterPartyAddress = counterPartyAddress; + this.counterPartyId = counterPartyId; + this.querySpec = querySpec; + } + /** GETTERS AND SETTERS **/ public String getProtocol() { return protocol; @@ -91,6 +139,14 @@ public void setQuerySpec(QuerySpec querySpec) { this.querySpec = querySpec; } + public String getCounterPartyId() { + return counterPartyId; + } + + public void setCounterPartyId(String counterPartyId) { + this.counterPartyId = counterPartyId; + } + /** INNER CLASSES **/ /** * This class consists exclusively to define attributes related to the Query specification of the Catalog request. diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/request/TransferRequest.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/request/TransferRequest.java index b84f8b107..5f08d1b2a 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/request/TransferRequest.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/request/TransferRequest.java @@ -176,6 +176,19 @@ public TransferRequest(JsonNode context, String assetId, String connectorAddress this.callbackAddresses = callbackAddresses; } + public TransferRequest(JsonNode context, String assetId, String connectorAddress, String connectorId, String contractId, DataDestination dataDestination, Boolean managedResources, String protocol, TransferType transferType, List callbackAddresses) { + super(context); + this.assetId = assetId; + this.connectorAddress = connectorAddress; + this.connectorId = connectorId; + this.contractId = contractId; + this.dataDestination = dataDestination; + this.managedResources = managedResources; + this.protocol = protocol; + this.transferType = transferType; + this.callbackAddresses = callbackAddresses; + } + /** GETTERS AND SETTERS **/ public String getAssetId() { return assetId; diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/AasService.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/AasService.java index be37b246d..d3f16d257 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/AasService.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/AasService.java @@ -429,7 +429,7 @@ public AssetSearch decentralDtrSearch(String processId, Search searchBody){ } status = this.processManager.getStatus(processId); if (status.historyExists("digital-twin-found")) { - return new AssetSearch(status.getHistory("digital-twin-found").getId(), status.getEndpoint()); + return new AssetSearch(status.getHistory("digital-twin-found").getId(), status.getBpn(), status.getEndpoint()); } return null; } catch (Exception e) { diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/ContractService.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/ContractService.java index 1e6bfc52a..3553db349 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/ContractService.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/ContractService.java @@ -355,12 +355,16 @@ public Response searchCall(HttpServletRequest httpRequest, HttpServletResponse h // Assing the variables with the content String assetId = assetSearch.getAssetId(); String connectorAddress = assetSearch.getConnectorAddress(); + String bpn = assetSearch.getBpn(); /*[1]=========================================*/ // Get catalog with all the contract offers if(connectorAddress == null){ LogUtil.printError("The connector address is empty!"); } + if(bpn == null){ + LogUtil.printError("The bpn is empty!"); + } if(assetId == null){ LogUtil.printError("The assetId is empty!"); } @@ -368,11 +372,11 @@ public Response searchCall(HttpServletRequest httpRequest, HttpServletResponse h Map datasets = null; Long startedTime = DateTimeUtil.getTimestamp(); try { - catalog = dataService.getContractOfferCatalog(connectorAddress, assetId); + catalog = dataService.getContractOfferCatalog(connectorAddress, bpn, assetId); datasets = edcUtil.filterValidContracts(dataService.getContractOffers(catalog), this.passportConfig.getPolicyCheck()); } catch (ServiceException e) { LogUtil.printError("The EDC is not reachable, it was not possible to retrieve catalog! Trying again..."); - catalog = dataService.getContractOfferCatalog(connectorAddress, assetId); + catalog = dataService.getContractOfferCatalog(connectorAddress, bpn, assetId); datasets = edcUtil.filterValidContracts(dataService.getContractOffers(catalog), this.passportConfig.getPolicyCheck()); if (datasets == null) { // If the contract catalog is not reachable retry... response.message = "The EDC is not reachable, it was not possible to retrieve catalog! Please try again!"; @@ -385,7 +389,7 @@ public Response searchCall(HttpServletRequest httpRequest, HttpServletResponse h if (datasets == null) { // Retry again... LogUtil.printWarning("[PROCESS " + process.id + "] No asset id found for the dataset contract offers in the catalog! Requesting catalog again..."); - catalog = dataService.getContractOfferCatalog(connectorAddress, assetId); + catalog = dataService.getContractOfferCatalog(connectorAddress, bpn, assetId); datasets = edcUtil.filterValidContracts(dataService.getContractOffers(catalog), this.passportConfig.getPolicyCheck()); if (datasets == null) { // If the contract catalog is not reachable retry... response.message = "Asset Id not found in any contract!"; diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/DataTransferService.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/DataTransferService.java index 98fde2280..c83952bb1 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/DataTransferService.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/DataTransferService.java @@ -41,6 +41,7 @@ import org.eclipse.tractusx.digitalproductpass.models.http.responses.IdResponse; import org.eclipse.tractusx.digitalproductpass.models.manager.History; import org.eclipse.tractusx.digitalproductpass.models.manager.Status; +import org.eclipse.tractusx.digitalproductpass.models.negotiation.CallbackAddress; import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Catalog; import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.CatalogRequest; import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Dataset; @@ -196,16 +197,16 @@ public Boolean checkEdcConsumerConnection() throws ServiceException { * @throws ControllerException * if unable to check the EDC consumer connection. */ - public String getEdcConnectorBpn() throws ServiceException { + public Boolean isApplicationEdc(String applicationBpn) throws ServiceException { try { String edcConsumerDsp = this.edcEndpoint + CatenaXUtil.edcDataEndpoint; - Catalog catalog = this.getContractOfferCatalog(edcConsumerDsp, ""); // Get empty catalog + Catalog catalog = this.getContractOfferCatalog(edcConsumerDsp, applicationBpn, ""); // Get empty catalog if (catalog == null || catalog.getParticipantId().isEmpty()) { - throw new ControllerException(this.getClass().getName()+".checkEdcConsumerConnection", "The catalog response is null or the participant id is not set!"); + return false; } - return catalog.getParticipantId(); + return catalog.getParticipantId().equals(applicationBpn); // Return true if the bpns matches } catch (Exception e) { - throw new ServiceException(this.getClass().getName()+".checkEdcConsumerConnection", e, "It was not possible to establish connection with the EDC consumer endpoint [" + this.edcEndpoint+"]"); + throw new ServiceException(this.getClass().getName()+".getEdcConnectorBpn", e, "It was not possible to establish connection with the EDC consumer endpoint [" + this.edcEndpoint+"]"); } } /** @@ -293,12 +294,12 @@ public Map getContractOffers(Catalog catalog) throws ServiceExc * @throws ServiceException * if unable to get the contract offer for the assetId. */ - public Dataset getContractOfferByAssetId(String assetId, String counterPartyAddress) throws ServiceException { + public Dataset getContractOfferByAssetId(String assetId, String counterPartyAddress, String counterPartId) throws ServiceException { /* * This method receives the assetId and looks up for targets with the same name. */ try { - Catalog catalog = this.getContractOfferCatalog(counterPartyAddress, assetId); + Catalog catalog = this.getContractOfferCatalog(counterPartyAddress, counterPartId, assetId); if(catalog == null){ return null; } @@ -529,7 +530,7 @@ public Offer buildOffer(Dataset dataset, Set policy) { * @throws ServiceException * if unable to retrieve the catalog. */ - public Catalog getContractOfferCatalog(String counterPartyAddress, String assetId) { + public Catalog getContractOfferCatalog(String counterPartyAddress, String counterPartyId, String assetId) { try { this.checkEmptyVariables(); @@ -547,8 +548,11 @@ public Catalog getContractOfferCatalog(String counterPartyAddress, String assetI "@vocab", "https://w3id.org/edc/v0.0.1/ns/", "odrl", "http://www.w3.org/ns/odrl/2/" )), + "dataspace-protocol-http", + counterPartyId, counterPartyAddress, - querySpec + querySpec, + "edc:CatalogRequest" ); HttpHeaders headers = httpUtil.getHeaders(); headers.add("Content-Type", "application/json"); @@ -574,7 +578,7 @@ public Catalog getContractOfferCatalog(String counterPartyAddress, String assetI * @throws ServiceException * if unable to retrieve the catalog. */ - public Catalog searchDigitalTwinCatalog(String counterPartyAddress) throws ServiceException { + public Catalog searchDigitalTwinCatalog(String counterPartyAddress, String counterPartId) throws ServiceException { try { this.checkEmptyVariables(); @@ -592,8 +596,11 @@ public Catalog searchDigitalTwinCatalog(String counterPartyAddress) throws Servi "@vocab", "https://w3id.org/edc/v0.0.1/ns/", "odrl", "http://www.w3.org/ns/odrl/2/" )), + "dataspace-protocol-http", + counterPartId, CatenaXUtil.buildDataEndpoint(counterPartyAddress), - querySpec + querySpec, + "edc:CatalogRequest" ); HttpHeaders headers = httpUtil.getHeaders(); @@ -1187,9 +1194,13 @@ public TransferRequest buildTransferRequest(Dataset dataset, Status status, Nego TransferRequest.DataDestination dataDestination = new TransferRequest.DataDestination(); dataDestination.setType("HttpProxy"); - TransferRequest.PrivateProperties privateProperties = new TransferRequest.PrivateProperties(); - privateProperties.setReceiverHttpEndpoint(receiverEndpoint); - privateProperties.setReceiverHttpEndpoint(receiverEndpoint); + + List callbackAddresses = List.of(new CallbackAddress( + false, + receiverEndpoint, + List.of("transfer.process") + )); + return new TransferRequest( jsonUtil.toJsonNode(Map.of("odrl", "http://www.w3.org/ns/odrl/2/","@vocab", "https://w3id.org/edc/v0.0.1/ns/")), dataset.getAssetId(), @@ -1198,10 +1209,9 @@ public TransferRequest buildTransferRequest(Dataset dataset, Status status, Nego negotiation.getContractAgreementId(), dataDestination, false, - privateProperties, "dataspace-protocol-http", transferType, - List.of() + callbackAddresses ); } catch (Exception e) { throw new ServiceException(this.getClass().getName(), e, "Failed to build the transfer request!"); @@ -1458,8 +1468,11 @@ public TransferRequest buildTransferRequest(String processId, Dtr dtr, String en TransferRequest.DataDestination dataDestination = new TransferRequest.DataDestination(); dataDestination.setType("HttpProxy"); - TransferRequest.PrivateProperties privateProperties = new TransferRequest.PrivateProperties(); - privateProperties.setReceiverHttpEndpoint(receiverEndpoint); + List callbackAddresses = List.of(new CallbackAddress( + false, + receiverEndpoint, + List.of("transfer.process") + )); return new TransferRequest( jsonUtil.toJsonNode(Map.of("odrl", "http://www.w3.org/ns/odrl/2/","@vocab", "https://w3id.org/edc/v0.0.1/ns/")), dtr.getAssetId(), @@ -1468,10 +1481,9 @@ public TransferRequest buildTransferRequest(String processId, Dtr dtr, String en dtr.getContractId(), dataDestination, false, - privateProperties, "dataspace-protocol-http", transferType, - List.of() + callbackAddresses ); } catch (Exception e) { throw new ServiceException(this.getClass().getName(), e, "Failed to build the transfer request!"); diff --git a/dpp-backend/digitalproductpass/src/test/java/services/DataTransferServiceTest.java b/dpp-backend/digitalproductpass/src/test/java/services/DataTransferServiceTest.java index 5f34a695c..9af6591bd 100644 --- a/dpp-backend/digitalproductpass/src/test/java/services/DataTransferServiceTest.java +++ b/dpp-backend/digitalproductpass/src/test/java/services/DataTransferServiceTest.java @@ -255,7 +255,7 @@ void searchDigitalTwinCatalog() { return new ResponseEntity<>(null, HttpStatus.NOT_FOUND); }); - Catalog digitalTwinCatalog = dataTransferService.searchDigitalTwinCatalog(providerUrl); + Catalog digitalTwinCatalog = dataTransferService.searchDigitalTwinCatalog(providerUrl, bpn); assertNotNull(digitalTwinCatalog); assertNotEquals(catalog, digitalTwinCatalog); From 2a3e2da53900c0175e9d0e39e3c1b1bea6c2a1c4 Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Wed, 8 May 2024 21:36:21 +0200 Subject: [PATCH 02/18] feat(edc7): enabled negotiation and transfer in edc, with new catalog bpn + fixed unit tests --- dpp-backend/digitalproductpass/pom.xml | 5 +- .../config/SingleApiConfig.java | 2 +- .../managers/DtrSearchManager.java | 6 +- .../models/negotiation/DidDocument.java | 1 + .../models/negotiation/catalog/Catalog.java | 2 +- .../models/negotiation/catalog/Offer.java | 78 ------- .../models/negotiation/catalog/Policy.java | 168 +++++++++++++++ .../request/NegotiationRequest.java | 136 +++++++----- .../negotiation/request/TransferRequest.java | 73 +------ .../negotiation/response/Negotiation.java | 45 +++- .../response/NegotiationTransferResponse.java | 63 ++++-- .../models/negotiation/response/Transfer.java | 66 ++++-- .../services/ContractService.java | 3 +- .../services/DataTransferService.java | 201 ++++++++---------- .../src/main/resources/application.yml | 2 +- .../java/managers/ProcessManagerTest.java | 11 +- .../services/DataTransferServiceTest.java | 81 ++++--- .../src/test/resources/application-test.yml | 2 +- .../catalogs/TestContractOfferCatalog.json | 76 ++++--- .../dpp/catalogs/TestDigitalTwinCatalog.json | 67 ++++-- .../dpp/contractpolicies/TestPolicy.json | 9 +- .../TestResponseInitNegotiation.json | 2 +- .../negotiation/TestResponseNegotiation.json | 20 +- .../transfer/TestResponseInitTransfer.json | 4 +- .../dpp/transfer/TestResponseTransfer.json | 40 ++-- 25 files changed, 652 insertions(+), 511 deletions(-) delete mode 100644 dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Offer.java create mode 100644 dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Policy.java diff --git a/dpp-backend/digitalproductpass/pom.xml b/dpp-backend/digitalproductpass/pom.xml index 067ab85d3..943b94d76 100644 --- a/dpp-backend/digitalproductpass/pom.xml +++ b/dpp-backend/digitalproductpass/pom.xml @@ -35,10 +35,11 @@ org.eclipse.tractusx digitalproductpass - 2.3.0 + 3.0.0 jar Catena-X Digital Product Passport Backend - Digital Product Passport Consumer Backend Reference Implementation System for Product Passport Consumer Frontend Application + + Digital Product Passport Consumer Backend is a reference implementation system for retrieving aspect models of digital twins in the Catena-X Network. 19 diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/config/SingleApiConfig.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/config/SingleApiConfig.java index 6774e9868..346414857 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/config/SingleApiConfig.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/config/SingleApiConfig.java @@ -33,7 +33,7 @@ * This class consists exclusively to define the attributes and methods needed for the Simple API configuration. **/ @Configuration -@ConfigurationProperties(prefix="configuration.singleApi") +@ConfigurationProperties(prefix="configuration.single-api") public class SingleApiConfig { /** ATTRIBUTES **/ diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java index 2db272b9a..71d243fd4 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java @@ -38,7 +38,7 @@ import org.eclipse.tractusx.digitalproductpass.models.http.responses.IdResponse; import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Catalog; import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Dataset; -import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Offer; +import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Policy; import org.eclipse.tractusx.digitalproductpass.models.negotiation.policy.Set; import org.eclipse.tractusx.digitalproductpass.models.negotiation.response.Negotiation; import org.eclipse.tractusx.digitalproductpass.services.DataTransferService; @@ -514,9 +514,9 @@ public void run() { return; } - Offer offer = dataTransferService.buildOffer(dataset, set); + Policy policy = dataTransferService.buildOffer(dataset, set, providerBpn); String builtDataEndpoint = CatenaXUtil.buildDataEndpoint(connectionUrl); - IdResponse negotiationResponse = dataTransferService.doContractNegotiation(offer, bpn, providerBpn, builtDataEndpoint); + IdResponse negotiationResponse = dataTransferService.doContractNegotiation(policy, builtDataEndpoint); if (negotiationResponse == null) { return; } diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/DidDocument.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/DidDocument.java index f4875f41b..f03c68be0 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/DidDocument.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/DidDocument.java @@ -42,6 +42,7 @@ public class DidDocument { /** ATTRIBUTES **/ @JsonProperty("@id") public String id; + @JsonProperty("@type") public String type; diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Catalog.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Catalog.java index 68cc5fa26..a74197d06 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Catalog.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Catalog.java @@ -49,7 +49,7 @@ public class Catalog extends DidDocument { @JsonProperty("dcat:service") DataService service; @JsonProperty("participantId") - @JsonAlias({"participantId", "edc:participantId"}) + @JsonAlias({"participantId", "edc:participantId", "dspace:participantId"}) String participantId; @JsonIgnore protected Map contractOffersMap = new HashMap<>(); diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Offer.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Offer.java deleted file mode 100644 index 26561ad17..000000000 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Offer.java +++ /dev/null @@ -1,78 +0,0 @@ -/********************************************************************************* - * - * Tractus-X - Digital Product Passport Application - * - * Copyright (c) 2022, 2024 BMW AG, Henkel AG & Co. KGaA - * Copyright (c) 2023, 2024 CGI Deutschland B.V. & Co. KG - * Copyright (c) 2022, 2024 Contributors to the Eclipse Foundation - * - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the - * License for the specific language govern in permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ - -package org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import org.eclipse.tractusx.digitalproductpass.models.negotiation.policy.Set; - -/** - * This class consists exclusively to define attributes related to the Offer's data. - **/ -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonInclude(JsonInclude.Include.NON_NULL) -public class Offer { - - /** ATTRIBUTES **/ - @JsonProperty("offerId") - String offerId; - @JsonProperty("assetId") - String assetId; - @JsonProperty("policy") - Set policy; - - /** CONSTRUCTOR(S) **/ - public Offer(String offerId, String assetId, Set policy) { - this.offerId = offerId; - this.assetId = assetId; - this.policy = policy; - } - public Offer() { - } - - /** GETTERS AND SETTERS **/ - public String getOfferId() { - return offerId; - } - @SuppressWarnings("Unused") - public void setOfferId(String offerId) { - this.offerId = offerId; - } - public String getAssetId() { - return assetId; - } - public void setAssetId(String assetId) { - this.assetId = assetId; - } - public Set getPolicy() { - return policy; - } - public void setPolicy(Set policy) { - this.policy = policy; - } -} diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Policy.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Policy.java new file mode 100644 index 000000000..d3270931a --- /dev/null +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Policy.java @@ -0,0 +1,168 @@ +/********************************************************************************* + * + * Tractus-X - Digital Product Passport Application + * + * Copyright (c) 2022, 2024 BMW AG, Henkel AG & Co. KGaA + * Copyright (c) 2023, 2024 CGI Deutschland B.V. & Co. KG + * Copyright (c) 2022, 2024 Contributors to the Eclipse Foundation + * + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the + * License for the specific language govern in permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import org.eclipse.tractusx.digitalproductpass.config.PolicyCheckConfig; +import org.eclipse.tractusx.digitalproductpass.models.negotiation.DidDocument; +import org.eclipse.tractusx.digitalproductpass.models.negotiation.policy.Action; +import org.eclipse.tractusx.digitalproductpass.models.negotiation.policy.Set; + +import java.util.Collection; + +/** + * Policy representing the offer from the catalog + **/ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Policy extends Set { + + /** + * ATTRIBUTES + **/ + @JsonProperty("odrl:target") + DidDocument target; + @JsonProperty("odrl:assigner") + DidDocument assigner; + + /** CONSTRUCTOR(S) **/ + + public Policy(String id, String type, Collection permissions, Collection prohibitions, Collection obligations, DidDocument target, DidDocument assigner) { + super(id, type, permissions, prohibitions, obligations); + this.target = target; + this.assigner = assigner; + } + + public Policy(Collection permissions, Collection prohibitions, Collection obligations, DidDocument target, DidDocument assigner) { + super(permissions, prohibitions, obligations); + this.target = target; + this.assigner = assigner; + } + + public Policy(String id, String type, JsonNode context, Collection permissions, Collection prohibitions, Collection obligations, DidDocument target, DidDocument assigner) { + super(id, type, context, permissions, prohibitions, obligations); + this.target = target; + this.assigner = assigner; + } + + public Policy(String type, Collection permissions, Collection prohibitions, Collection obligations, DidDocument target, DidDocument assigner) { + super(type, permissions, prohibitions, obligations); + this.target = target; + this.assigner = assigner; + } + + public Policy(JsonNode context, Collection permissions, Collection prohibitions, Collection obligations, DidDocument target, DidDocument assigner) { + super(context, permissions, prohibitions, obligations); + this.target = target; + this.assigner = assigner; + } + + public Policy(String id, String type, DidDocument target, DidDocument assigner) { + super(id, type); + this.target = target; + this.assigner = assigner; + } + + public Policy(DidDocument target, DidDocument assigner) { + this.target = target; + this.assigner = assigner; + } + + public Policy(PolicyCheckConfig.PolicyConfig policyConfig, DidDocument target, DidDocument assigner) { + super(policyConfig); + this.target = target; + this.assigner = assigner; + } + + public Policy(String id, String type, Collection permissions, Collection prohibitions, Collection obligations) { + super(id, type, permissions, prohibitions, obligations); + } + + public Policy(Collection permissions, Collection prohibitions, Collection obligations) { + super(permissions, prohibitions, obligations); + } + + public Policy(String id, String type, JsonNode context, Collection permissions, Collection prohibitions, Collection obligations) { + super(id, type, context, permissions, prohibitions, obligations); + } + + public Policy(String type, Collection permissions, Collection prohibitions, Collection obligations) { + super(type, permissions, prohibitions, obligations); + } + + public Policy(JsonNode context, Collection permissions, Collection prohibitions, Collection obligations) { + super(context, permissions, prohibitions, obligations); + } + + public Policy(String id, String type) { + super(id, type); + } + + public Policy(String id, String targetId, String assignerId) { + super(id, "odrl:Offer"); + this.target = new DidDocument(); // Set Target + this.target.setId(targetId); + this.assigner = new DidDocument(); // Set BPN from assigner + this.assigner.setId(assignerId); + } + + + public Policy() { + } + + public Policy(PolicyCheckConfig.PolicyConfig policyConfig) { + super(policyConfig); + } + + public DidDocument getTarget() { + return target; + } + + public void setTarget(DidDocument target) { + this.target = target; + } + + public DidDocument getAssigner() { + return assigner; + } + + public void setAssigner(DidDocument assigner) { + this.assigner = assigner; + } + + public Policy setup(String targetId, String assignerId, String type) { + this.setType(type); + this.target = new DidDocument(); // Set Target + this.target.setId(targetId); + this.assigner = new DidDocument(); // Set BPN from assigner + this.assigner.setId(assignerId); + return this; + } +} diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/request/NegotiationRequest.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/request/NegotiationRequest.java index f6c47d324..1bfa0f999 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/request/NegotiationRequest.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/request/NegotiationRequest.java @@ -31,7 +31,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.JsonNode; import org.eclipse.tractusx.digitalproductpass.models.negotiation.DidDocument; -import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Offer; +import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Policy; /** * This class consists exclusively to define attributes related to the Negotiation requests. @@ -41,83 +41,105 @@ public class NegotiationRequest extends DidDocument { /** ATTRIBUTES **/ - @JsonProperty("connectorAddress") - String connectorAddress; + @JsonProperty("counterPartyAddress") + String counterPartyAddress; @JsonProperty("protocol") String protocol; - @JsonProperty("connectorId") - String connectorId; - @JsonProperty("providerId") - String providerId; - @JsonProperty("offer") - Offer offer; + @JsonProperty("policy") + Policy policy; - /** CONSTRUCTOR(S) **/ - @SuppressWarnings("Unused") - public NegotiationRequest(JsonNode context, String connectorAddress, String protocol, String connectorId, String providerId, Offer offer) { - this.context = context; - this.type = "NegotiationInitiateRequestDto"; - this.connectorAddress = connectorAddress; + public NegotiationRequest(String id, String type, String counterPartyAddress, String protocol, Policy policy) { + super(id, type); + this.counterPartyAddress = counterPartyAddress; + this.protocol = protocol; + this.policy = policy; + } + + public NegotiationRequest(String counterPartyAddress, String protocol, Policy policy) { + this.counterPartyAddress = counterPartyAddress; + this.protocol = protocol; + this.policy = policy; + } + + public NegotiationRequest(String id, String type, JsonNode context, String counterPartyAddress, String protocol, Policy policy) { + super(id, type, context); + this.counterPartyAddress = counterPartyAddress; + this.protocol = protocol; + this.policy = policy; + } + + public NegotiationRequest(String type, String counterPartyAddress, String protocol, Policy policy) { + super(type); + this.counterPartyAddress = counterPartyAddress; this.protocol = protocol; - this.connectorId = connectorId; - this.providerId = providerId; - this.offer = offer; - } - public NegotiationRequest(JsonNode context, String connectorAddress, String connectorId, String providerId, Offer offer) { - this.context = context; - this.type = "NegotiationInitiateRequestDto"; - this.connectorAddress = connectorAddress; - this.protocol = "dataspace-protocol-http"; - this.connectorId = connectorId; - this.providerId = providerId; - this.offer = offer; - } - @SuppressWarnings("Unused") - public NegotiationRequest(JsonNode context, String type, String connectorAddress, String protocol, String connectorId, String providerId, Offer offer) { - this.context = context; - this.type = type; - this.connectorAddress = connectorAddress; + this.policy = policy; + } + + public NegotiationRequest(JsonNode context, String counterPartyAddress, String protocol, Policy policy) { + super(context); + this.counterPartyAddress = counterPartyAddress; this.protocol = protocol; - this.connectorId = connectorId; - this.providerId = providerId; - this.offer = offer; + this.policy = policy; } - @SuppressWarnings("Unused") + + public NegotiationRequest(JsonNode context, String type, String counterPartyAddress, String protocol, Policy policy) { + super(context, type); + this.counterPartyAddress = counterPartyAddress; + this.protocol = protocol; + this.policy = policy; + } + + public NegotiationRequest(String id, String type) { + super(id, type); + } + public NegotiationRequest() { } - /** GETTERS AND SETTERS **/ - public String getConnectorId() { - return connectorId; + public NegotiationRequest(String id, String type, JsonNode context) { + super(id, type, context); } - public void setConnectorId(String connectorId) { - this.connectorId = connectorId; + + public NegotiationRequest(String type) { + super(type); } - public String getConnectorAddress() { - return connectorAddress; + + public NegotiationRequest(JsonNode context) { + super(context); } - public void setConnectorAddress(String connectorAddress) { - this.connectorAddress = connectorAddress; + + public NegotiationRequest(JsonNode context, String type) { + super(context, type); } - public Offer getOffer() { - return offer; + + + public String getCounterPartyAddress() { + return counterPartyAddress; } - @SuppressWarnings("Unused") - public void setOffer(Offer offer) { - this.offer = offer; + + public void setCounterPartyAddress(String counterPartyAddress) { + this.counterPartyAddress = counterPartyAddress; } + public String getProtocol() { return protocol; } + public void setProtocol(String protocol) { this.protocol = protocol; } - @SuppressWarnings("Unused") - public String getProviderId() { - return providerId; + + public Policy getPolicy() { + return policy; } - @SuppressWarnings("Unused") - public void setProviderId(String providerId) { - this.providerId = providerId; + + public void setPolicy(Policy policy) { + this.policy = policy; } + + /** CONSTRUCTOR(S) **/ + + + /** GETTERS AND SETTERS **/ + } diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/request/TransferRequest.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/request/TransferRequest.java index 5f08d1b2a..87d4c29ce 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/request/TransferRequest.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/request/TransferRequest.java @@ -47,21 +47,16 @@ public class TransferRequest extends DidDocument { String assetId; @JsonProperty("connectorAddress") String connectorAddress; - @JsonProperty("connectorId") - String connectorId; @JsonProperty("contractId") String contractId; @JsonProperty("dataDestination") DataDestination dataDestination; @JsonProperty("managedResources") Boolean managedResources; - @JsonProperty("privateProperties") - PrivateProperties privateProperties; @JsonProperty("protocol") String protocol; @JsonProperty("transferType") TransferType transferType; - @JsonProperty("callbackAddresses") List callbackAddresses; @@ -69,118 +64,70 @@ public class TransferRequest extends DidDocument { public TransferRequest() { } - public TransferRequest(JsonNode context, String assetId, String connectorAddress, String connectorId, String contractId, DataDestination dataDestination, Boolean managedResources, PrivateProperties privateProperties, String protocol, TransferType transferType) { - this.context = context; - this.assetId = assetId; - this.connectorAddress = connectorAddress; - this.connectorId = connectorId; - this.contractId = contractId; - this.dataDestination = dataDestination; - this.managedResources = managedResources; - this.privateProperties = privateProperties; - this.protocol = protocol; - this.transferType = transferType; - } - public TransferRequest(String id, String type, String assetId, String connectorAddress, String connectorId, String contractId, DataDestination dataDestination, Boolean managedResources, PrivateProperties privateProperties, String protocol, TransferType transferType) { + public TransferRequest(String id, String type, String assetId, String connectorAddress, String contractId, DataDestination dataDestination, Boolean managedResources, String protocol, TransferType transferType, List callbackAddresses) { super(id, type); this.assetId = assetId; this.connectorAddress = connectorAddress; - this.connectorId = connectorId; this.contractId = contractId; this.dataDestination = dataDestination; this.managedResources = managedResources; - this.privateProperties = privateProperties; - this.protocol = protocol; - this.transferType = transferType; - } - - public TransferRequest(String assetId, String connectorAddress, String connectorId, String contractId, DataDestination dataDestination, Boolean managedResources, PrivateProperties privateProperties, String protocol, TransferType transferType) { - this.assetId = assetId; - this.connectorAddress = connectorAddress; - this.connectorId = connectorId; - this.contractId = contractId; - this.dataDestination = dataDestination; - this.managedResources = managedResources; - this.privateProperties = privateProperties; - this.protocol = protocol; - this.transferType = transferType; - } - - public TransferRequest(String id, String type, String assetId, String connectorAddress, String connectorId, String contractId, DataDestination dataDestination, Boolean managedResources, PrivateProperties privateProperties, String protocol, TransferType transferType, List callbackAddresses) { - super(id, type); - this.assetId = assetId; - this.connectorAddress = connectorAddress; - this.connectorId = connectorId; - this.contractId = contractId; - this.dataDestination = dataDestination; - this.managedResources = managedResources; - this.privateProperties = privateProperties; this.protocol = protocol; this.transferType = transferType; this.callbackAddresses = callbackAddresses; } - public TransferRequest(String assetId, String connectorAddress, String connectorId, String contractId, DataDestination dataDestination, Boolean managedResources, PrivateProperties privateProperties, String protocol, TransferType transferType, List callbackAddresses) { + public TransferRequest(String assetId, String connectorAddress, String contractId, DataDestination dataDestination, Boolean managedResources, String protocol, TransferType transferType, List callbackAddresses) { this.assetId = assetId; this.connectorAddress = connectorAddress; - this.connectorId = connectorId; this.contractId = contractId; this.dataDestination = dataDestination; this.managedResources = managedResources; - this.privateProperties = privateProperties; this.protocol = protocol; this.transferType = transferType; this.callbackAddresses = callbackAddresses; } - public TransferRequest(String id, String type, JsonNode context, String assetId, String connectorAddress, String connectorId, String contractId, DataDestination dataDestination, Boolean managedResources, PrivateProperties privateProperties, String protocol, TransferType transferType, List callbackAddresses) { + public TransferRequest(String id, String type, JsonNode context, String assetId, String connectorAddress, String contractId, DataDestination dataDestination, Boolean managedResources, String protocol, TransferType transferType, List callbackAddresses) { super(id, type, context); this.assetId = assetId; this.connectorAddress = connectorAddress; - this.connectorId = connectorId; this.contractId = contractId; this.dataDestination = dataDestination; this.managedResources = managedResources; - this.privateProperties = privateProperties; this.protocol = protocol; this.transferType = transferType; this.callbackAddresses = callbackAddresses; } - public TransferRequest(String type, String assetId, String connectorAddress, String connectorId, String contractId, DataDestination dataDestination, Boolean managedResources, PrivateProperties privateProperties, String protocol, TransferType transferType, List callbackAddresses) { + public TransferRequest(String type, String assetId, String connectorAddress, String contractId, DataDestination dataDestination, Boolean managedResources, String protocol, TransferType transferType, List callbackAddresses) { super(type); this.assetId = assetId; this.connectorAddress = connectorAddress; - this.connectorId = connectorId; this.contractId = contractId; this.dataDestination = dataDestination; this.managedResources = managedResources; - this.privateProperties = privateProperties; this.protocol = protocol; this.transferType = transferType; this.callbackAddresses = callbackAddresses; } - public TransferRequest(JsonNode context, String assetId, String connectorAddress, String connectorId, String contractId, DataDestination dataDestination, Boolean managedResources, PrivateProperties privateProperties, String protocol, TransferType transferType, List callbackAddresses) { + public TransferRequest(JsonNode context, String assetId, String connectorAddress, String contractId, DataDestination dataDestination, Boolean managedResources, String protocol, TransferType transferType, List callbackAddresses) { super(context); this.assetId = assetId; this.connectorAddress = connectorAddress; - this.connectorId = connectorId; this.contractId = contractId; this.dataDestination = dataDestination; this.managedResources = managedResources; - this.privateProperties = privateProperties; this.protocol = protocol; this.transferType = transferType; this.callbackAddresses = callbackAddresses; } - public TransferRequest(JsonNode context, String assetId, String connectorAddress, String connectorId, String contractId, DataDestination dataDestination, Boolean managedResources, String protocol, TransferType transferType, List callbackAddresses) { - super(context); + public TransferRequest(JsonNode context, String type, String assetId, String connectorAddress, String contractId, DataDestination dataDestination, Boolean managedResources, String protocol, TransferType transferType, List callbackAddresses) { + super(context, type); this.assetId = assetId; this.connectorAddress = connectorAddress; - this.connectorId = connectorId; this.contractId = contractId; this.dataDestination = dataDestination; this.managedResources = managedResources; @@ -189,6 +136,7 @@ public TransferRequest(JsonNode context, String assetId, String connectorAddress this.callbackAddresses = callbackAddresses; } + /** GETTERS AND SETTERS **/ public String getAssetId() { return assetId; @@ -208,14 +156,11 @@ public void setConnectorAddress(String connectorAddress) { public void setDataDestination(DataDestination dataDestination) { this.dataDestination = dataDestination; } public Boolean getManagedResources() { return managedResources; } public void setManagedResources(Boolean managedResources) { this.managedResources = managedResources; } - public PrivateProperties getPrivateProperties() { return privateProperties; } - public void setPrivateProperties(PrivateProperties privateProperties) { this.privateProperties = privateProperties; } + public String getProtocol() { return protocol; } public void setProtocol(String protocol) { this.protocol = protocol; } public TransferType getTransferType() { return transferType; } public void setTransferType(TransferType transferType) { this.transferType = transferType; } - public String getConnectorId() { return connectorId; } - public void setConnectorId(String connectorId) { this.connectorId = connectorId; } public List getCallbackAddresses() { return callbackAddresses; diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/response/Negotiation.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/response/Negotiation.java index fe049ee1c..4cde40504 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/response/Negotiation.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/response/Negotiation.java @@ -57,38 +57,63 @@ public class Negotiation extends NegotiationTransferResponse { String contractAgreementId; /** CONSTRUCTOR(S) **/ - public Negotiation(String id, String type, String state, String edcType, Long createdAt, List callbackAddresses, JsonNode context, String errorDetail, String protocol, String counterPartyId, String counterPartyAddress, String contractAgreementId) { - super(id, type, state, edcType, createdAt, callbackAddresses, context, errorDetail); + + public Negotiation() { + } + + public Negotiation(String protocol, String counterPartyId, String counterPartyAddress, String contractAgreementId) { this.protocol = protocol; this.counterPartyId = counterPartyId; this.counterPartyAddress = counterPartyAddress; this.contractAgreementId = contractAgreementId; } - public Negotiation(String state, String edcType, Long createdAt, List callbackAddresses, JsonNode context, String errorDetail, String protocol, String counterPartyId, String counterPartyAddress, String contractAgreementId) { - super(state, edcType, createdAt, callbackAddresses, context, errorDetail); + public Negotiation(String id, String type, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail, String protocol, String counterPartyId, String counterPartyAddress, String contractAgreementId) { + super(id, type, state, edcType, createdAt, callbackAddresses, errorDetail); this.protocol = protocol; this.counterPartyId = counterPartyId; this.counterPartyAddress = counterPartyAddress; this.contractAgreementId = contractAgreementId; } - public Negotiation(String protocol, String counterPartyId, String counterPartyAddress, String contractAgreementId) { + public Negotiation(String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail, String protocol, String counterPartyId, String counterPartyAddress, String contractAgreementId) { + super(state, edcType, createdAt, callbackAddresses, errorDetail); this.protocol = protocol; this.counterPartyId = counterPartyId; this.counterPartyAddress = counterPartyAddress; this.contractAgreementId = contractAgreementId; } - public Negotiation(String id, String type, String state, String edcType, Long createdAt, List callbackAddresses, JsonNode context, String errorDetail) { - super(id, type, state, edcType, createdAt, callbackAddresses, context, errorDetail); + public Negotiation(String id, String type, JsonNode context, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail, String protocol, String counterPartyId, String counterPartyAddress, String contractAgreementId) { + super(id, type, context, state, edcType, createdAt, callbackAddresses, errorDetail); + this.protocol = protocol; + this.counterPartyId = counterPartyId; + this.counterPartyAddress = counterPartyAddress; + this.contractAgreementId = contractAgreementId; } - public Negotiation(String state, String edcType, Long createdAt, List callbackAddresses, JsonNode context, String errorDetail) { - super(state, edcType, createdAt, callbackAddresses, context, errorDetail); + public Negotiation(String type, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail, String protocol, String counterPartyId, String counterPartyAddress, String contractAgreementId) { + super(type, state, edcType, createdAt, callbackAddresses, errorDetail); + this.protocol = protocol; + this.counterPartyId = counterPartyId; + this.counterPartyAddress = counterPartyAddress; + this.contractAgreementId = contractAgreementId; } - public Negotiation() { + public Negotiation(JsonNode context, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail, String protocol, String counterPartyId, String counterPartyAddress, String contractAgreementId) { + super(context, state, edcType, createdAt, callbackAddresses, errorDetail); + this.protocol = protocol; + this.counterPartyId = counterPartyId; + this.counterPartyAddress = counterPartyAddress; + this.contractAgreementId = contractAgreementId; + } + + public Negotiation(JsonNode context, String type, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail, String protocol, String counterPartyId, String counterPartyAddress, String contractAgreementId) { + super(context, type, state, edcType, createdAt, callbackAddresses, errorDetail); + this.protocol = protocol; + this.counterPartyId = counterPartyId; + this.counterPartyAddress = counterPartyAddress; + this.contractAgreementId = contractAgreementId; } /** GETTERS AND SETTERS **/ diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/response/NegotiationTransferResponse.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/response/NegotiationTransferResponse.java index 1d05c818b..4c6a12522 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/response/NegotiationTransferResponse.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/response/NegotiationTransferResponse.java @@ -31,6 +31,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.JsonNode; +import org.eclipse.tractusx.digitalproductpass.models.negotiation.CallbackAddress; import org.eclipse.tractusx.digitalproductpass.models.negotiation.DidDocument; import java.util.List; @@ -56,32 +57,67 @@ public class NegotiationTransferResponse extends DidDocument { Long createdAt; @JsonProperty("callbackAddresses") @JsonAlias({"callbackAddresses","edc:callbackAddresses"}) - List callbackAddresses; + Object callbackAddresses; + @JsonProperty("errorDetail") @JsonAlias({"errorDetail","edc:errorDetail"}) String errorDetail; /** CONSTRUCTOR(S) **/ - public NegotiationTransferResponse(String id, String type, String state, String edcType, Long createdAt, List callbackAddresses, JsonNode context, String errorDetail) { + public NegotiationTransferResponse() { + } + + public NegotiationTransferResponse(String id, String type, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail) { super(id, type); this.state = state; this.edcType = edcType; this.createdAt = createdAt; this.callbackAddresses = callbackAddresses; - this.context = context; this.errorDetail = errorDetail; } - public NegotiationTransferResponse(String state, String edcType, Long createdAt, List callbackAddresses, JsonNode context, String errorDetail) { + public NegotiationTransferResponse(String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail) { this.state = state; this.edcType = edcType; this.createdAt = createdAt; this.callbackAddresses = callbackAddresses; - this.context = context; this.errorDetail = errorDetail; } - public NegotiationTransferResponse() { + public NegotiationTransferResponse(String id, String type, JsonNode context, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail) { + super(id, type, context); + this.state = state; + this.edcType = edcType; + this.createdAt = createdAt; + this.callbackAddresses = callbackAddresses; + this.errorDetail = errorDetail; + } + + public NegotiationTransferResponse(String type, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail) { + super(type); + this.state = state; + this.edcType = edcType; + this.createdAt = createdAt; + this.callbackAddresses = callbackAddresses; + this.errorDetail = errorDetail; + } + + public NegotiationTransferResponse(JsonNode context, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail) { + super(context); + this.state = state; + this.edcType = edcType; + this.createdAt = createdAt; + this.callbackAddresses = callbackAddresses; + this.errorDetail = errorDetail; + } + + public NegotiationTransferResponse(JsonNode context, String type, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail) { + super(context, type); + this.state = state; + this.edcType = edcType; + this.createdAt = createdAt; + this.callbackAddresses = callbackAddresses; + this.errorDetail = errorDetail; } /** GETTERS AND SETTERS **/ @@ -109,14 +145,6 @@ public void setCreatedAt(Long createdAt) { this.createdAt = createdAt; } - public List getCallbackAddresses() { - return callbackAddresses; - } - - public void setCallbackAddresses(List callbackAddresses) { - this.callbackAddresses = callbackAddresses; - } - public String getErrorDetail() { return errorDetail; } @@ -126,4 +154,11 @@ public void setErrorDetail(String errorDetail) { } + public Object getCallbackAddresses() { + return callbackAddresses; + } + + public void setCallbackAddresses(Object callbackAddresses) { + this.callbackAddresses = callbackAddresses; + } } diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/response/Transfer.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/response/Transfer.java index 95120628c..7765b486c 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/response/Transfer.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/response/Transfer.java @@ -31,6 +31,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.JsonNode; +import org.eclipse.tractusx.digitalproductpass.models.negotiation.CallbackAddress; import org.eclipse.tractusx.digitalproductpass.models.negotiation.DidDocument; import org.eclipse.tractusx.digitalproductpass.models.negotiation.response.NegotiationTransferResponse; @@ -65,44 +66,59 @@ public class Transfer extends NegotiationTransferResponse { @JsonProperty("receiverHttpEndpoint") @JsonAlias({"receiverHttpEndpoint","edc:receiverHttpEndpoint"}) String receiverHttpEndpoint; + @JsonProperty("callbackAddresses") + @JsonAlias({"callbackAddresses","edc:callbackAddresses"}) + Object callbackAddresses; - /** CONSTRUCTOR(S) **/ - public Transfer(String id, String type, String state, String edcType, Long createdAt, List callbackAddresses, JsonNode context, String errorDetail, Long stateTimestamp, DataDestination dataDestination, DataRequest dataRequest, String receiverHttpEndpoint) { - super(id, type, state, edcType, createdAt, callbackAddresses, context, errorDetail); + public Transfer(Long stateTimestamp, String correlationId, String assetId, String contractId, DataDestination dataDestination, DataRequest dataRequest, String receiverHttpEndpoint, Object callbackAddresses) { this.stateTimestamp = stateTimestamp; + this.correlationId = correlationId; + this.assetId = assetId; + this.contractId = contractId; this.dataDestination = dataDestination; this.dataRequest = dataRequest; this.receiverHttpEndpoint = receiverHttpEndpoint; + this.callbackAddresses = callbackAddresses; } - public Transfer(String state, String edcType, Long createdAt, List callbackAddresses, JsonNode context, String errorDetail, Long stateTimestamp, DataDestination dataDestination, DataRequest dataRequest, String receiverHttpEndpoint) { - super(state, edcType, createdAt, callbackAddresses, context, errorDetail); + public Transfer(String id, String type, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail, Long stateTimestamp, String correlationId, String assetId, String contractId, DataDestination dataDestination, DataRequest dataRequest, String receiverHttpEndpoint, Object callbackAddresses1) { + super(id, type, state, edcType, createdAt, callbackAddresses, errorDetail); this.stateTimestamp = stateTimestamp; + this.correlationId = correlationId; + this.assetId = assetId; + this.contractId = contractId; this.dataDestination = dataDestination; this.dataRequest = dataRequest; this.receiverHttpEndpoint = receiverHttpEndpoint; + this.callbackAddresses = callbackAddresses1; } - public Transfer(Long stateTimestamp, DataDestination dataDestination, DataRequest dataRequest, String receiverHttpEndpoint) { + public Transfer(String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail, Long stateTimestamp, String correlationId, String assetId, String contractId, DataDestination dataDestination, DataRequest dataRequest, String receiverHttpEndpoint, Object callbackAddresses1) { + super(state, edcType, createdAt, callbackAddresses, errorDetail); this.stateTimestamp = stateTimestamp; + this.correlationId = correlationId; + this.assetId = assetId; + this.contractId = contractId; this.dataDestination = dataDestination; this.dataRequest = dataRequest; this.receiverHttpEndpoint = receiverHttpEndpoint; + this.callbackAddresses = callbackAddresses1; } - public Transfer(String id, String type, String state, String edcType, Long createdAt, List callbackAddresses, JsonNode context, String errorDetail) { - super(id, type, state, edcType, createdAt, callbackAddresses, context, errorDetail); - } - - public Transfer(String state, String edcType, Long createdAt, List callbackAddresses, JsonNode context, String errorDetail) { - super(state, edcType, createdAt, callbackAddresses, context, errorDetail); - } - - public Transfer() { + public Transfer(String id, String type, JsonNode context, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail, Long stateTimestamp, String correlationId, String assetId, String contractId, DataDestination dataDestination, DataRequest dataRequest, String receiverHttpEndpoint, Object callbackAddresses1) { + super(id, type, context, state, edcType, createdAt, callbackAddresses, errorDetail); + this.stateTimestamp = stateTimestamp; + this.correlationId = correlationId; + this.assetId = assetId; + this.contractId = contractId; + this.dataDestination = dataDestination; + this.dataRequest = dataRequest; + this.receiverHttpEndpoint = receiverHttpEndpoint; + this.callbackAddresses = callbackAddresses1; } - public Transfer(String id, String type, String state, String edcType, Long createdAt, List callbackAddresses, JsonNode context, String errorDetail, Long stateTimestamp, String correlationId, String assetId, String contractId, DataDestination dataDestination, DataRequest dataRequest, String receiverHttpEndpoint) { - super(id, type, state, edcType, createdAt, callbackAddresses, context, errorDetail); + public Transfer(String type, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail, Long stateTimestamp, String correlationId, String assetId, String contractId, DataDestination dataDestination, DataRequest dataRequest, String receiverHttpEndpoint, Object callbackAddresses1) { + super(type, state, edcType, createdAt, callbackAddresses, errorDetail); this.stateTimestamp = stateTimestamp; this.correlationId = correlationId; this.assetId = assetId; @@ -110,10 +126,11 @@ public Transfer(String id, String type, String state, String edcType, Long creat this.dataDestination = dataDestination; this.dataRequest = dataRequest; this.receiverHttpEndpoint = receiverHttpEndpoint; + this.callbackAddresses = callbackAddresses1; } - public Transfer(String state, String edcType, Long createdAt, List callbackAddresses, JsonNode context, String errorDetail, Long stateTimestamp, String correlationId, String assetId, String contractId, DataDestination dataDestination, DataRequest dataRequest, String receiverHttpEndpoint) { - super(state, edcType, createdAt, callbackAddresses, context, errorDetail); + public Transfer(JsonNode context, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail, Long stateTimestamp, String correlationId, String assetId, String contractId, DataDestination dataDestination, DataRequest dataRequest, String receiverHttpEndpoint, Object callbackAddresses1) { + super(context, state, edcType, createdAt, callbackAddresses, errorDetail); this.stateTimestamp = stateTimestamp; this.correlationId = correlationId; this.assetId = assetId; @@ -121,9 +138,11 @@ public Transfer(String state, String edcType, Long createdAt, List cal this.dataDestination = dataDestination; this.dataRequest = dataRequest; this.receiverHttpEndpoint = receiverHttpEndpoint; + this.callbackAddresses = callbackAddresses1; } - public Transfer(Long stateTimestamp, String correlationId, String assetId, String contractId, DataDestination dataDestination, DataRequest dataRequest, String receiverHttpEndpoint) { + public Transfer(JsonNode context, String type, String state, String edcType, Long createdAt, Object callbackAddresses, String errorDetail, Long stateTimestamp, String correlationId, String assetId, String contractId, DataDestination dataDestination, DataRequest dataRequest, String receiverHttpEndpoint, Object callbackAddresses1) { + super(context, type, state, edcType, createdAt, callbackAddresses, errorDetail); this.stateTimestamp = stateTimestamp; this.correlationId = correlationId; this.assetId = assetId; @@ -131,8 +150,15 @@ public Transfer(Long stateTimestamp, String correlationId, String assetId, Strin this.dataDestination = dataDestination; this.dataRequest = dataRequest; this.receiverHttpEndpoint = receiverHttpEndpoint; + this.callbackAddresses = callbackAddresses1; + } + + public Transfer() { } + /** CONSTRUCTOR(S) **/ + + public Long getStateTimestamp() { return stateTimestamp; } diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/ContractService.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/ContractService.java index 3553db349..898f8ec0b 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/ContractService.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/ContractService.java @@ -530,10 +530,9 @@ public Response doContractAgreement(HttpServletRequest httpRequest, HttpServletR .new NegotiateContract( processManager.loadDataModel(httpRequest), processId, - status.getBpn(), status.getProviderBpn(), dataset, - processManager.getStatus(processId), + processManager.getStatus(processId).getEndpoint(), policy ); String statusPath = processManager.setAgreed(httpRequest, processId, signedAt, contractId, policyId); diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/DataTransferService.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/DataTransferService.java index c83952bb1..27c17853a 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/DataTransferService.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/DataTransferService.java @@ -45,7 +45,7 @@ import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Catalog; import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.CatalogRequest; import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Dataset; -import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Offer; +import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Policy; import org.eclipse.tractusx.digitalproductpass.models.negotiation.policy.Set; import org.eclipse.tractusx.digitalproductpass.models.negotiation.response.Negotiation; import org.eclipse.tractusx.digitalproductpass.models.negotiation.response.NegotiationTransferResponse; @@ -192,7 +192,7 @@ public Boolean checkEdcConsumerConnection() throws ServiceException { * Checks the EDC consumer connection by trying to establish a connection and retrieve an empty catalog. *

* - * @return a {@code String} participantId of the retrieved catalog. + * @return a {@code Boolean} true if bpn number is the same as the application one * * @throws ControllerException * if unable to check the EDC consumer connection. @@ -201,12 +201,12 @@ public Boolean isApplicationEdc(String applicationBpn) throws ServiceException { try { String edcConsumerDsp = this.edcEndpoint + CatenaXUtil.edcDataEndpoint; Catalog catalog = this.getContractOfferCatalog(edcConsumerDsp, applicationBpn, ""); // Get empty catalog - if (catalog == null || catalog.getParticipantId().isEmpty()) { + if (catalog == null || catalog.getParticipantId() == null || catalog.getParticipantId().isEmpty()) { return false; } return catalog.getParticipantId().equals(applicationBpn); // Return true if the bpns matches } catch (Exception e) { - throw new ServiceException(this.getClass().getName()+".getEdcConnectorBpn", e, "It was not possible to establish connection with the EDC consumer endpoint [" + this.edcEndpoint+"]"); + throw new ServiceException(this.getClass().getName()+".isApplicationEdc", e, "It was not possible to establish connection with the EDC consumer endpoint [" + this.edcEndpoint+"]"); } } /** @@ -337,24 +337,20 @@ public Dataset getContractOfferByAssetId(String assetId, String counterPartyAddr *

* @param dataset * the {@code Dataset} data for the contract offer. - * @param status - * the {@code Status} status of the process. + * @param endpoint + * the {@code String} url from the edc * @param providerBpn * the {@code String} BPN number from provider of the catalog - * @param bpn - * the {@code String} BPN number from BNP discovery for the request. * * @return a {@code NegotiationRequest} object with the given data. * */ - public NegotiationRequest buildRequest(Dataset dataset, Status status, String bpn, String providerBpn) { - Offer contractOffer = this.buildOffer(dataset, 0); + public NegotiationRequest buildRequestFirstPolicy(Dataset dataset, String endpoint, String providerBpn) { return new NegotiationRequest( jsonUtil.toJsonNode(Map.of("odrl", "http://www.w3.org/ns/odrl/2/")), - status.getEndpoint(), - bpn, - providerBpn, - contractOffer + endpoint, + "dataspace-protocol-http", + this.buildOffer(dataset, 0, providerBpn) ); } @@ -363,36 +359,48 @@ public NegotiationRequest buildRequest(Dataset dataset, Status status, String bp *

* @param dataset * the {@code Dataset} data for the contract offer. - * @param status - * the {@code Status} status of the process. + * @param endpoint + * the {@code String} sedc endpoint * @param providerBpn * the {@code String} BPN number from provider of the catalog - * @param bpn - * the {@code String} BPN number from BNP discovery for the request. + * @param policyId + * the {@code policyId} id from the policy + * @return a {@code NegotiationRequest} object with the given data. + * + */ + public NegotiationRequest buildRequestById(Dataset dataset, String endpoint, String providerBpn, String policyId) { + Policy policy = this.buildOfferById(dataset, policyId, providerBpn); + return this.buildRequest(dataset, endpoint, providerBpn, policy); + } + + /** + * Builds a negotiation request with the given policy + *

+ * @param endpoint + * the {@code String} edc endpoint + * @param policyOffer + * the {@code Policy} policy offer to be negotiated + * * * @return a {@code NegotiationRequest} object with the given data. * */ - public NegotiationRequest buildRequestById(Dataset dataset, Status status, String bpn, String providerBpn, String policyId) { - Offer contractOffer = this.buildOfferById(dataset, policyId); + public NegotiationRequest buildRequest(String endpoint, Policy policyOffer) { return new NegotiationRequest( jsonUtil.toJsonNode(Map.of("odrl", "http://www.w3.org/ns/odrl/2/")), - status.getEndpoint(), - bpn, - providerBpn, - contractOffer + "odrl:ContractRequest", + endpoint, + "dataspace-protocol-http", + policyOffer ); } - /** * Builds a negotiation request with the given policy *

* @param dataset * the {@code Dataset} data for the contract offer. - * @param status - * the {@code Status} status of the process. - * @param bpn - * the {@code String} BPN number from BNP discovery for the request. + * @param endpoint + * the {@code String} edc endpoint * @param providerBpn * the {@code String} BPN number from provider of the catalog * @param policy @@ -402,16 +410,13 @@ public NegotiationRequest buildRequestById(Dataset dataset, Status status, Strin * @return a {@code NegotiationRequest} object with the given data. * */ - public NegotiationRequest buildRequest(Dataset dataset, Status status, String bpn, String providerBpn, Set policy) { - Offer contractOffer = this.buildOffer(dataset, policy); - return new NegotiationRequest( - jsonUtil.toJsonNode(Map.of("odrl", "http://www.w3.org/ns/odrl/2/")), - status.getEndpoint(), - bpn, - providerBpn, - contractOffer + public NegotiationRequest buildRequest(Dataset dataset, String endpoint, String providerBpn, Set policy) { + return this.buildRequest( + endpoint, + this.buildOffer(dataset, policy, providerBpn) ); } + /** * Gets a policy by index from a dataset dynamic policy data *

@@ -445,7 +450,7 @@ public Set selectPolicyByIndex(Object policies, Integer defaultIndex){ * @return a {@code Offer} object with the given data built offer. * */ - public Offer buildOffer(Dataset dataset, Integer defaultIndex) { + public Policy buildOffer(Dataset dataset, Integer defaultIndex, String bpn) { Object rawPolicy = dataset.getPolicy(); Set policy = null; if(rawPolicy instanceof LinkedHashMap){ @@ -454,13 +459,7 @@ public Offer buildOffer(Dataset dataset, Integer defaultIndex) { List policyList = (List) jsonUtil.bindObject(rawPolicy, List.class); policy = (Set) jsonUtil.bindObject(policyList.get(defaultIndex), Set.class); // Get fist policy from the list to resolve the conflict } - Set policyCopy = (Set) jsonUtil.bindObject(policy, Set.class); - policyCopy.setId(null); - return new Offer( - policy.getId(), - dataset.getAssetId(), - policyCopy - ); + return this.buildOffer(dataset, policy, bpn); } /** * Builds a negotiation request with the given data. @@ -473,7 +472,7 @@ public Offer buildOffer(Dataset dataset, Integer defaultIndex) { * @return a {@code Offer} object with the given data built offer. * */ - public Offer buildOfferById(Dataset dataset, String policyId) { + public Policy buildOfferById(Dataset dataset, String policyId, String bpn) { try { Object rawPolicy = dataset.getPolicy(); Set policy = null; @@ -486,13 +485,7 @@ public Offer buildOfferById(Dataset dataset, String policyId) { if(policy == null) { throw new ServiceException("DataTransferService.buildOfferById()", "Failed to build offer by id! ["+policyId+"] Because policy does not exists!"); } - Set policyCopy = (Set) jsonUtil.bindObject(policy, Set.class); - policyCopy.setId(null); - return new Offer( - policy.getId(), - dataset.getAssetId(), - policyCopy - ); + return this.buildOffer(dataset, policy, bpn); }catch (Exception e) { throw new ServiceException("DataTransferService.buildOfferById()", e, "Failed to build offer by id! ["+policyId+"]"); } @@ -508,14 +501,9 @@ public Offer buildOfferById(Dataset dataset, String policyId) { * @return a {@code Offer} object with the given data built offer. * */ - public Offer buildOffer(Dataset dataset, Set policy) { - Set policyCopy = (Set) jsonUtil.bindObject(policy, Set.class); - policyCopy.setId(null); - return new Offer( - policy.getId(), - dataset.getAssetId(), - policyCopy - ); + public Policy buildOffer(Dataset dataset, Set policy, String bpn) { + Policy policyOffer = jsonUtil.bind(policy, new TypeReference<>() {}); + return policyOffer.setup(dataset.getAssetId(), bpn, "odrl:Offer"); } /** * Gets the Contract Offer's Catalog from the provider. @@ -545,12 +533,13 @@ public Catalog getContractOfferCatalog(String counterPartyAddress, String counte querySpec.setFilterExpression(List.of(filterExpression)); Object body = new CatalogRequest( jsonUtil.toJsonNode(Map.of( - "@vocab", "https://w3id.org/edc/v0.0.1/ns/", - "odrl", "http://www.w3.org/ns/odrl/2/" + "edc", "https://w3id.org/edc/v0.0.1/ns/", + "odrl", "http://www.w3.org/ns/odrl/2/", + "dct","https://purl.org/dc/terms/" )), "dataspace-protocol-http", - counterPartyId, counterPartyAddress, + counterPartyId, querySpec, "edc:CatalogRequest" ); @@ -593,12 +582,13 @@ public Catalog searchDigitalTwinCatalog(String counterPartyAddress, String count querySpec.setFilterExpression(List.of(filterExpression)); Object body = new CatalogRequest( jsonUtil.toJsonNode(Map.of( - "@vocab", "https://w3id.org/edc/v0.0.1/ns/", - "odrl", "http://www.w3.org/ns/odrl/2/" + "edc", "https://w3id.org/edc/v0.0.1/ns/", + "odrl", "http://www.w3.org/ns/odrl/2/", + "dct","https://purl.org/dc/terms/" )), "dataspace-protocol-http", - counterPartId, CatenaXUtil.buildDataEndpoint(counterPartyAddress), + counterPartId, querySpec, "edc:CatalogRequest" ); @@ -633,7 +623,7 @@ public Catalog searchDigitalTwinCatalog(String counterPartyAddress, String count public IdResponse doContractNegotiation(NegotiationRequest negotiationRequest) { try { this.checkEmptyVariables(); - LogUtil.printDebug("[" + negotiationRequest.getOffer().getOfferId() + "] ===== [INITIALIZING CONTRACT NEGOTIATION] ==========================================="); + LogUtil.printDebug("[" + negotiationRequest.getPolicy().getId() + "] ===== [INITIALIZING CONTRACT NEGOTIATION] ==========================================="); String url = CatenaXUtil.buildManagementEndpoint(env, this.negotiationPath); HttpHeaders headers = httpUtil.getHeaders(); headers.add("Content-Type", "application/json"); @@ -651,10 +641,8 @@ public IdResponse doContractNegotiation(NegotiationRequest negotiationRequest) { /** * Initiates the Contract Negotiation in order to retrieve it. *

- * @param contractOffer + * @param policy * the {@code Offer} object with contract offer data. - * @param bpn - * the {@code String} BPN number from BNP discovery for the request. * @param counterPartyAddress * the {@code String} URL from the provider. * @@ -663,17 +651,10 @@ public IdResponse doContractNegotiation(NegotiationRequest negotiationRequest) { * @throws ServiceException * if unable to retrieve the contract negotiation. */ - public IdResponse doContractNegotiation(Offer contractOffer, String bpn, String providerBpn, String counterPartyAddress) { + public IdResponse doContractNegotiation(Policy policy, String counterPartyAddress) { try { this.checkEmptyVariables(); - NegotiationRequest body = new NegotiationRequest( - jsonUtil.toJsonNode(Map.of("odrl", "http://www.w3.org/ns/odrl/2/")), - counterPartyAddress, - bpn, - providerBpn, - contractOffer - ); - return this.doContractNegotiation(body); + return this.doContractNegotiation(this.buildRequest(counterPartyAddress, policy)); } catch (Exception e) { throw new ServiceException(this.getClass().getName() + "." + "doContractNegotiations", e, @@ -1000,42 +981,33 @@ public class NegotiateContract implements Runnable { private IdResponse tranferResponse; private Integer negotiationAttempts; private Integer transferAttempts; - private Status status; - private String bpn; + private String endpoint; private String processId; + private String providerBpn; /** CONSTRUCTOR(S) **/ public NegotiateContract() {}; - public NegotiateContract(ProcessDataModel dataModel, String processId, String bpn, String providerBpn, Dataset dataset, Status status) { - this.dataModel = dataModel; - this.processId = processId; - this.dataset = dataset; - this.status = status; - this.bpn = bpn; - this.providerBpn = providerBpn; - this.negotiationRequest = buildRequest(dataset, status, bpn, providerBpn); - } // Negotiate contract with policy - public NegotiateContract(ProcessDataModel dataModel, String processId, String bpn, String providerBpn, Dataset dataset, Status status, Set policy) { + public NegotiateContract(ProcessDataModel dataModel, String processId, String providerBpn, Dataset dataset, String endpoint, Set policy) { this.dataModel = dataModel; this.processId = processId; this.dataset = dataset; - this.status = status; - this.bpn = bpn; - this.negotiationRequest = buildRequest(dataset, status, bpn, providerBpn, policy); + this.endpoint = endpoint; + this.providerBpn = providerBpn; + this.negotiationRequest = buildRequest(dataset, endpoint, providerBpn, policy); } // Start the negotiation and build contract by policy id - public NegotiateContract(ProcessDataModel dataModel, String processId, String bpn, String providerBpn, Dataset dataset, Status status, String policyId) { + public NegotiateContract(ProcessDataModel dataModel, String processId,String providerBpn, Dataset dataset, String endpoint, String policyId) { this.dataModel = dataModel; this.processId = processId; this.dataset = dataset; - this.status = status; - this.bpn = bpn; - this.negotiationRequest = buildRequestById(dataset, status, bpn, providerBpn, policyId); + this.endpoint = endpoint; + this.providerBpn = providerBpn; + this.negotiationRequest = buildRequestById(dataset, endpoint, providerBpn, policyId); } - public NegotiateContract(NegotiationRequest negotiationRequest, ProcessDataModel dataModel, Dataset dataset, Negotiation negotiation, Transfer transfer, TransferRequest transferRequest, IdResponse negotiationResponse, IdResponse tranferResponse, Integer negotiationAttempts, Integer transferAttempts, Status status, String bpn, String processId, String providerBpn) { + public NegotiateContract(NegotiationRequest negotiationRequest, ProcessDataModel dataModel, Dataset dataset, Negotiation negotiation, Transfer transfer, TransferRequest transferRequest, IdResponse negotiationResponse, IdResponse tranferResponse, Integer negotiationAttempts, Integer transferAttempts, String endpoint, String processId, String providerBpn) { this.negotiationRequest = negotiationRequest; this.dataModel = dataModel; this.dataset = dataset; @@ -1046,8 +1018,7 @@ public NegotiateContract(NegotiationRequest negotiationRequest, ProcessDataModel this.tranferResponse = tranferResponse; this.negotiationAttempts = negotiationAttempts; this.transferAttempts = transferAttempts; - this.status = status; - this.bpn = bpn; + this.endpoint = endpoint; this.processId = processId; this.providerBpn = providerBpn; } @@ -1109,12 +1080,12 @@ public void setTransferAttempts(Integer transferAttempts) { this.transferAttempts = transferAttempts; } - public Status getStatus() { - return status; + public String getEndpoint() { + return endpoint; } - public void setStatus(Status status) { - this.status = status; + public void setEndpoint(String endpoint) { + this.endpoint = endpoint; } public String getProcessId() { @@ -1170,19 +1141,17 @@ public void setTranferResponse(IdResponse tranferResponse) { *

* @param dataset * the {@code Dataset} data for the contract offer. - * @param status - * the {@code Status} object of the process. + * @param endpoint + * the {@code String} edc endpoint * @param negotiation * the {@code Negotiation} object for the request. - * @param bpn - * the {@code String} BPN number from BNP discovery for the request. * * @return a {@code TransferRequest} object with the given data. * * @throws ServiceException * if unable to build the transfer request. */ - public TransferRequest buildTransferRequest(Dataset dataset, Status status, Negotiation negotiation, String bpn) { + public TransferRequest buildTransferRequest(Dataset dataset, String endpoint, Negotiation negotiation) { try { String receiverEndpoint = env.getProperty("configuration.edc.receiverEndpoint") + "/" + this.processId; // Send process Id to identification the session. TransferRequest.TransferType transferType = new TransferRequest.TransferType(); @@ -1204,8 +1173,7 @@ public TransferRequest buildTransferRequest(Dataset dataset, Status status, Nego return new TransferRequest( jsonUtil.toJsonNode(Map.of("odrl", "http://www.w3.org/ns/odrl/2/","@vocab", "https://w3id.org/edc/v0.0.1/ns/")), dataset.getAssetId(), - status.getEndpoint(), - bpn, + endpoint, negotiation.getContractAgreementId(), dataDestination, false, @@ -1261,7 +1229,7 @@ public void run() { LogUtil.printStatus("[PROCESS " + this.processId + "] Negotiation Finished with status [" + negotiation.getState() + "]!"); // TRANSFER PROCESS try { - this.transferRequest = buildTransferRequest(this.dataset, this.status, this.negotiation, this.bpn); + this.transferRequest = buildTransferRequest(this.dataset, this.endpoint, this.negotiation); processManager.saveTransferRequest(this.processId, transferRequest, new IdResponse(processId, null), false); this.tranferResponse = this.requestTransfer(transferRequest); processManager.saveTransferRequest(this.processId, transferRequest, this.tranferResponse, false); @@ -1322,11 +1290,11 @@ public IdResponse requestNegotiation(NegotiationRequest negotiationRequest) { try { negotiationResponse = doContractNegotiation(negotiationRequest); } catch (Exception e) { - throw new ServiceException(this.getClass().getName(), e, "Failed to start the negotiation for offer [" + negotiationRequest.getOffer().getOfferId() + "]"); + throw new ServiceException(this.getClass().getName(), e, "Failed to start the negotiation for offer [" + negotiationRequest.getPolicy().getId() + "]"); } if (negotiationResponse.getId() == null) { - throw new ServiceException(this.getClass().getName(), "The ID from the Offer is null [" + negotiationRequest.getOffer().getOfferId() + "]"); + throw new ServiceException(this.getClass().getName(), "The ID from the Offer is null [" + negotiationRequest.getPolicy().getId() + "]"); } LogUtil.printMessage("[PROCESS " + this.processId + "] Negotiation Requested [" + negotiationResponse.getId() + "]"); return negotiationResponse; @@ -1477,7 +1445,6 @@ public TransferRequest buildTransferRequest(String processId, Dtr dtr, String en jsonUtil.toJsonNode(Map.of("odrl", "http://www.w3.org/ns/odrl/2/","@vocab", "https://w3id.org/edc/v0.0.1/ns/")), dtr.getAssetId(), CatenaXUtil.buildDataEndpoint(dtr.getEndpoint()), - bpnNumber, dtr.getContractId(), dataDestination, false, diff --git a/dpp-backend/digitalproductpass/src/main/resources/application.yml b/dpp-backend/digitalproductpass/src/main/resources/application.yml index 91e6f08ee..e31aacf78 100644 --- a/dpp-backend/digitalproductpass/src/main/resources/application.yml +++ b/dpp-backend/digitalproductpass/src/main/resources/application.yml @@ -128,7 +128,7 @@ configuration: key: "bpn" timeout: 1500 - singleApi: + single-api: maxRetries: 30 delay: 1000 diff --git a/dpp-backend/digitalproductpass/src/test/java/managers/ProcessManagerTest.java b/dpp-backend/digitalproductpass/src/test/java/managers/ProcessManagerTest.java index 3a8841e2a..4ebef8420 100644 --- a/dpp-backend/digitalproductpass/src/test/java/managers/ProcessManagerTest.java +++ b/dpp-backend/digitalproductpass/src/test/java/managers/ProcessManagerTest.java @@ -43,7 +43,6 @@ import org.eclipse.tractusx.digitalproductpass.models.manager.History; import org.eclipse.tractusx.digitalproductpass.models.manager.Process; import org.eclipse.tractusx.digitalproductpass.models.manager.Status; -import org.eclipse.tractusx.digitalproductpass.models.negotiation.*; import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Dataset; import org.eclipse.tractusx.digitalproductpass.models.negotiation.request.NegotiationRequest; import org.eclipse.tractusx.digitalproductpass.models.negotiation.request.TransferRequest; @@ -493,12 +492,8 @@ void saveTransferInfo() { @Test void saveNegotiationRequestAndNegotiation() { NegotiationRequest negotiationRequest = new NegotiationRequest(); - String providerId = UUID.randomUUID().toString(); - String connectorId = UUID.randomUUID().toString(); negotiationRequest.setProtocol("HTTP"); - negotiationRequest.setProviderId(providerId); - negotiationRequest.setConnectorAddress("connectorAddress"); - negotiationRequest.setConnectorId(connectorId); + negotiationRequest.setCounterPartyAddress("connectorAddress"); String negotiationId = UUID.randomUUID().toString(); String contractAgreement = UUID.randomUUID().toString(); @@ -524,8 +519,6 @@ void saveNegotiationRequestAndNegotiation() { Map init = (Map) updatedNegotiation.get("init"); NegotiationRequest updatedNegotiationRequest = (NegotiationRequest) jsonUtil.bindObject(init.get("request"), NegotiationRequest.class); - assertEquals(providerId, updatedNegotiationRequest.getProviderId()); - assertEquals(connectorId, updatedNegotiationRequest.getConnectorId()); assertEquals("HTTP", updatedNegotiationRequest.getProtocol()); Map get = (Map) updatedNegotiation.get("get"); @@ -615,7 +608,6 @@ void saveTransferRequestAndTransfer() { transferRequest.setContractId(contractId); transferRequest.setAssetId(assetId); transferRequest.setConnectorAddress("connectorAddress"); - transferRequest.setConnectorId(connectorId); String transferId = UUID.randomUUID().toString(); Transfer transfer = new Transfer(); @@ -639,7 +631,6 @@ void saveTransferRequestAndTransfer() { TransferRequest updatedTransferRequest = (TransferRequest) jsonUtil.bindObject(init.get("request"), TransferRequest.class); assertEquals(contractId, updatedTransferRequest.getContractId()); - assertEquals(connectorId, updatedTransferRequest.getConnectorId()); assertEquals("HTTP", updatedTransferRequest.getProtocol()); Map get = (Map) updatedTransfer.get("get"); diff --git a/dpp-backend/digitalproductpass/src/test/java/services/DataTransferServiceTest.java b/dpp-backend/digitalproductpass/src/test/java/services/DataTransferServiceTest.java index 9af6591bd..d3431d946 100644 --- a/dpp-backend/digitalproductpass/src/test/java/services/DataTransferServiceTest.java +++ b/dpp-backend/digitalproductpass/src/test/java/services/DataTransferServiceTest.java @@ -34,11 +34,11 @@ import org.eclipse.tractusx.digitalproductpass.managers.ProcessManager; import org.eclipse.tractusx.digitalproductpass.models.http.responses.IdResponse; import org.eclipse.tractusx.digitalproductpass.models.manager.Status; -import org.eclipse.tractusx.digitalproductpass.models.negotiation.*; +import org.eclipse.tractusx.digitalproductpass.models.negotiation.CallbackAddress; import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Catalog; import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.CatalogRequest; import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Dataset; -import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Offer; +import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Policy; import org.eclipse.tractusx.digitalproductpass.models.negotiation.policy.Set; import org.eclipse.tractusx.digitalproductpass.models.negotiation.request.NegotiationRequest; import org.eclipse.tractusx.digitalproductpass.models.negotiation.request.TransferRequest; @@ -53,7 +53,6 @@ import org.junit.jupiter.api.TestInstance; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.sonarsource.scanner.api.internal.shaded.minimaljson.Json; import org.springframework.core.env.Environment; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -187,10 +186,9 @@ void checkEdcConsumerConnection() { when(httpUtil.doPost(anyString(), any(Class.class), any(HttpHeaders.class), any(Map.class), any(Object.class), eq(false), eq(false))) .thenReturn(new ResponseEntity<>(jsonUtil.fromJsonFileToObject(Paths.get(fileUtil.getBaseClassDir(this.getClass()), testCOCatalogPath).toString(), JsonNode.class), HttpStatus.OK)); - String participantId = dataTransferService.getEdcConnectorBpn(); + Boolean result = dataTransferService.isApplicationEdc(bpn); - assertNotNull(participantId); - assertEquals(vaultService.getLocalSecret("edc.participantId"), participantId); + assertTrue(result); } @Test @@ -198,36 +196,32 @@ void buildRequestAndOffer() { Status status = new Status(); status.setEndpoint("test.endpoint"); - NegotiationRequest negotiationRequest = dataTransferService.buildRequest(dataSet, status, bpn, bpn); + NegotiationRequest negotiationRequest = dataTransferService.buildRequest(dataSet, status.getEndpoint(), bpn, this.policy); assertNotNull(negotiationRequest); - assertEquals(status.getEndpoint(), negotiationRequest.getConnectorAddress()); - assertEquals(bpn, negotiationRequest.getConnectorId()); + assertEquals(status.getEndpoint(), negotiationRequest.getCounterPartyAddress()); + assertEquals(bpn, negotiationRequest.getPolicy().getAssigner().getId()); - Offer offer = negotiationRequest.getOffer(); + Policy policyOffer = negotiationRequest.getPolicy(); - assertNotNull(offer); - assertEquals(dataSet.getAssetId(), offer.getAssetId()); - assertEquals(policy.getId(), offer.getOfferId()); - assertNotNull(offer.getPolicy()); + assertNotNull(policyOffer); + assertEquals(dataSet.getAssetId(), policyOffer.getTarget().getId()); + assertEquals(policy.getId(), policyOffer.getId()); + assertNotNull(policy); } @Test void getContractOfferCatalog() { String providerUrl = UUID.randomUUID().toString(); Catalog catalog = (Catalog) jsonUtil.fromJsonFileToObject(Paths.get(fileUtil.getBaseClassDir(this.getClass()), testCOCatalogPath).toString(), Catalog.class); - String assetId = catalog.getParticipantId(); + String assetId = catalog.getId(); when(httpUtil.doPost(anyString(), any(Class.class), any(HttpHeaders.class), any(Map.class), any(Object.class), eq(false), eq(false))) .then(invocation -> { - CatalogRequest body = invocation.getArgument(4); - if (body.getCounterPartyAddress().equals(providerUrl)) { - return new ResponseEntity<>(jsonUtil.fromJsonFileToObject(Paths.get(fileUtil.getBaseClassDir(this.getClass()), testCOCatalogPath).toString(), JsonNode.class), HttpStatus.OK); - } - return new ResponseEntity<>(null, HttpStatus.NOT_FOUND); + return new ResponseEntity<>(jsonUtil.fromJsonFileToObject(Paths.get(fileUtil.getBaseClassDir(this.getClass()), testCOCatalogPath).toString(), JsonNode.class), HttpStatus.OK); }); - Catalog offerCatalog = dataTransferService.getContractOfferCatalog(providerUrl, assetId); + Catalog offerCatalog = dataTransferService.getContractOfferCatalog(providerUrl, bpn, assetId); assertNotNull(offerCatalog); assertNotEquals(catalog, offerCatalog); @@ -248,15 +242,11 @@ void searchDigitalTwinCatalog() { when(httpUtil.doPost(anyString(), any(Class.class), any(HttpHeaders.class), any(Map.class), any(Object.class), eq(false), eq(false))) .then(invocation -> { - CatalogRequest body = invocation.getArgument(4); - if (body.getCounterPartyAddress().equals(CatenaXUtil.buildDataEndpoint(providerUrl))) { - return new ResponseEntity<>(jsonUtil.fromJsonFileToObject(Paths.get(fileUtil.getBaseClassDir(this.getClass()), testDTCatalogPath).toString(), JsonNode.class), HttpStatus.OK); - } - return new ResponseEntity<>(null, HttpStatus.NOT_FOUND); + return new ResponseEntity<>(jsonUtil.fromJsonFileToObject(Paths.get(fileUtil.getBaseClassDir(this.getClass()), testDTCatalogPath).toString(), JsonNode.class), HttpStatus.OK); }); Catalog digitalTwinCatalog = dataTransferService.searchDigitalTwinCatalog(providerUrl, bpn); - + LogUtil.printTest(jsonUtil.toJson(digitalTwinCatalog, true)); assertNotNull(digitalTwinCatalog); assertNotEquals(catalog, digitalTwinCatalog); assertEquals(catalog.getId(), digitalTwinCatalog.getId()); @@ -265,14 +255,14 @@ void searchDigitalTwinCatalog() { assertEquals(catalog.getContext(), digitalTwinCatalog.getContext()); Map contractOffer = (Map) jsonUtil.toMap(digitalTwinCatalog.getContractOffers()); - assertEquals("data.core.digitalTwinRegistry", contractOffer.get("type")); + assertEquals("data.core.digitalTwinRegistry", contractOffer.get("asset:prop:type")); } @Test void doContractNegotiationAndSeeNegotiation() { String providerUrl = UUID.randomUUID().toString(); - Offer offer = dataTransferService.buildOffer(dataSet, 0); + Policy policyOffer = dataTransferService.buildOffer(dataSet, 0, bpn); when(httpUtil.doPost(anyString(), any(Class.class), any(HttpHeaders.class), any(Map.class), any(NegotiationRequest.class), eq(false), eq(false))) .then(invocation -> { @@ -283,11 +273,11 @@ void doContractNegotiationAndSeeNegotiation() { return new ResponseEntity<>(null, HttpStatus.NOT_FOUND); }); - IdResponse response = dataTransferService.doContractNegotiation(offer, bpn, bpn, providerUrl); + IdResponse response = dataTransferService.doContractNegotiation(policyOffer, providerUrl); assertNotNull(response); assertEquals("189f4957-0fbe-4d73-b215-977e3303a45e", response.getId()); - assertEquals("IdResponseDto", response.getType()); + assertEquals("IdResponse", response.getType()); when(httpUtil.doGet(anyString(), eq(NegotiationTransferResponse.class), any(HttpHeaders.class), any(Map.class), eq(false), eq(false))) .thenReturn(new ResponseEntity<>(jsonUtil.fromJsonFileToObject(Paths.get(fileUtil.getBaseClassDir(this.getClass()), testResponseNegotiationPath).toString(), Negotiation.class), HttpStatus.OK)); @@ -298,13 +288,13 @@ void doContractNegotiationAndSeeNegotiation() { Negotiation negotiation = dataTransferService.seeNegotiation(response.getId()); assertEquals(response.getId(), negotiation.getId()); - assertEquals("ContractNegotiationDto", negotiation.getType()); + assertEquals("ContractNegotiation", negotiation.getType()); assertEquals("FINALIZED", negotiation.getState()); } private Negotiation getNegotiation() { String providerUrl = UUID.randomUUID().toString(); - Offer offer = dataTransferService.buildOffer(dataSet, 0); + Policy policyOffer = dataTransferService.buildOffer(dataSet, 0, bpn); when(httpUtil.doPost(anyString(), any(Class.class), any(HttpHeaders.class), any(Map.class), any(NegotiationRequest.class), eq(false), eq(false))) .then(invocation -> { @@ -315,7 +305,7 @@ private Negotiation getNegotiation() { return new ResponseEntity<>(null, HttpStatus.NOT_FOUND); }); - IdResponse negotiationResponse = dataTransferService.doContractNegotiation(offer, bpn,bpn, providerUrl); + IdResponse negotiationResponse = dataTransferService.doContractNegotiation(policyOffer, providerUrl); when(httpUtil.doGet(anyString(), eq(NegotiationTransferResponse.class), any(HttpHeaders.class), any(Map.class), eq(false), eq(false))) .thenReturn(new ResponseEntity<>(jsonUtil.fromJsonFileToObject(Paths.get(fileUtil.getBaseClassDir(this.getClass()), testResponseNegotiationPath).toString(), Negotiation.class), HttpStatus.OK)); @@ -331,19 +321,26 @@ void initiateTransferAndSeeTransfer() { Negotiation negotiation = getNegotiation(); Status status = new Status(); - status.setEndpoint("test.endpoint"); + TransferRequest.TransferType transferType = new TransferRequest.TransferType(); + transferType.setContentType(env.getProperty("configuration.edc.transferType")); + transferType.setIsFinite(true); + status.setEndpoint("test.endpoint"); + List callbackAddresses = List.of(new CallbackAddress( + false, + "http://test.endpoint/4546", + List.of("transfer.process") + )); TransferRequest transferRequest = new TransferRequest( jsonUtil.toJsonNode(Map.of("odrl", "http://www.w3.org/ns/odrl/2/")), dataSet.getAssetId(), status.getEndpoint(), - bpn, negotiation.getContractAgreementId(), null, false, - null, "dataspace-protocol-http", - null + transferType, + callbackAddresses ); when(httpUtil.doPost(anyString(), any(Class.class), any(HttpHeaders.class), any(Map.class), any(Object.class), eq(false), eq(false))) @@ -352,8 +349,8 @@ void initiateTransferAndSeeTransfer() { IdResponse response = dataTransferService.initiateTransfer(transferRequest); assertNotNull(response); - assertEquals("9ab72e5b-f2d4-4f60-85e6-0985f9b6b579", response.getId()); - assertEquals("IdResponseDto", response.getType()); + assertEquals("73af176d-bc46-4cc2-80e2-423c0c6fb244", response.getId()); + assertEquals("IdResponse", response.getType()); when(httpUtil.doGet(anyString(), eq(NegotiationTransferResponse.class), any(HttpHeaders.class), any(Map.class), eq(false), eq(false))) .thenReturn(new ResponseEntity<>(jsonUtil.fromJsonFileToObject(Paths.get(fileUtil.getBaseClassDir(this.getClass()), testResponseTransferPath).toString(), Transfer.class), HttpStatus.OK)); @@ -364,7 +361,7 @@ void initiateTransferAndSeeTransfer() { Transfer transfer = dataTransferService.seeTransfer(response.getId()); assertEquals(response.getId(), transfer.getId()); - assertEquals("TransferProcessDto", transfer.getType()); - assertEquals("COMPLETED", transfer.getState()); + assertEquals("TransferProcess", transfer.getType()); + assertEquals("STARTED", transfer.getState()); } } \ No newline at end of file diff --git a/dpp-backend/digitalproductpass/src/test/resources/application-test.yml b/dpp-backend/digitalproductpass/src/test/resources/application-test.yml index 21ca961d9..c70f7ec24 100644 --- a/dpp-backend/digitalproductpass/src/test/resources/application-test.yml +++ b/dpp-backend/digitalproductpass/src/test/resources/application-test.yml @@ -128,7 +128,7 @@ configuration: key: "bpn" timeout: 1500 - singleApi: + single-api: maxRetries: 30 delay: 1000 diff --git a/dpp-backend/digitalproductpass/src/test/resources/dpp/catalogs/TestContractOfferCatalog.json b/dpp-backend/digitalproductpass/src/test/resources/dpp/catalogs/TestContractOfferCatalog.json index 2e789f099..4d920b8ea 100644 --- a/dpp-backend/digitalproductpass/src/test/resources/dpp/catalogs/TestContractOfferCatalog.json +++ b/dpp-backend/digitalproductpass/src/test/resources/dpp/catalogs/TestContractOfferCatalog.json @@ -1,63 +1,75 @@ { - "@id": "c86305ef-e8ee-4163-913c-ce074dfa274f", + "@id": "2c156143-eb4b-496a-9dad-b7fc776ed865", "@type": "dcat:Catalog", + "dspace:participantId": "BPNL00000000000", "dcat:dataset": { - "@id": "urn:uuid:9992f962-6f69-875d-0ea4-fb4db3bb3b23", + "@id": "dpp-registry", "@type": "dcat:Dataset", "odrl:hasPolicy": { - "@id": "ZDkxMzRjNmQtNWUzNy03ZDc5LTRkOTEtZmM5MGIzZWVkMzMw:dXJuOnV1aWQ6OTk5MmY5NjItNmY2OS04NzVkLTBlYTQtZmI0ZGIzYmIzYjIz:YjZkMzFkNGYtNGYyNS00MWI1LWFkMzctNjJjY2U4NGI3NjA0", - "@type": "odrl:Set", - "odrl:permission": { - "odrl:target": "urn:uuid:9992f962-6f69-875d-0ea4-fb4db3bb3b23", - "odrl:action": { - "odrl:type": "USE" - }, - "odrl:constraint": { - "odrl:or": { - "odrl:leftOperand": "PURPOSE", - "odrl:operator": { - "@id": "odrl:eq" - }, - "odrl:rightOperand": "ID 3.0 Trace" - } - } - }, + "@id": "cmVnaXN0cnktY29udHJhY3QtZGVmaW5pdGlvbg==:ZHBwLXJlZ2lzdHJ5:N2FjZDM0OGItNzk3Ny00MGRhLWIyZTktMGQyY2Y4NzBkNjhi", + "@type": "odrl:Offer", + "odrl:permission": [], "odrl:prohibition": [], - "odrl:obligation": [], - "odrl:target": "urn:uuid:9992f962-6f69-875d-0ea4-fb4db3bb3b23" + "odrl:obligation": [] }, "dcat:distribution": [ { "@type": "dcat:Distribution", "dct:format": { - "@id": "HttpProxy" + "@id": "AzureStorage-PUSH" }, - "dcat:accessService": "e2a066b3-5a16-45dc-8552-8d96ac787e02" + "dcat:accessService": { + "@id": "efecedfa-43bb-4b73-8728-aea6e246dda0", + "@type": "dcat:DataService", + "dct:terms": "connector", + "dct:endpointUrl": "https://test.com/api/v1/dsp" + } }, { "@type": "dcat:Distribution", "dct:format": { - "@id": "AmazonS3" + "@id": "HttpData-PULL" }, - "dcat:accessService": "e2a066b3-5a16-45dc-8552-8d96ac787e02" + "dcat:accessService": { + "@id": "efecedfa-43bb-4b73-8728-aea6e246dda0", + "@type": "dcat:DataService", + "dct:terms": "connector", + "dct:endpointUrl": "https://test.com/api/v1/dsp" + } + }, + { + "@type": "dcat:Distribution", + "dct:format": { + "@id": "AmazonS3-PUSH" + }, + "dcat:accessService": { + "@id": "efecedfa-43bb-4b73-8728-aea6e246dda0", + "@type": "dcat:DataService", + "dct:terms": "connector", + "dct:endpointUrl": "https://test.com/api/v1/dsp" + } } ], "description": "batterypass test data", - "id": "urn:uuid:9992f962-6f69-875d-0ea4-fb4db3bb3b23" + "version": "3.0", + "id": "dpp-asset" }, "dcat:service": { - "@id": "e2a066b3-5a16-45dc-8552-8d96ac787e02", + "@id": "efecedfa-43bb-4b73-8728-aea6e246dda0", "@type": "dcat:DataService", "dct:terms": "connector", - "dct:endpointUrl": "https://materialpass.int.demo.catena-x.net/BPNL000000000000/api/v1/dsp" + "dct:endpointUrl": "https://test.com/api/v1/dsp" }, "participantId": "BPNL00000000000", "@context": { - "dct": "https://purl.org/dc/terms/", - "tx": "https://w3id.org/tractusx/v0.0.1/ns/", + "@vocab": "https://w3id.org/edc/v0.0.1/ns/", "edc": "https://w3id.org/edc/v0.0.1/ns/", - "dcat": "https://www.w3.org/ns/dcat/", + "tx": "https://w3id.org/tractusx/v0.0.1/ns/", + "tx-auth": "https://w3id.org/tractusx/auth/", + "cx-policy": "https://w3id.org/catenax/policy/", + "dcat": "http://www.w3.org/ns/dcat#", + "dct": "http://purl.org/dc/terms/", "odrl": "http://www.w3.org/ns/odrl/2/", "dspace": "https://w3id.org/dspace/v0.8/" } -} +} \ No newline at end of file diff --git a/dpp-backend/digitalproductpass/src/test/resources/dpp/catalogs/TestDigitalTwinCatalog.json b/dpp-backend/digitalproductpass/src/test/resources/dpp/catalogs/TestDigitalTwinCatalog.json index 35ddc1302..970d1d45e 100644 --- a/dpp-backend/digitalproductpass/src/test/resources/dpp/catalogs/TestDigitalTwinCatalog.json +++ b/dpp-backend/digitalproductpass/src/test/resources/dpp/catalogs/TestDigitalTwinCatalog.json @@ -1,51 +1,78 @@ { - "@id": "bb824702-08dc-4315-9ff1-6373330a0cd9", + "@id": "2c156143-eb4b-496a-9dad-b7fc776ed865", "@type": "dcat:Catalog", + "dspace:participantId": "BPNL00000000000", "dcat:dataset": { - "@id": "registry-asset", + "@id": "dpp-registry", "@type": "dcat:Dataset", "odrl:hasPolicy": { - "@id": "ZGVmYXVsdC1jb250cmFjdC1kZWZpbml0aW9u:cmVnaXN0cnktYXNzZXQ=:MTIxMjYzMzgtYzhkMC00MGQ4LTkxYWMtZmY2ZTY0ZTQ5ZmM0", - "@type": "odrl:Set", + "@id": "cmVnaXN0cnktY29udHJhY3QtZGVmaW5pdGlvbg==:ZHBwLXJlZ2lzdHJ5:N2FjZDM0OGItNzk3Ny00MGRhLWIyZTktMGQyY2Y4NzBkNjhi", + "@type": "odrl:Offer", "odrl:permission": [], "odrl:prohibition": [], - "odrl:obligation": [], - "odrl:target": "registry-asset" + "odrl:obligation": [] }, "dcat:distribution": [ { "@type": "dcat:Distribution", "dct:format": { - "@id": "HttpProxy" + "@id": "AzureStorage-PUSH" }, - "dcat:accessService": "bc491229-1b41-49a9-9101-a430a4907e6e" + "dcat:accessService": { + "@id": "efecedfa-43bb-4b73-8728-aea6e246dda0", + "@type": "dcat:DataService", + "dct:terms": "connector", + "dct:endpointUrl": "https://test.com/api/v1/dsp" + } }, { "@type": "dcat:Distribution", "dct:format": { - "@id": "AmazonS3" + "@id": "HttpData-PULL" }, - "dcat:accessService": "bc491229-1b41-49a9-9101-a430a4907e6e" + "dcat:accessService": { + "@id": "efecedfa-43bb-4b73-8728-aea6e246dda0", + "@type": "dcat:DataService", + "dct:terms": "connector", + "dct:endpointUrl": "https://test.com/api/v1/dsp" + } + }, + { + "@type": "dcat:Distribution", + "dct:format": { + "@id": "AmazonS3-PUSH" + }, + "dcat:accessService": { + "@id": "efecedfa-43bb-4b73-8728-aea6e246dda0", + "@type": "dcat:DataService", + "dct:terms": "connector", + "dct:endpointUrl": "https://test.com/api/v1/dsp" + } } ], - "type": "data.core.digitalTwinRegistry", - "description": "Digital Twin Registry for DPP", - "id": "registry-asset", - "contenttype": "application/json" + "version": "3.0", + "type": { + "@id": "DigitalTwinRegistry" + }, + "asset:prop:type": "data.core.digitalTwinRegistry", + "id": "dpp-registry" }, "dcat:service": { - "@id": "bc491229-1b41-49a9-9101-a430a4907e6e", + "@id": "efecedfa-43bb-4b73-8728-aea6e246dda0", "@type": "dcat:DataService", "dct:terms": "connector", - "dct:endpointUrl": "https://materialpass.int.demo.catena-x.net/BPNL000000000000/api/v1/dsp" + "dct:endpointUrl": "https://test.com/api/v1/dsp" }, "participantId": "BPNL00000000000", "@context": { - "dct": "https://purl.org/dc/terms/", - "tx": "https://w3id.org/tractusx/v0.0.1/ns/", + "@vocab": "https://w3id.org/edc/v0.0.1/ns/", "edc": "https://w3id.org/edc/v0.0.1/ns/", - "dcat": "https://www.w3.org/ns/dcat/", + "tx": "https://w3id.org/tractusx/v0.0.1/ns/", + "tx-auth": "https://w3id.org/tractusx/auth/", + "cx-policy": "https://w3id.org/catenax/policy/", + "dcat": "http://www.w3.org/ns/dcat#", + "dct": "http://purl.org/dc/terms/", "odrl": "http://www.w3.org/ns/odrl/2/", "dspace": "https://w3id.org/dspace/v0.8/" } -} +} \ No newline at end of file diff --git a/dpp-backend/digitalproductpass/src/test/resources/dpp/contractpolicies/TestPolicy.json b/dpp-backend/digitalproductpass/src/test/resources/dpp/contractpolicies/TestPolicy.json index 460c4f79a..6a4a36042 100644 --- a/dpp-backend/digitalproductpass/src/test/resources/dpp/contractpolicies/TestPolicy.json +++ b/dpp-backend/digitalproductpass/src/test/resources/dpp/contractpolicies/TestPolicy.json @@ -1,8 +1,7 @@ { - "@id": "ZGVmYXVsdC1jb250cmFjdC1kZWZpbml0aW9u:cmVnaXN0cnktYXNzZXQ=:MTIxMjYzMzgtYzhkMC00MGQ4LTkxYWMtZmY2ZTY0ZTQ5ZmM0", - "@type": "odrl:Set", - "odrl:permission" : [], + "@id": "cmVnaXN0cnktY29udHJhY3QtZGVmaW5pdGlvbg==:ZHBwLXJlZ2lzdHJ5:N2FjZDM0OGItNzk3Ny00MGRhLWIyZTktMGQyY2Y4NzBkNjhi", + "@type": "odrl:Offer", + "odrl:permission": [], "odrl:prohibition": [], - "odrl:obligation": [], - "odrl:target": "registry-asset" + "odrl:obligation": [] } diff --git a/dpp-backend/digitalproductpass/src/test/resources/dpp/negotiation/TestResponseInitNegotiation.json b/dpp-backend/digitalproductpass/src/test/resources/dpp/negotiation/TestResponseInitNegotiation.json index 59e633ed5..3bbc9ab77 100644 --- a/dpp-backend/digitalproductpass/src/test/resources/dpp/negotiation/TestResponseInitNegotiation.json +++ b/dpp-backend/digitalproductpass/src/test/resources/dpp/negotiation/TestResponseInitNegotiation.json @@ -1,5 +1,5 @@ { - "@type" : "IdResponseDto", + "@type" : "IdResponse", "@id" : "189f4957-0fbe-4d73-b215-977e3303a45e", "createdAt" : 1699439557127, "@context" : { diff --git a/dpp-backend/digitalproductpass/src/test/resources/dpp/negotiation/TestResponseNegotiation.json b/dpp-backend/digitalproductpass/src/test/resources/dpp/negotiation/TestResponseNegotiation.json index 160280758..f702ca3df 100644 --- a/dpp-backend/digitalproductpass/src/test/resources/dpp/negotiation/TestResponseNegotiation.json +++ b/dpp-backend/digitalproductpass/src/test/resources/dpp/negotiation/TestResponseNegotiation.json @@ -1,18 +1,20 @@ { - "@type": "ContractNegotiationDto", + "@type": "ContractNegotiation", "@id": "189f4957-0fbe-4d73-b215-977e3303a45e", "type": "CONSUMER", "protocol": "dataspace-protocol-http", "state": "FINALIZED", - "counterPartyAddress": "https://materialpass.int.demo.catena-x.net/BPNL000000000000/api/v1/dsp", + "counterPartyId": "BPNL00000000000", + "counterPartyAddress": "https://test.com/api/v1/dsp", "callbackAddresses": [], - "contractAgreementId": "ZGVmYXVsdC1jb250cmFjdC1kZWZpbml0aW9u:cmVnaXN0cnktYXNzZXQ=:NmRjMDFlOTQtMGE0MC00MTQzLThhOTYtY2IyMmYxN2JjZGJj", + "createdAt": 1715192601315, + "contractAgreementId": "1ce31703-bca2-4cd0-809c-b716fba61c03", "@context": { - "dct": "https://purl.org/dc/terms/", - "tx": "https://w3id.org/tractusx/v0.0.1/ns/", + "@vocab": "https://w3id.org/edc/v0.0.1/ns/", "edc": "https://w3id.org/edc/v0.0.1/ns/", - "dcat": "https://www.w3.org/ns/dcat/", - "odrl": "http://www.w3.org/ns/odrl/2/", - "dspace": "https://w3id.org/dspace/v0.8/" + "tx": "https://w3id.org/tractusx/v0.0.1/ns/", + "tx-auth": "https://w3id.org/tractusx/auth/", + "cx-policy": "https://w3id.org/catenax/policy/", + "odrl": "http://www.w3.org/ns/odrl/2/" } -} +} \ No newline at end of file diff --git a/dpp-backend/digitalproductpass/src/test/resources/dpp/transfer/TestResponseInitTransfer.json b/dpp-backend/digitalproductpass/src/test/resources/dpp/transfer/TestResponseInitTransfer.json index d2ff5e87a..6a646718a 100644 --- a/dpp-backend/digitalproductpass/src/test/resources/dpp/transfer/TestResponseInitTransfer.json +++ b/dpp-backend/digitalproductpass/src/test/resources/dpp/transfer/TestResponseInitTransfer.json @@ -1,6 +1,6 @@ { - "@type": "IdResponseDto", - "@id": "9ab72e5b-f2d4-4f60-85e6-0985f9b6b579", + "@type": "IdResponse", + "@id": "73af176d-bc46-4cc2-80e2-423c0c6fb244", "createdAt": 1699439575484, "@context": { "dct": "https://purl.org/dc/terms/", diff --git a/dpp-backend/digitalproductpass/src/test/resources/dpp/transfer/TestResponseTransfer.json b/dpp-backend/digitalproductpass/src/test/resources/dpp/transfer/TestResponseTransfer.json index 76385f5ab..c33f2d487 100644 --- a/dpp-backend/digitalproductpass/src/test/resources/dpp/transfer/TestResponseTransfer.json +++ b/dpp-backend/digitalproductpass/src/test/resources/dpp/transfer/TestResponseTransfer.json @@ -1,27 +1,29 @@ { - "@id": "9ab72e5b-f2d4-4f60-85e6-0985f9b6b579", - "@type": "TransferProcessDto", - "state": "COMPLETED", - "stateTimestamp": 1699439577253, + "@id": "73af176d-bc46-4cc2-80e2-423c0c6fb244", + "@type": "TransferProcess", + "state": "STARTED", + "stateTimestamp": 1715192724130, "type": "CONSUMER", - "callbackAddresses": [], + "callbackAddresses": { + "@type": "CallbackAddress", + "transactional": false, + "uri": "https://callback.address.com/endpoint", + "events": "transfer.process" + }, + "correlationId": "caa51b56-b4db-4f36-b95d-8de56d1cbe7e", + "assetId": "dpp-asset", + "contractId": "1ce31703-bca2-4cd0-809c-b716fba61c03", + "transferType": "HttpData-PULL", "dataDestination": { + "@type": "DataAddress", "type": "HttpProxy" }, - "dataRequest": { - "@type": "DataRequestDto", - "@id": "9ab72e5b-f2d4-4f60-85e6-0985f9b6b579", - "assetId": "365e6fbe-bb34-11ec-8422-0242ac120002-61125dc3-5e6f-4f4b-838d-447432b97918", - "contractId": "ZGVmYXVsdC1jb250cmFjdC1kZWZpbml0aW9u:cmVnaXN0cnktYXNzZXQ=:NmRjMDFlOTQtMGE0MC00MTQzLThhOTYtY2IyMmYxN2JjZGJj", - "connectorId": "BPNL00000000CBA5" - }, - "receiverHttpEndpoint": "https://testUrl.com/BPNL000000000000/endpoint/ebc08cdc-fc22-41e8-9394-81142de0b35a/365e6fbe-bb34-11ec-8422-0242ac120002-61125dc3-5e6f-4f4b-838d-447432b97918", "@context": { - "dct": "https://purl.org/dc/terms/", - "tx": "https://w3id.org/tractusx/v0.0.1/ns/", + "@vocab": "https://w3id.org/edc/v0.0.1/ns/", "edc": "https://w3id.org/edc/v0.0.1/ns/", - "dcat": "https://www.w3.org/ns/dcat/", - "odrl": "http://www.w3.org/ns/odrl/2/", - "dspace": "https://w3id.org/dspace/v0.8/" + "tx": "https://w3id.org/tractusx/v0.0.1/ns/", + "tx-auth": "https://w3id.org/tractusx/auth/", + "cx-policy": "https://w3id.org/catenax/policy/", + "odrl": "http://www.w3.org/ns/odrl/2/" } -} +} \ No newline at end of file From 8028331b6b73caaa22576e9b1de1d88edc1f9910 Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Thu, 9 May 2024 21:00:54 +0200 Subject: [PATCH 03/18] fix: added condition to not add edc data endpoint if already exists --- charts/digital-product-pass/templates/configmap-backend.yaml | 2 +- charts/digital-product-pass/values.yaml | 2 +- .../tractusx/digitalproductpass/services/CatenaXService.java | 1 + .../digitalproductpass/src/main/java/utils/CatenaXUtil.java | 2 ++ 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/charts/digital-product-pass/templates/configmap-backend.yaml b/charts/digital-product-pass/templates/configmap-backend.yaml index 5c5e9436e..76fd3bb42 100644 --- a/charts/digital-product-pass/templates/configmap-backend.yaml +++ b/charts/digital-product-pass/templates/configmap-backend.yaml @@ -126,7 +126,7 @@ data: edc: key: {{ tpl (.Values.backend.discovery.edcDiscovery.key | default "bpn") . | quote }} # -- configuration to the single API endpoint - singleApi: + single-api: maxRetries: {{ .Values.backend.singleApi.maxRetries }} delay: {{ .Values.backend.singleApi.delay }} # -- process configuration diff --git a/charts/digital-product-pass/values.yaml b/charts/digital-product-pass/values.yaml index beb5b9428..a802ee789 100644 --- a/charts/digital-product-pass/values.yaml +++ b/charts/digital-product-pass/values.yaml @@ -255,7 +255,7 @@ backend: edcDiscovery: key: "bpn" # -- configuration to the single API endpoint - singleApi: + single-api: maxRetries: 30 delay: 1000 diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/CatenaXService.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/CatenaXService.java index b372ba1df..18f267f42 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/CatenaXService.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/CatenaXService.java @@ -628,6 +628,7 @@ public void searchDTRs (List bpnList, String processId) { try { List edcEndpointBinded = null; List edcEndpoints = this.getEdcDiscovery(bpnList); + LogUtil.printDebug("EDC ENDPOINTS [ " + jsonUtil.toJson(edcEndpoints, true)); try { edcEndpointBinded = (List) jsonUtil.bindReferenceType(edcEndpoints, new TypeReference>() {}); } catch (Exception e) { diff --git a/dpp-backend/digitalproductpass/src/main/java/utils/CatenaXUtil.java b/dpp-backend/digitalproductpass/src/main/java/utils/CatenaXUtil.java index 6e54e6d8d..3d314862b 100644 --- a/dpp-backend/digitalproductpass/src/main/java/utils/CatenaXUtil.java +++ b/dpp-backend/digitalproductpass/src/main/java/utils/CatenaXUtil.java @@ -88,6 +88,8 @@ public static Boolean containsEdcEndpoint(String str) { * */ public static String buildDataEndpoint(String endpoint) { + if(endpoint.contains(edcDataEndpoint)) + return endpoint; return endpoint + edcDataEndpoint; } From 6ab48244b0598ffa4e671981cf2d0102bbd75953 Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Thu, 9 May 2024 21:12:44 +0200 Subject: [PATCH 04/18] fix: startup copyright updated --- .../tractusx/digitalproductpass/listeners/AppListener.java | 1 + 1 file changed, 1 insertion(+) diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/listeners/AppListener.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/listeners/AppListener.java index fc189afe0..4dba2e74f 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/listeners/AppListener.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/listeners/AppListener.java @@ -216,6 +216,7 @@ public void onStartUp() { "**********************************************************************\n\n" + " " + buildProperties.getName() + "\n" + " Copyright (c) 2022, 2024: BMW AG, Henkel AG & Co. KGaA\n" + + " Copyright (c) 2023, 2024: CGI Deutschland B.V. & Co. KG\n" + " Copyright (c) 2022, 2024: Contributors to the Eclipse Foundation.\n\n" + "**********************************************************************\n\n"; System.out.print(serverStartUpMessage); From 0cb0122468b5dc5798a3bc25e77d8c999b1d368e Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Thu, 9 May 2024 21:19:05 +0200 Subject: [PATCH 05/18] feat: fixed bug with the destribution parsing --- .../negotiation/catalog/Distribution.java | 83 ++++++++++--------- 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Distribution.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Distribution.java index ccd80e429..b864c0bfb 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Distribution.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Distribution.java @@ -29,6 +29,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import org.eclipse.tractusx.digitalproductpass.models.negotiation.DataService; import org.eclipse.tractusx.digitalproductpass.models.negotiation.DidDocument; /** @@ -40,60 +42,65 @@ public class Distribution extends DidDocument { /** ATTRIBUTES **/ @JsonProperty("dct:format") - Format format; + DidDocument format; @JsonProperty("dcat:accessService") - String accessService; + DataService accessService; /** CONSTRUCTOR(S) **/ - public Distribution(String type, Format format, String accessService) { - this.type = type; + + public Distribution() { + } + + public Distribution(String id, String type, DidDocument format, DataService accessService) { + super(id, type); this.format = format; this.accessService = accessService; } - public Distribution() { + + public Distribution(DidDocument format, DataService accessService) { + this.format = format; + this.accessService = accessService; } + public Distribution(String id, String type, JsonNode context, DidDocument format, DataService accessService) { + super(id, type, context); + this.format = format; + this.accessService = accessService; + } + + public Distribution(String type, DidDocument format, DataService accessService) { + super(type); + this.format = format; + this.accessService = accessService; + } + + public Distribution(JsonNode context, DidDocument format, DataService accessService) { + super(context); + this.format = format; + this.accessService = accessService; + } + + public Distribution(JsonNode context, String type, DidDocument format, DataService accessService) { + super(context, type); + this.format = format; + this.accessService = accessService; + } /** GETTERS AND SETTERS **/ - public Format getFormat() { + + public DidDocument getFormat() { return format; } - public void setFormat(Format format) { + + public void setFormat(DidDocument format) { this.format = format; } - @SuppressWarnings("Unused") - public String getAccessService() { + + public DataService getAccessService() { return accessService; } - @SuppressWarnings("Unused") - public void setAccessService(String accessService) { - this.accessService = accessService; - } - /** INNER CLASSES **/ - /** - * This class consists exclusively to define attributes related to the Distribution's format property. - **/ - static class Format { - /** ATTRIBUTES **/ - @JsonProperty("@id") - String id; - - /** CONSTRUCTOR(S) **/ - @SuppressWarnings("Unused") - public Format(String id) { - this.id = id; - } - @SuppressWarnings("Unused") - public Format() { - } - - /** GETTERS AND SETTERS **/ - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } + public void setAccessService(DataService accessService) { + this.accessService = accessService; } From c5566376008371449ea922deb57b982c69819e74 Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Thu, 9 May 2024 21:26:07 +0200 Subject: [PATCH 06/18] chore(tmp): disabled dash license plugin --- dpp-backend/digitalproductpass/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dpp-backend/digitalproductpass/pom.xml b/dpp-backend/digitalproductpass/pom.xml index 943b94d76..e8a3e5dcf 100644 --- a/dpp-backend/digitalproductpass/pom.xml +++ b/dpp-backend/digitalproductpass/pom.xml @@ -234,7 +234,7 @@ - + org.apache.maven.plugins maven-compiler-plugin From c4cd844ec339aac2a0a89df5e87992b482b7b92c Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Thu, 9 May 2024 21:43:35 +0200 Subject: [PATCH 07/18] fix: propagate error related to no policy available --- .../managers/DtrSearchManager.java | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java index 71d243fd4..7cf68dc80 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java @@ -255,7 +255,13 @@ public void searchEndpoint(String processId, String bpn, String endpoint) { Map datasets = new HashMap<>() {{ put(dataset.getId(), dataset); }}; - Thread singleOfferThread = ThreadUtil.runThread(createAndSaveDtr(datasets, bpn, providerBpn, endpoint, processId), "CreateAndSaveDtr-" + processId + "-" + bpn + "-" + endpoint); + + Selection contractAndPolicy = getDtrDataset(datasets); + if (contractAndPolicy == null) { + throw new ManagerException("DtrSearchManager.searchEndpoint", "There was no valid policy available for the digital twin registry found!"); + } + + Thread singleOfferThread = ThreadUtil.runThread(createAndSaveDtr(contractAndPolicy, datasets, bpn, providerBpn, endpoint, processId), "CreateAndSaveDtr-" + processId + "-" + bpn + "-" + endpoint); try { if (!singleOfferThread.join(Duration.ofSeconds(this.dtrRequestProcessTimeout))) { singleOfferThread.interrupt(); @@ -273,9 +279,13 @@ public void searchEndpoint(String processId, String bpn, String endpoint) { return; } Map datasets = edcUtil.mapDatasetsById(contractOfferList); + Selection contractAndPolicy = getDtrDataset(datasets); + if (contractAndPolicy == null) { + throw new ManagerException("DtrSearchManager.searchEndpoint", "There was no valid policy available for the digital twin registry found!"); + } // Store datasets in the digital twin logs contractOfferList.parallelStream().forEach(dataset -> { - Thread multipleOffersThread = ThreadUtil.runThread(createAndSaveDtr(datasets, bpn, providerBpn, endpoint, processId), "CreateAndSaveDtr-" + processId + "-" + bpn + "-" + endpoint); + Thread multipleOffersThread = ThreadUtil.runThread(createAndSaveDtr(contractAndPolicy, datasets, bpn, providerBpn, endpoint, processId), "CreateAndSaveDtr-" + processId + "-" + bpn + "-" + endpoint); try { if (!multipleOffersThread.join(Duration.ofSeconds(this.dtrRequestProcessTimeout))) { multipleOffersThread.interrupt(); @@ -486,23 +496,19 @@ public Selection getDtrDataset(Map datasets) { * for a given BPN number and an URL connection into a process with the given process id. *

* - * @param datasets the {@code Map} data for the contract offer. + * @param contractAndPolicy the {@code Selection} the selected contract and policy + * @param datasets the {@code Map} map of contracts available * @param bpn the {@code String} bpn number. * @param connectionUrl the {@code String} URL connection of the Digital Twin. * @param processId the {@code String} id of the application's process. * @return a {@code Runnable} object to be used by a calling thread. * @throws ManagerException if unable to do the contract negotiation for the DTR. */ - private Runnable createAndSaveDtr(Map datasets, String bpn, String providerBpn, String connectionUrl, String processId) { + private Runnable createAndSaveDtr(Selection contractAndPolicy, Map datasets, String bpn, String providerBpn, String connectionUrl, String processId) { return new Runnable() { @Override public void run() { try { - Selection contractAndPolicy = getDtrDataset(datasets); - if (contractAndPolicy == null) { - LogUtil.printError("It was not possible to get the dataset contract and policy!"); - return; - } Dataset dataset = contractAndPolicy.d(); // Get the contract element if (dataset == null) { LogUtil.printError("It was not possible to get the contract!"); @@ -539,9 +545,8 @@ public void run() { } processManager.addSearchStatusDtr(processId, dtr); - } catch (Exception e) { - throw new ManagerException(this.getClass().getName() + ".createAndSaveDtr", e, "Failed to save the dataModel for this connection url: " + connectionUrl); + throw new ManagerException(this.getClass().getName() + ".createAndSaveDtr", e, "Failed to create the digital twin registry for url: " + connectionUrl); } } }; From bc89c1f5e69d8c8e900ea539df4cee102448a03f Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Thu, 9 May 2024 21:57:01 +0200 Subject: [PATCH 08/18] chore(err): updated digital twin registry search error messages --- .../digitalproductpass/managers/DtrSearchManager.java | 2 +- .../tractusx/digitalproductpass/services/ContractService.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java index 7cf68dc80..410aa5702 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java @@ -157,7 +157,7 @@ public void run() { state = State.Finished; } catch (Exception e) { state = State.Error; - throw new DataModelException(this.getClass().getName(), e, "Was not possible to process the DTRs"); + throw new DataModelException(this.getClass().getName(), e, "It was not possible find any valid digital twin registry!"); } } }; diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/ContractService.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/ContractService.java index 898f8ec0b..eb22389e0 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/ContractService.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/ContractService.java @@ -215,10 +215,10 @@ public Response createCall (HttpServletResponse httpResponse, DiscoverySearch se SearchStatus status = processManager.getSearchStatus(processId); if (status == null) { - return httpUtil.buildResponse(httpUtil.getNotFound("It was not possible to search for the decentral digital twin registries"), httpResponse); + return httpUtil.buildResponse(httpUtil.getNotFound("It was not possible to search for the decentralized digital twin registries"), httpResponse); } if (status.getDtrs().isEmpty()) { - return httpUtil.buildResponse(httpUtil.getNotFound("No decentral digital twin registry was found"), httpResponse); + return httpUtil.buildResponse(httpUtil.getNotFound("No valid decentralized digital twin registries found for the configured policies!"), httpResponse); } response = httpUtil.getResponse(); response.data = Map.of( From ac5c99cad7f548c7c04d97d894bde5aaa1b5119d Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Thu, 9 May 2024 22:19:42 +0200 Subject: [PATCH 09/18] chore(err): updated digital twin registry search error messages --- .../digitalproductpass/managers/DtrSearchManager.java | 6 ++++-- .../digitalproductpass/src/main/java/utils/EdcUtil.java | 3 +++ .../digitalproductpass/src/main/java/utils/PolicyUtil.java | 4 +++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java index 410aa5702..52a269b09 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java @@ -274,10 +274,12 @@ public void searchEndpoint(String processId, String bpn, String endpoint) { } return; } - List contractOfferList = (List) jsonUtil.bindObject(contractOffers, List.class); - if (contractOfferList.isEmpty()) { + List contractOfferList = jsonUtil.bind(contractOffers, new TypeReference<>() {}); + if (contractOfferList == null || contractOfferList.isEmpty()) { + LogUtil.printDebug("[DEBUG] ContractOfferList is empty!"); return; } + LogUtil.printDebug("[DEBUG] ContractOfferList: " + jsonUtil.toJson(contractOfferList, true)); Map datasets = edcUtil.mapDatasetsById(contractOfferList); Selection contractAndPolicy = getDtrDataset(datasets); if (contractAndPolicy == null) { diff --git a/dpp-backend/digitalproductpass/src/main/java/utils/EdcUtil.java b/dpp-backend/digitalproductpass/src/main/java/utils/EdcUtil.java index cd91f90cd..5169b7be3 100644 --- a/dpp-backend/digitalproductpass/src/main/java/utils/EdcUtil.java +++ b/dpp-backend/digitalproductpass/src/main/java/utils/EdcUtil.java @@ -154,11 +154,14 @@ public Selection selectValidContractAndPolicy(Map List> validContractSelections = new ArrayList<>(); // Array with possible selections contracts.keySet().forEach(key -> { Dataset contract = contracts.get(key); // Get the contract + LogUtil.printDebug("[DEBUG]: Contract ["+key+"] -> " + jsonUtil.toJson(contract, true)); List policies = policyUtil.getValidPoliciesByConstraints(contract.getPolicy(), policyConfig); // Get all its valid policies + LogUtil.printDebug("[DEBUG]: Contract ["+key+"] with no valid policies!"); // If policies are not null or are more than one if(policies == null || policies.size() == 0){ return; } + LogUtil.printDebug("[DEBUG]: Contract ["+key+"] valid policies: " + jsonUtil.toJson(policies, true)); policies.forEach(policy -> validContractSelections.add(new Selection<>(contract, policy))); // Create the possible selections }); // Select any possible selection diff --git a/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java b/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java index 0ec3b6a89..230a3b2d5 100644 --- a/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java +++ b/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java @@ -139,8 +139,10 @@ public List getValidPoliciesByConstraints(Object policies, PolicyCheckConfi if (policies instanceof LinkedHashMap) { // Check if policy is valid or not Set policy = jsonUtil.bind(policies, new TypeReference<>(){}); + LogUtil.printDebug("[DEBUG] Policy in contract -> "+ jsonUtil.toJson(policy, true)); // In case the policy is valid return the policy if(this.isPolicyValid(policy, validPolicies, strictMode)){ + LogUtil.printDebug("[DEBUG] Policy in contract is valid!"); return new ArrayList<>(){{add(policy);}}; // Add policy to a list of valid policies } // If the policy is not valid return an empty list @@ -243,7 +245,7 @@ public Boolean defaultPolicyCheck(Set policy, List validPolicies){ try { // Filter the list of policies based on the policy configuration List policies = validPolicies.stream().filter(p -> this.isPolicyConstraintsValid(policy, p)).toList(); - System.out.println("[VALID POLICIES] " + policies); + System.out.println("[DEBUG] [VALID POLICIES] " + policies); return policies.size() > 0; //If any policy is valid then return true }catch (Exception e) { throw new UtilException(PolicyUtil.class, e, "[DEFAULT MODE] It was not possible to check if policy is valid!"); From 5cfa457519fd8a0af1090e55813b9d04cace07db Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Fri, 10 May 2024 18:17:17 +0200 Subject: [PATCH 10/18] feat(dependency): fixed bug bug adding lombok library, ip checks executed --- DEPENDENCIES_BACKEND | 1 + charts/digital-product-pass/values-int.yaml | 2 +- charts/digital-product-pass/values.yaml | 2 +- dpp-backend/digitalproductpass/pom.xml | 9 +++++++-- .../models/negotiation/policy/Set.java | 6 ++++++ 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/DEPENDENCIES_BACKEND b/DEPENDENCIES_BACKEND index 555f3186d..0dce085d4 100644 --- a/DEPENDENCIES_BACKEND +++ b/DEPENDENCIES_BACKEND @@ -75,6 +75,7 @@ maven/mavencentral/org.bouncycastle/bcutil-jdk15on/1.69, MIT, approved, clearlyd maven/mavencentral/org.checkerframework/checker-qual/3.33.0, MIT, approved, clearlydefined maven/mavencentral/org.codehaus.plexus/plexus-utils/3.2.1, , approved, CQ20774 maven/mavencentral/org.ow2.asm/asm/9.6, BSD-3-Clause, approved, #10776 +maven/mavencentral/org.projectlombok/lombok/1.18.32, MIT AND LicenseRef-Public-Domain, approved, CQ23907 maven/mavencentral/org.reactivestreams/reactive-streams/1.0.4, CC0-1.0, approved, CQ16332 maven/mavencentral/org.slf4j/jul-to-slf4j/2.0.13, MIT, approved, #7698 maven/mavencentral/org.slf4j/slf4j-api/2.0.13, MIT, approved, #5915 diff --git a/charts/digital-product-pass/values-int.yaml b/charts/digital-product-pass/values-int.yaml index 52c5d1444..6df28ed1b 100644 --- a/charts/digital-product-pass/values-int.yaml +++ b/charts/digital-product-pass/values-int.yaml @@ -62,7 +62,7 @@ backend: discovery: hostname: "semantics.int.demo.catena-x.net/discoveryfinder" - single-api: + singleApi: maxRetries: 30 delay: 1000 diff --git a/charts/digital-product-pass/values.yaml b/charts/digital-product-pass/values.yaml index de1e39db4..eefa69963 100644 --- a/charts/digital-product-pass/values.yaml +++ b/charts/digital-product-pass/values.yaml @@ -255,7 +255,7 @@ backend: edcDiscovery: key: "bpn" # -- configuration to the single API endpoint - single-api: + singleApi: maxRetries: 30 delay: 1000 diff --git a/dpp-backend/digitalproductpass/pom.xml b/dpp-backend/digitalproductpass/pom.xml index e8a3e5dcf..120a0889a 100644 --- a/dpp-backend/digitalproductpass/pom.xml +++ b/dpp-backend/digitalproductpass/pom.xml @@ -157,6 +157,11 @@ spring-boot-starter-test test + + org.projectlombok + lombok + true + com.google.code.gson gson @@ -234,7 +239,7 @@ - + org.apache.maven.plugins maven-compiler-plugin diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java index 8affb8476..9e539fc87 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java @@ -30,6 +30,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.JsonNode; +import lombok.Singular; import org.eclipse.tractusx.digitalproductpass.config.PolicyCheckConfig; import org.eclipse.tractusx.digitalproductpass.exceptions.ModelException; import org.eclipse.tractusx.digitalproductpass.models.negotiation.DidDocument; @@ -47,10 +48,13 @@ public class Set extends DidDocument { /** ATTRIBUTES **/ + @Singular @JsonProperty("odrl:permission") Collection permissions; + @Singular @JsonProperty("odrl:prohibition") Collection prohibitions; + @Singular @JsonProperty("odrl:obligation") Collection obligations; @@ -125,6 +129,8 @@ public Collection buildActions(List acti + + /** GETTERS AND SETTERS **/ public Collection getPermissions() { From 4607204357a3cd8b8aa2fc767de3f15a64fe1153 Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Fri, 10 May 2024 18:42:45 +0200 Subject: [PATCH 11/18] feat: added jacksonized annotation --- .../digitalproductpass/models/negotiation/policy/Set.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java index 9e539fc87..4ebe016e8 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java @@ -30,7 +30,9 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.JsonNode; +import lombok.Builder; import lombok.Singular; +import lombok.extern.jackson.Jacksonized; import org.eclipse.tractusx.digitalproductpass.config.PolicyCheckConfig; import org.eclipse.tractusx.digitalproductpass.exceptions.ModelException; import org.eclipse.tractusx.digitalproductpass.models.negotiation.DidDocument; @@ -45,6 +47,8 @@ **/ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) +@Jacksonized +@Builder public class Set extends DidDocument { /** ATTRIBUTES **/ From ac5a7f6c26e79e783532da6195e718545539352c Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Fri, 10 May 2024 19:12:38 +0200 Subject: [PATCH 12/18] chore: updated bug from lombok --- dpp-backend/digitalproductpass/lombok.config | 28 +++++++++++++++++++ .../models/negotiation/policy/Set.java | 8 +++++- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 dpp-backend/digitalproductpass/lombok.config diff --git a/dpp-backend/digitalproductpass/lombok.config b/dpp-backend/digitalproductpass/lombok.config new file mode 100644 index 000000000..6f7933571 --- /dev/null +++ b/dpp-backend/digitalproductpass/lombok.config @@ -0,0 +1,28 @@ +################################################################################# +# Tractus-X - Digital Product Passport Application +# +# Copyright (c) 2022, 2024 BMW AG, Henkel AG & Co. KGaA +# Copyright (c) 2023, 2024 CGI Deutschland B.V. & Co. KG +# Copyright (c) 2022, 2024 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License, Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0. +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +# either express or implied. See the +# License for the specific language govern in permissions and limitations +# under the License. +# +# SPDX-License-Identifier: Apache-2.0 +################################################################################# + + +config.stopBubbling = true + +lombok.copyableAnnotations += com.fasterxml.jackson.annotation.JsonProperty \ No newline at end of file diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java index 4ebe016e8..eed39daf9 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java @@ -30,8 +30,11 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; import lombok.Builder; +import lombok.Data; import lombok.Singular; +import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; import org.eclipse.tractusx.digitalproductpass.config.PolicyCheckConfig; import org.eclipse.tractusx.digitalproductpass.exceptions.ModelException; @@ -48,7 +51,7 @@ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) @Jacksonized -@Builder +@JsonPOJOBuilder(buildMethodName = "createSet", withPrefix = "construct") public class Set extends DidDocument { /** ATTRIBUTES **/ @@ -62,6 +65,9 @@ public class Set extends DidDocument { @JsonProperty("odrl:obligation") Collection obligations; + public Set createSet() { + return new Set(permissions, prohibitions, obligations); + } /** CONSTRUCTOR(S) **/ public Set(String id, String type, Collection permissions, Collection prohibitions, Collection obligations) { super(id, type); From 2b4ac705fe0ca6ef943b3a1f8664a21da98eda35 Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Fri, 10 May 2024 22:22:53 +0200 Subject: [PATCH 13/18] fix(policy-bug): fixed policy parsing bug --- .../models/negotiation/catalog/Policy.java | 22 +++--- .../models/negotiation/policy/Set.java | 54 ++++++-------- .../src/main/java/utils/EdcUtil.java | 3 - .../src/main/java/utils/PolicyUtil.java | 47 +++++++++++- .../src/test/java/utils/PolicyUtilTest.java | 72 ++++++++++++++++++- 5 files changed, 148 insertions(+), 50 deletions(-) diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Policy.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Policy.java index d3270931a..36ba0d537 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Policy.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/catalog/Policy.java @@ -35,7 +35,7 @@ import org.eclipse.tractusx.digitalproductpass.models.negotiation.policy.Action; import org.eclipse.tractusx.digitalproductpass.models.negotiation.policy.Set; -import java.util.Collection; +import java.util.List; /** * Policy representing the offer from the catalog @@ -54,31 +54,31 @@ public class Policy extends Set { /** CONSTRUCTOR(S) **/ - public Policy(String id, String type, Collection permissions, Collection prohibitions, Collection obligations, DidDocument target, DidDocument assigner) { + public Policy(String id, String type, List permissions, List prohibitions, List obligations, DidDocument target, DidDocument assigner) { super(id, type, permissions, prohibitions, obligations); this.target = target; this.assigner = assigner; } - public Policy(Collection permissions, Collection prohibitions, Collection obligations, DidDocument target, DidDocument assigner) { + public Policy(List permissions, List prohibitions, List obligations, DidDocument target, DidDocument assigner) { super(permissions, prohibitions, obligations); this.target = target; this.assigner = assigner; } - public Policy(String id, String type, JsonNode context, Collection permissions, Collection prohibitions, Collection obligations, DidDocument target, DidDocument assigner) { + public Policy(String id, String type, JsonNode context, List permissions, List prohibitions, List obligations, DidDocument target, DidDocument assigner) { super(id, type, context, permissions, prohibitions, obligations); this.target = target; this.assigner = assigner; } - public Policy(String type, Collection permissions, Collection prohibitions, Collection obligations, DidDocument target, DidDocument assigner) { + public Policy(String type, List permissions, List prohibitions, List obligations, DidDocument target, DidDocument assigner) { super(type, permissions, prohibitions, obligations); this.target = target; this.assigner = assigner; } - public Policy(JsonNode context, Collection permissions, Collection prohibitions, Collection obligations, DidDocument target, DidDocument assigner) { + public Policy(JsonNode context, List permissions, List prohibitions, List obligations, DidDocument target, DidDocument assigner) { super(context, permissions, prohibitions, obligations); this.target = target; this.assigner = assigner; @@ -101,23 +101,23 @@ public Policy(PolicyCheckConfig.PolicyConfig policyConfig, DidDocument target, D this.assigner = assigner; } - public Policy(String id, String type, Collection permissions, Collection prohibitions, Collection obligations) { + public Policy(String id, String type, List permissions, List prohibitions, List obligations) { super(id, type, permissions, prohibitions, obligations); } - public Policy(Collection permissions, Collection prohibitions, Collection obligations) { + public Policy(List permissions, List prohibitions, List obligations) { super(permissions, prohibitions, obligations); } - public Policy(String id, String type, JsonNode context, Collection permissions, Collection prohibitions, Collection obligations) { + public Policy(String id, String type, JsonNode context, List permissions, List prohibitions, List obligations) { super(id, type, context, permissions, prohibitions, obligations); } - public Policy(String type, Collection permissions, Collection prohibitions, Collection obligations) { + public Policy(String type, List permissions, List prohibitions, List obligations) { super(type, permissions, prohibitions, obligations); } - public Policy(JsonNode context, Collection permissions, Collection prohibitions, Collection obligations) { + public Policy(JsonNode context, List permissions, List prohibitions, List obligations) { super(context, permissions, prohibitions, obligations); } diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java index eed39daf9..4bb48e95d 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java @@ -31,9 +31,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; -import lombok.Builder; -import lombok.Data; -import lombok.Singular; +import com.google.gson.annotations.SerializedName; +import lombok.*; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; import org.eclipse.tractusx.digitalproductpass.config.PolicyCheckConfig; @@ -41,7 +40,7 @@ import org.eclipse.tractusx.digitalproductpass.models.negotiation.DidDocument; import java.util.ArrayList; -import java.util.Collection; +import java.util.List; import java.util.List; import java.util.Objects; @@ -50,53 +49,46 @@ **/ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -@Jacksonized -@JsonPOJOBuilder(buildMethodName = "createSet", withPrefix = "construct") public class Set extends DidDocument { /** ATTRIBUTES **/ - @Singular @JsonProperty("odrl:permission") - Collection permissions; - @Singular + List permissions; @JsonProperty("odrl:prohibition") - Collection prohibitions; - @Singular + List prohibitions; + @JsonProperty("odrl:obligation") - Collection obligations; + List obligations; - public Set createSet() { - return new Set(permissions, prohibitions, obligations); - } /** CONSTRUCTOR(S) **/ - public Set(String id, String type, Collection permissions, Collection prohibitions, Collection obligations) { + public Set(String id, String type, List permissions, List prohibitions, List obligations) { super(id, type); this.permissions = permissions; this.prohibitions = prohibitions; this.obligations = obligations; } - public Set(Collection permissions, Collection prohibitions, Collection obligations) { + public Set(List permissions, List prohibitions, List obligations) { this.permissions = permissions; this.prohibitions = prohibitions; this.obligations = obligations; } - public Set(String id, String type, JsonNode context, Collection permissions, Collection prohibitions, Collection obligations) { + public Set(String id, String type, JsonNode context, List permissions, List prohibitions, List obligations) { super(id, type, context); this.permissions = permissions; this.prohibitions = prohibitions; this.obligations = obligations; } - public Set(String type, Collection permissions, Collection prohibitions, Collection obligations) { + public Set(String type, List permissions, List prohibitions, List obligations) { super(type); this.permissions = permissions; this.prohibitions = prohibitions; this.obligations = obligations; } - public Set(JsonNode context, Collection permissions, Collection prohibitions, Collection obligations) { + public Set(JsonNode context, List permissions, List prohibitions, List obligations) { super(context); this.permissions = permissions; this.prohibitions = prohibitions; @@ -126,10 +118,10 @@ public void buildSet(PolicyCheckConfig.PolicyConfig policyConfig){ this.prohibitions = this.buildActions(policyConfig.getProhibition()); } - public Collection buildActions(List actionConfigs){ + public List buildActions(List actionConfigs){ try { // Set actions to the collection - Collection actions = new ArrayList<>(actionConfigs.size()); + List actions = new ArrayList<>(actionConfigs.size()); actionConfigs.forEach(actionConfig -> actions.add(new Action(actionConfig))); // Parse and create actions return actions; }catch (Exception e){ @@ -143,27 +135,27 @@ public Collection buildActions(List acti /** GETTERS AND SETTERS **/ - public Collection getPermissions() { + public List getPermissions() { return permissions; } - public void setPermissions(Collection permissions) { + public void setPermissions(List permissions) { this.permissions = permissions; } - public Collection getProhibitions() { + public List getProhibitions() { return prohibitions; } - public void setProhibitions(Collection prohibitions) { + public void setProhibitions(List prohibitions) { this.prohibitions = prohibitions; } - public Collection getObligations() { + public List getObligations() { return obligations; } - public void setObligations(Collection obligations) { + public void setObligations(List obligations) { this.obligations = obligations; } @@ -192,11 +184,11 @@ public Boolean compare(Set set){ /** * Method responsible for comparing two actions constraints *

- * @param currentActions {@code Collection} is the object to be compared - * @param incomingActions {@code Collection} is the object to be compared to + * @param currentActions {@code List} is the object to be compared + * @param incomingActions {@code List} is the object to be compared to * @return true if the actions are the same */ - public Boolean compareActions(Collection currentActions, Collection incomingActions){ + public Boolean compareActions(List currentActions, List incomingActions){ try { // Optimizations to avoid searching in children if(currentActions == null && incomingActions == null){return true;} // If both actions are null they are equal diff --git a/dpp-backend/digitalproductpass/src/main/java/utils/EdcUtil.java b/dpp-backend/digitalproductpass/src/main/java/utils/EdcUtil.java index 5169b7be3..cd91f90cd 100644 --- a/dpp-backend/digitalproductpass/src/main/java/utils/EdcUtil.java +++ b/dpp-backend/digitalproductpass/src/main/java/utils/EdcUtil.java @@ -154,14 +154,11 @@ public Selection selectValidContractAndPolicy(Map List> validContractSelections = new ArrayList<>(); // Array with possible selections contracts.keySet().forEach(key -> { Dataset contract = contracts.get(key); // Get the contract - LogUtil.printDebug("[DEBUG]: Contract ["+key+"] -> " + jsonUtil.toJson(contract, true)); List policies = policyUtil.getValidPoliciesByConstraints(contract.getPolicy(), policyConfig); // Get all its valid policies - LogUtil.printDebug("[DEBUG]: Contract ["+key+"] with no valid policies!"); // If policies are not null or are more than one if(policies == null || policies.size() == 0){ return; } - LogUtil.printDebug("[DEBUG]: Contract ["+key+"] valid policies: " + jsonUtil.toJson(policies, true)); policies.forEach(policy -> validContractSelections.add(new Selection<>(contract, policy))); // Create the possible selections }); // Select any possible selection diff --git a/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java b/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java index 230a3b2d5..c206cbb69 100644 --- a/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java +++ b/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java @@ -27,11 +27,13 @@ package utils; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; import org.eclipse.tractusx.digitalproductpass.config.PolicyCheckConfig; import org.eclipse.tractusx.digitalproductpass.config.PolicyCheckConfig.ActionConfig; import org.eclipse.tractusx.digitalproductpass.config.PolicyCheckConfig.PolicyConfig; import org.eclipse.tractusx.digitalproductpass.models.edc.EndpointDataReference; import org.eclipse.tractusx.digitalproductpass.models.negotiation.catalog.Dataset; +import org.eclipse.tractusx.digitalproductpass.models.negotiation.policy.Action; import org.eclipse.tractusx.digitalproductpass.models.negotiation.policy.Constraint; import org.eclipse.tractusx.digitalproductpass.models.negotiation.policy.Set; import org.springframework.beans.factory.annotation.Autowired; @@ -138,11 +140,9 @@ public List getValidPoliciesByConstraints(Object policies, PolicyCheckConfi } if (policies instanceof LinkedHashMap) { // Check if policy is valid or not - Set policy = jsonUtil.bind(policies, new TypeReference<>(){}); - LogUtil.printDebug("[DEBUG] Policy in contract -> "+ jsonUtil.toJson(policy, true)); + Set policy = this.parsePolicy(policies); // In case the policy is valid return the policy if(this.isPolicyValid(policy, validPolicies, strictMode)){ - LogUtil.printDebug("[DEBUG] Policy in contract is valid!"); return new ArrayList<>(){{add(policy);}}; // Add policy to a list of valid policies } // If the policy is not valid return an empty list @@ -232,6 +232,47 @@ public Boolean isPolicyConstraintsValid(Set policy, Set configPolicy){ throw new UtilException(PolicyUtil.class, e, "[DEFAULT MODE] It was not possible to check if policy is valid!"); } } + + /** + * Builds a policy from a raw policy object + *

+ * + * @param rawPolicy {@code Object} the policy to be checked + * @return {@code Set} the list of parsed policies built from the configuration parameters + * @throws UtilException if error when parsing the contracts + */ + public Set parsePolicy(Object rawPolicy){ + try { + JsonNode policy = jsonUtil.toJsonNode(rawPolicy); + JsonNode permission = policy.get("odrl:permission"); + JsonNode prohibition = policy.get("odrl:prohibition"); + JsonNode obligation = policy.get("odrl:obligation"); + if(permission.isArray() && prohibition.isArray() && obligation.isArray()){ + return jsonUtil.bind(rawPolicy, new TypeReference<>(){}); + } + return new Set(this.parseActions(permission), this.parseActions(prohibition), this.parseActions(obligation)); + }catch (Exception e) { + throw new UtilException(PolicyUtil.class, e, "It was not possible to create a new policy!"); + } + } + /** + * Builds an action from a raw policy object + *

+ * + * @param node {@code JsonNode} action to be checked + * @return {@code List} the list of actions parsed + * @throws UtilException if error when parsing the contracts + */ + public List parseActions(JsonNode node){ + List arrayList = new ArrayList<>(); + if(!node.isArray()){ + arrayList.add(jsonUtil.bind(node, new TypeReference<>(){})); + }else{ + arrayList = jsonUtil.bind(node, new TypeReference<>(){}); + } + return arrayList; + } + /** * Checks a policy configuration strictly against the incoming policy *

diff --git a/dpp-backend/digitalproductpass/src/test/java/utils/PolicyUtilTest.java b/dpp-backend/digitalproductpass/src/test/java/utils/PolicyUtilTest.java index 840a9c6f8..145fa6092 100644 --- a/dpp-backend/digitalproductpass/src/test/java/utils/PolicyUtilTest.java +++ b/dpp-backend/digitalproductpass/src/test/java/utils/PolicyUtilTest.java @@ -28,6 +28,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import org.bouncycastle.est.ESTAuth; import org.eclipse.tractusx.digitalproductpass.config.DtrConfig; +import org.eclipse.tractusx.digitalproductpass.config.PassportConfig; import org.eclipse.tractusx.digitalproductpass.config.PolicyCheckConfig; import org.eclipse.tractusx.digitalproductpass.models.negotiation.policy.Set; import org.junit.jupiter.api.BeforeEach; @@ -48,6 +49,7 @@ import org.springframework.test.context.junit4.SpringRunner; import utils.exceptions.UtilException; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -59,12 +61,15 @@ */ @ActiveProfiles("test") @ExtendWith(SpringExtension.class) -@SpringBootTest(classes = {utils.JsonUtil.class, utils.PolicyUtil.class, utils.FileUtil.class, org.eclipse.tractusx.digitalproductpass.config.DtrConfig.class}) +@SpringBootTest(classes = {utils.JsonUtil.class, utils.PolicyUtil.class, utils.FileUtil.class, org.eclipse.tractusx.digitalproductpass.config.DtrConfig.class, org.eclipse.tractusx.digitalproductpass.config.PassportConfig.class}) @EnableConfigurationProperties class PolicyUtilTest { @Autowired DtrConfig dtrConfig; + + @Autowired + PassportConfig passportConfig; @Autowired JsonUtil jsonUtil; @Autowired @@ -83,18 +88,23 @@ class PolicyUtilTest { LinkedHashMap action; LinkedHashMap actionDtr; LinkedList> permissions; + + LinkedHashMap singlePermission; LinkedList> permissionsDtr; LinkedList> prohibitions; LinkedList> obligations; LinkedHashMap policy; + LinkedHashMap uniquePolicy; LinkedHashMap policyDtr; LinkedList> policies; LinkedList> policiesDtr; LinkedHashMap credential; + LinkedHashMap uniqueCredential; LinkedHashMap credentialDtr; LinkedHashMap multipleCredential; LinkedHashMap multipleCredentialDtr; PolicyCheckConfig policyCheckConfig; + PolicyCheckConfig policyCheckConfigPassport; Set mappedPolicy; Set mappedPolicyDtr; @@ -111,12 +121,15 @@ void setUp() { constraints = new LinkedList<>(); configuredConstraints = new LinkedList<>(); policy = new LinkedHashMap<>(); + uniquePolicy = new LinkedHashMap<>(); policyDtr = new LinkedHashMap<>(); credential = new LinkedHashMap<>(); + uniqueCredential = new LinkedHashMap<>(); credentialDtr = new LinkedHashMap<>(); action = new LinkedHashMap<>(); actionDtr = new LinkedHashMap<>(); permissions = new LinkedList<>(); + singlePermission = new LinkedHashMap<>(); permissionsDtr = new LinkedList<>(); prohibitions = new LinkedList<>(); obligations = new LinkedList<>(); @@ -132,9 +145,19 @@ void setUp() { constraint2.put("odrl:leftOperand", "cx-policy:FrameworkAgreement"); constraint2.put("odrl:operator", operator); constraint2.put("odrl:rightOperand", "circulareconomy:1.0"); + + LinkedHashMap constraint5 = new LinkedHashMap<>(); + LinkedList> correctContraints = new LinkedList<>(); + LinkedHashMap correctAction = new LinkedHashMap<>(); + LinkedHashMap correctLogicalConstraint = new LinkedHashMap<>(); + constraint5.put("odrl:leftOperand", "cx-policy:UsagePurpose"); + constraint5.put("odrl:operator", operator); + constraint5.put("odrl:rightOperand", "cx.circular.dpp:1"); constraints.add(constraint1); constraints.add(constraint2); - + correctContraints.add(constraint1); + correctContraints.add(constraint2); + correctContraints.add(constraint5); operator.put("@id", "odrl:eq"); constraint3.put("odrl:leftOperand", "cx-policy:Membership"); constraint3.put("odrl:operator", operator); @@ -145,16 +168,28 @@ void setUp() { constraint4.put("odrl:rightOperand", "cx.core.digitalTwinRegistry:1"); configuredConstraints.add(constraint3); configuredConstraints.add(constraint4); + configuredConstraints = new LinkedList<>(); logicalConstraintDtr.put("odrl:and", configuredConstraints); logicalConstraint.put("odrl:and", constraints); + correctLogicalConstraint.put("odrl:and", correctContraints); + action.put("odrl:action", "USE"); action.put("odrl:constraint", logicalConstraint); + correctAction.put("odrl:action", "USE"); + correctAction.put("odrl:constraint", correctLogicalConstraint); + actionDtr.put("odrl:action", "USE"); actionDtr.put("odrl:constraint", logicalConstraintDtr); + singlePermission = correctAction; permissions.add(action); + uniquePolicy.put("odrl:permission", singlePermission); + uniquePolicy.put("odrl:prohibition", prohibitions); + uniquePolicy.put("odrl:obligation", obligations); + uniqueCredential.put("policy", uniquePolicy); + policy.put("odrl:permission", permissions); policy.put("odrl:prohibition", prohibitions); policy.put("odrl:obligation", obligations); @@ -185,6 +220,7 @@ void setUp() { if(this.dtrConfig == null){ throw new UtilException(PolicyUtilTest.class, "[TEST EXCEPTION]: Configuration not found!"); } + policyCheckConfigPassport = this.passportConfig.getPolicyCheck(); policyCheckConfig = this.dtrConfig.getPolicyCheck(); if(policyCheckConfig == null){ throw new UtilException(PolicyUtilTest.class, "[TEST EXCEPTION]: The policy configuration was not found!"); @@ -359,4 +395,36 @@ void getPolicyInvalidByConstraints() { } } + /** + * Parse unique policy instead of array + * **/ + @Test + void parseUniquePolicy(){ + try{ + LogUtil.printTest("[INPUT]: " + jsonUtil.toJson(uniquePolicy, true)); + LogUtil.printTest("[POLICY CONFIGURATION]: " + jsonUtil.toJson(policyCheckConfigPassport, true)); + Set validPolicy = this.policyUtil.getPolicyByConstraints(uniquePolicy, policyCheckConfigPassport); + LogUtil.printTest("[RESPONSE]: " + jsonUtil.toJson(validPolicy, true)); + assertNotNull(validPolicy); + }catch(Exception e){ + throw new UtilException(PolicyUtilTest.class, e,"It was not possible to test the default policy check!"); + } + } + + /** + * Parse unique policy instead of array + * **/ + @Test + void getUniquePolicies(){ + try{ + LogUtil.printTest("[INPUT]: " + jsonUtil.toJson(uniquePolicy, true)); + LogUtil.printTest("[POLICY CONFIGURATION]: " + jsonUtil.toJson(policyCheckConfigPassport, true)); + List validPolicies = this.policyUtil.getValidPoliciesByConstraints(uniquePolicy, policyCheckConfigPassport); + LogUtil.printTest("[RESPONSE]: " + jsonUtil.toJson(validPolicies, true)); + assertTrue(validPolicies.size() > 0); + }catch(Exception e){ + throw new UtilException(PolicyUtilTest.class, e,"It was not possible to test the default policy check!"); + } + } + } \ No newline at end of file From a79c94524d472c54e4f549a5899d3b142e4e9402 Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Fri, 10 May 2024 22:40:57 +0200 Subject: [PATCH 14/18] fix(policy-bug): fixed unit tests --- charts/digital-product-pass/values.yaml | 2 +- .../models/negotiation/policy/Set.java | 5 --- .../src/main/java/utils/PolicyUtil.java | 32 +++++++++++++++---- .../src/test/java/utils/PolicyUtilTest.java | 3 +- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/charts/digital-product-pass/values.yaml b/charts/digital-product-pass/values.yaml index eefa69963..6ce5f8980 100644 --- a/charts/digital-product-pass/values.yaml +++ b/charts/digital-product-pass/values.yaml @@ -235,7 +235,7 @@ backend: - action: "USE" logicalConstraint: "odrl:and" constraints: - - leftOperand: "cx-policy:Membership" + - leftOperand: "Membership" operator: "odrl:eq" rightOperand: "active" - leftOperand: "cx-policy:UsagePurpose" diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java index 4bb48e95d..1e8df0f16 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/models/negotiation/policy/Set.java @@ -30,11 +30,6 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; -import com.google.gson.annotations.SerializedName; -import lombok.*; -import lombok.experimental.SuperBuilder; -import lombok.extern.jackson.Jacksonized; import org.eclipse.tractusx.digitalproductpass.config.PolicyCheckConfig; import org.eclipse.tractusx.digitalproductpass.exceptions.ModelException; import org.eclipse.tractusx.digitalproductpass.models.negotiation.DidDocument; diff --git a/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java b/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java index c206cbb69..f130d3a6b 100644 --- a/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java +++ b/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java @@ -148,12 +148,7 @@ public List getValidPoliciesByConstraints(Object policies, PolicyCheckConfi // If the policy is not valid return an empty list return new ArrayList<>(); } - List policyList; - try { - policyList = jsonUtil.bind(policies, new TypeReference<>(){}); - } catch (Exception e) { - throw new UtilException(PolicyUtil.class, e, "It was not possible to parse the policy list"); - } + List policyList = this.parsePolicies(policies); //Search for policies that are valid and get one of the valid ones return policyList.stream().parallel().filter(p -> this.isPolicyValid(p, validPolicies, strictMode)).toList(); }catch (Exception e) { @@ -232,7 +227,30 @@ public Boolean isPolicyConstraintsValid(Set policy, Set configPolicy){ throw new UtilException(PolicyUtil.class, e, "[DEFAULT MODE] It was not possible to check if policy is valid!"); } } - + /** + * Builds a policy from a raw policy object + *

+ * + * @param rawPolicy {@code Object} the policy to be checked + * @return {@code Set} the list of parsed policies built from the configuration parameters + * @throws UtilException if error when parsing the contracts + */ + public List parsePolicies(Object rawPolicy){ + try { + JsonNode policy = jsonUtil.toJsonNode(rawPolicy); + if(!policy.isArray()){ + Set parsedPolicy = this.parsePolicy(policy); + return new ArrayList<>(){{add(parsedPolicy);}}; + } + List policies = new ArrayList<>(); + for (final JsonNode p : policy) { + policies.add(this.parsePolicy(p)); + } + return policies; + }catch (Exception e) { + throw new UtilException(PolicyUtil.class, e, "It was not possible to create a new policy!"); + } + } /** * Builds a policy from a raw policy object *

diff --git a/dpp-backend/digitalproductpass/src/test/java/utils/PolicyUtilTest.java b/dpp-backend/digitalproductpass/src/test/java/utils/PolicyUtilTest.java index 145fa6092..b670d58f9 100644 --- a/dpp-backend/digitalproductpass/src/test/java/utils/PolicyUtilTest.java +++ b/dpp-backend/digitalproductpass/src/test/java/utils/PolicyUtilTest.java @@ -67,9 +67,9 @@ class PolicyUtilTest { @Autowired DtrConfig dtrConfig; - @Autowired PassportConfig passportConfig; + @Autowired JsonUtil jsonUtil; @Autowired @@ -168,7 +168,6 @@ void setUp() { constraint4.put("odrl:rightOperand", "cx.core.digitalTwinRegistry:1"); configuredConstraints.add(constraint3); configuredConstraints.add(constraint4); - configuredConstraints = new LinkedList<>(); logicalConstraintDtr.put("odrl:and", configuredConstraints); logicalConstraint.put("odrl:and", constraints); From 9686b7d56b532ee44592c55936fb7a16dcafd5e1 Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Sat, 11 May 2024 16:56:06 +0200 Subject: [PATCH 15/18] chore: removed debug messages --- .../managers/DtrSearchManager.java | 5 ++--- .../src/main/java/utils/PolicyUtil.java | 13 +++++-------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java index 52a269b09..b7bd101d7 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/managers/DtrSearchManager.java @@ -46,6 +46,7 @@ import org.springframework.stereotype.Component; import utils.*; +import java.lang.reflect.Type; import java.nio.file.Path; import java.time.Duration; @@ -249,7 +250,7 @@ public void searchEndpoint(String processId, String bpn, String endpoint) { return; } if (contractOffers instanceof LinkedHashMap) { - Dataset dataset = (Dataset) jsonUtil.bindObject(contractOffers, Dataset.class); + Dataset dataset = jsonUtil.bind(contractOffers, new TypeReference<>() {}); if (dataset != null) { // Store the dataset in the digital twin logs Map datasets = new HashMap<>() {{ @@ -276,10 +277,8 @@ public void searchEndpoint(String processId, String bpn, String endpoint) { } List contractOfferList = jsonUtil.bind(contractOffers, new TypeReference<>() {}); if (contractOfferList == null || contractOfferList.isEmpty()) { - LogUtil.printDebug("[DEBUG] ContractOfferList is empty!"); return; } - LogUtil.printDebug("[DEBUG] ContractOfferList: " + jsonUtil.toJson(contractOfferList, true)); Map datasets = edcUtil.mapDatasetsById(contractOfferList); Selection contractAndPolicy = getDtrDataset(datasets); if (contractAndPolicy == null) { diff --git a/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java b/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java index f130d3a6b..5386713f3 100644 --- a/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java +++ b/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java @@ -94,15 +94,15 @@ public Set getPolicyById(Dataset dataset, String policyId) { Set policy = null; // If the policy is an object if (rawPolicy instanceof LinkedHashMap) { - policy = (Set) this.jsonUtil.bindObject(rawPolicy, Set.class); + policy = this.parsePolicy(rawPolicy); } else { List policyList = (List) this.jsonUtil.bindObject(rawPolicy, List.class); if (policyList == null) { return null; } - policy = (Set) this.jsonUtil.bindObject(policyList.stream().filter( + policy = this.parsePolicy(policyList.stream().filter( (p) -> p.get("@id").equals(policyId) - ).findFirst(), Set.class); // Get policy with the specific policy id + ).findFirst()); } // If the policy does not exist if (policy == null) { @@ -282,13 +282,10 @@ public Set parsePolicy(Object rawPolicy){ * @throws UtilException if error when parsing the contracts */ public List parseActions(JsonNode node){ - List arrayList = new ArrayList<>(); if(!node.isArray()){ - arrayList.add(jsonUtil.bind(node, new TypeReference<>(){})); - }else{ - arrayList = jsonUtil.bind(node, new TypeReference<>(){}); + return new ArrayList<>(){{add(jsonUtil.bind(node, new TypeReference<>(){}));}}; } - return arrayList; + return jsonUtil.bind(node, new TypeReference<>(){}); } /** From 4bc51c66015d65399c37e0dbe2bee4dc6b1c9ad6 Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Sat, 11 May 2024 17:17:31 +0200 Subject: [PATCH 16/18] fix: solved issue with policy selection --- .../src/main/java/utils/PolicyUtil.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java b/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java index 5386713f3..2cd6bac79 100644 --- a/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java +++ b/dpp-backend/digitalproductpass/src/main/java/utils/PolicyUtil.java @@ -96,13 +96,13 @@ public Set getPolicyById(Dataset dataset, String policyId) { if (rawPolicy instanceof LinkedHashMap) { policy = this.parsePolicy(rawPolicy); } else { - List policyList = (List) this.jsonUtil.bindObject(rawPolicy, List.class); + List policyList = this.parsePolicies(rawPolicy); if (policyList == null) { return null; } - policy = this.parsePolicy(policyList.stream().filter( - (p) -> p.get("@id").equals(policyId) - ).findFirst()); + policy = policyList.stream().filter( + (p) -> p.getId().equals(policyId) + ).findFirst().orElse(null); } // If the policy does not exist if (policy == null) { @@ -243,7 +243,7 @@ public List parsePolicies(Object rawPolicy){ return new ArrayList<>(){{add(parsedPolicy);}}; } List policies = new ArrayList<>(); - for (final JsonNode p : policy) { + for (JsonNode p : policy) { policies.add(this.parsePolicy(p)); } return policies; @@ -261,13 +261,21 @@ public List parsePolicies(Object rawPolicy){ */ public Set parsePolicy(Object rawPolicy){ try { + // Parse policy to json node JsonNode policy = jsonUtil.toJsonNode(rawPolicy); + // Get permission, prohibition and obligation JsonNode permission = policy.get("odrl:permission"); JsonNode prohibition = policy.get("odrl:prohibition"); JsonNode obligation = policy.get("odrl:obligation"); + // Check if its null + if(permission == null || prohibition == null || obligation == null){ + throw new UtilException(PolicyUtil.class, "One of the policy action constraints is empty!"); + } + // Check if all them are array then parse as default if(permission.isArray() && prohibition.isArray() && obligation.isArray()){ return jsonUtil.bind(rawPolicy, new TypeReference<>(){}); } + // If not parse the set by action type return new Set(this.parseActions(permission), this.parseActions(prohibition), this.parseActions(obligation)); }catch (Exception e) { throw new UtilException(PolicyUtil.class, e, "It was not possible to create a new policy!"); @@ -282,9 +290,11 @@ public Set parsePolicy(Object rawPolicy){ * @throws UtilException if error when parsing the contracts */ public List parseActions(JsonNode node){ + // If node is not array parse a single action object if(!node.isArray()){ return new ArrayList<>(){{add(jsonUtil.bind(node, new TypeReference<>(){}));}}; } + // If node is array parse the action node as a list return jsonUtil.bind(node, new TypeReference<>(){}); } From c86b2b8205bab67b84b65051052a05e8e6894166 Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Sat, 11 May 2024 17:34:40 +0200 Subject: [PATCH 17/18] chore: update create function --- .../tractusx/digitalproductpass/services/CatenaXService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/CatenaXService.java b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/CatenaXService.java index 18f267f42..b372ba1df 100644 --- a/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/CatenaXService.java +++ b/dpp-backend/digitalproductpass/src/main/java/org/eclipse/tractusx/digitalproductpass/services/CatenaXService.java @@ -628,7 +628,6 @@ public void searchDTRs (List bpnList, String processId) { try { List edcEndpointBinded = null; List edcEndpoints = this.getEdcDiscovery(bpnList); - LogUtil.printDebug("EDC ENDPOINTS [ " + jsonUtil.toJson(edcEndpoints, true)); try { edcEndpointBinded = (List) jsonUtil.bindReferenceType(edcEndpoints, new TypeReference>() {}); } catch (Exception e) { From acc3a57bb942c31b20878b7ef177da910c2afc3e Mon Sep 17 00:00:00 2001 From: Mathias Brunkow Moser Date: Sat, 11 May 2024 17:39:03 +0200 Subject: [PATCH 18/18] chore(charts): updated chart version --- charts/digital-product-pass/Chart.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/digital-product-pass/Chart.yaml b/charts/digital-product-pass/Chart.yaml index e0822b687..0ac81b860 100644 --- a/charts/digital-product-pass/Chart.yaml +++ b/charts/digital-product-pass/Chart.yaml @@ -42,7 +42,7 @@ type: application # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 2.3.3 +version: 2.3.4 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to