diff --git a/CHANGELOG.md b/CHANGELOG.md index 29158730c..cd5f3eafe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ please see [changelog_updates.md](docs/dev/changelog_updates.md). - Refactoring: Config as Java Code ([#1051](https://github.com/sovity/edc-ce/pull/1051)) - Fix issues with the Create Data Offer Endpoint ([PR#1055](https://github.com/sovity/edc-ce/pull/1055)) +- Interrupt the transfer process earlier for terminated contracts ([PR#1074](https://github.com/sovity/edc-ce/pull/1074)) ### Deployment Migration Notes diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index cf40d820a..c8cf01f64 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -66,5 +66,5 @@ members of the project's leadership. ## Attribution -This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), -version 1.4, available at http://contributor-covenant.org/version/1/4. \ No newline at end of file +This Code of Conduct is adapted from the [Contributor Covenant](http://www.contributor-covenant.org), +version 1.4, available at http://www.contributor-covenant.org/version/1/4. diff --git a/extensions/contract-termination/src/main/java/de/sovity/edc/extension/contacttermination/TransferProcessBlocker.java b/extensions/contract-termination/src/main/java/de/sovity/edc/extension/contacttermination/TransferProcessBlocker.java index 256b8f179..e8deaca36 100644 --- a/extensions/contract-termination/src/main/java/de/sovity/edc/extension/contacttermination/TransferProcessBlocker.java +++ b/extensions/contract-termination/src/main/java/de/sovity/edc/extension/contacttermination/TransferProcessBlocker.java @@ -27,8 +27,7 @@ public class TransferProcessBlocker implements TransferProcessListener { private final DslContextFactory dslContextFactory; private final ContractAgreementIsTerminatedQuery contractAgreementIsTerminated; - @Override - public void preRequesting(TransferProcess process) { + private void stopIt(TransferProcess process) { val terminated = dslContextFactory.transactionResult(dsl -> contractAgreementIsTerminated.isTerminated(dsl, process.getContractId())); @@ -37,4 +36,9 @@ public void preRequesting(TransferProcess process) { throw new IllegalStateException(message); } } + + @Override + public void preCreated(TransferProcess process) { + stopIt(process); + } } diff --git a/tests/build.gradle.kts b/tests/build.gradle.kts index 255718f4b..a668dae79 100644 --- a/tests/build.gradle.kts +++ b/tests/build.gradle.kts @@ -11,9 +11,11 @@ dependencies { testAnnotationProcessor(libs.lombok) testCompileOnly(libs.lombok) + testImplementation(project(":extensions:database-direct-access")) testImplementation(project(":extensions:test-backend-controller")) testImplementation(project(":extensions:wrapper:clients:java-client")) testImplementation(project(":utils:test-utils")) + testImplementation(project(":utils:jooq-database-access")) testImplementation(libs.jsonUnit.assertj) testImplementation(libs.mockito.core) testImplementation(libs.assertj.core) diff --git a/tests/src/test/java/de/sovity/edc/e2e/ContractTerminationTest.java b/tests/src/test/java/de/sovity/edc/e2e/ContractTerminationTest.java index 084d98e1d..47e75316f 100644 --- a/tests/src/test/java/de/sovity/edc/e2e/ContractTerminationTest.java +++ b/tests/src/test/java/de/sovity/edc/e2e/ContractTerminationTest.java @@ -22,9 +22,11 @@ import de.sovity.edc.client.gen.model.ContractTerminationRequest; import de.sovity.edc.client.gen.model.InitiateTransferRequest; import de.sovity.edc.client.gen.model.TransferHistoryEntry; +import de.sovity.edc.ext.db.jooq.Tables; import de.sovity.edc.extension.contacttermination.ContractAgreementTerminationService; import de.sovity.edc.extension.contacttermination.ContractTerminationEvent; import de.sovity.edc.extension.contacttermination.ContractTerminationObserver; +import de.sovity.edc.extension.db.directaccess.DslContextFactory; import de.sovity.edc.extension.e2e.extension.Consumer; import de.sovity.edc.extension.e2e.extension.E2eScenario; import de.sovity.edc.extension.e2e.extension.E2eTestExtension; @@ -359,7 +361,9 @@ void doesntCrashWhenAgreementDoesntExist( void cantTransferDataAfterTerminated( E2eScenario scenario, ClientAndServer mockServer, + @Consumer DslContextFactory consumerDsl, @Consumer EdcClient consumerClient, + @Provider DslContextFactory providerDsl, @Provider EdcClient providerClient ) { val assetId = "asset-1"; @@ -410,6 +414,20 @@ void cantTransferDataAfterTerminated( awaitTerminationCount(consumerClient, 1); awaitTerminationCount(providerClient, 1); + val t = Tables.SOVITY_CONTRACT_TERMINATION; + + val terminatedOnProviderSide = providerDsl.transactionResult((ptrx) -> + ptrx.selectCount() + .from(t) + .where(t.CONTRACT_AGREEMENT_ID.eq(contractAgreementId)) + .execute()); + + assertThat(terminatedOnProviderSide).isEqualTo(1); + // pretend that the consumer didn't receive the termination message and let them try to get the data + consumerDsl.transactionResult((ctrx) -> ctrx.truncate(t).execute()); + val terminatedOnConsumerSide = consumerDsl.transactionResult((ctrx) -> ctrx.fetchCount(t)); + assertThat(terminatedOnConsumerSide).isEqualTo(0); + // act consumerClient.uiApi().initiateTransfer(transferRequest); // first transfer attempt