From 2d7e07ebfbd11cb5732022ec74f15e0c4ea766f5 Mon Sep 17 00:00:00 2001 From: Enrico Risa Date: Tue, 11 Jul 2023 13:07:15 +0200 Subject: [PATCH] refactor(CPA): obliviates the control plane adapter term and module refactor --- core/edr-cache-core/build.gradle.kts | 4 +- .../edc/edr/core/EdrCacheCoreExtension.java | 2 +- .../EdrCacheEntryPredicateConverter.java | 19 +- .../InMemoryEndpointDataReferenceCache.java | 19 +- .../core/defaults/PersistentCacheEntry.java | 2 +- ...nMemoryEndpointDataReferenceCacheTest.java | 2 +- .../defaults/PersistentCacheEntryTest.java | 3 +- .../edr-core}/build.gradle.kts | 13 +- .../edc/edr/core/EdrCoreExtension.java | 54 ++++ .../edc/edr/core/service/EdrServiceImpl.java | 72 ++--- ...rg.eclipse.edc.spi.system.ServiceExtension | 2 +- .../core/service/EdrCoreExtensionTest.java | 50 ++++ .../edr/core/service/EdrServiceImplTest.java | 67 ++++- docs/kit/operation-view/page10_extensions.md | 2 +- .../edc-controlplane-base/build.gradle.kts | 5 +- .../build.gradle.kts | 2 +- .../build.gradle.kts | 7 +- .../build.gradle.kts | 2 +- .../build.gradle.kts | 2 +- .../build.gradle.kts | 2 +- .../build.gradle.kts | 4 +- .../DataPlaneProxyConsumerApiExtension.java | 2 +- .../asset/ConsumerAssetRequestController.java | 19 +- .../api/asset/model/AssetRequest.java | 21 +- .../api/asset/model/AssetRequestTest.java | 10 +- .../ConsumerAssetRequestControllerTest.java | 257 ++++++++++++++++++ .../edr-api}/README.md | 6 +- .../edr-api}/build.gradle.kts | 4 +- .../eclipse/tractusx/edc/api/edr/EdrApi.java} | 28 +- .../edc/api/edr/EdrApiExtension.java} | 18 +- .../tractusx/edc/api/edr/EdrController.java} | 59 +++- .../api/edr}/dto/NegotiateEdrRequestDto.java | 2 +- ...DataReferenceToDataAddressTransformer.java | 2 +- ...EndpointDataReferenceEntryTransformer.java | 12 +- ...ctToNegotiateEdrRequestDtoTransformer.java | 18 +- ...tDtoToNegotiatedEdrRequestTransformer.java | 6 +- ...rg.eclipse.edc.spi.system.ServiceExtension | 3 +- .../edc/api/edr/EdrApiExtensionTest.java} | 16 +- .../edc/api/edr/EdrControllerTest.java} | 110 ++++++-- .../tractusx/edc/api/edr}/TestFunctions.java | 6 +- ...ReferenceToDataAddressTransformerTest.java | 2 +- ...ointDataReferenceEntryTransformerTest.java | 10 +- ...NegotiateEdrRequestDtoTransformerTest.java | 2 +- ...oToNegotiateEdrRequestTransformerTest.java | 6 +- .../{ => edr}/edr-cache-sql/README.md | 6 +- .../{ => edr}/edr-cache-sql/build.gradle.kts | 4 +- .../{ => edr}/edr-cache-sql/docs/schema.sql | 1 + .../sql/SqlEndpointDataReferenceCache.java | 38 +-- ...qlEndpointDataReferenceCacheExtension.java | 2 +- .../sql/schema/BaseSqlEdrStatements.java | 3 +- .../edc/edr/store/sql/schema/EdrMapping.java | 3 +- .../edr/store/sql/schema/EdrStatements.java | 4 + .../postgres/PostgresEdrStatements.java | 0 ...rg.eclipse.edc.spi.system.ServiceExtension | 0 ...resqlTransactionalStoreSetupExtension.java | 0 ...dpointDataReferenceCacheExtensionTest.java | 0 .../SqlEndpointDataReferenceCacheTest.java | 2 +- ...ntDataReferenceCacheTransactionalTest.java | 4 +- .../edr/edr-callback/build.gradle.kts | 28 ++ .../callback/ContractNegotiationCallback.java | 4 +- .../InProcessCallbackMessageDispatcher.java | 4 +- .../InProcessCallbackRegistryExtension.java | 4 +- .../InProcessCallbackRegistryImpl.java | 6 +- .../edc}/callback/LocalCallbackExtension.java | 19 +- .../TransferProcessLocalCallback.java | 10 +- ...rg.eclipse.edc.spi.system.ServiceExtension | 16 ++ .../ContractNegotiationCallbackTest.java | 8 +- ...nProcessCallbackMessageDispatcherTest.java | 8 +- ...nProcessCallbackRegistryExtensionTest.java | 2 +- .../callback/LocalCallbackExtensionTest.java | 12 +- .../tractusx/edc}/callback/TestFunctions.java | 2 +- .../TransferProcessLocalCallbackTest.java | 12 +- .../edr/V0_0_2__Add_ProviderId_Column.sql | 19 ++ edc-tests/e2e-tests/build.gradle.kts | 4 +- .../EdrNegotiationHelperFunctions.java | 2 +- .../tractusx/edc/lifecycle/DataWiper.java | 2 +- .../tractusx/edc/lifecycle/Participant.java | 4 +- .../edc-dataplane-proxy-e2e/build.gradle.kts | 2 +- .../proxy/e2e/DpfProxyEndToEndTest.java | 2 +- .../dataplane/proxy/e2e/EdrCacheSetup.java | 2 +- edc-tests/miw-tests/build.gradle.kts | 4 +- .../openapi/yaml/control-plane-adapter.yaml | 40 --- .../edc-dataplane-proxy-consumer-api.yaml | 3 + ...ol-plane-adapter-api.yaml => edr-api.yaml} | 53 +++- settings.gradle.kts | 11 +- .../build.gradle.kts | 2 +- .../edc/spi}/callback/InProcessCallback.java | 2 +- .../callback/InProcessCallbackRegistry.java | 2 +- .../build.gradle.kts | 2 + .../edc/edr/spi/service/EdrService.java} | 13 +- .../store}/EndpointDataReferenceCache.java | 5 +- .../types}/EndpointDataReferenceEntry.java | 24 +- .../edr/spi/types}/NegotiateEdrRequest.java | 2 +- .../spi/EndpointDataReferenceEntryTest.java | 1 + .../EndpointDataReferenceCacheBaseTest.java | 29 +- .../tractusx/edc/edr/spi/TestFunctions.java | 4 + 96 files changed, 1008 insertions(+), 382 deletions(-) rename {edc-extensions/control-plane-adapter-callback => core/edr-core}/build.gradle.kts (78%) create mode 100644 core/edr-core/src/main/java/org/eclipse/tractusx/edc/edr/core/EdrCoreExtension.java rename edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/AdapterTransferProcessServiceImpl.java => core/edr-core/src/main/java/org/eclipse/tractusx/edc/edr/core/service/EdrServiceImpl.java (63%) rename {edc-extensions/control-plane-adapter-api => core/edr-core}/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension (87%) create mode 100644 core/edr-core/src/test/java/org/eclipse/tractusx/edc/edr/core/service/EdrCoreExtensionTest.java rename edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/AdapterTransferProcessServiceImplTest.java => core/edr-core/src/test/java/org/eclipse/tractusx/edc/edr/core/service/EdrServiceImplTest.java (70%) create mode 100644 edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/model/ConsumerAssetRequestControllerTest.java rename edc-extensions/{control-plane-adapter-api => edr/edr-api}/README.md (79%) rename edc-extensions/{control-plane-adapter-api => edr/edr-api}/build.gradle.kts (88%) rename edc-extensions/{control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrApi.java => edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/EdrApi.java} (73%) rename edc-extensions/{control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterApiExtension.java => edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/EdrApiExtension.java} (69%) rename edc-extensions/{control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrController.java => edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/EdrController.java} (63%) rename edc-extensions/{control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter => edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr}/dto/NegotiateEdrRequestDto.java (98%) rename edc-extensions/{control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter => edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr}/transform/EndpointDataReferenceToDataAddressTransformer.java (97%) rename edc-extensions/{control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter => edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr}/transform/JsonObjectFromEndpointDataReferenceEntryTransformer.java (73%) rename edc-extensions/{control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter => edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr}/transform/JsonObjectToNegotiateEdrRequestDtoTransformer.java (78%) rename edc-extensions/{control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter => edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr}/transform/NegotiateEdrRequestDtoToNegotiatedEdrRequestTransformer.java (90%) rename edc-extensions/{control-plane-adapter-callback => edr/edr-api}/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension (74%) rename edc-extensions/{control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrApiExtensionTest.java => edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/EdrApiExtensionTest.java} (79%) rename edc-extensions/{control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrControllerTest.java => edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/EdrControllerTest.java} (67%) rename edc-extensions/{control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter => edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr}/TestFunctions.java (93%) rename edc-extensions/{control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter => edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr}/transform/EndpointDataReferenceToDataAddressTransformerTest.java (97%) rename edc-extensions/{control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter => edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr}/transform/JsonObjectFromEndpointDataReferenceEntryTransformerTest.java (79%) rename edc-extensions/{control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter => edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr}/transform/JsonObjectToNegotiateEdrRequestDtoTransformerTest.java (99%) rename edc-extensions/{control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter => edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr}/transform/NegotiateEdrRequestDtoToNegotiateEdrRequestTransformerTest.java (94%) rename edc-extensions/{ => edr}/edr-cache-sql/README.md (80%) rename edc-extensions/{ => edr}/edr-cache-sql/build.gradle.kts (87%) rename edc-extensions/{ => edr}/edr-cache-sql/docs/schema.sql (94%) rename edc-extensions/{ => edr}/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCache.java (95%) rename edc-extensions/{ => edr}/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheExtension.java (97%) rename edc-extensions/{ => edr}/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/BaseSqlEdrStatements.java (92%) rename edc-extensions/{ => edr}/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrMapping.java (86%) rename edc-extensions/{ => edr}/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrStatements.java (94%) rename edc-extensions/{ => edr}/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/postgres/PostgresEdrStatements.java (100%) rename edc-extensions/{ => edr}/edr-cache-sql/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension (100%) rename edc-extensions/{ => edr}/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/PostgresqlTransactionalStoreSetupExtension.java (100%) rename edc-extensions/{ => edr}/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheExtensionTest.java (100%) rename edc-extensions/{ => edr}/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTest.java (98%) rename edc-extensions/{ => edr}/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTransactionalTest.java (97%) create mode 100644 edc-extensions/edr/edr-callback/build.gradle.kts rename edc-extensions/{control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter => edr/edr-callback/src/main/java/org/eclipse/tractusx/edc}/callback/ContractNegotiationCallback.java (96%) rename edc-extensions/{control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter => edr/edr-callback/src/main/java/org/eclipse/tractusx/edc}/callback/InProcessCallbackMessageDispatcher.java (93%) rename edc-extensions/{control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter => edr/edr-callback/src/main/java/org/eclipse/tractusx/edc}/callback/InProcessCallbackRegistryExtension.java (88%) rename edc-extensions/{control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter => edr/edr-callback/src/main/java/org/eclipse/tractusx/edc}/callback/InProcessCallbackRegistryImpl.java (85%) rename edc-extensions/{control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter => edr/edr-callback/src/main/java/org/eclipse/tractusx/edc}/callback/LocalCallbackExtension.java (76%) rename edc-extensions/{control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter => edr/edr-callback/src/main/java/org/eclipse/tractusx/edc}/callback/TransferProcessLocalCallback.java (90%) create mode 100644 edc-extensions/edr/edr-callback/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension rename edc-extensions/{control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter => edr/edr-callback/src/test/java/org/eclipse/tractusx/edc}/callback/ContractNegotiationCallbackTest.java (94%) rename edc-extensions/{control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter => edr/edr-callback/src/test/java/org/eclipse/tractusx/edc}/callback/InProcessCallbackMessageDispatcherTest.java (87%) rename edc-extensions/{control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter => edr/edr-callback/src/test/java/org/eclipse/tractusx/edc}/callback/InProcessCallbackRegistryExtensionTest.java (96%) rename edc-extensions/{control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter => edr/edr-callback/src/test/java/org/eclipse/tractusx/edc}/callback/LocalCallbackExtensionTest.java (86%) rename edc-extensions/{control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter => edr/edr-callback/src/test/java/org/eclipse/tractusx/edc}/callback/TestFunctions.java (98%) rename edc-extensions/{control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter => edr/edr-callback/src/test/java/org/eclipse/tractusx/edc}/callback/TransferProcessLocalCallbackTest.java (94%) create mode 100644 edc-extensions/postgresql-migration/src/main/resources/org/eclipse/tractusx/edc/postgresql/migration/edr/V0_0_2__Add_ProviderId_Column.sql delete mode 100644 resources/openapi/yaml/control-plane-adapter.yaml rename resources/openapi/yaml/{control-plane-adapter-api.yaml => edr-api.yaml} (88%) rename spi/{control-plane-adapter-spi => callback-spi}/build.gradle.kts (93%) rename spi/{control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter => callback-spi/src/main/java/org/eclipse/tractusx/edc/spi}/callback/InProcessCallback.java (93%) rename spi/{control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter => callback-spi/src/main/java/org/eclipse/tractusx/edc/spi}/callback/InProcessCallbackRegistry.java (95%) rename spi/{edr-cache-spi => edr-spi}/build.gradle.kts (88%) rename spi/{control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/service/AdapterTransferProcessService.java => edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/service/EdrService.java} (76%) rename spi/{edr-cache-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi => edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/store}/EndpointDataReferenceCache.java (92%) rename spi/{edr-cache-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi => edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/types}/EndpointDataReferenceEntry.java (90%) rename spi/{control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/model => edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/types}/NegotiateEdrRequest.java (98%) rename spi/{edr-cache-spi => edr-spi}/src/test/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceEntryTest.java (95%) rename spi/{edr-cache-spi => edr-spi}/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceCacheBaseTest.java (83%) rename spi/{edr-cache-spi => edr-spi}/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/TestFunctions.java (88%) diff --git a/core/edr-cache-core/build.gradle.kts b/core/edr-cache-core/build.gradle.kts index 95b0c0be6..3521efcd0 100644 --- a/core/edr-cache-core/build.gradle.kts +++ b/core/edr-cache-core/build.gradle.kts @@ -21,9 +21,9 @@ dependencies { implementation(libs.edc.config.filesystem) implementation(libs.edc.util) - implementation(project(":spi:edr-cache-spi")) + implementation(project(":spi:edr-spi")) - testImplementation(testFixtures(project(":spi:edr-cache-spi"))) + testImplementation(testFixtures(project(":spi:edr-spi"))) } diff --git a/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/EdrCacheCoreExtension.java b/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/EdrCacheCoreExtension.java index 5de7e78a5..14fd2bea0 100644 --- a/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/EdrCacheCoreExtension.java +++ b/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/EdrCacheCoreExtension.java @@ -21,7 +21,7 @@ import org.eclipse.edc.spi.system.ServiceExtension; import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.eclipse.tractusx.edc.edr.core.defaults.InMemoryEndpointDataReferenceCache; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; /** * Registers default services for the EDR cache. diff --git a/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/defaults/EdrCacheEntryPredicateConverter.java b/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/defaults/EdrCacheEntryPredicateConverter.java index 27346d512..3c2de91c8 100644 --- a/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/defaults/EdrCacheEntryPredicateConverter.java +++ b/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/defaults/EdrCacheEntryPredicateConverter.java @@ -15,22 +15,19 @@ package org.eclipse.tractusx.edc.edr.core.defaults; import org.eclipse.edc.spi.query.BaseCriterionToPredicateConverter; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; public class EdrCacheEntryPredicateConverter extends BaseCriterionToPredicateConverter { @Override protected Object property(String key, Object object) { - if (object instanceof EndpointDataReferenceEntry) { - var entry = (EndpointDataReferenceEntry) object; - switch (key) { - case "assetId": - return entry.getAssetId(); - case "agreementId": - return entry.getAgreementId(); - default: - return null; - } + if (object instanceof EndpointDataReferenceEntry entry) { + return switch (key) { + case "assetId" -> entry.getAssetId(); + case "agreementId" -> entry.getAgreementId(); + case "providerId" -> entry.getProviderId(); + default -> null; + }; } throw new IllegalArgumentException("Can only handle objects of type " + EndpointDataReferenceEntry.class.getSimpleName() + " but received an " + object.getClass().getSimpleName()); } diff --git a/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/defaults/InMemoryEndpointDataReferenceCache.java b/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/defaults/InMemoryEndpointDataReferenceCache.java index 0149902bf..8f07f6c7d 100644 --- a/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/defaults/InMemoryEndpointDataReferenceCache.java +++ b/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/defaults/InMemoryEndpointDataReferenceCache.java @@ -19,8 +19,8 @@ import org.eclipse.edc.spi.result.StoreResult; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; import org.eclipse.edc.util.concurrency.LockManager; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Predicate; @@ -66,12 +67,22 @@ public InMemoryEndpointDataReferenceCache() { @Override @NotNull - public List referencesForAsset(String assetId) { + public List referencesForAsset(String assetId, String providerId) { var entries = entriesByAssetId.get(assetId); + + Predicate providerIdFilter = (cached) -> + Optional.ofNullable(providerId) + .map(id -> id.equals(cached.getProviderId())) + .orElse(true); + if (entries == null) { return emptyList(); } - return entries.stream().map(e -> resolveReference(e.getTransferProcessId())).filter(Objects::nonNull).collect(toList()); + return entries.stream() + .filter(providerIdFilter) + .map(e -> resolveReference(e.getTransferProcessId())) + .filter(Objects::nonNull) + .collect(toList()); } @Override diff --git a/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/defaults/PersistentCacheEntry.java b/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/defaults/PersistentCacheEntry.java index 3a9ae9ebd..9c31b141b 100644 --- a/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/defaults/PersistentCacheEntry.java +++ b/core/edr-cache-core/src/main/java/org/eclipse/tractusx/edc/edr/core/defaults/PersistentCacheEntry.java @@ -16,7 +16,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; /** * A wrapper to persist {@link EndpointDataReferenceEntry}s and {@link EndpointDataReference}s. diff --git a/core/edr-cache-core/src/test/java/org/eclipse/tractusx/edc/edr/core/defaults/InMemoryEndpointDataReferenceCacheTest.java b/core/edr-cache-core/src/test/java/org/eclipse/tractusx/edc/edr/core/defaults/InMemoryEndpointDataReferenceCacheTest.java index 7fb287716..70fb39996 100644 --- a/core/edr-cache-core/src/test/java/org/eclipse/tractusx/edc/edr/core/defaults/InMemoryEndpointDataReferenceCacheTest.java +++ b/core/edr-cache-core/src/test/java/org/eclipse/tractusx/edc/edr/core/defaults/InMemoryEndpointDataReferenceCacheTest.java @@ -14,8 +14,8 @@ package org.eclipse.tractusx.edc.edr.core.defaults; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCacheBaseTest; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; class InMemoryEndpointDataReferenceCacheTest extends EndpointDataReferenceCacheBaseTest { private final InMemoryEndpointDataReferenceCache cache = new InMemoryEndpointDataReferenceCache(); diff --git a/core/edr-cache-core/src/test/java/org/eclipse/tractusx/edc/edr/core/defaults/PersistentCacheEntryTest.java b/core/edr-cache-core/src/test/java/org/eclipse/tractusx/edc/edr/core/defaults/PersistentCacheEntryTest.java index b17c1e524..22fc0af8f 100644 --- a/core/edr-cache-core/src/test/java/org/eclipse/tractusx/edc/edr/core/defaults/PersistentCacheEntryTest.java +++ b/core/edr-cache-core/src/test/java/org/eclipse/tractusx/edc/edr/core/defaults/PersistentCacheEntryTest.java @@ -17,7 +17,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; import org.junit.jupiter.api.Test; import static java.util.UUID.randomUUID; @@ -39,6 +39,7 @@ void verify_serializeDeserialize() throws JsonProcessingException { .assetId(randomUUID().toString()) .agreementId(randomUUID().toString()) .transferProcessId(randomUUID().toString()) + .providerId(randomUUID().toString()) .build(); var serialized = mapper.writeValueAsString(new PersistentCacheEntry(edrEntry, edr)); diff --git a/edc-extensions/control-plane-adapter-callback/build.gradle.kts b/core/edr-core/build.gradle.kts similarity index 78% rename from edc-extensions/control-plane-adapter-callback/build.gradle.kts rename to core/edr-core/build.gradle.kts index ffb126fed..789349d66 100644 --- a/edc-extensions/control-plane-adapter-callback/build.gradle.kts +++ b/core/edr-core/build.gradle.kts @@ -14,17 +14,20 @@ plugins { `java-library` - `maven-publish` } dependencies { - implementation(project(":spi:control-plane-adapter-spi")) - implementation(project(":spi:edr-cache-spi")) implementation(libs.edc.spi.core) - implementation(libs.edc.spi.transfer) + implementation(libs.edc.config.filesystem) + implementation(libs.edc.util) + implementation(libs.edc.spi.aggregateservices) implementation(libs.edc.spi.contract) implementation(libs.edc.spi.controlplane) - implementation(libs.edc.spi.aggregateservices) + implementation(project(":spi:edr-spi")) + testImplementation(libs.edc.junit) + testImplementation(testFixtures(project(":spi:edr-spi"))) + } + diff --git a/core/edr-core/src/main/java/org/eclipse/tractusx/edc/edr/core/EdrCoreExtension.java b/core/edr-core/src/main/java/org/eclipse/tractusx/edc/edr/core/EdrCoreExtension.java new file mode 100644 index 000000000..b502fc308 --- /dev/null +++ b/core/edr-core/src/main/java/org/eclipse/tractusx/edc/edr/core/EdrCoreExtension.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * + * 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 + * + * SPDX-License-Identifier: Apache-2.0 + * + * Contributors: + * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation + * + */ + +package org.eclipse.tractusx.edc.edr.core; + +import org.eclipse.edc.connector.spi.contractnegotiation.ContractNegotiationService; +import org.eclipse.edc.runtime.metamodel.annotation.Extension; +import org.eclipse.edc.runtime.metamodel.annotation.Inject; +import org.eclipse.edc.runtime.metamodel.annotation.Provider; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.system.ServiceExtension; +import org.eclipse.tractusx.edc.edr.core.service.EdrServiceImpl; +import org.eclipse.tractusx.edc.edr.spi.service.EdrService; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; + +/** + * Registers default services for the EDR cache. + */ +@Extension(value = EdrCoreExtension.NAME) +public class EdrCoreExtension implements ServiceExtension { + static final String NAME = "EDR Core"; + + + @Inject + private Monitor monitor; + + @Inject + private ContractNegotiationService contractNegotiationService; + + @Inject + private EndpointDataReferenceCache endpointDataReferenceCache; + + @Override + public String name() { + return NAME; + } + + + @Provider + public EdrService adapterTransferProcessService() { + return new EdrServiceImpl(contractNegotiationService, endpointDataReferenceCache); + } +} diff --git a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/AdapterTransferProcessServiceImpl.java b/core/edr-core/src/main/java/org/eclipse/tractusx/edc/edr/core/service/EdrServiceImpl.java similarity index 63% rename from edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/AdapterTransferProcessServiceImpl.java rename to core/edr-core/src/main/java/org/eclipse/tractusx/edc/edr/core/service/EdrServiceImpl.java index 90a3290f6..cbf497446 100644 --- a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/AdapterTransferProcessServiceImpl.java +++ b/core/edr-core/src/main/java/org/eclipse/tractusx/edc/edr/core/service/EdrServiceImpl.java @@ -12,21 +12,20 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.edr.core.service; import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiation; import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest; import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequestData; import org.eclipse.edc.connector.spi.contractnegotiation.ContractNegotiationService; import org.eclipse.edc.service.spi.result.ServiceResult; -import org.eclipse.edc.spi.query.Criterion; import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; -import org.eclipse.tractusx.edc.spi.cp.adapter.model.NegotiateEdrRequest; -import org.eclipse.tractusx.edc.spi.cp.adapter.service.AdapterTransferProcessService; +import org.eclipse.tractusx.edc.edr.spi.service.EdrService; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.types.NegotiateEdrRequest; import java.util.List; import java.util.Optional; @@ -35,10 +34,8 @@ import java.util.stream.Stream; import static java.lang.String.format; -import static org.eclipse.edc.service.spi.result.ServiceResult.notFound; -import static org.eclipse.edc.service.spi.result.ServiceResult.success; -public class AdapterTransferProcessServiceImpl implements AdapterTransferProcessService { +public class EdrServiceImpl implements EdrService { public static final String LOCAL_ADAPTER_URI = "local://adapter"; public static final Set LOCAL_EVENTS = Set.of("contract.negotiation", "transfer.process"); @@ -51,7 +48,7 @@ public class AdapterTransferProcessServiceImpl implements AdapterTransferProcess private final EndpointDataReferenceCache endpointDataReferenceCache; - public AdapterTransferProcessServiceImpl(ContractNegotiationService contractNegotiationService, EndpointDataReferenceCache endpointDataReferenceCache) { + public EdrServiceImpl(ContractNegotiationService contractNegotiationService, EndpointDataReferenceCache endpointDataReferenceCache) { this.contractNegotiationService = contractNegotiationService; this.endpointDataReferenceCache = endpointDataReferenceCache; } @@ -59,22 +56,7 @@ public AdapterTransferProcessServiceImpl(ContractNegotiationService contractNego @Override public ServiceResult initiateEdrNegotiation(NegotiateEdrRequest request) { var contractNegotiation = contractNegotiationService.initiateNegotiation(createContractRequest(request)); - return success(contractNegotiation); - } - - private ContractRequest createContractRequest(NegotiateEdrRequest request) { - var callbacks = Stream.concat(request.getCallbackAddresses().stream(), Stream.of(LOCAL_CALLBACK)).collect(Collectors.toList()); - - var requestData = ContractRequestData.Builder.newInstance() - .contractOffer(request.getOffer()) - .protocol(request.getProtocol()) - .counterPartyAddress(request.getConnectorAddress()) - .connectorId(request.getConnectorId()) - .build(); - - return ContractRequest.Builder.newInstance() - .requestData(requestData) - .callbackAddresses(callbacks).build(); + return ServiceResult.success(contractNegotiation); } @Override @@ -82,32 +64,34 @@ public ServiceResult findByTransferProcessId(String trans var edr = endpointDataReferenceCache.resolveReference(transferProcessId); return Optional.ofNullable(edr) .map(ServiceResult::success) - .orElse(notFound(format("No Edr found associated to the transfer process with id: %s", transferProcessId))); + .orElse(ServiceResult.notFound(format("No Edr found associated to the transfer process with id: %s", transferProcessId))); } @Override - public ServiceResult> findByAssetAndAgreement(String assetId, String agreementId) { - var results = queryEdrs(assetId, agreementId).collect(Collectors.toList()); - return success(results); + public ServiceResult> findBy(QuerySpec querySpec) { + var results = endpointDataReferenceCache.queryForEntries(querySpec).collect(Collectors.toList()); + return ServiceResult.success(results); } - private Stream queryEdrs(String assetId, String agreementId) { - var queryBuilder = QuerySpec.Builder.newInstance(); - if (assetId != null) { - queryBuilder.filter(fieldFilter("assetId", assetId)); - } - if (agreementId != null) { - queryBuilder.filter(fieldFilter("agreementId", agreementId)); - } - return endpointDataReferenceCache.queryForEntries(queryBuilder.build()); + @Override + public ServiceResult deleteByTransferProcessId(String transferProcessId) { + var deleted = endpointDataReferenceCache.deleteByTransferProcessId(transferProcessId); + return ServiceResult.from(deleted); } + private ContractRequest createContractRequest(NegotiateEdrRequest request) { + var callbacks = Stream.concat(request.getCallbackAddresses().stream(), Stream.of(LOCAL_CALLBACK)).collect(Collectors.toList()); - private Criterion fieldFilter(String field, String value) { - return Criterion.Builder.newInstance() - .operandLeft(field) - .operator("=") - .operandRight(value) + var requestData = ContractRequestData.Builder.newInstance() + .contractOffer(request.getOffer()) + .protocol(request.getProtocol()) + .counterPartyAddress(request.getConnectorAddress()) + .connectorId(request.getConnectorId()) .build(); + + return ContractRequest.Builder.newInstance() + .requestData(requestData) + .callbackAddresses(callbacks).build(); } + } diff --git a/edc-extensions/control-plane-adapter-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/core/edr-core/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension similarity index 87% rename from edc-extensions/control-plane-adapter-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension rename to core/edr-core/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension index 23ba7b21c..7bbbfc9fc 100644 --- a/edc-extensions/control-plane-adapter-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension +++ b/core/edr-core/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension @@ -12,4 +12,4 @@ # # -org.eclipse.tractusx.edc.api.cp.adapter.AdapterApiExtension +org.eclipse.tractusx.edc.edr.core.EdrCoreExtension diff --git a/core/edr-core/src/test/java/org/eclipse/tractusx/edc/edr/core/service/EdrCoreExtensionTest.java b/core/edr-core/src/test/java/org/eclipse/tractusx/edc/edr/core/service/EdrCoreExtensionTest.java new file mode 100644 index 000000000..ee7c58fd5 --- /dev/null +++ b/core/edr-core/src/test/java/org/eclipse/tractusx/edc/edr/core/service/EdrCoreExtensionTest.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * + * 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 + * + * SPDX-License-Identifier: Apache-2.0 + * + * Contributors: + * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation + * + */ + +package org.eclipse.tractusx.edc.edr.core.service; + +import org.eclipse.edc.connector.spi.contractnegotiation.ContractNegotiationService; +import org.eclipse.edc.junit.extensions.DependencyInjectionExtension; +import org.eclipse.edc.spi.system.ServiceExtensionContext; +import org.eclipse.edc.spi.system.injection.ObjectFactory; +import org.eclipse.tractusx.edc.edr.core.EdrCoreExtension; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +@ExtendWith(DependencyInjectionExtension.class) +public class EdrCoreExtensionTest { + + EdrCoreExtension extension; + + @BeforeEach + void setUp(ObjectFactory factory, ServiceExtensionContext context) { + context.registerService(ContractNegotiationService.class, mock(ContractNegotiationService.class)); + context.registerService(EndpointDataReferenceCache.class, mock(EndpointDataReferenceCache.class)); + extension = factory.constructInstance(EdrCoreExtension.class); + } + + @Test + void shouldInitializeTheExtension(ServiceExtensionContext context) { + extension.initialize(context); + + var service = extension.adapterTransferProcessService(); + assertThat(service).isInstanceOf(EdrServiceImpl.class); + + } +} diff --git a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/AdapterTransferProcessServiceImplTest.java b/core/edr-core/src/test/java/org/eclipse/tractusx/edc/edr/core/service/EdrServiceImplTest.java similarity index 70% rename from edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/AdapterTransferProcessServiceImplTest.java rename to core/edr-core/src/test/java/org/eclipse/tractusx/edc/edr/core/service/EdrServiceImplTest.java index 69977fdfe..c1b43affd 100644 --- a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/AdapterTransferProcessServiceImplTest.java +++ b/core/edr-core/src/test/java/org/eclipse/tractusx/edc/edr/core/service/EdrServiceImplTest.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.edr.core.service; import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiation; import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest; @@ -21,32 +21,42 @@ import org.eclipse.edc.policy.model.Policy; import org.eclipse.edc.service.spi.result.ServiceFailure; import org.eclipse.edc.service.spi.result.ServiceResult; +import org.eclipse.edc.spi.query.QuerySpec; +import org.eclipse.edc.spi.result.StoreResult; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; -import org.eclipse.tractusx.edc.spi.cp.adapter.model.NegotiateEdrRequest; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; +import org.eclipse.tractusx.edc.edr.spi.types.NegotiateEdrRequest; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import java.util.List; import java.util.Set; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.tractusx.edc.cp.adapter.callback.AdapterTransferProcessServiceImpl.LOCAL_CALLBACK; +import static org.eclipse.tractusx.edc.edr.core.service.EdrServiceImpl.LOCAL_CALLBACK; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -public class AdapterTransferProcessServiceImplTest { +public class EdrServiceImplTest { ContractNegotiationService contractNegotiationService = mock(ContractNegotiationService.class); EndpointDataReferenceCache endpointDataReferenceCache = mock(EndpointDataReferenceCache.class); + EdrServiceImpl transferService; + + @BeforeEach + void setup() { + transferService = new EdrServiceImpl(contractNegotiationService, endpointDataReferenceCache); + } + @Test void initEdrNegotiation_shouldFireContractNegotiation_WhenUsingCallbacks() { - var transferService = new AdapterTransferProcessServiceImpl(contractNegotiationService, endpointDataReferenceCache); var captor = ArgumentCaptor.forClass(ContractRequest.class); @@ -76,7 +86,6 @@ void findByTransferProcessId_shouldReturnTheEdr_whenFoundInCache() { var transferProcessId = "tpId"; - var transferService = new AdapterTransferProcessServiceImpl(contractNegotiationService, endpointDataReferenceCache); when(endpointDataReferenceCache.resolveReference(transferProcessId)).thenReturn(EndpointDataReference.Builder.newInstance().endpoint("test").build()); var result = transferService.findByTransferProcessId(transferProcessId); @@ -92,7 +101,6 @@ void findByTransferProcessId_shouldReturnTheEdr_whenFoundInCache() { void findByTransferProcessId_shouldNotFound_whenNotPresentInCache() { var transferProcessId = "tpId"; - var transferService = new AdapterTransferProcessServiceImpl(contractNegotiationService, endpointDataReferenceCache); when(endpointDataReferenceCache.resolveReference(transferProcessId)).thenReturn(null); var result = transferService.findByTransferProcessId(transferProcessId); @@ -104,6 +112,49 @@ void findByTransferProcessId_shouldNotFound_whenNotPresentInCache() { .isEqualTo(ServiceFailure.Reason.NOT_FOUND); } + @Test + void deleteByTransferProcessId() { + var transferProcessId = "tpId"; + + when(endpointDataReferenceCache.deleteByTransferProcessId(transferProcessId)).thenReturn(StoreResult.success(null)); + + var result = transferService.deleteByTransferProcessId(transferProcessId); + + assertThat(result) + .isNotNull() + .extracting(ServiceResult::succeeded) + .isEqualTo(true); + } + + @Test + void deleteByTransferProcessId_shouldNotFound_whenNotPresentInCache() { + var transferProcessId = "tpId"; + + when(endpointDataReferenceCache.deleteByTransferProcessId(transferProcessId)).thenReturn(StoreResult.notFound("")); + + var result = transferService.deleteByTransferProcessId(transferProcessId); + + assertThat(result) + .isNotNull() + .extracting(ServiceResult::getFailure) + .extracting(ServiceFailure::getReason) + .isEqualTo(ServiceFailure.Reason.NOT_FOUND); + } + + @Test + void queryEdrs() { + when(endpointDataReferenceCache.queryForEntries(any())).thenReturn(Stream.empty()); + + var result = transferService.findBy(QuerySpec.Builder.newInstance().build()); + + assertThat(result) + .isNotNull() + .extracting(ServiceResult::getContent) + .extracting(List::size) + .isEqualTo(0); + + } + private NegotiateEdrRequest getNegotiateEdrRequest() { return NegotiateEdrRequest.Builder.newInstance() .protocol("protocol") diff --git a/docs/kit/operation-view/page10_extensions.md b/docs/kit/operation-view/page10_extensions.md index 798c86195..ce0a72ead 100644 --- a/docs/kit/operation-view/page10_extensions.md +++ b/docs/kit/operation-view/page10_extensions.md @@ -7,7 +7,7 @@ They are currently only available in Tractus-X EDC. This extension allows for validation of business partners within the access policy. -## Control Plane Adapter +## Control Plane EDR APIs The goal of this extension is to simplify the process of retrieving data out of EDC. It returns `EndpointDataReference` object, hiding all the communication details for contract offers, diff --git a/edc-controlplane/edc-controlplane-base/build.gradle.kts b/edc-controlplane/edc-controlplane-base/build.gradle.kts index 089811456..c1821e021 100644 --- a/edc-controlplane/edc-controlplane-base/build.gradle.kts +++ b/edc-controlplane/edc-controlplane-base/build.gradle.kts @@ -24,13 +24,14 @@ plugins { dependencies { runtimeOnly(project(":core:edr-cache-core")) + runtimeOnly(project(":core:edr-core")) runtimeOnly(project(":edc-extensions:business-partner-validation")) runtimeOnly(project(":edc-extensions:dataplane-selector-configuration")) runtimeOnly(project(":edc-extensions:data-encryption")) runtimeOnly(project(":edc-extensions:provision-additional-headers")) - runtimeOnly(project(":edc-extensions:control-plane-adapter-api")) - runtimeOnly(project(":edc-extensions:control-plane-adapter-callback")) + runtimeOnly(project(":edc-extensions:edr:edr-api")) + runtimeOnly(project(":edc-extensions:edr:edr-callback")) // needed for SSI integration runtimeOnly(project(":core:json-ld-core")) diff --git a/edc-controlplane/edc-controlplane-postgresql-azure-vault/build.gradle.kts b/edc-controlplane/edc-controlplane-postgresql-azure-vault/build.gradle.kts index 29e0ffc36..322019398 100644 --- a/edc-controlplane/edc-controlplane-postgresql-azure-vault/build.gradle.kts +++ b/edc-controlplane/edc-controlplane-postgresql-azure-vault/build.gradle.kts @@ -29,7 +29,7 @@ plugins { dependencies { runtimeOnly(project(":edc-controlplane:edc-controlplane-base")) runtimeOnly(project(":edc-extensions:postgresql-migration")) - runtimeOnly(project(":edc-extensions:edr-cache-sql")) + runtimeOnly(project(":edc-extensions:edr:edr-cache-sql")) runtimeOnly(libs.edc.azure.vault) runtimeOnly(libs.bundles.edc.sqlstores) runtimeOnly(libs.edc.transaction.local) diff --git a/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault-legacy/build.gradle.kts b/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault-legacy/build.gradle.kts index 11a6619c1..7bc677ed2 100644 --- a/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault-legacy/build.gradle.kts +++ b/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault-legacy/build.gradle.kts @@ -28,13 +28,14 @@ plugins { dependencies { runtimeOnly(project(":core:edr-cache-core")) + runtimeOnly(project(":core:edr-core")) runtimeOnly(project(":edc-extensions:business-partner-validation")) runtimeOnly(project(":edc-extensions:dataplane-selector-configuration")) runtimeOnly(project(":edc-extensions:data-encryption")) runtimeOnly(project(":edc-extensions:cx-oauth2")) runtimeOnly(project(":edc-extensions:provision-additional-headers")) - runtimeOnly(project(":edc-extensions:control-plane-adapter-api")) - runtimeOnly(project(":edc-extensions:control-plane-adapter-callback")) + runtimeOnly(project(":edc-extensions:edr:edr-api")) + runtimeOnly(project(":edc-extensions:edr:edr-callback")) runtimeOnly(libs.edc.core.controlplane) runtimeOnly(libs.edc.config.filesystem) @@ -55,7 +56,7 @@ dependencies { runtimeOnly(project(":edc-extensions:postgresql-migration")) runtimeOnly(project(":edc-extensions:hashicorp-vault")) - runtimeOnly(project(":edc-extensions:edr-cache-sql")) + runtimeOnly(project(":edc-extensions:edr:edr-cache-sql")) runtimeOnly(libs.bundles.edc.sqlstores) runtimeOnly(libs.edc.transaction.local) runtimeOnly(libs.edc.sql.pool) diff --git a/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/build.gradle.kts b/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/build.gradle.kts index 8b8398dcc..835ab9607 100644 --- a/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/build.gradle.kts +++ b/edc-controlplane/edc-controlplane-postgresql-hashicorp-vault/build.gradle.kts @@ -30,7 +30,7 @@ dependencies { runtimeOnly(project(":edc-controlplane:edc-controlplane-base")) runtimeOnly(project(":edc-extensions:postgresql-migration")) runtimeOnly(project(":edc-extensions:hashicorp-vault")) - runtimeOnly(project(":edc-extensions:edr-cache-sql")) + runtimeOnly(project(":edc-extensions:edr:edr-cache-sql")) runtimeOnly(libs.bundles.edc.sqlstores) runtimeOnly(libs.edc.transaction.local) runtimeOnly(libs.edc.sql.pool) diff --git a/edc-dataplane/edc-dataplane-azure-vault/build.gradle.kts b/edc-dataplane/edc-dataplane-azure-vault/build.gradle.kts index 4423254e6..3107b5262 100644 --- a/edc-dataplane/edc-dataplane-azure-vault/build.gradle.kts +++ b/edc-dataplane/edc-dataplane-azure-vault/build.gradle.kts @@ -33,7 +33,7 @@ dependencies { } implementation(libs.edc.azure.identity) implementation("com.azure:azure-security-keyvault-secrets:4.6.3") - runtimeOnly(project(":edc-extensions:edr-cache-sql")) + runtimeOnly(project(":edc-extensions:edr:edr-cache-sql")) runtimeOnly(libs.edc.transaction.local) runtimeOnly(libs.edc.sql.pool) runtimeOnly(libs.postgres) diff --git a/edc-dataplane/edc-dataplane-hashicorp-vault/build.gradle.kts b/edc-dataplane/edc-dataplane-hashicorp-vault/build.gradle.kts index 247744df2..bfabc09a4 100644 --- a/edc-dataplane/edc-dataplane-hashicorp-vault/build.gradle.kts +++ b/edc-dataplane/edc-dataplane-hashicorp-vault/build.gradle.kts @@ -26,7 +26,7 @@ plugins { dependencies { implementation(project(":edc-dataplane:edc-dataplane-base")) implementation(project(":edc-extensions:hashicorp-vault")) - runtimeOnly(project(":edc-extensions:edr-cache-sql")) + runtimeOnly(project(":edc-extensions:edr:edr-cache-sql")) runtimeOnly(libs.edc.transaction.local) runtimeOnly(libs.edc.sql.pool) runtimeOnly(libs.postgres) diff --git a/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/build.gradle.kts b/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/build.gradle.kts index ee5edb153..4cb349bca 100644 --- a/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/build.gradle.kts +++ b/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/build.gradle.kts @@ -27,8 +27,10 @@ dependencies { implementation(libs.edc.dpf.util) implementation(libs.edc.ext.http) - implementation(project(":spi:edr-cache-spi")) + implementation(project(":spi:edr-spi")) testImplementation(libs.edc.junit) + testImplementation(testFixtures(libs.edc.core.jersey)) + testImplementation(libs.restAssured) } diff --git a/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/main/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/DataPlaneProxyConsumerApiExtension.java b/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/main/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/DataPlaneProxyConsumerApiExtension.java index 048f56ead..dffbd97a0 100644 --- a/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/main/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/DataPlaneProxyConsumerApiExtension.java +++ b/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/main/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/DataPlaneProxyConsumerApiExtension.java @@ -27,7 +27,7 @@ import org.eclipse.edc.web.spi.configuration.WebServiceSettings; import org.eclipse.tractusx.edc.dataplane.proxy.consumer.api.asset.ClientErrorExceptionMapper; import org.eclipse.tractusx.edc.dataplane.proxy.consumer.api.asset.ConsumerAssetRequestController; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; import java.util.concurrent.ExecutorService; diff --git a/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/main/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/ConsumerAssetRequestController.java b/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/main/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/ConsumerAssetRequestController.java index 89b715fad..e0201596f 100644 --- a/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/main/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/ConsumerAssetRequestController.java +++ b/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/main/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/ConsumerAssetRequestController.java @@ -28,7 +28,7 @@ import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; import org.eclipse.edc.spi.types.domain.transfer.DataFlowRequest; import org.eclipse.tractusx.edc.dataplane.proxy.consumer.api.asset.model.AssetRequest; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; import java.util.Map; import java.util.concurrent.ExecutorService; @@ -112,7 +112,7 @@ private EndpointDataReference resolveEdr(AssetRequest request) { } return edr; } else { - var resolvedEdrs = edrCache.referencesForAsset(request.getAssetId()); + var resolvedEdrs = edrCache.referencesForAsset(request.getAssetId(), request.getProviderId()); if (resolvedEdrs.isEmpty()) { throw new BadRequestException("No EDR for asset: " + request.getAssetId()); } else if (resolvedEdrs.size() > 1) { @@ -128,17 +128,10 @@ private EndpointDataReference resolveEdr(AssetRequest request) { private void handleCompletion(AsyncResponse response, StreamResult result, Throwable throwable) { if (result != null && result.failed()) { switch (result.reason()) { - case NOT_FOUND: - response.resume(status(NOT_FOUND).type(APPLICATION_JSON).build()); - break; - case NOT_AUTHORIZED: - response.resume(status(UNAUTHORIZED).type(APPLICATION_JSON).build()); - break; - case GENERAL_ERROR: - response.resume(status(INTERNAL_SERVER_ERROR).type(APPLICATION_JSON).build()); - break; - default: - throw new IllegalStateException("Unexpected value: " + result.reason()); + case NOT_FOUND -> response.resume(status(NOT_FOUND).type(APPLICATION_JSON).build()); + case NOT_AUTHORIZED -> response.resume(status(UNAUTHORIZED).type(APPLICATION_JSON).build()); + case GENERAL_ERROR -> response.resume(status(INTERNAL_SERVER_ERROR).type(APPLICATION_JSON).build()); + default -> throw new IllegalStateException("Unexpected value: " + result.reason()); } } else if (throwable != null) { reportError(response, throwable); diff --git a/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/main/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/model/AssetRequest.java b/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/main/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/model/AssetRequest.java index 79fbf70dd..ba4b06db1 100644 --- a/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/main/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/model/AssetRequest.java +++ b/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/main/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/model/AssetRequest.java @@ -29,8 +29,13 @@ public class AssetRequest { private String transferProcessId; private String assetId; + + private String providerId; private String endpointUrl; + private AssetRequest() { + } + public String getTransferProcessId() { return transferProcessId; } @@ -43,13 +48,18 @@ public String getEndpointUrl() { return endpointUrl; } - private AssetRequest() { + public String getProviderId() { + return providerId; } @JsonPOJOBuilder(withPrefix = "") public static class Builder { private final AssetRequest request; + private Builder() { + request = new AssetRequest(); + } + @JsonCreator public static Builder newInstance() { return new Builder(); @@ -70,6 +80,11 @@ public Builder endpointUrl(String endpointUrl) { return this; } + public Builder providerId(String providerId) { + request.providerId = providerId; + return this; + } + public AssetRequest build() { if (request.assetId == null && request.transferProcessId == null) { throw new NullPointerException("An assetId or endpointReferenceId must be set"); @@ -77,9 +92,5 @@ public AssetRequest build() { requireNonNull(request.endpointUrl, "endpointUrl"); return request; } - - private Builder() { - request = new AssetRequest(); - } } } diff --git a/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/model/AssetRequestTest.java b/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/model/AssetRequestTest.java index 5855b20dd..1da34af3a 100644 --- a/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/model/AssetRequestTest.java +++ b/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/model/AssetRequestTest.java @@ -27,7 +27,13 @@ class AssetRequestTest { void verify_SerializeDeserialize() throws JsonProcessingException { var mapper = new ObjectMapper(); - var request = AssetRequest.Builder.newInstance().assetId("asset1").endpointUrl("https://test.com").transferProcessId("tp1").build(); + var request = AssetRequest.Builder.newInstance() + .assetId("asset1") + .endpointUrl("https://test.com") + .providerId("providerId") + .transferProcessId("tp1") + .build(); + var serialized = mapper.writeValueAsString(request); var deserialized = mapper.readValue(serialized, AssetRequest.class); @@ -35,6 +41,8 @@ void verify_SerializeDeserialize() throws JsonProcessingException { assertThat(deserialized.getAssetId()).isEqualTo(request.getAssetId()); assertThat(deserialized.getTransferProcessId()).isEqualTo(request.getTransferProcessId()); assertThat(deserialized.getEndpointUrl()).isEqualTo(request.getEndpointUrl()); + assertThat(deserialized.getProviderId()).isEqualTo(request.getProviderId()); + } @Test diff --git a/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/model/ConsumerAssetRequestControllerTest.java b/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/model/ConsumerAssetRequestControllerTest.java new file mode 100644 index 000000000..9707cf0b8 --- /dev/null +++ b/edc-extensions/dataplane-proxy/edc-dataplane-proxy-consumer-api/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/consumer/api/asset/model/ConsumerAssetRequestControllerTest.java @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * + * 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 + * + * SPDX-License-Identifier: Apache-2.0 + * + * Contributors: + * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation + * + */ + +package org.eclipse.tractusx.edc.dataplane.proxy.consumer.api.asset.model; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.restassured.specification.RequestSpecification; +import jakarta.ws.rs.core.MediaType; +import org.eclipse.edc.connector.dataplane.spi.manager.DataPlaneManager; +import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSink; +import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSource; +import org.eclipse.edc.connector.dataplane.spi.pipeline.StreamResult; +import org.eclipse.edc.connector.dataplane.util.sink.AsyncStreamingDataSink; +import org.eclipse.edc.junit.annotations.ApiTest; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.edc.web.jersey.testfixtures.RestControllerTestBase; +import org.eclipse.tractusx.edc.dataplane.proxy.consumer.api.asset.ConsumerAssetRequestController; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executors; +import java.util.stream.Stream; + +import static io.restassured.RestAssured.given; +import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; +import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; +import static jakarta.ws.rs.core.Response.Status.UNAUTHORIZED; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@ApiTest +public class ConsumerAssetRequestControllerTest extends RestControllerTestBase { + + public static final String ASSET_REQUEST_PATH = "/aas/request"; + private final EndpointDataReferenceCache cache = mock(EndpointDataReferenceCache.class); + private final DataPlaneManager dataPlaneManager = mock(DataPlaneManager.class); + private final ObjectMapper mapper = new ObjectMapper(); + + private static Stream provideServiceResultForProxyCall() { + return Stream.of( + Arguments.of(StreamResult.notFound(), NOT_FOUND.getStatusCode()), + Arguments.of(StreamResult.notAuthorized(), UNAUTHORIZED.getStatusCode()), + Arguments.of(StreamResult.error("error"), INTERNAL_SERVER_ERROR.getStatusCode())); + } + + @Test + void requestAsset_shouldReturnData_withAssetId() throws IOException { + + var assetId = "assetId"; + var transferProcessId = "tp"; + var url = "http://localhost:8080/test"; + var request = Map.of("assetId", assetId, "endpointUrl", url); + var edr = EndpointDataReference.Builder.newInstance() + .id(transferProcessId) + .authKey("authKey") + .authCode("authCode") + .endpoint(url) + .build(); + + var response = Map.of("response", "ok"); + var responseBytes = mapper.writeValueAsBytes(response); + + var datasource = mock(DataSource.class); + var partStream = mock(DataSource.Part.class); + + when(datasource.openPartStream()).thenReturn(StreamResult.success(Stream.of(partStream))); + when(partStream.openStream()).thenReturn(new ByteArrayInputStream(responseBytes)); + + when(cache.referencesForAsset(assetId, null)).thenReturn(List.of(edr)); + when(dataPlaneManager.transfer(any(DataSink.class), any())) + .thenAnswer(a -> { + AsyncStreamingDataSink sink = a.getArgument(0); + return sink.transfer(datasource); + }); + + var proxyResponseBytes = baseRequest() + .contentType(MediaType.APPLICATION_JSON) + .body(request) + .post(ASSET_REQUEST_PATH) + .then() + .statusCode(200) + .extract().body().asByteArray(); + + var proxyResponse = mapper.readValue(proxyResponseBytes, new TypeReference>() { + }); + + assertThat(proxyResponse).containsAllEntriesOf(response); + } + + @ParameterizedTest + @MethodSource("provideServiceResultForProxyCall") + void requestAsset_shouldReturnError_WhenProxyCallFails(StreamResult result, Integer responseCode) throws IOException { + + var assetId = "assetId"; + var transferProcessId = "tp"; + var url = "http://localhost:8080/test"; + var request = Map.of("assetId", assetId, "endpointUrl", url); + var edr = EndpointDataReference.Builder.newInstance() + .id(transferProcessId) + .authKey("authKey") + .authCode("authCode") + .endpoint(url) + .build(); + + when(cache.referencesForAsset(assetId, null)).thenReturn(List.of(edr)); + when(dataPlaneManager.transfer(any(DataSink.class), any())) + .thenReturn(CompletableFuture.completedFuture(result)); + + baseRequest() + .contentType(MediaType.APPLICATION_JSON) + .body(request) + .post(ASSET_REQUEST_PATH) + .then() + .statusCode(responseCode); + + } + + @Test + void requestAsset_shouldReturnError_whenEdrByAssetIdNotFound() { + + var assetId = "assetId"; + var url = "http://localhost:8080/test"; + var request = Map.of("assetId", assetId, "endpointUrl", url); + + when(cache.referencesForAsset(assetId, null)).thenReturn(List.of()); + + baseRequest() + .contentType(MediaType.APPLICATION_JSON) + .body(request) + .post(ASSET_REQUEST_PATH) + .then() + .statusCode(400); + + } + + @Test + void requestAsset_shouldReturnError_whenMultipleEdrsByAssetIdFound() { + + var assetId = "assetId"; + var url = "http://localhost:8080/test"; + var request = Map.of("assetId", assetId, "endpointUrl", url); + + var edr = EndpointDataReference.Builder.newInstance() + .id(UUID.randomUUID().toString()) + .authKey("authKey") + .authCode("authCode") + .endpoint(url) + .build(); + + when(cache.referencesForAsset(assetId, null)).thenReturn(List.of(edr, edr)); + + baseRequest() + .contentType(MediaType.APPLICATION_JSON) + .body(request) + .post(ASSET_REQUEST_PATH) + .then() + .statusCode(428); + + } + + @Test + void requestAsset_shouldReturnData_withTransferProcessId() throws IOException { + + var transferProcessId = "tp"; + var url = "http://localhost:8080/test"; + var request = Map.of("transferProcessId", transferProcessId, "endpointUrl", url); + var edr = EndpointDataReference.Builder.newInstance() + .id(transferProcessId) + .authKey("authKey") + .authCode("authCode") + .endpoint(url) + .build(); + + var response = Map.of("response", "ok"); + var responseBytes = mapper.writeValueAsBytes(response); + + var datasource = mock(DataSource.class); + var partStream = mock(DataSource.Part.class); + + when(datasource.openPartStream()).thenReturn(StreamResult.success(Stream.of(partStream))); + when(partStream.openStream()).thenReturn(new ByteArrayInputStream(responseBytes)); + + when(cache.resolveReference(transferProcessId)).thenReturn(edr); + when(dataPlaneManager.transfer(any(DataSink.class), any())) + .thenAnswer(a -> { + AsyncStreamingDataSink sink = a.getArgument(0); + return sink.transfer(datasource); + }); + + var proxyResponseBytes = baseRequest() + .contentType(MediaType.APPLICATION_JSON) + .body(request) + .post(ASSET_REQUEST_PATH) + .then() + .statusCode(200) + .extract().body().asByteArray(); + + var proxyResponse = mapper.readValue(proxyResponseBytes, new TypeReference>() { + }); + + assertThat(proxyResponse).containsAllEntriesOf(response); + } + + @Test + void requestAsset_shouldReturnError_whenEdrByTransferProcessIdNotFound() { + + var tp = "tp"; + var url = "http://localhost:8080/test"; + var request = Map.of("transferProcessId", tp, "endpointUrl", url); + + when(cache.resolveReference(tp)).thenReturn(null); + + baseRequest() + .contentType(MediaType.APPLICATION_JSON) + .body(request) + .post(ASSET_REQUEST_PATH) + .then() + .statusCode(400); + + } + + @Override + protected Object controller() { + return new ConsumerAssetRequestController(cache, dataPlaneManager, Executors.newSingleThreadExecutor(), mock(Monitor.class)); + } + + private RequestSpecification baseRequest() { + return given() + .baseUri("http://localhost:" + port) + .basePath("/") + .when(); + } +} diff --git a/edc-extensions/control-plane-adapter-api/README.md b/edc-extensions/edr/edr-api/README.md similarity index 79% rename from edc-extensions/control-plane-adapter-api/README.md rename to edc-extensions/edr/edr-api/README.md index 5d6b09e2a..084715dcc 100644 --- a/edc-extensions/control-plane-adapter-api/README.md +++ b/edc-extensions/edr/edr-api/README.md @@ -1,4 +1,4 @@ -# Control Plane Adapter API (EDR management) +# Control Plane EDR API This module provides extensions to the EDC management API for dealing with EDR tokens. @@ -15,6 +15,6 @@ This module for now provides three APIs: The initiate negotiation EDR leverage the callbacks mechanism introduced in the latest EDC, and it handles the contract negotiation and the transfer request in one API call. Once the transfer has been completed the provider will return the EDR that will be stored into the consumer EDR store/cache. Users can interact -with the EDR store/cache for fetching the EDR and then requesting the data, or can use the `proxy` API described [here](../dataplane-proxy/edc-dataplane-proxy-consumer-api/README.md) +with the EDR store/cache for fetching the EDR and then requesting the data, or can use the `proxy` API described [here](../../dataplane-proxy/edc-dataplane-proxy-consumer-api/README.md) -An overview on how to use the EDR APIs is available [here](../../docs/samples/edr-api-overview/edr-api-overview.md) +An overview on how to use the EDR APIs is available [here](../../../docs/samples/edr-api-overview/edr-api-overview.md) diff --git a/edc-extensions/control-plane-adapter-api/build.gradle.kts b/edc-extensions/edr/edr-api/build.gradle.kts similarity index 88% rename from edc-extensions/control-plane-adapter-api/build.gradle.kts rename to edc-extensions/edr/edr-api/build.gradle.kts index 36e1437b9..426e41a6d 100644 --- a/edc-extensions/control-plane-adapter-api/build.gradle.kts +++ b/edc-extensions/edr/edr-api/build.gradle.kts @@ -19,8 +19,8 @@ plugins { } dependencies { - implementation(project(":spi:control-plane-adapter-spi")) - implementation(project(":spi:edr-cache-spi")) + implementation(project(":spi:callback-spi")) + implementation(project(":spi:edr-spi")) implementation(project(":spi:core-spi")) implementation(libs.edc.api.management) diff --git a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrApi.java b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/EdrApi.java similarity index 73% rename from edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrApi.java rename to edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/EdrApi.java index 36d05c073..1435f3b83 100644 --- a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrApi.java +++ b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/EdrApi.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter; +package org.eclipse.tractusx.edc.api.edr; import io.swagger.v3.oas.annotations.OpenAPIDefinition; import io.swagger.v3.oas.annotations.Operation; @@ -25,14 +25,14 @@ import org.eclipse.edc.api.model.DataAddressDto; import org.eclipse.edc.api.model.IdResponseDto; import org.eclipse.edc.web.spi.ApiErrorDetail; -import org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; import java.util.List; @OpenAPIDefinition -@Tag(name = "Control Plane Adapter EDR Api") -public interface AdapterEdrApi { +@Tag(name = "Control Plane EDR Api") +public interface EdrApi { @Operation(description = "Initiates an EDR negotiation by handling a contract negotiation first and then a transfer process for a given offer and with the given counter part. Please note that successfully invoking this endpoint " + "only means that the negotiation was initiated.", @@ -49,11 +49,11 @@ public interface AdapterEdrApi { @ApiResponse(responseCode = "200", content = @Content(array = @ArraySchema(schema = @Schema(implementation = EndpointDataReferenceEntry.class)))), @ApiResponse(responseCode = "400", description = "Request was malformed", - content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class))))} + content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)))) } ) - List queryEdrs(String assetId, String agreementId); + List queryEdrs(String assetId, String agreementId, String providerId); - @Operation(description = "Gets an EDR with the given transfer process ID)", + @Operation(description = "Gets an EDR with the given transfer process ID", responses = { @ApiResponse(responseCode = "200", description = "The EDR cached", content = @Content(schema = @Schema(implementation = DataAddressDto.class))), @@ -64,4 +64,16 @@ public interface AdapterEdrApi { } ) JsonObject getEdr(String transferProcessId); + + @Operation(description = "Delete an EDR with the given transfer process ID", + responses = { + @ApiResponse(responseCode = "200", description = "The EDR cached", + content = @Content(schema = @Schema(implementation = DataAddressDto.class))), + @ApiResponse(responseCode = "400", description = "Request was malformed, e.g. id was null", + content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)))), + @ApiResponse(responseCode = "404", description = "An EDR with the given ID does not exist", + content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)))) + } + ) + void deleteEdr(String transferProcessId); } diff --git a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterApiExtension.java b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/EdrApiExtension.java similarity index 69% rename from edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterApiExtension.java rename to edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/EdrApiExtension.java index d9e11e41b..eb2994785 100644 --- a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterApiExtension.java +++ b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/EdrApiExtension.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter; +package org.eclipse.tractusx.edc.api.edr; import org.eclipse.edc.connector.api.management.configuration.ManagementApiConfiguration; import org.eclipse.edc.jsonld.spi.JsonLd; @@ -21,16 +21,16 @@ import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.eclipse.edc.transform.spi.TypeTransformerRegistry; import org.eclipse.edc.web.spi.WebService; -import org.eclipse.tractusx.edc.api.cp.adapter.transform.EndpointDataReferenceToDataAddressTransformer; -import org.eclipse.tractusx.edc.api.cp.adapter.transform.JsonObjectFromEndpointDataReferenceEntryTransformer; -import org.eclipse.tractusx.edc.api.cp.adapter.transform.JsonObjectToNegotiateEdrRequestDtoTransformer; -import org.eclipse.tractusx.edc.api.cp.adapter.transform.NegotiateEdrRequestDtoToNegotiatedEdrRequestTransformer; -import org.eclipse.tractusx.edc.spi.cp.adapter.service.AdapterTransferProcessService; +import org.eclipse.tractusx.edc.api.edr.transform.EndpointDataReferenceToDataAddressTransformer; +import org.eclipse.tractusx.edc.api.edr.transform.JsonObjectFromEndpointDataReferenceEntryTransformer; +import org.eclipse.tractusx.edc.api.edr.transform.JsonObjectToNegotiateEdrRequestDtoTransformer; +import org.eclipse.tractusx.edc.api.edr.transform.NegotiateEdrRequestDtoToNegotiatedEdrRequestTransformer; +import org.eclipse.tractusx.edc.edr.spi.service.EdrService; import static org.eclipse.tractusx.edc.edr.spi.CoreConstants.TX_NAMESPACE; import static org.eclipse.tractusx.edc.edr.spi.CoreConstants.TX_PREFIX; -public class AdapterApiExtension implements ServiceExtension { +public class EdrApiExtension implements ServiceExtension { @Inject private WebService webService; @@ -38,7 +38,7 @@ public class AdapterApiExtension implements ServiceExtension { private ManagementApiConfiguration apiConfig; @Inject - private AdapterTransferProcessService adapterTransferProcessService; + private EdrService edrService; @Inject private TypeTransformerRegistry transformerRegistry; @@ -53,6 +53,6 @@ public void initialize(ServiceExtensionContext context) { transformerRegistry.register(new JsonObjectToNegotiateEdrRequestDtoTransformer()); transformerRegistry.register(new JsonObjectFromEndpointDataReferenceEntryTransformer()); transformerRegistry.register(new EndpointDataReferenceToDataAddressTransformer()); - webService.registerResource(apiConfig.getContextAlias(), new AdapterEdrController(adapterTransferProcessService, jsonLdService, transformerRegistry)); + webService.registerResource(apiConfig.getContextAlias(), new EdrController(edrService, jsonLdService, transformerRegistry)); } } diff --git a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrController.java b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/EdrController.java similarity index 63% rename from edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrController.java rename to edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/EdrController.java index 557fa3a95..4c52d8fa1 100644 --- a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrController.java +++ b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/EdrController.java @@ -12,10 +12,11 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter; +package org.eclipse.tractusx.edc.api.edr; import jakarta.json.JsonObject; import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; import jakarta.ws.rs.GET; import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; @@ -27,15 +28,17 @@ import org.eclipse.edc.jsonld.spi.JsonLd; import org.eclipse.edc.spi.EdcException; import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.spi.query.Criterion; +import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.spi.result.Result; import org.eclipse.edc.spi.types.domain.DataAddress; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; import org.eclipse.edc.transform.spi.TypeTransformerRegistry; import org.eclipse.edc.web.spi.exception.InvalidRequestException; -import org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; -import org.eclipse.tractusx.edc.spi.cp.adapter.model.NegotiateEdrRequest; -import org.eclipse.tractusx.edc.spi.cp.adapter.service.AdapterTransferProcessService; +import org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto; +import org.eclipse.tractusx.edc.edr.spi.service.EdrService; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.types.NegotiateEdrRequest; import java.util.List; import java.util.stream.Collectors; @@ -45,16 +48,16 @@ @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) @Path("/edrs") -public class AdapterEdrController implements AdapterEdrApi { +public class EdrController implements EdrApi { - private final AdapterTransferProcessService adapterTransferProcessService; + private final EdrService edrService; private final TypeTransformerRegistry transformerRegistry; private final JsonLd jsonLdService; private Monitor monitor; - public AdapterEdrController(AdapterTransferProcessService adapterTransferProcessService, JsonLd jsonLdService, TypeTransformerRegistry transformerRegistry) { - this.adapterTransferProcessService = adapterTransferProcessService; + public EdrController(EdrService edrService, JsonLd jsonLdService, TypeTransformerRegistry transformerRegistry) { + this.edrService = edrService; this.jsonLdService = jsonLdService; this.transformerRegistry = transformerRegistry; } @@ -67,7 +70,7 @@ public JsonObject initiateEdrNegotiation(JsonObject requestObject) { .compose(dto -> transformerRegistry.transform(dto, NegotiateEdrRequest.class)) .orElseThrow(InvalidRequestException::new); - var contractNegotiation = adapterTransferProcessService.initiateEdrNegotiation(edrNegotiationRequest).orElseThrow(exceptionMapper(NegotiateEdrRequest.class)); + var contractNegotiation = edrService.initiateEdrNegotiation(edrNegotiationRequest).orElseThrow(exceptionMapper(NegotiateEdrRequest.class)); var responseDto = IdResponseDto.Builder.newInstance() .id(contractNegotiation.getId()) @@ -81,11 +84,11 @@ public JsonObject initiateEdrNegotiation(JsonObject requestObject) { @GET @Override - public List queryEdrs(@QueryParam("assetId") String assetId, @QueryParam("agreementId") String agreementId) { + public List queryEdrs(@QueryParam("assetId") String assetId, @QueryParam("agreementId") String agreementId, @QueryParam("providerId") String providerId) { if (assetId == null && agreementId == null) { throw new InvalidRequestException("At least one of this query parameter is required [assetId,agreementId]"); } - return adapterTransferProcessService.findByAssetAndAgreement(assetId, agreementId) + return edrService.findBy(querySpec(assetId, agreementId, providerId)) .orElseThrow(exceptionMapper(EndpointDataReferenceEntry.class)) .stream() .map(edrCached -> transformerRegistry.transform(edrCached, JsonObject.class) @@ -100,14 +103,44 @@ public List queryEdrs(@QueryParam("assetId") String assetId, @QueryP @Path("/{id}") @Override public JsonObject getEdr(@PathParam("id") String transferProcessId) { - var edr = adapterTransferProcessService.findByTransferProcessId(transferProcessId).orElseThrow(exceptionMapper(EndpointDataReference.class, transferProcessId)); + var edr = edrService.findByTransferProcessId(transferProcessId).orElseThrow(exceptionMapper(EndpointDataReference.class, transferProcessId)); return transformerRegistry.transform(edr, DataAddress.class) .compose(dataAddress -> transformerRegistry.transform(dataAddress, JsonObject.class)) .compose(jsonLdService::compact) .orElseThrow(f -> new EdcException("Error creating response body: " + f.getFailureDetail())); } + @DELETE + @Path("/{id}") + @Override + public void deleteEdr(@PathParam("id") String transferProcessId) { + edrService.deleteByTransferProcessId(transferProcessId).orElseThrow(exceptionMapper(EndpointDataReference.class, transferProcessId)); + } + private void logIfError(Result result) { result.onFailure(f -> monitor.warning(f.getFailureDetail())); } + + private QuerySpec querySpec(String assetId, String agreementId, String providerId) { + var queryBuilder = QuerySpec.Builder.newInstance(); + if (assetId != null) { + queryBuilder.filter(fieldFilter("assetId", assetId)); + } + if (agreementId != null) { + queryBuilder.filter(fieldFilter("agreementId", agreementId)); + } + if (providerId != null) { + queryBuilder.filter(fieldFilter("providerId", agreementId)); + } + return queryBuilder.build(); + } + + + private Criterion fieldFilter(String field, String value) { + return Criterion.Builder.newInstance() + .operandLeft(field) + .operator("=") + .operandRight(value) + .build(); + } } diff --git a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/dto/NegotiateEdrRequestDto.java b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/dto/NegotiateEdrRequestDto.java similarity index 98% rename from edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/dto/NegotiateEdrRequestDto.java rename to edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/dto/NegotiateEdrRequestDto.java index b49e928c0..b1f018268 100644 --- a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/dto/NegotiateEdrRequestDto.java +++ b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/dto/NegotiateEdrRequestDto.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter.dto; +package org.eclipse.tractusx.edc.api.edr.dto; import org.eclipse.edc.connector.api.management.contractnegotiation.model.ContractOfferDescription; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; diff --git a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/EndpointDataReferenceToDataAddressTransformer.java b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/transform/EndpointDataReferenceToDataAddressTransformer.java similarity index 97% rename from edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/EndpointDataReferenceToDataAddressTransformer.java rename to edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/transform/EndpointDataReferenceToDataAddressTransformer.java index 60ff11e3d..817eb5bb2 100644 --- a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/EndpointDataReferenceToDataAddressTransformer.java +++ b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/transform/EndpointDataReferenceToDataAddressTransformer.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter.transform; +package org.eclipse.tractusx.edc.api.edr.transform; import org.eclipse.edc.spi.types.domain.DataAddress; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; diff --git a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/JsonObjectFromEndpointDataReferenceEntryTransformer.java b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/transform/JsonObjectFromEndpointDataReferenceEntryTransformer.java similarity index 73% rename from edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/JsonObjectFromEndpointDataReferenceEntryTransformer.java rename to edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/transform/JsonObjectFromEndpointDataReferenceEntryTransformer.java index 36676d0c3..c0b56ce62 100644 --- a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/JsonObjectFromEndpointDataReferenceEntryTransformer.java +++ b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/transform/JsonObjectFromEndpointDataReferenceEntryTransformer.java @@ -12,21 +12,21 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter.transform; +package org.eclipse.tractusx.edc.api.edr.transform; import jakarta.json.Json; import jakarta.json.JsonObject; import org.eclipse.edc.jsonld.spi.transformer.AbstractJsonLdTransformer; import org.eclipse.edc.transform.spi.TransformerContext; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; -import static org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry.EDR_ENTRY_AGREEMENT_ID; -import static org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry.EDR_ENTRY_ASSET_ID; -import static org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry.EDR_ENTRY_TRANSFER_PROCESS_ID; -import static org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry.EDR_ENTRY_TYPE; +import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_AGREEMENT_ID; +import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_ASSET_ID; +import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_TRANSFER_PROCESS_ID; +import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_TYPE; public class JsonObjectFromEndpointDataReferenceEntryTransformer extends AbstractJsonLdTransformer { diff --git a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/JsonObjectToNegotiateEdrRequestDtoTransformer.java b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/transform/JsonObjectToNegotiateEdrRequestDtoTransformer.java similarity index 78% rename from edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/JsonObjectToNegotiateEdrRequestDtoTransformer.java rename to edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/transform/JsonObjectToNegotiateEdrRequestDtoTransformer.java index 8479852c6..f877cedda 100644 --- a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/JsonObjectToNegotiateEdrRequestDtoTransformer.java +++ b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/transform/JsonObjectToNegotiateEdrRequestDtoTransformer.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter.transform; +package org.eclipse.tractusx.edc.api.edr.transform; import jakarta.json.JsonObject; import jakarta.json.JsonValue; @@ -20,19 +20,19 @@ import org.eclipse.edc.jsonld.spi.transformer.AbstractJsonLdTransformer; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; import org.eclipse.edc.transform.spi.TransformerContext; -import org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto; +import org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import static org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_CALLBACK_ADDRESSES; -import static org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_CONNECTOR_ADDRESS; -import static org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_CONNECTOR_ID; -import static org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_OFFER; -import static org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_PROTOCOL; -import static org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_PROVIDER_ID; -import static org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_TYPE; +import static org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_CALLBACK_ADDRESSES; +import static org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_CONNECTOR_ADDRESS; +import static org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_CONNECTOR_ID; +import static org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_OFFER; +import static org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_PROTOCOL; +import static org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_PROVIDER_ID; +import static org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_TYPE; public class JsonObjectToNegotiateEdrRequestDtoTransformer extends AbstractJsonLdTransformer { diff --git a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/NegotiateEdrRequestDtoToNegotiatedEdrRequestTransformer.java b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/transform/NegotiateEdrRequestDtoToNegotiatedEdrRequestTransformer.java similarity index 90% rename from edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/NegotiateEdrRequestDtoToNegotiatedEdrRequestTransformer.java rename to edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/transform/NegotiateEdrRequestDtoToNegotiatedEdrRequestTransformer.java index 675955af9..b7b8a19c2 100644 --- a/edc-extensions/control-plane-adapter-api/src/main/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/NegotiateEdrRequestDtoToNegotiatedEdrRequestTransformer.java +++ b/edc-extensions/edr/edr-api/src/main/java/org/eclipse/tractusx/edc/api/edr/transform/NegotiateEdrRequestDtoToNegotiatedEdrRequestTransformer.java @@ -12,13 +12,13 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter.transform; +package org.eclipse.tractusx.edc.api.edr.transform; import org.eclipse.edc.api.transformer.DtoTransformer; import org.eclipse.edc.connector.contract.spi.types.offer.ContractOffer; import org.eclipse.edc.transform.spi.TransformerContext; -import org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto; -import org.eclipse.tractusx.edc.spi.cp.adapter.model.NegotiateEdrRequest; +import org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto; +import org.eclipse.tractusx.edc.edr.spi.types.NegotiateEdrRequest; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/edc-extensions/control-plane-adapter-callback/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/edc-extensions/edr/edr-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension similarity index 74% rename from edc-extensions/control-plane-adapter-callback/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension rename to edc-extensions/edr/edr-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension index 210521e83..35dd325ee 100644 --- a/edc-extensions/control-plane-adapter-callback/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension +++ b/edc-extensions/edr/edr-api/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension @@ -12,5 +12,4 @@ # # -org.eclipse.tractusx.edc.cp.adapter.callback.InProcessCallbackRegistryExtension -org.eclipse.tractusx.edc.cp.adapter.callback.LocalCallbackExtension +org.eclipse.tractusx.edc.api.edr.EdrApiExtension diff --git a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrApiExtensionTest.java b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/EdrApiExtensionTest.java similarity index 79% rename from edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrApiExtensionTest.java rename to edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/EdrApiExtensionTest.java index 8be15fa5e..cf2595cae 100644 --- a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrApiExtensionTest.java +++ b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/EdrApiExtensionTest.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter; +package org.eclipse.tractusx.edc.api.edr; import org.eclipse.edc.connector.api.management.configuration.ManagementApiConfiguration; import org.eclipse.edc.junit.extensions.DependencyInjectionExtension; @@ -20,9 +20,9 @@ import org.eclipse.edc.spi.system.injection.ObjectFactory; import org.eclipse.edc.transform.spi.TypeTransformerRegistry; import org.eclipse.edc.web.spi.WebService; -import org.eclipse.tractusx.edc.api.cp.adapter.transform.JsonObjectFromEndpointDataReferenceEntryTransformer; -import org.eclipse.tractusx.edc.api.cp.adapter.transform.JsonObjectToNegotiateEdrRequestDtoTransformer; -import org.eclipse.tractusx.edc.api.cp.adapter.transform.NegotiateEdrRequestDtoToNegotiatedEdrRequestTransformer; +import org.eclipse.tractusx.edc.api.edr.transform.JsonObjectFromEndpointDataReferenceEntryTransformer; +import org.eclipse.tractusx.edc.api.edr.transform.JsonObjectToNegotiateEdrRequestDtoTransformer; +import org.eclipse.tractusx.edc.api.edr.transform.NegotiateEdrRequestDtoToNegotiatedEdrRequestTransformer; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -34,9 +34,9 @@ import static org.mockito.Mockito.when; @ExtendWith(DependencyInjectionExtension.class) -public class AdapterEdrApiExtensionTest { +public class EdrApiExtensionTest { - AdapterApiExtension extension; + EdrApiExtension extension; TypeTransformerRegistry transformerRegistry = mock(TypeTransformerRegistry.class); @@ -49,7 +49,7 @@ void setUp(ObjectFactory factory, ServiceExtensionContext context) { context.registerService(WebService.class, webService); context.registerService(TypeTransformerRegistry.class, transformerRegistry); context.registerService(ManagementApiConfiguration.class, configuration); - extension = factory.constructInstance(AdapterApiExtension.class); + extension = factory.constructInstance(EdrApiExtension.class); } @Test @@ -59,7 +59,7 @@ void initialize_ShouldConfigureTheController(ServiceExtensionContext context) { when(configuration.getContextAlias()).thenReturn(alias); extension.initialize(context); - verify(webService).registerResource(eq(alias), isA(AdapterEdrController.class)); + verify(webService).registerResource(eq(alias), isA(EdrController.class)); verify(transformerRegistry).register(isA(NegotiateEdrRequestDtoToNegotiatedEdrRequestTransformer.class)); verify(transformerRegistry).register(isA(JsonObjectToNegotiateEdrRequestDtoTransformer.class)); verify(transformerRegistry).register(isA(JsonObjectFromEndpointDataReferenceEntryTransformer.class)); diff --git a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrControllerTest.java b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/EdrControllerTest.java similarity index 67% rename from edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrControllerTest.java rename to edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/EdrControllerTest.java index cfeee755d..5ae585efd 100644 --- a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/AdapterEdrControllerTest.java +++ b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/EdrControllerTest.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter; +package org.eclipse.tractusx.edc.api.edr; import io.restassured.specification.RequestSpecification; import jakarta.json.Json; @@ -24,15 +24,17 @@ import org.eclipse.edc.jsonld.spi.JsonLd; import org.eclipse.edc.junit.annotations.ApiTest; import org.eclipse.edc.service.spi.result.ServiceResult; +import org.eclipse.edc.spi.query.Criterion; +import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.spi.result.Result; import org.eclipse.edc.spi.types.domain.DataAddress; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; import org.eclipse.edc.transform.spi.TypeTransformerRegistry; import org.eclipse.edc.web.jersey.testfixtures.RestControllerTestBase; -import org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; -import org.eclipse.tractusx.edc.spi.cp.adapter.model.NegotiateEdrRequest; -import org.eclipse.tractusx.edc.spi.cp.adapter.service.AdapterTransferProcessService; +import org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto; +import org.eclipse.tractusx.edc.edr.spi.service.EdrService; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.types.NegotiateEdrRequest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -44,13 +46,14 @@ import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.spi.CoreConstants.EDC_NAMESPACE; -import static org.eclipse.tractusx.edc.api.cp.adapter.TestFunctions.negotiationRequest; -import static org.eclipse.tractusx.edc.api.cp.adapter.TestFunctions.openRequest; +import static org.eclipse.tractusx.edc.api.edr.TestFunctions.negotiationRequest; +import static org.eclipse.tractusx.edc.api.edr.TestFunctions.openRequest; import static org.eclipse.tractusx.edc.edr.spi.CoreConstants.TX_NAMESPACE; -import static org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry.EDR_ENTRY_AGREEMENT_ID; -import static org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry.EDR_ENTRY_ASSET_ID; -import static org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry.EDR_ENTRY_TRANSFER_PROCESS_ID; -import static org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry.EDR_ENTRY_TYPE; +import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_AGREEMENT_ID; +import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_ASSET_ID; +import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_PROVIDER_ID; +import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_TRANSFER_PROCESS_ID; +import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_TYPE; import static org.hamcrest.Matchers.is; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -58,11 +61,11 @@ import static org.mockito.Mockito.when; @ApiTest -public class AdapterEdrControllerTest extends RestControllerTestBase { +public class EdrControllerTest extends RestControllerTestBase { - public static final String ADAPTER_EDR_PATH = "/edrs"; + public static final String EDR_PATH = "/edrs"; private final JsonLd jsonLdService = new TitaniumJsonLd(monitor); - AdapterTransferProcessService adapterTransferProcessService = mock(AdapterTransferProcessService.class); + EdrService edrService = mock(EdrService.class); TypeTransformerRegistry transformerRegistry = mock(TypeTransformerRegistry.class); @BeforeEach @@ -80,7 +83,7 @@ void initEdrNegotiation_shouldWork_whenValidRequest() { when(transformerRegistry.transform(any(JsonObject.class), eq(NegotiateEdrRequestDto.class))).thenReturn(Result.success(NegotiateEdrRequestDto.Builder.newInstance().build())); when(transformerRegistry.transform(any(), eq(NegotiateEdrRequest.class))).thenReturn(Result.success(openRequest)); - when(adapterTransferProcessService.initiateEdrNegotiation(openRequest)).thenReturn(ServiceResult.success(contractNegotiation)); + when(edrService.initiateEdrNegotiation(openRequest)).thenReturn(ServiceResult.success(contractNegotiation)); when(transformerRegistry.transform(any(IdResponseDto.class), eq(JsonObject.class))).thenReturn(Result.success(responseBody)); var request = negotiationRequest(); @@ -88,7 +91,7 @@ void initEdrNegotiation_shouldWork_whenValidRequest() { baseRequest() .contentType(MediaType.APPLICATION_JSON) .body(request) - .post(ADAPTER_EDR_PATH) + .post(EDR_PATH) .then() .statusCode(200) .body(ID, is(contractNegotiation.getId())); @@ -104,7 +107,7 @@ void initEdrNegotiation_shouldReturnBadRequest_whenValidInvalidRequest() { baseRequest() .contentType(MediaType.APPLICATION_JSON) .body(request) - .post(ADAPTER_EDR_PATH) + .post(EDR_PATH) .then() .statusCode(400); @@ -114,11 +117,11 @@ void initEdrNegotiation_shouldReturnBadRequest_whenValidInvalidRequest() { void initEdrNegotiation_shouldReturnError_whenNotFound() { var transferProcessId = "id"; - when(adapterTransferProcessService.findByTransferProcessId(transferProcessId)).thenReturn(ServiceResult.notFound("")); + when(edrService.findByTransferProcessId(transferProcessId)).thenReturn(ServiceResult.notFound("")); baseRequest() .contentType(MediaType.APPLICATION_JSON) - .get(ADAPTER_EDR_PATH + "/" + transferProcessId) + .get(EDR_PATH + "/" + transferProcessId) .then() .statusCode(404); } @@ -134,13 +137,13 @@ void getEdr_shouldReturnDataAddress_whenFound() { .build(); var dataAddress = DataAddress.Builder.newInstance().type("HttpData").build(); - when(adapterTransferProcessService.findByTransferProcessId(transferProcessId)).thenReturn(ServiceResult.success(edr)); + when(edrService.findByTransferProcessId(transferProcessId)).thenReturn(ServiceResult.success(edr)); when(transformerRegistry.transform(any(EndpointDataReference.class), eq(DataAddress.class))).thenReturn(Result.success(dataAddress)); when(transformerRegistry.transform(any(DataAddress.class), eq(JsonObject.class))).thenReturn(Result.success(response)); baseRequest() .contentType(MediaType.APPLICATION_JSON) - .get(ADAPTER_EDR_PATH + "/" + transferProcessId) + .get(EDR_PATH + "/" + transferProcessId) .then() .statusCode(200) .body("'edc:endpoint'", is(edr.getEndpoint())) @@ -154,11 +157,14 @@ void queryEdrs_shouldReturnCachedEntries_whenAssetIdIsProvided() { var assetId = "id"; var transferProcessId = "id"; var agreementId = "id"; + var providerId = "id"; + var entry = EndpointDataReferenceEntry.Builder.newInstance() .transferProcessId(transferProcessId) .agreementId(agreementId) .assetId(assetId) + .providerId(providerId) .build(); var response = Json.createObjectBuilder() @@ -166,19 +172,23 @@ void queryEdrs_shouldReturnCachedEntries_whenAssetIdIsProvided() { .add(EDR_ENTRY_ASSET_ID, entry.getAssetId()) .add(EDR_ENTRY_TRANSFER_PROCESS_ID, entry.getTransferProcessId()) .add(EDR_ENTRY_AGREEMENT_ID, entry.getAgreementId()) + .add(EDR_ENTRY_PROVIDER_ID, entry.getProviderId()) .build(); - when(adapterTransferProcessService.findByAssetAndAgreement(assetId, null)).thenReturn(ServiceResult.success(List.of(entry))); + var filter = QuerySpec.Builder.newInstance().filter(fieldFilter("assetId", assetId)).build(); + + when(edrService.findBy(eq(filter))).thenReturn(ServiceResult.success(List.of(entry))); when(transformerRegistry.transform(any(EndpointDataReferenceEntry.class), eq(JsonObject.class))).thenReturn(Result.success(response)); baseRequest() .contentType(MediaType.APPLICATION_JSON) - .get(ADAPTER_EDR_PATH + format("?=assetId=%s", assetId)) + .get(EDR_PATH + format("?=assetId=%s", assetId)) .then() .statusCode(200) .body("[0].'edc:transferProcessId'", is(entry.getTransferProcessId())) .body("[0].'edc:agreementId'", is(entry.getAgreementId())) - .body("[0].'edc:assetId'", is(entry.getAssetId())); + .body("[0].'edc:assetId'", is(entry.getAssetId())) + .body("[0].'edc:providerId'", is(entry.getProviderId())); } @@ -187,11 +197,13 @@ void queryEdrs_shouldReturnCachedEntries_whenAgreementIdIsProvided() { var assetId = "id"; var transferProcessId = "id"; var agreementId = "id"; + var providerId = "id"; var entry = EndpointDataReferenceEntry.Builder.newInstance() .transferProcessId(transferProcessId) .agreementId(agreementId) .assetId(assetId) + .providerId(providerId) .build(); @@ -200,34 +212,66 @@ void queryEdrs_shouldReturnCachedEntries_whenAgreementIdIsProvided() { .add(EDR_ENTRY_ASSET_ID, entry.getAssetId()) .add(EDR_ENTRY_TRANSFER_PROCESS_ID, entry.getTransferProcessId()) .add(EDR_ENTRY_AGREEMENT_ID, entry.getAgreementId()) + .add(EDR_ENTRY_PROVIDER_ID, entry.getProviderId()) .build(); + var filter = QuerySpec.Builder.newInstance() + .filter(fieldFilter("agreementId", agreementId)) + .filter(fieldFilter("providerId", entry.getProviderId())) + .build(); - when(adapterTransferProcessService.findByAssetAndAgreement(null, agreementId)).thenReturn(ServiceResult.success(List.of(entry))); + when(edrService.findBy(eq(filter))).thenReturn(ServiceResult.success(List.of(entry))); when(transformerRegistry.transform(any(EndpointDataReferenceEntry.class), eq(JsonObject.class))).thenReturn(Result.success(response)); baseRequest() .contentType(MediaType.APPLICATION_JSON) - .get(ADAPTER_EDR_PATH + format("?=agreementId=%s", entry.getAgreementId())) + .get(EDR_PATH + format("?=agreementId=%s&providerId=%s", entry.getAgreementId(), entry.getProviderId())) .then() .statusCode(200) .body("[0].'edc:transferProcessId'", is(entry.getTransferProcessId())) .body("[0].'edc:agreementId'", is(entry.getAgreementId())) - .body("[0].'edc:assetId'", is(entry.getAssetId())); + .body("[0].'edc:assetId'", is(entry.getAssetId())) + .body("[0].'edc:providerId'", is(entry.getProviderId())); + } + + @Test + void deleteEdr() { + var transferProcessId = "id"; + + when(edrService.deleteByTransferProcessId(transferProcessId)).thenReturn(ServiceResult.success(null)); + + baseRequest() + .contentType(MediaType.APPLICATION_JSON) + .delete(EDR_PATH + "/" + transferProcessId) + .then() + .statusCode(204); + } + + @Test + void deleteEdr_shouldReturnNotFound_whenNotInCache() { + var transferProcessId = "id"; + + when(edrService.deleteByTransferProcessId(transferProcessId)).thenReturn(ServiceResult.notFound("")); + + baseRequest() + .contentType(MediaType.APPLICATION_JSON) + .delete(EDR_PATH + "/" + transferProcessId) + .then() + .statusCode(404); } @Test void queryEdrs_shouldFail_whenNoQueryParameter() { baseRequest() .contentType(MediaType.APPLICATION_JSON) - .get(ADAPTER_EDR_PATH) + .get(EDR_PATH) .then() .statusCode(400); } @Override protected Object controller() { - return new AdapterEdrController(adapterTransferProcessService, jsonLdService, transformerRegistry); + return new EdrController(edrService, jsonLdService, transformerRegistry); } private RequestSpecification baseRequest() { @@ -245,4 +289,12 @@ private ContractNegotiation getContractNegotiation() { .protocol("protocol") .build(); } + + private Criterion fieldFilter(String field, String value) { + return Criterion.Builder.newInstance() + .operandLeft(field) + .operator("=") + .operandRight(value) + .build(); + } } diff --git a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/TestFunctions.java b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/TestFunctions.java similarity index 93% rename from edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/TestFunctions.java rename to edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/TestFunctions.java index c3ad7947a..b326009aa 100644 --- a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/TestFunctions.java +++ b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/TestFunctions.java @@ -12,15 +12,15 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter; +package org.eclipse.tractusx.edc.api.edr; import jakarta.json.Json; import jakarta.json.JsonObject; import org.eclipse.edc.connector.api.management.contractnegotiation.model.ContractOfferDescription; import org.eclipse.edc.connector.contract.spi.types.offer.ContractOffer; import org.eclipse.edc.policy.model.Policy; -import org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto; -import org.eclipse.tractusx.edc.spi.cp.adapter.model.NegotiateEdrRequest; +import org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto; +import org.eclipse.tractusx.edc.edr.spi.types.NegotiateEdrRequest; import java.util.UUID; diff --git a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/EndpointDataReferenceToDataAddressTransformerTest.java b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/transform/EndpointDataReferenceToDataAddressTransformerTest.java similarity index 97% rename from edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/EndpointDataReferenceToDataAddressTransformerTest.java rename to edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/transform/EndpointDataReferenceToDataAddressTransformerTest.java index 6fa27db70..da98ae1b5 100644 --- a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/EndpointDataReferenceToDataAddressTransformerTest.java +++ b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/transform/EndpointDataReferenceToDataAddressTransformerTest.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter.transform; +package org.eclipse.tractusx.edc.api.edr.transform; import org.eclipse.edc.transform.spi.TransformerContext; import org.junit.jupiter.api.BeforeEach; diff --git a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/JsonObjectFromEndpointDataReferenceEntryTransformerTest.java b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/transform/JsonObjectFromEndpointDataReferenceEntryTransformerTest.java similarity index 79% rename from edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/JsonObjectFromEndpointDataReferenceEntryTransformerTest.java rename to edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/transform/JsonObjectFromEndpointDataReferenceEntryTransformerTest.java index 79e0ba5ae..674428c88 100644 --- a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/JsonObjectFromEndpointDataReferenceEntryTransformerTest.java +++ b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/transform/JsonObjectFromEndpointDataReferenceEntryTransformerTest.java @@ -12,17 +12,17 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter.transform; +package org.eclipse.tractusx.edc.api.edr.transform; import org.eclipse.edc.transform.spi.TransformerContext; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry.EDR_ENTRY_AGREEMENT_ID; -import static org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry.EDR_ENTRY_ASSET_ID; -import static org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry.EDR_ENTRY_TRANSFER_PROCESS_ID; +import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_AGREEMENT_ID; +import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_ASSET_ID; +import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_TRANSFER_PROCESS_ID; import static org.mockito.Mockito.mock; class JsonObjectFromEndpointDataReferenceEntryTransformerTest { diff --git a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/JsonObjectToNegotiateEdrRequestDtoTransformerTest.java b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/transform/JsonObjectToNegotiateEdrRequestDtoTransformerTest.java similarity index 99% rename from edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/JsonObjectToNegotiateEdrRequestDtoTransformerTest.java rename to edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/transform/JsonObjectToNegotiateEdrRequestDtoTransformerTest.java index 435be2a05..df3081576 100644 --- a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/JsonObjectToNegotiateEdrRequestDtoTransformerTest.java +++ b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/transform/JsonObjectToNegotiateEdrRequestDtoTransformerTest.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter.transform; +package org.eclipse.tractusx.edc.api.edr.transform; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; diff --git a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/NegotiateEdrRequestDtoToNegotiateEdrRequestTransformerTest.java b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/transform/NegotiateEdrRequestDtoToNegotiateEdrRequestTransformerTest.java similarity index 94% rename from edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/NegotiateEdrRequestDtoToNegotiateEdrRequestTransformerTest.java rename to edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/transform/NegotiateEdrRequestDtoToNegotiateEdrRequestTransformerTest.java index 70656ad71..75c2227c9 100644 --- a/edc-extensions/control-plane-adapter-api/src/test/java/org/eclipse/tractusx/edc/api/cp/adapter/transform/NegotiateEdrRequestDtoToNegotiateEdrRequestTransformerTest.java +++ b/edc-extensions/edr/edr-api/src/test/java/org/eclipse/tractusx/edc/api/edr/transform/NegotiateEdrRequestDtoToNegotiateEdrRequestTransformerTest.java @@ -12,17 +12,17 @@ * */ -package org.eclipse.tractusx.edc.api.cp.adapter.transform; +package org.eclipse.tractusx.edc.api.edr.transform; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; import org.eclipse.edc.transform.spi.TransformerContext; -import org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto; +import org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto; import org.junit.jupiter.api.Test; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.tractusx.edc.api.cp.adapter.TestFunctions.createOffer; +import static org.eclipse.tractusx.edc.api.edr.TestFunctions.createOffer; import static org.mockito.Mockito.mock; public class NegotiateEdrRequestDtoToNegotiateEdrRequestTransformerTest { diff --git a/edc-extensions/edr-cache-sql/README.md b/edc-extensions/edr/edr-cache-sql/README.md similarity index 80% rename from edc-extensions/edr-cache-sql/README.md rename to edc-extensions/edr/edr-cache-sql/README.md index 712aeb944..270d1f266 100644 --- a/edc-extensions/edr-cache-sql/README.md +++ b/edc-extensions/edr/edr-cache-sql/README.md @@ -1,15 +1,15 @@ # SQL-based `EndpointDataReferenceCache` extension -This extensions provide a persistent implementation of `EndpointDataReferenceCache`. +This extension provide a persistent implementation of `EndpointDataReferenceCache`. It will store in the database this fields: -- tranferProcessId +- transferProcessId - agreementId - assetId - edrId -It represent a single EDR negotiation done with the new Control Plane Adapter APIs. +It represents a single EDR negotiation done with the new Control Plane EDR APIs. The EDR itself it is stored in the participant vault with a prefixed key `edr__`. diff --git a/edc-extensions/edr-cache-sql/build.gradle.kts b/edc-extensions/edr/edr-cache-sql/build.gradle.kts similarity index 87% rename from edc-extensions/edr-cache-sql/build.gradle.kts rename to edc-extensions/edr/edr-cache-sql/build.gradle.kts index c1da99b15..4b922dfe2 100644 --- a/edc-extensions/edr-cache-sql/build.gradle.kts +++ b/edc-extensions/edr/edr-cache-sql/build.gradle.kts @@ -18,7 +18,7 @@ plugins { } dependencies { - implementation(project(":spi:edr-cache-spi")) + implementation(project(":spi:edr-spi")) implementation(libs.edc.spi.core) implementation(libs.edc.core.sql) @@ -27,7 +27,7 @@ dependencies { testImplementation(libs.edc.transaction.local) - testImplementation(testFixtures(project(":spi:edr-cache-spi"))) + testImplementation(testFixtures(project(":spi:edr-spi"))) testImplementation(testFixtures(libs.edc.core.sql)) testImplementation(testFixtures(libs.edc.junit)) diff --git a/edc-extensions/edr-cache-sql/docs/schema.sql b/edc-extensions/edr/edr-cache-sql/docs/schema.sql similarity index 94% rename from edc-extensions/edr-cache-sql/docs/schema.sql rename to edc-extensions/edr/edr-cache-sql/docs/schema.sql index fe4ef2104..45afba2bd 100644 --- a/edc-extensions/edr-cache-sql/docs/schema.sql +++ b/edc-extensions/edr/edr-cache-sql/docs/schema.sql @@ -17,6 +17,7 @@ CREATE TABLE IF NOT EXISTS edc_edr_cache agreement_id VARCHAR NOT NULL, asset_id VARCHAR NOT NULL, edr_id VARCHAR NOT NULL, + provider_id VARCHAR, created_at BIGINT NOT NULL, updated_at BIGINT NOT NULL ); diff --git a/edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCache.java b/edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCache.java similarity index 95% rename from edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCache.java rename to edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCache.java index 2af831aa8..a4bd84e27 100644 --- a/edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCache.java +++ b/edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCache.java @@ -25,8 +25,8 @@ import org.eclipse.edc.sql.store.AbstractSqlStore; import org.eclipse.edc.transaction.datasource.spi.DataSourceRegistry; import org.eclipse.edc.transaction.spi.TransactionContext; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; import org.eclipse.tractusx.edc.edr.store.sql.schema.EdrStatements; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -76,26 +76,11 @@ public SqlEndpointDataReferenceCache(DataSourceRegistry dataSourceRegistry, Stri }); } - private T findById(Connection connection, String id, ResultSetMapper resultSetMapper) { - var sql = statements.getFindByTransferProcessIdTemplate(); - return executeQuerySingle(connection, false, resultSetMapper, sql, id); - } - @Override - public @NotNull List referencesForAsset(String assetId) { + public @NotNull List referencesForAsset(String assetId, String providerId) { return internalQuery(queryFor("assetId", assetId), this::mapToEdrId).map(this::referenceFromEntry).collect(Collectors.toList()); } - @NotNull - private Stream internalQuery(QuerySpec spec, ResultSetMapper resultSetMapper) { - try { - var queryStmt = statements.createQuery(spec); - return executeQuery(getConnection(), true, resultSetMapper, queryStmt.getQueryAsString(), queryStmt.getParameters()); - } catch (SQLException exception) { - throw new EdcPersistenceException(exception); - } - } - @Override public Stream queryForEntries(QuerySpec spec) { return internalQuery(spec, this::mapResultSet); @@ -107,7 +92,7 @@ public void save(EndpointDataReferenceEntry entry, EndpointDataReference edr) { try (var connection = getConnection()) { var sql = statements.getInsertTemplate(); var createdAt = clock.millis(); - executeQuery(connection, sql, entry.getTransferProcessId(), entry.getAssetId(), entry.getAgreementId(), edr.getId(), createdAt, createdAt); + executeQuery(connection, sql, entry.getTransferProcessId(), entry.getAssetId(), entry.getAgreementId(), edr.getId(), entry.getProviderId(), createdAt, createdAt); vault.storeSecret(VAULT_PREFIX + edr.getId(), toJson(edr)).orElseThrow((failure) -> new EdcPersistenceException(failure.getFailureDetail())); } catch (Exception exception) { throw new EdcPersistenceException(exception); @@ -133,12 +118,27 @@ public StoreResult deleteByTransferProcessId(String }); } + private T findById(Connection connection, String id, ResultSetMapper resultSetMapper) { + var sql = statements.getFindByTransferProcessIdTemplate(); + return executeQuerySingle(connection, false, resultSetMapper, sql, id); + } + + @NotNull + private Stream internalQuery(QuerySpec spec, ResultSetMapper resultSetMapper) { + try { + var queryStmt = statements.createQuery(spec); + return executeQuery(getConnection(), true, resultSetMapper, queryStmt.getQueryAsString(), queryStmt.getParameters()); + } catch (SQLException exception) { + throw new EdcPersistenceException(exception); + } + } private EndpointDataReferenceEntry mapResultSet(ResultSet resultSet) throws SQLException { return EndpointDataReferenceEntry.Builder.newInstance() .transferProcessId(resultSet.getString(statements.getTransferProcessIdColumn())) .assetId(resultSet.getString(statements.getAssetIdColumn())) .agreementId(resultSet.getString(statements.getAgreementIdColumn())) + .providerId(resultSet.getString(statements.getProviderIdColumn())) .build(); } diff --git a/edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheExtension.java b/edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheExtension.java similarity index 97% rename from edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheExtension.java rename to edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheExtension.java index 1add47e9a..cc35b01e0 100644 --- a/edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheExtension.java +++ b/edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheExtension.java @@ -24,7 +24,7 @@ import org.eclipse.edc.spi.types.TypeManager; import org.eclipse.edc.transaction.datasource.spi.DataSourceRegistry; import org.eclipse.edc.transaction.spi.TransactionContext; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; import org.eclipse.tractusx.edc.edr.store.sql.schema.EdrStatements; import org.eclipse.tractusx.edc.edr.store.sql.schema.postgres.PostgresEdrStatements; diff --git a/edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/BaseSqlEdrStatements.java b/edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/BaseSqlEdrStatements.java similarity index 92% rename from edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/BaseSqlEdrStatements.java rename to edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/BaseSqlEdrStatements.java index 1e4111928..de1edc204 100644 --- a/edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/BaseSqlEdrStatements.java +++ b/edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/BaseSqlEdrStatements.java @@ -35,12 +35,13 @@ public SqlQueryStatement createQuery(QuerySpec querySpec) { @Override public String getInsertTemplate() { - return format("INSERT INTO %s (%s, %s, %s, %s,%s, %s) VALUES (?, ?, ?, ?, ?, ?)", + return format("INSERT INTO %s (%s, %s, %s, %s,%s, %s, %s) VALUES (?, ?, ?, ?, ?, ?, ?)", getEdrTable(), getTransferProcessIdColumn(), getAssetIdColumn(), getAgreementIdColumn(), getEdrId(), + getProviderIdColumn(), getCreatedAtColumn(), getUpdatedAtColumn() ); diff --git a/edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrMapping.java b/edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrMapping.java similarity index 86% rename from edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrMapping.java rename to edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrMapping.java index fbc615bff..fbee495fe 100644 --- a/edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrMapping.java +++ b/edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrMapping.java @@ -15,7 +15,7 @@ package org.eclipse.tractusx.edc.edr.store.sql.schema; import org.eclipse.edc.sql.translation.TranslationMapping; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; /** * Maps fields of a {@link EndpointDataReferenceEntry} onto the @@ -25,5 +25,6 @@ public class EdrMapping extends TranslationMapping { public EdrMapping(EdrStatements statements) { add("assetId", statements.getAssetIdColumn()); add("agreementId", statements.getAgreementIdColumn()); + add("providerId", statements.getProviderIdColumn()); } } diff --git a/edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrStatements.java b/edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrStatements.java similarity index 94% rename from edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrStatements.java rename to edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrStatements.java index d755dc2e4..88d39f5fd 100644 --- a/edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrStatements.java +++ b/edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/EdrStatements.java @@ -34,6 +34,10 @@ default String getAgreementIdColumn() { return "agreement_id"; } + default String getProviderIdColumn() { + return "provider_id"; + } + default String getAssetIdColumn() { return "asset_id"; } diff --git a/edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/postgres/PostgresEdrStatements.java b/edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/postgres/PostgresEdrStatements.java similarity index 100% rename from edc-extensions/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/postgres/PostgresEdrStatements.java rename to edc-extensions/edr/edr-cache-sql/src/main/java/org/eclipse/tractusx/edc/edr/store/sql/schema/postgres/PostgresEdrStatements.java diff --git a/edc-extensions/edr-cache-sql/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/edc-extensions/edr/edr-cache-sql/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension similarity index 100% rename from edc-extensions/edr-cache-sql/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension rename to edc-extensions/edr/edr-cache-sql/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension diff --git a/edc-extensions/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/PostgresqlTransactionalStoreSetupExtension.java b/edc-extensions/edr/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/PostgresqlTransactionalStoreSetupExtension.java similarity index 100% rename from edc-extensions/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/PostgresqlTransactionalStoreSetupExtension.java rename to edc-extensions/edr/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/PostgresqlTransactionalStoreSetupExtension.java diff --git a/edc-extensions/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheExtensionTest.java b/edc-extensions/edr/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheExtensionTest.java similarity index 100% rename from edc-extensions/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheExtensionTest.java rename to edc-extensions/edr/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheExtensionTest.java diff --git a/edc-extensions/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTest.java b/edc-extensions/edr/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTest.java similarity index 98% rename from edc-extensions/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTest.java rename to edc-extensions/edr/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTest.java index f89b786e0..dcc89ff85 100644 --- a/edc-extensions/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTest.java +++ b/edc-extensions/edr/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTest.java @@ -19,8 +19,8 @@ import org.eclipse.edc.spi.security.Vault; import org.eclipse.edc.spi.types.TypeManager; import org.eclipse.edc.sql.testfixtures.PostgresqlStoreSetupExtension; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCacheBaseTest; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; import org.eclipse.tractusx.edc.edr.store.sql.schema.EdrStatements; import org.eclipse.tractusx.edc.edr.store.sql.schema.postgres.PostgresEdrStatements; import org.junit.jupiter.api.AfterEach; diff --git a/edc-extensions/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTransactionalTest.java b/edc-extensions/edr/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTransactionalTest.java similarity index 97% rename from edc-extensions/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTransactionalTest.java rename to edc-extensions/edr/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTransactionalTest.java index b88ce8f12..a41a3b302 100644 --- a/edc-extensions/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTransactionalTest.java +++ b/edc-extensions/edr/edr-cache-sql/src/test/java/org/eclipse/tractusx/edc/edr/store/sql/SqlEndpointDataReferenceCacheTransactionalTest.java @@ -113,7 +113,7 @@ void save() { .extracting(EndpointDataReference::getId) .isEqualTo(edrId); - var edrs = cache.referencesForAsset(assetId); + var edrs = cache.referencesForAsset(assetId, null); assertThat(edrs.size()).isEqualTo(1); assertThat(edrs.get((0)).getId()).isEqualTo(edrId); @@ -134,7 +134,7 @@ void deleteByTransferProcessId_shouldDelete_WhenFound() { .isEqualTo(entry); assertThat(cache.resolveReference(entry.getTransferProcessId())).isNull(); - assertThat(cache.referencesForAsset(entry.getAssetId())).hasSize(0); + assertThat(cache.referencesForAsset(entry.getAssetId(), null)).hasSize(0); assertThat(cache.queryForEntries(QuerySpec.max())).hasSize(0); verify(vault).storeSecret(eq(VAULT_PREFIX + edr.getId()), any()); diff --git a/edc-extensions/edr/edr-callback/build.gradle.kts b/edc-extensions/edr/edr-callback/build.gradle.kts new file mode 100644 index 000000000..a06f38a02 --- /dev/null +++ b/edc-extensions/edr/edr-callback/build.gradle.kts @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * + * 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 + * + * SPDX-License-Identifier: Apache-2.0 + * + * Contributors: + * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation + * + */ + +plugins { + `java-library` + `maven-publish` +} + +dependencies { + implementation(project(":spi:callback-spi")) + implementation(project(":spi:edr-spi")) + implementation(libs.edc.spi.core) + implementation(libs.edc.spi.transfer) + implementation(libs.edc.spi.controlplane) + + testImplementation(libs.edc.junit) +} diff --git a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/ContractNegotiationCallback.java b/edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/ContractNegotiationCallback.java similarity index 96% rename from edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/ContractNegotiationCallback.java rename to edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/ContractNegotiationCallback.java index 80082a366..8aa031e7c 100644 --- a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/ContractNegotiationCallback.java +++ b/edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/ContractNegotiationCallback.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.callback; import org.eclipse.edc.connector.contract.spi.event.contractnegotiation.ContractNegotiationFinalized; import org.eclipse.edc.connector.spi.callback.CallbackEventRemoteMessage; @@ -23,7 +23,7 @@ import org.eclipse.edc.spi.monitor.Monitor; import org.eclipse.edc.spi.result.Result; import org.eclipse.edc.spi.types.domain.DataAddress; -import org.eclipse.tractusx.edc.spi.cp.adapter.callback.InProcessCallback; +import org.eclipse.tractusx.edc.spi.callback.InProcessCallback; import java.util.UUID; diff --git a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackMessageDispatcher.java b/edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/InProcessCallbackMessageDispatcher.java similarity index 93% rename from edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackMessageDispatcher.java rename to edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/InProcessCallbackMessageDispatcher.java index 21a106f42..e4faac1bc 100644 --- a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackMessageDispatcher.java +++ b/edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/InProcessCallbackMessageDispatcher.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.callback; import org.eclipse.edc.connector.spi.callback.CallbackEventRemoteMessage; import org.eclipse.edc.spi.EdcException; @@ -21,7 +21,7 @@ import org.eclipse.edc.spi.response.ResponseStatus; import org.eclipse.edc.spi.response.StatusResult; import org.eclipse.edc.spi.types.domain.message.RemoteMessage; -import org.eclipse.tractusx.edc.spi.cp.adapter.callback.InProcessCallbackRegistry; +import org.eclipse.tractusx.edc.spi.callback.InProcessCallbackRegistry; import java.util.concurrent.CompletableFuture; diff --git a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackRegistryExtension.java b/edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/InProcessCallbackRegistryExtension.java similarity index 88% rename from edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackRegistryExtension.java rename to edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/InProcessCallbackRegistryExtension.java index f7bb6ba06..9164a9c8c 100644 --- a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackRegistryExtension.java +++ b/edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/InProcessCallbackRegistryExtension.java @@ -12,12 +12,12 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.callback; import org.eclipse.edc.runtime.metamodel.annotation.Extension; import org.eclipse.edc.runtime.metamodel.annotation.Provider; import org.eclipse.edc.spi.system.ServiceExtension; -import org.eclipse.tractusx.edc.spi.cp.adapter.callback.InProcessCallbackRegistry; +import org.eclipse.tractusx.edc.spi.callback.InProcessCallbackRegistry; @Extension(InProcessCallbackRegistryExtension.NAME) public class InProcessCallbackRegistryExtension implements ServiceExtension { diff --git a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackRegistryImpl.java b/edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/InProcessCallbackRegistryImpl.java similarity index 85% rename from edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackRegistryImpl.java rename to edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/InProcessCallbackRegistryImpl.java index d65c4e5ae..f3942ebbc 100644 --- a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackRegistryImpl.java +++ b/edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/InProcessCallbackRegistryImpl.java @@ -12,13 +12,13 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.callback; import org.eclipse.edc.connector.spi.callback.CallbackEventRemoteMessage; import org.eclipse.edc.spi.event.Event; import org.eclipse.edc.spi.result.Result; -import org.eclipse.tractusx.edc.spi.cp.adapter.callback.InProcessCallback; -import org.eclipse.tractusx.edc.spi.cp.adapter.callback.InProcessCallbackRegistry; +import org.eclipse.tractusx.edc.spi.callback.InProcessCallback; +import org.eclipse.tractusx.edc.spi.callback.InProcessCallbackRegistry; import java.util.ArrayList; import java.util.List; diff --git a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/LocalCallbackExtension.java b/edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/LocalCallbackExtension.java similarity index 76% rename from edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/LocalCallbackExtension.java rename to edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/LocalCallbackExtension.java index 6b60a4eff..733627c65 100644 --- a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/LocalCallbackExtension.java +++ b/edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/LocalCallbackExtension.java @@ -12,26 +12,23 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.callback; import org.eclipse.edc.connector.spi.callback.CallbackProtocolResolverRegistry; -import org.eclipse.edc.connector.spi.contractnegotiation.ContractNegotiationService; import org.eclipse.edc.connector.spi.transferprocess.TransferProcessService; import org.eclipse.edc.connector.transfer.spi.store.TransferProcessStore; import org.eclipse.edc.runtime.metamodel.annotation.Extension; import org.eclipse.edc.runtime.metamodel.annotation.Inject; -import org.eclipse.edc.runtime.metamodel.annotation.Provider; import org.eclipse.edc.spi.message.RemoteMessageDispatcherRegistry; import org.eclipse.edc.spi.monitor.Monitor; import org.eclipse.edc.spi.system.ServiceExtension; import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.eclipse.edc.transaction.spi.TransactionContext; import org.eclipse.edc.transform.spi.TypeTransformerRegistry; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; -import org.eclipse.tractusx.edc.spi.cp.adapter.callback.InProcessCallbackRegistry; -import org.eclipse.tractusx.edc.spi.cp.adapter.service.AdapterTransferProcessService; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; +import org.eclipse.tractusx.edc.spi.callback.InProcessCallbackRegistry; -import static org.eclipse.tractusx.edc.cp.adapter.callback.InProcessCallbackMessageDispatcher.CALLBACK_EVENT_LOCAL; +import static org.eclipse.tractusx.edc.callback.InProcessCallbackMessageDispatcher.CALLBACK_EVENT_LOCAL; @Extension(LocalCallbackExtension.NAME) public class LocalCallbackExtension implements ServiceExtension { @@ -47,9 +44,6 @@ public class LocalCallbackExtension implements ServiceExtension { @Inject private TransferProcessService transferProcessService; - @Inject - private ContractNegotiationService contractNegotiationService; - @Inject private TransferProcessStore transferProcessStore; @@ -87,11 +81,6 @@ public void initialize(ServiceExtensionContext context) { } - @Provider - public AdapterTransferProcessService adapterTransferProcessService() { - return new AdapterTransferProcessServiceImpl(contractNegotiationService, endpointDataReferenceCache); - } - private String resolveProtocol(String scheme) { if (scheme.equalsIgnoreCase(LOCAL)) { diff --git a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/TransferProcessLocalCallback.java b/edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/TransferProcessLocalCallback.java similarity index 90% rename from edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/TransferProcessLocalCallback.java rename to edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/TransferProcessLocalCallback.java index c46ab8720..a74f8913b 100644 --- a/edc-extensions/control-plane-adapter-callback/src/main/java/org/eclipse/tractusx/edc/cp/adapter/callback/TransferProcessLocalCallback.java +++ b/edc-extensions/edr/edr-callback/src/main/java/org/eclipse/tractusx/edc/callback/TransferProcessLocalCallback.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.callback; import org.eclipse.edc.connector.spi.callback.CallbackEventRemoteMessage; import org.eclipse.edc.connector.transfer.spi.event.TransferProcessStarted; @@ -22,9 +22,9 @@ import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; import org.eclipse.edc.transaction.spi.TransactionContext; import org.eclipse.edc.transform.spi.TypeTransformerRegistry; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; -import org.eclipse.tractusx.edc.spi.cp.adapter.callback.InProcessCallback; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.spi.callback.InProcessCallback; import static java.lang.String.format; @@ -57,13 +57,13 @@ public Result invoke(CallbackEventRemoteMessage messa private Result storeEdr(EndpointDataReference edr) { return transactionContext.execute(() -> { - // TODO upstream api for getting the TP with the DataRequest#id var transferProcess = transferProcessStore.findForCorrelationId(edr.getId()); if (transferProcess != null) { var cacheEntry = EndpointDataReferenceEntry.Builder.newInstance() .transferProcessId(transferProcess.getId()) .assetId(transferProcess.getDataRequest().getAssetId()) .agreementId(transferProcess.getDataRequest().getContractId()) + .providerId(transferProcess.getDataRequest().getConnectorId()) .build(); edrCache.save(cacheEntry, edr); diff --git a/edc-extensions/edr/edr-callback/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension b/edc-extensions/edr/edr-callback/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension new file mode 100644 index 000000000..aa0b83674 --- /dev/null +++ b/edc-extensions/edr/edr-callback/src/main/resources/META-INF/services/org.eclipse.edc.spi.system.ServiceExtension @@ -0,0 +1,16 @@ +# +# Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +# +# 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 +# +# SPDX-License-Identifier: Apache-2.0 +# +# Contributors: +# Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation +# +# + +org.eclipse.tractusx.edc.callback.InProcessCallbackRegistryExtension +org.eclipse.tractusx.edc.callback.LocalCallbackExtension diff --git a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/ContractNegotiationCallbackTest.java b/edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/ContractNegotiationCallbackTest.java similarity index 94% rename from edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/ContractNegotiationCallbackTest.java rename to edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/ContractNegotiationCallbackTest.java index 62545a8b5..594c003f5 100644 --- a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/ContractNegotiationCallbackTest.java +++ b/edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/ContractNegotiationCallbackTest.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.callback; import org.eclipse.edc.connector.contract.spi.event.contractnegotiation.ContractNegotiationAccepted; import org.eclipse.edc.connector.contract.spi.event.contractnegotiation.ContractNegotiationConfirmed; @@ -43,9 +43,9 @@ import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.tractusx.edc.cp.adapter.callback.ContractNegotiationCallback.DATA_DESTINATION; -import static org.eclipse.tractusx.edc.cp.adapter.callback.TestFunctions.getNegotiationFinalizedEvent; -import static org.eclipse.tractusx.edc.cp.adapter.callback.TestFunctions.remoteMessage; +import static org.eclipse.tractusx.edc.callback.ContractNegotiationCallback.DATA_DESTINATION; +import static org.eclipse.tractusx.edc.callback.TestFunctions.getNegotiationFinalizedEvent; +import static org.eclipse.tractusx.edc.callback.TestFunctions.remoteMessage; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; diff --git a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackMessageDispatcherTest.java b/edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/InProcessCallbackMessageDispatcherTest.java similarity index 87% rename from edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackMessageDispatcherTest.java rename to edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/InProcessCallbackMessageDispatcherTest.java index 54e5bef21..6d4763b1c 100644 --- a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackMessageDispatcherTest.java +++ b/edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/InProcessCallbackMessageDispatcherTest.java @@ -12,18 +12,18 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.callback; import org.eclipse.edc.spi.EdcException; import org.eclipse.edc.spi.result.Result; import org.eclipse.edc.spi.types.domain.message.RemoteMessage; -import org.eclipse.tractusx.edc.spi.cp.adapter.callback.InProcessCallback; +import org.eclipse.tractusx.edc.spi.callback.InProcessCallback; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; -import static org.eclipse.tractusx.edc.cp.adapter.callback.TestFunctions.getNegotiationFinalizedEvent; -import static org.eclipse.tractusx.edc.cp.adapter.callback.TestFunctions.remoteMessage; +import static org.eclipse.tractusx.edc.callback.TestFunctions.getNegotiationFinalizedEvent; +import static org.eclipse.tractusx.edc.callback.TestFunctions.remoteMessage; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; diff --git a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackRegistryExtensionTest.java b/edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/InProcessCallbackRegistryExtensionTest.java similarity index 96% rename from edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackRegistryExtensionTest.java rename to edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/InProcessCallbackRegistryExtensionTest.java index 9aef1a0b2..3932688f1 100644 --- a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/InProcessCallbackRegistryExtensionTest.java +++ b/edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/InProcessCallbackRegistryExtensionTest.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.callback; import org.eclipse.edc.junit.extensions.DependencyInjectionExtension; import org.eclipse.edc.spi.system.ServiceExtensionContext; diff --git a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/LocalCallbackExtensionTest.java b/edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/LocalCallbackExtensionTest.java similarity index 86% rename from edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/LocalCallbackExtensionTest.java rename to edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/LocalCallbackExtensionTest.java index afff1d6a4..1f0f35261 100644 --- a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/LocalCallbackExtensionTest.java +++ b/edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/LocalCallbackExtensionTest.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.callback; import org.eclipse.edc.connector.spi.callback.CallbackProtocolResolver; import org.eclipse.edc.connector.spi.callback.CallbackProtocolResolverRegistry; @@ -20,15 +20,15 @@ import org.eclipse.edc.spi.message.RemoteMessageDispatcherRegistry; import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.eclipse.edc.spi.system.injection.ObjectFactory; -import org.eclipse.tractusx.edc.spi.cp.adapter.callback.InProcessCallback; -import org.eclipse.tractusx.edc.spi.cp.adapter.callback.InProcessCallbackRegistry; +import org.eclipse.tractusx.edc.spi.callback.InProcessCallback; +import org.eclipse.tractusx.edc.spi.callback.InProcessCallbackRegistry; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import static org.assertj.core.api.Assertions.assertThat; -import static org.eclipse.tractusx.edc.cp.adapter.callback.InProcessCallbackMessageDispatcher.CALLBACK_EVENT_LOCAL; +import static org.eclipse.tractusx.edc.callback.InProcessCallbackMessageDispatcher.CALLBACK_EVENT_LOCAL; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -64,10 +64,6 @@ void shouldInitializeTheExtension(ServiceExtensionContext context) { assertThat(resolver.resolve("local")).isEqualTo(CALLBACK_EVENT_LOCAL); assertThat(resolver.resolve("test")).isNull(); - - var service = extension.adapterTransferProcessService(); - assertThat(service).isInstanceOf(AdapterTransferProcessServiceImpl.class); - var callbackArgumentCaptor = ArgumentCaptor.forClass(InProcessCallback.class); verify(inProcessCallbackRegistry, times(2)).registerHandler(callbackArgumentCaptor.capture()); diff --git a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/TestFunctions.java b/edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/TestFunctions.java similarity index 98% rename from edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/TestFunctions.java rename to edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/TestFunctions.java index ec8593667..75791ce53 100644 --- a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/TestFunctions.java +++ b/edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/TestFunctions.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.callback; import org.eclipse.edc.connector.contract.spi.event.contractnegotiation.ContractNegotiationFinalized; import org.eclipse.edc.connector.contract.spi.types.agreement.ContractAgreement; diff --git a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/TransferProcessLocalCallbackTest.java b/edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/TransferProcessLocalCallbackTest.java similarity index 94% rename from edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/TransferProcessLocalCallbackTest.java rename to edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/TransferProcessLocalCallbackTest.java index d00fe250f..04e1ff70b 100644 --- a/edc-extensions/control-plane-adapter-callback/src/test/java/org/eclipse/tractusx/edc/cp/adapter/callback/TransferProcessLocalCallbackTest.java +++ b/edc-extensions/edr/edr-callback/src/test/java/org/eclipse/tractusx/edc/callback/TransferProcessLocalCallbackTest.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.cp.adapter.callback; +package org.eclipse.tractusx.edc.callback; import org.eclipse.edc.connector.transfer.spi.event.TransferProcessCompleted; import org.eclipse.edc.connector.transfer.spi.event.TransferProcessDeprovisioned; @@ -29,8 +29,8 @@ import org.eclipse.edc.transaction.spi.NoopTransactionContext; import org.eclipse.edc.transaction.spi.TransactionContext; import org.eclipse.edc.transform.spi.TypeTransformerRegistry; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; @@ -47,9 +47,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.edc.spi.types.domain.edr.EndpointDataReference.EDR_SIMPLE_TYPE; -import static org.eclipse.tractusx.edc.cp.adapter.callback.TestFunctions.getEdr; -import static org.eclipse.tractusx.edc.cp.adapter.callback.TestFunctions.getTransferProcessStartedEvent; -import static org.eclipse.tractusx.edc.cp.adapter.callback.TestFunctions.remoteMessage; +import static org.eclipse.tractusx.edc.callback.TestFunctions.getEdr; +import static org.eclipse.tractusx.edc.callback.TestFunctions.getTransferProcessStartedEvent; +import static org.eclipse.tractusx.edc.callback.TestFunctions.remoteMessage; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; diff --git a/edc-extensions/postgresql-migration/src/main/resources/org/eclipse/tractusx/edc/postgresql/migration/edr/V0_0_2__Add_ProviderId_Column.sql b/edc-extensions/postgresql-migration/src/main/resources/org/eclipse/tractusx/edc/postgresql/migration/edr/V0_0_2__Add_ProviderId_Column.sql new file mode 100644 index 000000000..ee20b3990 --- /dev/null +++ b/edc-extensions/postgresql-migration/src/main/resources/org/eclipse/tractusx/edc/postgresql/migration/edr/V0_0_2__Add_ProviderId_Column.sql @@ -0,0 +1,19 @@ +-- +-- Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +-- +-- 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 +-- +-- SPDX-License-Identifier: Apache-2.0 +-- +-- Contributors: +-- Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation +-- + +-- Statements are designed for and tested with Postgres only! + + +-- add column +ALTER TABLE edc_edr_cache ADD COLUMN provider_id VARCHAR; + diff --git a/edc-tests/e2e-tests/build.gradle.kts b/edc-tests/e2e-tests/build.gradle.kts index 5a58005d4..6c2b52d13 100644 --- a/edc-tests/e2e-tests/build.gradle.kts +++ b/edc-tests/e2e-tests/build.gradle.kts @@ -17,8 +17,8 @@ plugins { } dependencies { - testImplementation(project(":spi:edr-cache-spi")) - testImplementation(project(":edc-extensions:control-plane-adapter-api")) + testImplementation(project(":spi:edr-spi")) + testImplementation(project(":edc-extensions:edr:edr-api")) testImplementation(libs.okhttp.mockwebserver) testImplementation(libs.restAssured) testImplementation(libs.nimbus.jwt) diff --git a/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/helpers/EdrNegotiationHelperFunctions.java b/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/helpers/EdrNegotiationHelperFunctions.java index bc4bb22a7..ffab67582 100644 --- a/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/helpers/EdrNegotiationHelperFunctions.java +++ b/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/helpers/EdrNegotiationHelperFunctions.java @@ -22,7 +22,7 @@ import org.eclipse.edc.jsonld.spi.JsonLd; import org.eclipse.edc.spi.event.Event; import org.eclipse.edc.spi.monitor.Monitor; -import org.eclipse.tractusx.edc.api.cp.adapter.dto.NegotiateEdrRequestDto; +import org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto; import java.util.Set; diff --git a/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/DataWiper.java b/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/DataWiper.java index 6910eeda6..549b59227 100644 --- a/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/DataWiper.java +++ b/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/DataWiper.java @@ -19,7 +19,7 @@ import org.eclipse.edc.spi.asset.AssetIndex; import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.spi.system.ServiceExtensionContext; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; import java.util.stream.Collectors; diff --git a/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/Participant.java b/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/Participant.java index eb8ba1906..3c39dcc01 100644 --- a/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/Participant.java +++ b/edc-tests/e2e-tests/src/test/java/org/eclipse/tractusx/edc/lifecycle/Participant.java @@ -327,7 +327,9 @@ public String pullProxyDataByAssetId(Participant provider, String assetId) { } public Response pullProxyDataResponseByAssetId(Participant provider, String assetId) { - var body = Map.of("assetId", assetId, "endpointUrl", format("%s/aas/test", provider.gatewayEndpoint)); + var body = Map.of("assetId", assetId, + "endpointUrl", format("%s/aas/test", provider.gatewayEndpoint), + "providerId", provider.bpn); return proxyRequest(body); } diff --git a/edc-tests/edc-dataplane-proxy-e2e/build.gradle.kts b/edc-tests/edc-dataplane-proxy-e2e/build.gradle.kts index 0eeb54af0..4dcda6a8f 100644 --- a/edc-tests/edc-dataplane-proxy-e2e/build.gradle.kts +++ b/edc-tests/edc-dataplane-proxy-e2e/build.gradle.kts @@ -24,7 +24,7 @@ dependencies { // test runtime config testImplementation(libs.edc.config.filesystem) testImplementation(libs.edc.dpf.http) - testImplementation(project(":spi:edr-cache-spi")) + testImplementation(project(":spi:edr-spi")) testImplementation(project(":core:edr-cache-core")) testImplementation(project(":edc-extensions:dataplane-proxy:edc-dataplane-proxy-consumer-api")) testImplementation(project(":edc-extensions:dataplane-proxy:edc-dataplane-proxy-provider-api")) diff --git a/edc-tests/edc-dataplane-proxy-e2e/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/e2e/DpfProxyEndToEndTest.java b/edc-tests/edc-dataplane-proxy-e2e/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/e2e/DpfProxyEndToEndTest.java index 2a5780162..484cb67c2 100644 --- a/edc-tests/edc-dataplane-proxy-e2e/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/e2e/DpfProxyEndToEndTest.java +++ b/edc-tests/edc-dataplane-proxy-e2e/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/e2e/DpfProxyEndToEndTest.java @@ -21,7 +21,7 @@ import org.eclipse.edc.junit.extensions.EdcRuntimeExtension; import org.eclipse.edc.spi.types.TypeManager; import org.eclipse.edc.spi.types.domain.HttpDataAddress; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceCache; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/edc-tests/edc-dataplane-proxy-e2e/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/e2e/EdrCacheSetup.java b/edc-tests/edc-dataplane-proxy-e2e/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/e2e/EdrCacheSetup.java index bcaeaf68a..59a1a80b8 100644 --- a/edc-tests/edc-dataplane-proxy-e2e/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/e2e/EdrCacheSetup.java +++ b/edc-tests/edc-dataplane-proxy-e2e/src/test/java/org/eclipse/tractusx/edc/dataplane/proxy/e2e/EdrCacheSetup.java @@ -16,7 +16,7 @@ import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; import org.eclipse.tractusx.edc.edr.core.defaults.PersistentCacheEntry; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; import java.util.ArrayList; import java.util.List; diff --git a/edc-tests/miw-tests/build.gradle.kts b/edc-tests/miw-tests/build.gradle.kts index 40e999168..c27404b3a 100644 --- a/edc-tests/miw-tests/build.gradle.kts +++ b/edc-tests/miw-tests/build.gradle.kts @@ -17,8 +17,8 @@ plugins { } dependencies { - testImplementation(project(":spi:edr-cache-spi")) - testImplementation(project(":edc-extensions:control-plane-adapter-api")) + testImplementation(project(":spi:edr-spi")) + testImplementation(project(":edc-extensions:edr:edr-api")) testImplementation(libs.okhttp.mockwebserver) testImplementation(libs.restAssured) testImplementation(libs.nimbus.jwt) diff --git a/resources/openapi/yaml/control-plane-adapter.yaml b/resources/openapi/yaml/control-plane-adapter.yaml deleted file mode 100644 index c54839524..000000000 --- a/resources/openapi/yaml/control-plane-adapter.yaml +++ /dev/null @@ -1,40 +0,0 @@ -openapi: 3.0.1 -paths: - /adapter/asset/sync/{assetId}: - get: - operationId: getAssetSynchronous - parameters: - - in: path - name: assetId - required: true - schema: - type: string - example: null - - in: query - name: providerUrl - schema: - type: string - example: null - - in: query - name: contractAgreementId - schema: - type: string - example: null - - in: query - name: contractAgreementReuse - schema: - type: boolean - default: true - example: null - - in: query - name: timeout - schema: - type: string - example: null - responses: - default: - content: - application/json: {} - description: default response - tags: - - Control Plane Adapter diff --git a/resources/openapi/yaml/edc-dataplane-proxy-consumer-api.yaml b/resources/openapi/yaml/edc-dataplane-proxy-consumer-api.yaml index 861d83730..4a1d28c7c 100644 --- a/resources/openapi/yaml/edc-dataplane-proxy-consumer-api.yaml +++ b/resources/openapi/yaml/edc-dataplane-proxy-consumer-api.yaml @@ -29,6 +29,9 @@ components: endpointUrl: type: string example: null + providerId: + type: string + example: null transferProcessId: type: string example: null diff --git a/resources/openapi/yaml/control-plane-adapter-api.yaml b/resources/openapi/yaml/edr-api.yaml similarity index 88% rename from resources/openapi/yaml/control-plane-adapter-api.yaml rename to resources/openapi/yaml/edr-api.yaml index 75eec75a5..e937bc6ba 100644 --- a/resources/openapi/yaml/control-plane-adapter-api.yaml +++ b/resources/openapi/yaml/edr-api.yaml @@ -15,6 +15,11 @@ paths: schema: type: string example: null + - in: query + name: providerId + schema: + type: string + example: null responses: "200": content: @@ -34,7 +39,7 @@ paths: $ref: '#/components/schemas/ApiErrorDetail' description: Request was malformed tags: - - Control Plane Adapter EDR Api + - Control Plane EDR Api post: description: Initiates an EDR negotiation by handling a contract negotiation first and then a transfer process for a given offer and with the given counter @@ -81,10 +86,47 @@ paths: $ref: '#/components/schemas/ApiErrorDetail' description: Request body was malformed tags: - - Control Plane Adapter EDR Api + - Control Plane EDR Api /edrs/{id}: + delete: + description: Delete an EDR with the given transfer process ID + operationId: deleteEdr + parameters: + - in: path + name: id + required: true + schema: + type: string + example: null + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/DataAddressDto' + description: The EDR cached + "400": + content: + application/json: + schema: + type: array + example: null + items: + $ref: '#/components/schemas/ApiErrorDetail' + description: "Request was malformed, e.g. id was null" + "404": + content: + application/json: + schema: + type: array + example: null + items: + $ref: '#/components/schemas/ApiErrorDetail' + description: An EDR with the given ID does not exist + tags: + - Control Plane EDR Api get: - description: Gets an EDR with the given transfer process ID) + description: Gets an EDR with the given transfer process ID operationId: getEdr parameters: - in: path @@ -119,7 +161,7 @@ paths: $ref: '#/components/schemas/ApiErrorDetail' description: An EDR with the given ID does not exist tags: - - Control Plane Adapter EDR Api + - Control Plane EDR Api components: schemas: Action: @@ -246,6 +288,9 @@ components: assetId: type: string example: null + providerId: + type: string + example: null transferProcessId: type: string example: null diff --git a/settings.gradle.kts b/settings.gradle.kts index 2c58f3df7..b292424ed 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -20,14 +20,15 @@ rootProject.name = "tractusx-edc" // spi modules -include(":spi:control-plane-adapter-spi") -include(":spi:edr-cache-spi") +include(":spi:callback-spi") +include(":spi:edr-spi") include(":spi:core-spi") include(":spi:ssi-spi") // core modules include(":core:edr-cache-core") +include(":core:edr-core") include(":core:json-ld-core") @@ -41,9 +42,9 @@ include(":edc-extensions:provision-additional-headers") include(":edc-extensions:transferprocess-sftp-client") include(":edc-extensions:transferprocess-sftp-common") include(":edc-extensions:transferprocess-sftp-provisioner") -include(":edc-extensions:control-plane-adapter-api") -include(":edc-extensions:control-plane-adapter-callback") -include(":edc-extensions:edr-cache-sql") +include(":edc-extensions:edr:edr-api") +include(":edc-extensions:edr:edr-callback") +include(":edc-extensions:edr:edr-cache-sql") include(":edc-extensions:cx-policy") include("edc-extensions:ssi:ssi-identity-core") include("edc-extensions:ssi:ssi-miw-credential-client") diff --git a/spi/control-plane-adapter-spi/build.gradle.kts b/spi/callback-spi/build.gradle.kts similarity index 93% rename from spi/control-plane-adapter-spi/build.gradle.kts rename to spi/callback-spi/build.gradle.kts index 80ee806b2..f13496ffb 100644 --- a/spi/control-plane-adapter-spi/build.gradle.kts +++ b/spi/callback-spi/build.gradle.kts @@ -20,7 +20,7 @@ plugins { dependencies { implementation(project(":spi:core-spi")) - implementation(project(":spi:edr-cache-spi")) + implementation(project(":spi:edr-spi")) implementation(libs.edc.spi.core) implementation(libs.edc.spi.contract) implementation(libs.edc.spi.aggregateservices) diff --git a/spi/control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/callback/InProcessCallback.java b/spi/callback-spi/src/main/java/org/eclipse/tractusx/edc/spi/callback/InProcessCallback.java similarity index 93% rename from spi/control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/callback/InProcessCallback.java rename to spi/callback-spi/src/main/java/org/eclipse/tractusx/edc/spi/callback/InProcessCallback.java index 12a6901fa..e7648161b 100644 --- a/spi/control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/callback/InProcessCallback.java +++ b/spi/callback-spi/src/main/java/org/eclipse/tractusx/edc/spi/callback/InProcessCallback.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.spi.cp.adapter.callback; +package org.eclipse.tractusx.edc.spi.callback; import org.eclipse.edc.connector.spi.callback.CallbackEventRemoteMessage; import org.eclipse.edc.spi.event.Event; diff --git a/spi/control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/callback/InProcessCallbackRegistry.java b/spi/callback-spi/src/main/java/org/eclipse/tractusx/edc/spi/callback/InProcessCallbackRegistry.java similarity index 95% rename from spi/control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/callback/InProcessCallbackRegistry.java rename to spi/callback-spi/src/main/java/org/eclipse/tractusx/edc/spi/callback/InProcessCallbackRegistry.java index 2968530ae..32868b011 100644 --- a/spi/control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/callback/InProcessCallbackRegistry.java +++ b/spi/callback-spi/src/main/java/org/eclipse/tractusx/edc/spi/callback/InProcessCallbackRegistry.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.spi.cp.adapter.callback; +package org.eclipse.tractusx.edc.spi.callback; import org.eclipse.edc.connector.spi.callback.CallbackEventRemoteMessage; diff --git a/spi/edr-cache-spi/build.gradle.kts b/spi/edr-spi/build.gradle.kts similarity index 88% rename from spi/edr-cache-spi/build.gradle.kts rename to spi/edr-spi/build.gradle.kts index a08b24ee3..d550ba979 100644 --- a/spi/edr-cache-spi/build.gradle.kts +++ b/spi/edr-spi/build.gradle.kts @@ -20,6 +20,8 @@ plugins { dependencies { implementation(project(":spi:core-spi")) implementation(libs.edc.spi.core) + implementation(libs.edc.spi.contract) + implementation(libs.edc.spi.aggregateservices) testFixturesImplementation(libs.edc.junit) testFixturesImplementation(libs.junit.jupiter.api) diff --git a/spi/control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/service/AdapterTransferProcessService.java b/spi/edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/service/EdrService.java similarity index 76% rename from spi/control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/service/AdapterTransferProcessService.java rename to spi/edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/service/EdrService.java index 3ff0b50e9..d93e1704d 100644 --- a/spi/control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/service/AdapterTransferProcessService.java +++ b/spi/edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/service/EdrService.java @@ -12,20 +12,21 @@ * */ -package org.eclipse.tractusx.edc.spi.cp.adapter.service; +package org.eclipse.tractusx.edc.edr.spi.service; import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractNegotiation; import org.eclipse.edc.service.spi.result.ServiceResult; +import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; -import org.eclipse.tractusx.edc.edr.spi.EndpointDataReferenceEntry; -import org.eclipse.tractusx.edc.spi.cp.adapter.model.NegotiateEdrRequest; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; +import org.eclipse.tractusx.edc.edr.spi.types.NegotiateEdrRequest; import java.util.List; /** * Service for opening a transfer process. */ -public interface AdapterTransferProcessService { +public interface EdrService { /** * Open a transfer process by firing a contract negotiation. Implementors should fire a contract negotiation @@ -44,6 +45,8 @@ public interface AdapterTransferProcessService { */ ServiceResult findByTransferProcessId(String transferProcessId); - ServiceResult> findByAssetAndAgreement(String assetId, String agreementId); + ServiceResult> findBy(QuerySpec querySpec); + + ServiceResult deleteByTransferProcessId(String transferProcessId); } diff --git a/spi/edr-cache-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceCache.java b/spi/edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/store/EndpointDataReferenceCache.java similarity index 92% rename from spi/edr-cache-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceCache.java rename to spi/edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/store/EndpointDataReferenceCache.java index bf0f3dc37..a681cdeb2 100644 --- a/spi/edr-cache-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceCache.java +++ b/spi/edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/store/EndpointDataReferenceCache.java @@ -12,11 +12,12 @@ * */ -package org.eclipse.tractusx.edc.edr.spi; +package org.eclipse.tractusx.edc.edr.spi.store; import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.spi.result.StoreResult; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -38,7 +39,7 @@ public interface EndpointDataReferenceCache { * Resolves the {@link EndpointDataReference}s for the asset. */ @NotNull - List referencesForAsset(String assetId); + List referencesForAsset(String assetId, String providerId); /** * Returns all the EDR entries in the store that are covered by a given {@link QuerySpec}. diff --git a/spi/edr-cache-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceEntry.java b/spi/edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/types/EndpointDataReferenceEntry.java similarity index 90% rename from spi/edr-cache-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceEntry.java rename to spi/edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/types/EndpointDataReferenceEntry.java index 6351bca79..8ac7cc51b 100644 --- a/spi/edr-cache-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceEntry.java +++ b/spi/edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/types/EndpointDataReferenceEntry.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.edr.spi; +package org.eclipse.tractusx.edc.edr.spi.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @@ -37,11 +37,14 @@ public class EndpointDataReferenceEntry { public static final String EDR_ENTRY_ASSET_ID = EDC_NAMESPACE + "assetId"; public static final String EDR_ENTRY_AGREEMENT_ID = EDC_NAMESPACE + "agreementId"; public static final String EDR_ENTRY_TRANSFER_PROCESS_ID = EDC_NAMESPACE + "transferProcessId"; + public static final String EDR_ENTRY_PROVIDER_ID = EDC_NAMESPACE + "providerId"; private String assetId; private String agreementId; private String transferProcessId; + private String providerId; + private EndpointDataReferenceEntry() { } @@ -57,6 +60,15 @@ public String getTransferProcessId() { return transferProcessId; } + public String getProviderId() { + return providerId; + } + + @Override + public int hashCode() { + return Objects.hash(assetId, agreementId, transferProcessId); + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -67,11 +79,6 @@ public boolean equals(Object o) { return transferProcessId.equals(that.transferProcessId); } - @Override - public int hashCode() { - return Objects.hash(assetId, agreementId, transferProcessId); - } - @JsonPOJOBuilder(withPrefix = "") public static class Builder { private final EndpointDataReferenceEntry entry; @@ -100,6 +107,11 @@ public Builder transferProcessId(String transferProcessId) { return this; } + public Builder providerId(String providerId) { + entry.providerId = providerId; + return this; + } + public EndpointDataReferenceEntry build() { requireNonNull(entry.assetId, "assetId"); requireNonNull(entry.agreementId, "agreementId"); diff --git a/spi/control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/model/NegotiateEdrRequest.java b/spi/edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/types/NegotiateEdrRequest.java similarity index 98% rename from spi/control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/model/NegotiateEdrRequest.java rename to spi/edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/types/NegotiateEdrRequest.java index 846c16653..c6cab456c 100644 --- a/spi/control-plane-adapter-spi/src/main/java/org/eclipse/tractusx/edc/spi/cp/adapter/model/NegotiateEdrRequest.java +++ b/spi/edr-spi/src/main/java/org/eclipse/tractusx/edc/edr/spi/types/NegotiateEdrRequest.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.tractusx.edc.spi.cp.adapter.model; +package org.eclipse.tractusx.edc.edr.spi.types; import org.eclipse.edc.connector.contract.spi.types.offer.ContractOffer; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; diff --git a/spi/edr-cache-spi/src/test/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceEntryTest.java b/spi/edr-spi/src/test/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceEntryTest.java similarity index 95% rename from spi/edr-cache-spi/src/test/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceEntryTest.java rename to spi/edr-spi/src/test/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceEntryTest.java index 75266e1bc..7095d3713 100644 --- a/spi/edr-cache-spi/src/test/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceEntryTest.java +++ b/spi/edr-spi/src/test/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceEntryTest.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; import org.junit.jupiter.api.Test; import static java.util.UUID.randomUUID; diff --git a/spi/edr-cache-spi/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceCacheBaseTest.java b/spi/edr-spi/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceCacheBaseTest.java similarity index 83% rename from spi/edr-cache-spi/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceCacheBaseTest.java rename to spi/edr-spi/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceCacheBaseTest.java index dddea7775..0e9fada0c 100644 --- a/spi/edr-cache-spi/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceCacheBaseTest.java +++ b/spi/edr-spi/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/EndpointDataReferenceCacheBaseTest.java @@ -19,6 +19,7 @@ import org.eclipse.edc.spi.result.StoreFailure; import org.eclipse.edc.spi.result.StoreResult; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.tractusx.edc.edr.spi.store.EndpointDataReferenceCache; import org.junit.jupiter.api.Test; import java.util.stream.Collectors; @@ -31,8 +32,6 @@ public abstract class EndpointDataReferenceCacheBaseTest { - protected abstract EndpointDataReferenceCache getStore(); - @Test void save() { @@ -50,13 +49,12 @@ void save() { .extracting(EndpointDataReference::getId) .isEqualTo(edrId); - var edrs = getStore().referencesForAsset(assetId); + var edrs = getStore().referencesForAsset(assetId, null); assertThat(edrs.size()).isEqualTo(1); assertThat(edrs.get((0)).getId()).isEqualTo(edrId); } - @Test void queryEntries_noQuerySpec() { var all = IntStream.range(0, 10) @@ -67,7 +65,6 @@ void queryEntries_noQuerySpec() { assertThat(getStore().queryForEntries(QuerySpec.none())).containsExactlyInAnyOrderElementsOf(all); } - @Test void queryEntries_assetIdQuerySpec() { IntStream.range(0, 10) @@ -104,6 +101,24 @@ void queryEntries_agreementIdQuerySpec() { assertThat(getStore().queryForEntries(QuerySpec.Builder.newInstance().filter(filter).build())).containsOnly(entry); } + @Test + void queryEntries_providerIdQuerySpec() { + IntStream.range(0, 10) + .mapToObj(i -> edrEntry("assetId" + i, "agreementId" + i, "tpId" + i)) + .forEach(entry -> getStore().save(entry, edr(entry.getTransferProcessId()))); + + var entry = edrEntry("assetId", "agreementId", "tpId"); + getStore().save(entry, edr("edrId")); + + var filter = Criterion.Builder.newInstance() + .operandLeft("providerId") + .operator("=") + .operandRight(entry.getProviderId()) + .build(); + + assertThat(getStore().queryForEntries(QuerySpec.Builder.newInstance().filter(filter).build())).containsOnly(entry); + } + @Test void deleteByTransferProcessId_shouldDelete_WhenFound() { @@ -115,7 +130,7 @@ void deleteByTransferProcessId_shouldDelete_WhenFound() { .isEqualTo(entry); assertThat(getStore().resolveReference(entry.getTransferProcessId())).isNull(); - assertThat(getStore().referencesForAsset(entry.getAssetId())).hasSize(0); + assertThat(getStore().referencesForAsset(entry.getAssetId(), null)).hasSize(0); assertThat(getStore().queryForEntries(QuerySpec.max())).hasSize(0); } @@ -127,4 +142,6 @@ void deleteByTransferProcessId_shouldReturnError_whenNotFound() { .isEqualTo(StoreFailure.Reason.NOT_FOUND); } + protected abstract EndpointDataReferenceCache getStore(); + } diff --git a/spi/edr-cache-spi/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/TestFunctions.java b/spi/edr-spi/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/TestFunctions.java similarity index 88% rename from spi/edr-cache-spi/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/TestFunctions.java rename to spi/edr-spi/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/TestFunctions.java index bd9a0b221..91be14a90 100644 --- a/spi/edr-cache-spi/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/TestFunctions.java +++ b/spi/edr-spi/src/testFixtures/java/org/eclipse/tractusx/edc/edr/spi/TestFunctions.java @@ -15,6 +15,9 @@ package org.eclipse.tractusx.edc.edr.spi; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry; + +import java.util.UUID; public class TestFunctions { @@ -32,6 +35,7 @@ public static EndpointDataReferenceEntry edrEntry(String assetId, String agreeme .assetId(assetId) .agreementId(agreementId) .transferProcessId(transferProcessId) + .providerId(UUID.randomUUID().toString()) .build(); } }