From 0ef385cefe44dddedc65eb63662b303d85eef7b3 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Fri, 8 Jul 2022 10:50:02 +0200 Subject: [PATCH 01/45] chore: remove IdsResponseMessageFactory --- .../IdsMultipartApiServiceExtension.java | 6 +- .../handler/ContractOfferHandler.java | 29 +- .../handler/ContractRequestHandler.java | 32 +- .../handler/ResponseMessageUtil.java | 72 +++-- .../ids/IdsResponseMessageFactory.java | 237 --------------- .../ids/IdsResponseMessageFactoryTest.java | 284 ------------------ 6 files changed, 72 insertions(+), 588 deletions(-) delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/IdsResponseMessageFactory.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/IdsResponseMessageFactoryTest.java diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java index 77c88014d9e..1d40ee4520b 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java @@ -35,7 +35,6 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DataCatalogDescriptionRequestHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.RepresentationDescriptionRequestHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.ResourceDescriptionRequestHandler; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.ids.IdsResponseMessageFactory; import org.eclipse.dataspaceconnector.ids.core.serialization.ObjectMapperFactory; import org.eclipse.dataspaceconnector.ids.spi.IdsId; import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; @@ -158,10 +157,9 @@ private void registerControllers(ServiceExtensionContext serviceExtensionContext handlers.add(artifactRequestHandler); // create contract message handlers - var responseMessageFactory = new IdsResponseMessageFactory(connectorId, identityService); - handlers.add(new ContractRequestHandler(monitor, connectorId, objectMapper, providerNegotiationManager, responseMessageFactory, transformerRegistry, assetIndex)); + handlers.add(new ContractRequestHandler(monitor, connectorId, objectMapper, providerNegotiationManager, transformerRegistry, assetIndex)); handlers.add(new ContractAgreementHandler(monitor, connectorId, objectMapper, consumerNegotiationManager, transformerRegistry)); - handlers.add(new ContractOfferHandler(monitor, connectorId, objectMapper, providerNegotiationManager, consumerNegotiationManager, responseMessageFactory)); + handlers.add(new ContractOfferHandler(monitor, connectorId, objectMapper, providerNegotiationManager, consumerNegotiationManager)); handlers.add(new ContractRejectionHandler(monitor, connectorId, providerNegotiationManager, consumerNegotiationManager)); // add notification handler and sub-handlers diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java index c1f4efd81af..e43513176e4 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java @@ -19,11 +19,8 @@ import de.fraunhofer.iais.eis.ContractOffer; import de.fraunhofer.iais.eis.ContractOfferMessage; import de.fraunhofer.iais.eis.Message; -import de.fraunhofer.iais.eis.RequestInProcessMessage; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.ids.IdsResponseMessageFactory; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.ids.exceptions.InvalidCorrelationMessageException; import org.eclipse.dataspaceconnector.spi.contract.negotiation.ConsumerContractNegotiationManager; import org.eclipse.dataspaceconnector.spi.contract.negotiation.ProviderContractNegotiationManager; import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; @@ -35,6 +32,7 @@ import java.util.Objects; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.messageTypeNotSupported; /** * This class handles and processes incoming IDS {@link ContractOfferMessage}s. @@ -46,21 +44,18 @@ public class ContractOfferHandler implements Handler { private final String connectorId; private final ProviderContractNegotiationManager providerNegotiationManager; private final ConsumerContractNegotiationManager consumerNegotiationManager; - private final IdsResponseMessageFactory responseMessageFactory; public ContractOfferHandler( @NotNull Monitor monitor, @NotNull String connectorId, @NotNull ObjectMapper objectMapper, @NotNull ProviderContractNegotiationManager providerNegotiationManager, - @NotNull ConsumerContractNegotiationManager consumerNegotiationManager, - @NotNull IdsResponseMessageFactory responseMessageFactory) { + @NotNull ConsumerContractNegotiationManager consumerNegotiationManager) { this.monitor = Objects.requireNonNull(monitor); this.connectorId = Objects.requireNonNull(connectorId); this.objectMapper = Objects.requireNonNull(objectMapper); this.providerNegotiationManager = Objects.requireNonNull(providerNegotiationManager); this.consumerNegotiationManager = Objects.requireNonNull(consumerNegotiationManager); - this.responseMessageFactory = Objects.requireNonNull(responseMessageFactory); } @Override @@ -84,24 +79,10 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { monitor.severe("ContractOfferHandler: Contract Offer is invalid", e); return createBadParametersErrorMultipartResponse(message); } + + // TODO similar implementation to ContractRequestHandler (only required if counter offers supported, not needed for M1) - Message response; - - try { - response = responseMessageFactory.createRequestInProcessMessage(message); - } catch (Exception e) { - if (e instanceof InvalidCorrelationMessageException) { - monitor.debug(String.format("Rejecting invalid IDS contract offer message [Msg-ID: %s]", message.getId()), e); - } else { - monitor.severe(String.format("Exception while creating IDS RequestInProcessMessage to answer contract offer [Msg-ID: %s]", message.getId()), e); - } - - response = responseMessageFactory.createRejectionMessage(message, e); - } - - if (response instanceof RequestInProcessMessage) { - // TODO similar implementation to ContractRequestHandler (only required if counter offers supported, not needed for M1) - } + var response = messageTypeNotSupported(message, connectorId); return MultipartResponse.Builder.newInstance() .header(response) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java index 85cdb1ccc9e..c0cef90cb58 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java @@ -19,11 +19,8 @@ import de.fraunhofer.iais.eis.ContractRequest; import de.fraunhofer.iais.eis.ContractRequestMessage; import de.fraunhofer.iais.eis.Message; -import de.fraunhofer.iais.eis.RequestInProcessMessage; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.ids.IdsResponseMessageFactory; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.ids.exceptions.InvalidCorrelationMessageException; import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; import org.eclipse.dataspaceconnector.ids.spi.Protocols; import org.eclipse.dataspaceconnector.ids.spi.transform.ContractTransformerInput; @@ -41,7 +38,9 @@ import java.io.IOException; import java.util.Objects; +import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.ResponseMessageUtil.createRequestInProcessMessage; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.internalRecipientError; import static org.eclipse.dataspaceconnector.ids.spi.IdsConstants.IDS_WEBHOOK_ADDRESS_PROPERTY; /** @@ -55,14 +54,12 @@ public class ContractRequestHandler implements Handler { private final ProviderContractNegotiationManager negotiationManager; private final IdsTransformerRegistry transformerRegistry; private final AssetIndex assetIndex; - private final IdsResponseMessageFactory responseMessageFactory; public ContractRequestHandler( @NotNull Monitor monitor, @NotNull String connectorId, @NotNull ObjectMapper objectMapper, @NotNull ProviderContractNegotiationManager negotiationManager, - @NotNull IdsResponseMessageFactory responseMessageFactory, @NotNull IdsTransformerRegistry transformerRegistry, @NotNull AssetIndex assetIndex) { this.monitor = Objects.requireNonNull(monitor); @@ -71,7 +68,6 @@ public ContractRequestHandler( this.negotiationManager = Objects.requireNonNull(negotiationManager); this.transformerRegistry = Objects.requireNonNull(transformerRegistry); this.assetIndex = Objects.requireNonNull(assetIndex); - this.responseMessageFactory = Objects.requireNonNull(responseMessageFactory); } @Override @@ -147,24 +143,18 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { .correlationId(String.valueOf(message.getTransferContract())) .contractOffer(contractOffer) .build(); - + + var negotiationInitiateResult = negotiationManager.requested(claimToken, requestObj); + Message response; - - try { - response = responseMessageFactory.createRequestInProcessMessage(message); - } catch (Exception e) { - if (e instanceof InvalidCorrelationMessageException) { - monitor.debug(String.format("Rejecting invalid IDS contract request message [Msg-ID: %s]", message.getId()), e); + if (negotiationInitiateResult.succeeded()) { + response = createRequestInProcessMessage(connectorId, message); + } else { + if (negotiationInitiateResult.fatalError()) { + response = badParameters(message, connectorId); } else { - monitor.severe(String.format("Exception while creating IDS RequestInProcessMessage to answer contract request [Msg-ID: %s]", message.getId()), e); + response = internalRecipientError(message, connectorId); } - - response = responseMessageFactory.createRejectionMessage(message, e); - } - - if (response instanceof RequestInProcessMessage) { - // Start negotiation process - negotiationManager.requested(claimToken, requestObj); } return MultipartResponse.Builder.newInstance() diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ResponseMessageUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ResponseMessageUtil.java index 7cd506d7ce5..7d362efa07a 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ResponseMessageUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ResponseMessageUtil.java @@ -19,6 +19,7 @@ import de.fraunhofer.iais.eis.Message; import de.fraunhofer.iais.eis.MessageProcessedNotificationMessageBuilder; import de.fraunhofer.iais.eis.NotificationMessage; +import de.fraunhofer.iais.eis.RequestInProcessMessageBuilder; import de.fraunhofer.iais.eis.ResponseMessage; import de.fraunhofer.iais.eis.ResponseMessageBuilder; import org.eclipse.dataspaceconnector.ids.core.util.CalendarUtil; @@ -37,21 +38,14 @@ class ResponseMessageUtil { public static ResponseMessage createDummyResponse( @Nullable String connectorId, @Nullable Message correlationMessage) { - - URI messageId = URI.create(String.join(IdsIdParser.DELIMITER, IdsIdParser.SCHEME, IdsType.MESSAGE.getValue(), UUID.randomUUID().toString())); + URI messageId = getMessageId(); ResponseMessageBuilder builder = new ResponseMessageBuilder(messageId); builder._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); builder._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); builder._issued_(CalendarUtil.gregorianNow()); - String connectorIdUrn = String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.CONNECTOR.getValue(), - connectorId); - - URI connectorIdUri = URI.create(connectorIdUrn); + URI connectorIdUri = getConnectorUrn(connectorId); builder._issuerConnector_(connectorIdUri); builder._senderAgent_(connectorIdUri); @@ -79,20 +73,13 @@ public static ResponseMessage createDummyResponse( public static NotificationMessage createMessageProcessedNotificationMessage( @Nullable String connectorId, @Nullable Message correlationMessage) { - - var messageId = URI.create(String.join(IdsIdParser.DELIMITER, IdsIdParser.SCHEME, IdsType.MESSAGE.getValue(), UUID.randomUUID().toString())); + var messageId = getMessageId(); var builder = new MessageProcessedNotificationMessageBuilder(messageId); builder._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); builder._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); - var connectorIdUrn = String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.CONNECTOR.getValue(), - connectorId); - - var connectorIdUri = URI.create(connectorIdUrn); + var connectorIdUri = getConnectorUrn(connectorId); builder._issuerConnector_(connectorIdUri); builder._senderAgent_(connectorIdUri); @@ -117,4 +104,53 @@ public static NotificationMessage createMessageProcessedNotificationMessage( return builder.build(); } + + public static NotificationMessage createRequestInProcessMessage(@Nullable String connectorId, + @Nullable Message correlationMessage) { + var messageId = getMessageId(); + var builder = new RequestInProcessMessageBuilder(messageId); + + builder._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); + builder._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); + + var connectorIdUri = getConnectorUrn(connectorId); + + builder._issuerConnector_(connectorIdUri); + builder._senderAgent_(connectorIdUri); + + if (correlationMessage != null) { + var id = correlationMessage.getId(); + if (id != null) { + builder._correlationMessage_(id); + } + + var senderAgent = correlationMessage.getSenderAgent(); + if (senderAgent != null) { + builder._recipientAgent_(new ArrayList<>(Collections.singletonList(senderAgent))); + } + + var issuerConnector = correlationMessage.getIssuerConnector(); + if (issuerConnector != null) { + builder._recipientConnector_(new ArrayList<>(Collections.singletonList(issuerConnector))); + } + } + + return builder.build(); + } + + private static URI getMessageId() { + return URI.create(String.join( + IdsIdParser.DELIMITER, + IdsIdParser.SCHEME, + IdsType.MESSAGE.getValue(), + UUID.randomUUID().toString())); + } + + private static URI getConnectorUrn(String connectorId) { + return URI.create(String.join( + IdsIdParser.DELIMITER, + IdsIdParser.SCHEME, + IdsType.CONNECTOR.getValue(), + connectorId)); + } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/IdsResponseMessageFactory.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/IdsResponseMessageFactory.java deleted file mode 100644 index 3249b254d45..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/IdsResponseMessageFactory.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (c) 2022 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial Implementation - * Microsoft Corporation - Use IDS Webhook address for JWT audience claim - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.message.ids; - -import de.fraunhofer.iais.eis.DynamicAttributeToken; -import de.fraunhofer.iais.eis.DynamicAttributeTokenBuilder; -import de.fraunhofer.iais.eis.Message; -import de.fraunhofer.iais.eis.RejectionMessage; -import de.fraunhofer.iais.eis.RejectionMessageBuilder; -import de.fraunhofer.iais.eis.RejectionReason; -import de.fraunhofer.iais.eis.RequestInProcessMessage; -import de.fraunhofer.iais.eis.RequestInProcessMessageBuilder; -import de.fraunhofer.iais.eis.TokenFormat; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.ids.exceptions.InvalidCorrelationMessageException; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.ids.exceptions.MissingClientCredentialsException; -import org.eclipse.dataspaceconnector.ids.core.util.CalendarUtil; -import org.eclipse.dataspaceconnector.ids.spi.IdsId; -import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.transform.IdsProtocol; -import org.eclipse.dataspaceconnector.spi.EdcException; -import org.eclipse.dataspaceconnector.spi.iam.IdentityService; -import org.eclipse.dataspaceconnector.spi.iam.TokenParameters; -import org.eclipse.dataspaceconnector.spi.iam.TokenRepresentation; -import org.eclipse.dataspaceconnector.spi.result.Result; -import org.jetbrains.annotations.NotNull; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Objects; -import java.util.UUID; - -/** - * The {@link IdsResponseMessageFactory} creates IDS compliant {@link de.fraunhofer.iais.eis.ResponseMessage}. - */ -@SuppressWarnings("DuplicatedCode") -public class IdsResponseMessageFactory { - - /** - * It may be necessary to reject messages with a missing message ID. - * In this case this constant can be used as correlation message instead. - */ - public static final URI NULL_CORRELATION_MESSAGE_ID = URI.create(String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.MESSAGE.getValue(), - "null")); - - /** - * It may be necessary to reject messages with a missing sender agent. - * In this case this constant can be used as recipient agent instead. - */ - public static final URI NULL_RECIPIENT_AGENT = URI.create(String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.CONNECTOR.getValue(), - "null")); - - /** - * It may be necessary to reject messages with a missing issuer connector. - * In this case this constant can be used as recipient connector instead. - */ - public static final URI NULL_RECIPIENT_CONNECTOR = URI.create(String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.CONNECTOR.getValue(), - "null")); - - /** - * It may be necessary to reject messages, even when the EDC is not able to provide client credentials for itself. - * In this case this constant can be used as security token value instead. - */ - public static final String NULL_TOKEN = "null.null.null"; - - private final URI connectorId; - private final IdentityService identityService; - - public IdsResponseMessageFactory(@NotNull String connectorId, @NotNull IdentityService identityService) { - Objects.requireNonNull(connectorId); - this.identityService = Objects.requireNonNull(identityService); - - URI uri; - try { - IdsId connectorIdsId = IdsIdParser.parse(connectorId); - boolean isConnectorUrn = connectorIdsId != null && connectorIdsId.getType() == IdsType.CONNECTOR; - if (!isConnectorUrn) { - throw new EdcException("Connector URN not of type IdsType.CONNECTOR"); - } - - uri = URI.create(connectorId); - } catch (IllegalArgumentException ignore) { // if connectorId is no URN - String urn = String.join(IdsIdParser.DELIMITER, IdsIdParser.SCHEME, IdsType.CONNECTOR.getValue(), connectorId); - uri = URI.create(urn); - } - this.connectorId = uri; - } - - /** - * In general using IDS it should always be tried to answer with an IDS message. Therefore, in case an exception occurs - * while creating an IDS response message, this method should be called. - * In comparison to the other message creating methods, this one will not throw an exception in case - * there are issues with the correlation message. - * - * @param correlationMessage message the rejection is referring to - * @param reason exception that was thrown when creating a response message - * @return RejectionMessage - */ - public RejectionMessage createRejectionMessage(@NotNull Message correlationMessage, @NotNull Exception reason) { - Objects.requireNonNull(correlationMessage); - Objects.requireNonNull(reason); - - String randomMessageId = String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.MESSAGE.getValue(), - UUID.randomUUID().toString()); - - RejectionMessageBuilder builder = new RejectionMessageBuilder(URI.create(randomMessageId)); - - builder._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); - builder._issued_(CalendarUtil.gregorianNow()); - builder._issuerConnector_(connectorId); - builder._senderAgent_(connectorId); - - URI correlationMessageId = correlationMessage.getId(); - if (correlationMessageId == null) { - correlationMessageId = NULL_CORRELATION_MESSAGE_ID; - } - builder._correlationMessage_(correlationMessageId); - - URI recipientAgent = correlationMessage.getSenderAgent(); - if (recipientAgent == null) { - recipientAgent = NULL_RECIPIENT_AGENT; - } - builder._recipientAgent_(new ArrayList<>(Collections.singletonList(recipientAgent))); - - URI recipientConnector = correlationMessage.getIssuerConnector(); - if (recipientConnector == null) { - recipientConnector = NULL_RECIPIENT_CONNECTOR; - } - builder._recipientConnector_(new ArrayList<>(Collections.singletonList(recipientConnector))); - - TokenParameters tokenParameters = TokenParameters.Builder.newInstance() - .scope(IdsClientCredentialsScope.ALL) - .audience(recipientConnector.toString()) - .build(); - Result tokenResult = identityService.obtainClientCredentials(tokenParameters); - if (tokenResult.failed()) { - tokenResult = Result.success(TokenRepresentation.Builder.newInstance().token(NULL_TOKEN).build()); - } - DynamicAttributeToken token = new DynamicAttributeTokenBuilder() - ._tokenFormat_(TokenFormat.JWT) - ._tokenValue_(tokenResult.getContent().getToken()) - .build(); - builder._securityToken_(token); - - if (reason instanceof InvalidCorrelationMessageException) { - builder._rejectionReason_(RejectionReason.BAD_PARAMETERS); - } else if (reason instanceof MissingClientCredentialsException) { - builder._rejectionReason_(RejectionReason.INTERNAL_RECIPIENT_ERROR); - } else { - builder._rejectionReason_(RejectionReason.INTERNAL_RECIPIENT_ERROR); - } - - return builder.build(); - } - - /** - * Create IDS compliant {@link RequestInProcessMessage}. - * - * @param correlationMessage message the response is referring to - * @return RequestInProcessMessage - */ - public RequestInProcessMessage createRequestInProcessMessage(@NotNull Message correlationMessage) { - Objects.requireNonNull(correlationMessage); - - String randomMessageId = String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.MESSAGE.getValue(), - UUID.randomUUID().toString()); - - RequestInProcessMessageBuilder builder = new RequestInProcessMessageBuilder(URI.create(randomMessageId)); - - builder._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); - builder._issued_(CalendarUtil.gregorianNow()); - builder._issuerConnector_(connectorId); - builder._senderAgent_(connectorId); - - URI correlationMessageId = correlationMessage.getId(); - if (correlationMessageId == null) { - throw InvalidCorrelationMessageException.createExceptionForCorrelationIdMissing(); - } - builder._correlationMessage_(correlationMessageId); - - URI recipientAgent = correlationMessage.getSenderAgent(); - if (recipientAgent == null) { - throw InvalidCorrelationMessageException.createExceptionForSenderAgentMissing(); - } - builder._recipientAgent_(new ArrayList<>(Collections.singletonList(recipientAgent))); - - URI recipientConnector = correlationMessage.getIssuerConnector(); - if (recipientConnector == null) { - throw InvalidCorrelationMessageException.createExceptionForIssuerConnectorMissing(); - } - builder._recipientConnector_(new ArrayList<>(Collections.singletonList(recipientConnector))); - - Result tokenResult = identityService.obtainClientCredentials(TokenParameters.Builder.newInstance() - .scope(IdsClientCredentialsScope.ALL) - .audience(recipientConnector.toString()) - .build()); - if (tokenResult.failed()) { - throw new MissingClientCredentialsException(tokenResult.getFailureMessages()); - } - DynamicAttributeToken token = new DynamicAttributeTokenBuilder() - ._tokenFormat_(TokenFormat.JWT) - ._tokenValue_(tokenResult.getContent().getToken()) - .build(); - builder._securityToken_(token); - - return builder.build(); - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/IdsResponseMessageFactoryTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/IdsResponseMessageFactoryTest.java deleted file mode 100644 index 45c46f857e9..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/IdsResponseMessageFactoryTest.java +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Copyright (c) 2022 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial Implementation - * Microsoft Corporation - Use IDS Webhook address for JWT audience claim - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.message.ids; - -import de.fraunhofer.iais.eis.Message; -import de.fraunhofer.iais.eis.RejectionMessage; -import de.fraunhofer.iais.eis.RejectionReason; -import de.fraunhofer.iais.eis.TokenFormat; -import jakarta.inject.Provider; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.ids.exceptions.InvalidCorrelationMessageException; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.ids.exceptions.MissingClientCredentialsException; -import org.eclipse.dataspaceconnector.ids.spi.IdsId; -import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.transform.IdsProtocol; -import org.eclipse.dataspaceconnector.spi.EdcException; -import org.eclipse.dataspaceconnector.spi.iam.IdentityService; -import org.eclipse.dataspaceconnector.spi.iam.TokenParameters; -import org.eclipse.dataspaceconnector.spi.iam.TokenRepresentation; -import org.eclipse.dataspaceconnector.spi.result.Result; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import java.net.URI; -import java.time.Instant; -import java.util.Collections; -import java.util.Objects; -import java.util.UUID; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -import static org.mockito.ArgumentMatchers.argThat; - -public class IdsResponseMessageFactoryTest { - - private static final String CONNECTOR_ID = UUID.randomUUID().toString(); - private static final String TOKEN_VALUE = "xxxxx.yyyyy.zzzzz"; - private static final String CORRELATION_MESSAGE_ID = String.join(IdsIdParser.DELIMITER, IdsIdParser.SCHEME, IdsType.MESSAGE.getValue(), UUID.randomUUID().toString()); - private static final String CORRELATION_MESSAGE_SENDER = String.join(IdsIdParser.DELIMITER, IdsIdParser.SCHEME, IdsType.CONNECTOR.getValue(), UUID.randomUUID().toString()); - private static final String CORRELATION_ISSUER_CONNECTOR = String.join(IdsIdParser.DELIMITER, IdsIdParser.SCHEME, IdsType.CONNECTOR.getValue(), UUID.randomUUID().toString()); - - private IdsResponseMessageFactory factory; - - // mocks - private Message correlationMessage; - private IdentityService identityService; - private InvalidCorrelationMessageException exception; - - @BeforeEach - public void setup() { - identityService = Mockito.mock(IdentityService.class); - correlationMessage = Mockito.mock(Message.class); - exception = Mockito.mock(InvalidCorrelationMessageException.class); - - factory = new IdsResponseMessageFactory(CONNECTOR_ID, identityService); - - Mockito.when(correlationMessage.getId()).thenReturn(URI.create(CORRELATION_MESSAGE_ID)); - Mockito.when(correlationMessage.getSenderAgent()).thenReturn(URI.create(CORRELATION_MESSAGE_SENDER)); - Mockito.when(correlationMessage.getIssuerConnector()).thenReturn(URI.create(CORRELATION_ISSUER_CONNECTOR)); - - Mockito.when(identityService.obtainClientCredentials(tokenParametersFor(CORRELATION_ISSUER_CONNECTOR))) - .thenReturn(Result.success(TokenRepresentation.Builder.newInstance().token(TOKEN_VALUE).build())); - } - - @Test - public void testConnectorIdInvalidUrn() { - String urn = String.join(IdsIdParser.DELIMITER, IdsIdParser.SCHEME, IdsType.CONTRACT_OFFER.getValue(), CONNECTOR_ID); - - Assertions.assertThrows(EdcException.class, () -> new IdsResponseMessageFactory(urn, identityService)); - } - - @Test - public void testConnectorIdValidUrn() { - String urn = String.join(IdsIdParser.DELIMITER, IdsIdParser.SCHEME, IdsType.CONNECTOR.getValue(), CONNECTOR_ID); - - Assertions.assertDoesNotThrow(() -> new IdsResponseMessageFactory(urn, identityService)); - } - - @Test - public void testConnectorIdNoUrn() { - Assertions.assertDoesNotThrow(() -> new IdsResponseMessageFactory(CONNECTOR_ID, identityService)); - } - - @Test - public void testMessageId() { - - Consumer assertFunc = (message) -> { - IdsId messageId = IdsIdParser.parse(message.getId().toString()); - Assertions.assertNotNull(messageId); - Assertions.assertEquals(IdsType.MESSAGE, messageId.getType()); - }; - - Assertions.assertAll("message id", - () -> assertFunc.accept(factory.createRequestInProcessMessage(correlationMessage)), - () -> assertFunc.accept(factory.createRejectionMessage(correlationMessage, exception)) - ); - } - - - @Test - public void testSenderAgent() { - String expectedSenderAgent = String.join(IdsIdParser.DELIMITER, IdsIdParser.SCHEME, IdsType.CONNECTOR.getValue(), CONNECTOR_ID); - - Consumer assertFunc = (message) -> Assertions.assertEquals(expectedSenderAgent, message.getSenderAgent().toString()); - - Assertions.assertAll("sender agent", - () -> assertFunc.accept(factory.createRequestInProcessMessage(correlationMessage)), - () -> assertFunc.accept(factory.createRejectionMessage(correlationMessage, exception)) - ); - } - - @Test - public void testCorrelationMessageId() { - Consumer assertFunc = (message) -> Assertions.assertEquals(CORRELATION_MESSAGE_ID, message.getCorrelationMessage().toString()); - - Assertions.assertAll("correlation message id", - () -> assertFunc.accept(factory.createRequestInProcessMessage(correlationMessage)), - () -> assertFunc.accept(factory.createRejectionMessage(correlationMessage, exception)) - ); - } - - @Disabled // TODO enable with IDS-Serializer from issue 236 - @Test - public void testIssued() { - Consumer assertFunc = (message) -> { - boolean isOlderThanNowMinus5Sec = Instant.now().getEpochSecond() - 5 < message.getIssued().toGregorianCalendar().toZonedDateTime().toEpochSecond(); - boolean isNewerThanNowPlus5Sec = Instant.now().getEpochSecond() + 5 > message.getIssued().toGregorianCalendar().toZonedDateTime().toEpochSecond(); - - Assertions.assertTrue(isOlderThanNowMinus5Sec && isNewerThanNowPlus5Sec); - }; - - Assertions.assertAll("issued", - () -> assertFunc.accept(factory.createRequestInProcessMessage(correlationMessage)), - () -> assertFunc.accept(factory.createRejectionMessage(correlationMessage, exception)) - ); - } - - @Test - public void testSecurityTokenValue() { - Consumer assertFunc = (message) -> Assertions.assertEquals(TOKEN_VALUE, message.getSecurityToken().getTokenValue()); - - Assertions.assertAll("security token value", - () -> assertFunc.accept(factory.createRequestInProcessMessage(correlationMessage)), - () -> assertFunc.accept(factory.createRejectionMessage(correlationMessage, exception)) - ); - } - - - @Test - public void testSecurityTokenFormat() { - Consumer assertFunc = (message) -> Assertions.assertEquals(TokenFormat.JWT, message.getSecurityToken().getTokenFormat()); - - Assertions.assertAll("security token format", - () -> assertFunc.accept(factory.createRequestInProcessMessage(correlationMessage)), - () -> assertFunc.accept(factory.createRejectionMessage(correlationMessage, exception)) - ); - } - - - @Test - public void testModelVersion() { - Consumer assertFunc = (message) -> Assertions.assertEquals(IdsProtocol.INFORMATION_MODEL_VERSION, message.getModelVersion()); - - Assertions.assertAll("model version", - () -> assertFunc.accept(factory.createRequestInProcessMessage(correlationMessage)), - () -> assertFunc.accept(factory.createRejectionMessage(correlationMessage, exception)) - ); - } - - @Test - public void testCorrelationMessageNull() { - Mockito.when(correlationMessage.getId()).thenReturn(null); - - Consumer> assertFunc = (provider) -> Assertions.assertThrows(InvalidCorrelationMessageException.class, provider::get); - - // rejection message for exceptions uses a placeholder instead of throwing an exception - Consumer> assertExFunc = (provider) -> { - Message message = provider.get(); - Assertions.assertEquals(IdsResponseMessageFactory.NULL_CORRELATION_MESSAGE_ID, message.getCorrelationMessage()); - }; - - Assertions.assertAll("correlation message null", - () -> assertFunc.accept(() -> factory.createRequestInProcessMessage(correlationMessage)), - () -> assertExFunc.accept(() -> factory.createRejectionMessage(correlationMessage, exception)) - ); - } - - @Test - public void testSenderAgentNull() { - Mockito.when(correlationMessage.getSenderAgent()).thenReturn(null); - - Consumer> assertFunc = (provider) -> Assertions.assertThrows(InvalidCorrelationMessageException.class, provider::get); - - // rejection message for exceptions uses a placeholder instead of throwing an exception - Consumer> assertExFunc = (provider) -> { - Message message = provider.get(); - Assertions.assertEquals(IdsResponseMessageFactory.NULL_RECIPIENT_AGENT, message.getRecipientAgent().get(0)); - }; - - Assertions.assertAll("sender agent null", - () -> assertFunc.accept(() -> factory.createRequestInProcessMessage(correlationMessage)), - () -> assertExFunc.accept(() -> factory.createRejectionMessage(correlationMessage, exception)) - ); - } - - @Test - public void testIssuerConnectorNull() { - Mockito.when(correlationMessage.getIssuerConnector()).thenReturn(null); - Mockito.when(identityService.obtainClientCredentials(tokenParametersFor(IdsResponseMessageFactory.NULL_RECIPIENT_CONNECTOR.toString()))) - .thenReturn(Result.success(TokenRepresentation.Builder.newInstance().token(TOKEN_VALUE).build())); - - Consumer> assertFunc = (provider) -> Assertions.assertThrows(InvalidCorrelationMessageException.class, provider::get); - - // rejection message for exceptions uses a placeholder instead of throwing an exception - Consumer> assertExFunc = (provider) -> { - Message message = provider.get(); - Assertions.assertEquals(IdsResponseMessageFactory.NULL_RECIPIENT_CONNECTOR, message.getRecipientConnector().get(0)); - }; - - Assertions.assertAll("issuer connector null", - () -> assertFunc.accept(() -> factory.createRequestInProcessMessage(correlationMessage)), - () -> assertExFunc.accept(() -> factory.createRejectionMessage(correlationMessage, exception)) - ); - } - - @Test - public void testClientCredentialsMissing() { - Mockito.when(identityService.obtainClientCredentials(tokenParametersFor(CORRELATION_ISSUER_CONNECTOR))) - .thenReturn(Result.failure("foo")); - - Consumer> assertFunc = (provider) -> Assertions.assertThrows(MissingClientCredentialsException.class, provider::get); - - // rejection message for exceptions uses a placeholder instead of throwing an exception - Consumer> assertExFunc = (provider) -> { - Message message = provider.get(); - Assertions.assertEquals(IdsResponseMessageFactory.NULL_TOKEN, message.getSecurityToken().getTokenValue()); - }; - - Assertions.assertAll("client credentials missing", - () -> assertFunc.accept(() -> factory.createRequestInProcessMessage(correlationMessage)), - () -> assertExFunc.accept(() -> factory.createRejectionMessage(correlationMessage, exception)) - ); - } - - @Test - public void testRejectionReasons() { - - BiConsumer assertFunc = (exception, reason) -> { - RejectionMessage message = factory.createRejectionMessage(correlationMessage, exception); - Assertions.assertEquals(reason, message.getRejectionReason()); - }; - - Assertions.assertAll("rejection reasons", - () -> assertFunc.accept(InvalidCorrelationMessageException.createExceptionForCorrelationIdMissing(), - RejectionReason.BAD_PARAMETERS), - () -> assertFunc.accept(new MissingClientCredentialsException(Collections.emptyList()), - RejectionReason.INTERNAL_RECIPIENT_ERROR), - () -> assertFunc.accept(Mockito.mock(Exception.class), - RejectionReason.INTERNAL_RECIPIENT_ERROR) - ); - } - - private static TokenParameters tokenParametersFor(String audience) { - return argThat(t -> t != null && - Objects.equals(t.getScope(), IdsClientCredentialsScope.ALL) && - Objects.equals(t.getAudience(), audience)); - } -} From d815e25c2a7b008e2b6e59588968434e529c9e79 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Fri, 8 Jul 2022 10:55:24 +0200 Subject: [PATCH 02/45] chore: remove unused exceptions --- .../InvalidCorrelationMessageException.java | 46 ------------------- .../MissingClientCredentialsException.java | 28 ----------- 2 files changed, 74 deletions(-) delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/exceptions/InvalidCorrelationMessageException.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/exceptions/MissingClientCredentialsException.java diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/exceptions/InvalidCorrelationMessageException.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/exceptions/InvalidCorrelationMessageException.java deleted file mode 100644 index 8be186bc4ee..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/exceptions/InvalidCorrelationMessageException.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2022 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.message.ids.exceptions; - -/** - * The {@link InvalidCorrelationMessageException} is thrown when a correlation {@link de.fraunhofer.iais.eis.Message} is missing mandatory information. - */ -public class InvalidCorrelationMessageException extends RuntimeException { - - /** - * {@link InvalidCorrelationMessageException} indicating that the id of a {@link de.fraunhofer.iais.eis.Message} is null. - */ - public static InvalidCorrelationMessageException createExceptionForCorrelationIdMissing() { - return new InvalidCorrelationMessageException("Message ID of correlation message is null"); - } - - /** - * {@link InvalidCorrelationMessageException} indicating that the issuer of a {@link de.fraunhofer.iais.eis.Message} is null. - */ - public static InvalidCorrelationMessageException createExceptionForIssuerConnectorMissing() { - return new InvalidCorrelationMessageException("Issuer connector of correlation message is null"); - } - - /** - * {@link InvalidCorrelationMessageException} indicating that the sender agent of a {@link de.fraunhofer.iais.eis.Message} is null. - */ - public static InvalidCorrelationMessageException createExceptionForSenderAgentMissing() { - return new InvalidCorrelationMessageException("Sender agent of correlation message is null"); - } - - private InvalidCorrelationMessageException(String reason) { - super(reason); - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/exceptions/MissingClientCredentialsException.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/exceptions/MissingClientCredentialsException.java deleted file mode 100644 index e61e7115346..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/exceptions/MissingClientCredentialsException.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2022 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.message.ids.exceptions; - -import org.eclipse.dataspaceconnector.spi.EdcException; - -import java.util.List; - -/** - * The {@link MissingClientCredentialsException} is thrown when there is a problem obtaining client credentials. - */ -public class MissingClientCredentialsException extends EdcException { - public MissingClientCredentialsException(List messages) { - super(String.format("Missing client credentials. Problems: %s", String.join(", ", messages))); - } -} From 1ab2fc57125d615ce2cc47a10a92a27706c4fd3c Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Fri, 8 Jul 2022 12:11:23 +0200 Subject: [PATCH 03/45] chore: merge response and rejection util classes --- .../controller/MultipartController.java | 25 +-- .../handler/ArtifactRequestHandler.java | 5 +- .../handler/ContractAgreementHandler.java | 5 +- .../handler/ContractOfferHandler.java | 4 +- .../handler/ContractRejectionHandler.java | 5 +- .../handler/ContractRequestHandler.java | 6 +- .../multipart/handler/DescriptionHandler.java | 4 +- .../handler/EndpointDataReferenceHandler.java | 5 +- .../handler/NotificationMessageHandler.java | 2 +- .../handler/ResponseMessageUtil.java | 156 --------------- .../description/MultipartResponseUtil.java | 6 +- .../multipart/util/RejectionMessageUtil.java | 142 -------------- .../multipart/util/ResponseMessageUtil.java | 183 ++++++++++++++++++ ...Test.java => ResponseMessageUtilTest.java} | 50 ++--- 14 files changed, 244 insertions(+), 354 deletions(-) delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ResponseMessageUtil.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/RejectionMessageUtil.java create mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java rename data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/{RejectionMessageUtilTest.java => ResponseMessageUtilTest.java} (88%) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java index 4fdd22605c9..366e5a9774e 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java @@ -19,7 +19,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.Connector; -import de.fraunhofer.iais.eis.DynamicAttributeToken; import de.fraunhofer.iais.eis.Message; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.POST; @@ -31,11 +30,9 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.eclipse.dataspaceconnector.spi.EdcException; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; import org.eclipse.dataspaceconnector.spi.iam.IdentityService; import org.eclipse.dataspaceconnector.spi.iam.TokenRepresentation; import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.result.Result; import org.glassfish.jersey.media.multipart.FormDataBodyPart; import org.glassfish.jersey.media.multipart.FormDataMultiPart; import org.glassfish.jersey.media.multipart.FormDataParam; @@ -45,14 +42,13 @@ import java.io.InputStream; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Objects; import static java.lang.String.format; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.malformedMessage; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.messageTypeNotSupported; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.notAuthenticated; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.notFound; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.malformedMessage; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.notAuthenticated; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.notFound; @Consumes({MediaType.MULTIPART_FORM_DATA}) @Produces({MediaType.MULTIPART_FORM_DATA}) @@ -100,14 +96,19 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, if (header == null) { return Response.ok(createFormDataMultiPart(malformedMessage(null, connectorId))).build(); } + + // Check if any required field missing + if (header.getId() == null || header.getIssuerConnector() == null || header.getSenderAgent() == null) { + return Response.ok(createFormDataMultiPart(malformedMessage(header, connectorId))).build(); + } - DynamicAttributeToken dynamicAttributeToken = header.getSecurityToken(); + var dynamicAttributeToken = header.getSecurityToken(); if (dynamicAttributeToken == null || dynamicAttributeToken.getTokenValue() == null) { monitor.warning("MultipartController: Token is missing in header"); return Response.ok(createFormDataMultiPart(notAuthenticated(header, connectorId))).build(); } - Map additional = new HashMap<>(); + var additional = new HashMap(); //IDS token validation requires issuerConnector and securityProfile additional.put("issuerConnector", header.getIssuerConnector()); try { @@ -121,7 +122,7 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, .additional(additional) .build(); - Result verificationResult = identityService.verifyJwtToken(tokenRepresentation, idsWebhookAddress); + var verificationResult = identityService.verifyJwtToken(tokenRepresentation, idsWebhookAddress); if (verificationResult.failed()) { monitor.warning(format("MultipartController: Token validation failed %s", verificationResult.getFailure().getMessages())); @@ -143,7 +144,7 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, return Response.ok(createFormDataMultiPart(messageTypeNotSupported(header, connectorId))).build(); } - MultipartResponse multipartResponse = handler.handleRequest(multipartRequest, claimToken); + var multipartResponse = handler.handleRequest(multipartRequest, claimToken); if (multipartResponse != null) { return Response.ok(createFormDataMultiPart(multipartResponse)).build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index a72b62d97db..24a43265409 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -40,7 +40,8 @@ import java.util.Objects; import java.util.Optional; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createDummyResponse; import static org.eclipse.dataspaceconnector.ids.spi.IdsConstants.IDS_WEBHOOK_ADDRESS_PROPERTY; public class ArtifactRequestHandler implements Handler { @@ -160,7 +161,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } return MultipartResponse.Builder.newInstance() - .header(ResponseMessageUtil.createDummyResponse(connectorId, artifactRequestMessage)) // TODO Change this response so that it matches our UML pictures + .header(createDummyResponse(connectorId, artifactRequestMessage)) // TODO Change this response so that it matches our UML pictures .build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java index 5e5fb03227e..1557abcb4e5 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java @@ -32,7 +32,8 @@ import java.io.IOException; import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createMessageProcessedNotificationMessage; /** * This class handles and processes incoming IDS {@link ContractAgreementMessage}s. @@ -115,7 +116,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } return MultipartResponse.Builder.newInstance() - .header(ResponseMessageUtil.createMessageProcessedNotificationMessage(connectorId, message)) + .header(createMessageProcessedNotificationMessage(connectorId, message)) .build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java index e43513176e4..4ac559a0902 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java @@ -31,8 +31,8 @@ import java.io.IOException; import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.messageTypeNotSupported; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; /** * This class handles and processes incoming IDS {@link ContractOfferMessage}s. diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java index c0ad3bf7d2a..c1be79aab0b 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java @@ -27,7 +27,8 @@ import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createMessageProcessedNotificationMessage; /** * This class handles and processes incoming IDS {@link ContractRejectionMessage}s. @@ -85,7 +86,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } return MultipartResponse.Builder.newInstance() - .header(ResponseMessageUtil.createMessageProcessedNotificationMessage(connectorId, message)) + .header(createMessageProcessedNotificationMessage(connectorId, message)) .build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java index c0cef90cb58..40fd0c5325f 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java @@ -38,9 +38,9 @@ import java.io.IOException; import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.ResponseMessageUtil.createRequestInProcessMessage; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.internalRecipientError; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createRequestInProcessMessage; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.internalRecipientError; import static org.eclipse.dataspaceconnector.ids.spi.IdsConstants.IDS_WEBHOOK_ADDRESS_PROPERTY; /** diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java index 7f45bf4face..8db7b9383f4 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java @@ -33,8 +33,8 @@ import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.messageTypeNotSupported; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; public class DescriptionHandler implements Handler { private final Monitor monitor; diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java index 2132bce0fa7..47859ef8354 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java @@ -29,7 +29,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.internalRecipientError; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createMessageProcessedNotificationMessage; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.internalRecipientError; /** * Implementation of the {@link Handler} class for handling of {@link EndpointDataReferenceMessage}. @@ -84,7 +85,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } return MultipartResponse.Builder.newInstance() - .header(ResponseMessageUtil.createMessageProcessedNotificationMessage(connectorId, multipartRequest.getHeader())) + .header(createMessageProcessedNotificationMessage(connectorId, multipartRequest.getHeader())) .build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java index 7ad0a0f7c65..04c48e40dea 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java @@ -22,7 +22,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.messageTypeNotSupported; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; /** * Implementation of the {@link Handler} class for handling of {@link NotificationMessage} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ResponseMessageUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ResponseMessageUtil.java deleted file mode 100644 index 7d362efa07a..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ResponseMessageUtil.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH, Fraunhofer Institute for Software and Systems Engineering - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * Fraunhofer Institute for Software and Systems Engineering - additional message building methods - * Daimler TSS GmbH - introduce factory to create RequestInProcessMessage - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler; - -import de.fraunhofer.iais.eis.Message; -import de.fraunhofer.iais.eis.MessageProcessedNotificationMessageBuilder; -import de.fraunhofer.iais.eis.NotificationMessage; -import de.fraunhofer.iais.eis.RequestInProcessMessageBuilder; -import de.fraunhofer.iais.eis.ResponseMessage; -import de.fraunhofer.iais.eis.ResponseMessageBuilder; -import org.eclipse.dataspaceconnector.ids.core.util.CalendarUtil; -import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.transform.IdsProtocol; -import org.jetbrains.annotations.Nullable; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.UUID; - -class ResponseMessageUtil { - - public static ResponseMessage createDummyResponse( - @Nullable String connectorId, - @Nullable Message correlationMessage) { - URI messageId = getMessageId(); - ResponseMessageBuilder builder = new ResponseMessageBuilder(messageId); - - builder._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); - builder._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); - builder._issued_(CalendarUtil.gregorianNow()); - - URI connectorIdUri = getConnectorUrn(connectorId); - - builder._issuerConnector_(connectorIdUri); - builder._senderAgent_(connectorIdUri); - - if (correlationMessage != null) { - URI id = correlationMessage.getId(); - if (id != null) { - builder._correlationMessage_(id); - } - - URI senderAgent = correlationMessage.getSenderAgent(); - if (senderAgent != null) { - builder._recipientAgent_(new ArrayList<>(Collections.singletonList(senderAgent))); - } - - URI issuerConnector = correlationMessage.getIssuerConnector(); - if (issuerConnector != null) { - builder._recipientConnector_(new ArrayList<>(Collections.singletonList(issuerConnector))); - } - } - - return builder.build(); - } - - public static NotificationMessage createMessageProcessedNotificationMessage( - @Nullable String connectorId, - @Nullable Message correlationMessage) { - var messageId = getMessageId(); - var builder = new MessageProcessedNotificationMessageBuilder(messageId); - - builder._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); - builder._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); - - var connectorIdUri = getConnectorUrn(connectorId); - - builder._issuerConnector_(connectorIdUri); - builder._senderAgent_(connectorIdUri); - builder._issued_(CalendarUtil.gregorianNow()); - - if (correlationMessage != null) { - var id = correlationMessage.getId(); - if (id != null) { - builder._correlationMessage_(id); - } - - var senderAgent = correlationMessage.getSenderAgent(); - if (senderAgent != null) { - builder._recipientAgent_(new ArrayList<>(Collections.singletonList(senderAgent))); - } - - var issuerConnector = correlationMessage.getIssuerConnector(); - if (issuerConnector != null) { - builder._recipientConnector_(new ArrayList<>(Collections.singletonList(issuerConnector))); - } - } - - return builder.build(); - } - - public static NotificationMessage createRequestInProcessMessage(@Nullable String connectorId, - @Nullable Message correlationMessage) { - var messageId = getMessageId(); - var builder = new RequestInProcessMessageBuilder(messageId); - - builder._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); - builder._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); - - var connectorIdUri = getConnectorUrn(connectorId); - - builder._issuerConnector_(connectorIdUri); - builder._senderAgent_(connectorIdUri); - - if (correlationMessage != null) { - var id = correlationMessage.getId(); - if (id != null) { - builder._correlationMessage_(id); - } - - var senderAgent = correlationMessage.getSenderAgent(); - if (senderAgent != null) { - builder._recipientAgent_(new ArrayList<>(Collections.singletonList(senderAgent))); - } - - var issuerConnector = correlationMessage.getIssuerConnector(); - if (issuerConnector != null) { - builder._recipientConnector_(new ArrayList<>(Collections.singletonList(issuerConnector))); - } - } - - return builder.build(); - } - - private static URI getMessageId() { - return URI.create(String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.MESSAGE.getValue(), - UUID.randomUUID().toString())); - } - - private static URI getConnectorUrn(String connectorId) { - return URI.create(String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.CONNECTOR.getValue(), - connectorId)); - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartResponseUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartResponseUtil.java index 113a1635465..9200afe5111 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartResponseUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartResponseUtil.java @@ -18,9 +18,9 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.jetbrains.annotations.Nullable; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.messageTypeNotSupported; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RejectionMessageUtil.notFound; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.notFound; class MultipartResponseUtil { diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/RejectionMessageUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/RejectionMessageUtil.java deleted file mode 100644 index 7c03b616ab7..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/RejectionMessageUtil.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.util; - -import de.fraunhofer.iais.eis.Message; -import de.fraunhofer.iais.eis.RejectionMessage; -import de.fraunhofer.iais.eis.RejectionMessageBuilder; -import de.fraunhofer.iais.eis.RejectionReason; -import org.eclipse.dataspaceconnector.ids.core.util.CalendarUtil; -import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.transform.IdsProtocol; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.UUID; - -public final class RejectionMessageUtil { - - private RejectionMessageUtil() { - } - - @NotNull - public static RejectionMessage notFound( - @Nullable Message correlationMessage, @Nullable String connectorId) { - return createRejectionMessageBuilder(correlationMessage, connectorId) - ._rejectionReason_(RejectionReason.NOT_FOUND) - .build(); - } - - @NotNull - public static RejectionMessage notAuthenticated( - @Nullable Message correlationMessage, @Nullable String connectorId) { - return createRejectionMessageBuilder(correlationMessage, connectorId) - ._rejectionReason_(RejectionReason.NOT_AUTHENTICATED) - .build(); - } - - @NotNull - public static RejectionMessage notAuthorized( - @Nullable Message correlationMessage, @Nullable String connectorId) { - return createRejectionMessageBuilder(correlationMessage, connectorId) - ._rejectionReason_(RejectionReason.NOT_AUTHORIZED) - .build(); - } - - @NotNull - public static RejectionMessage malformedMessage( - @Nullable Message correlationMessage, @Nullable String connectorId) { - return createRejectionMessageBuilder(correlationMessage, connectorId) - ._rejectionReason_(RejectionReason.MALFORMED_MESSAGE) - .build(); - } - - @NotNull - public static RejectionMessage messageTypeNotSupported( - @Nullable Message correlationMessage, @Nullable String connectorId) { - return createRejectionMessageBuilder(correlationMessage, connectorId) - ._rejectionReason_(RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED) - .build(); - } - - @NotNull - public static RejectionMessage badParameters( - @Nullable Message correlationMessage, @Nullable String connectorId) { - return createRejectionMessageBuilder(correlationMessage, connectorId) - ._rejectionReason_(RejectionReason.BAD_PARAMETERS) - .build(); - } - - @NotNull - public static RejectionMessage internalRecipientError( - @Nullable Message correlationMessage, @Nullable String connectorId) { - return createRejectionMessageBuilder(correlationMessage, connectorId) - ._rejectionReason_(RejectionReason.INTERNAL_RECIPIENT_ERROR) - .build(); - } - - @NotNull - private static RejectionMessageBuilder createRejectionMessageBuilder( - @Nullable Message correlationMessage, @Nullable String connectorId) { - - String id = String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.MESSAGE.getValue(), - UUID.randomUUID().toString()); - - RejectionMessageBuilder builder = new RejectionMessageBuilder(URI.create(id)); - - builder._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); - builder._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); - builder._issued_(CalendarUtil.gregorianNow()); - - if (connectorId != null) { - connectorId = String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.CONNECTOR.getValue(), - connectorId); - - URI connectorIdUri = URI.create(connectorId); - - builder._issuerConnector_(connectorIdUri); - builder._senderAgent_(connectorIdUri); - } - - if (correlationMessage != null) { - URI correlationMessageId = correlationMessage.getId(); - if (correlationMessageId != null) { - builder._correlationMessage_(correlationMessageId); - } - - URI senderAgent = correlationMessage.getSenderAgent(); - if (senderAgent != null) { - builder._recipientAgent_(new ArrayList<>(Collections.singletonList(senderAgent))); - } - - URI issuerConnector = correlationMessage.getIssuerConnector(); - if (issuerConnector != null) { - builder._recipientConnector_(new ArrayList<>(Collections.singletonList(issuerConnector))); - } - } - - return builder; - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java new file mode 100644 index 00000000000..3a92ea129aa --- /dev/null +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2021 Daimler TSS GmbH, Fraunhofer Institute for Software and Systems Engineering + * + * 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: + * Daimler TSS GmbH - Initial API and Implementation + * Fraunhofer Institute for Software and Systems Engineering - additional message building methods + * Daimler TSS GmbH - introduce factory to create RequestInProcessMessage + * + */ + +package org.eclipse.dataspaceconnector.ids.api.multipart.util; + +import de.fraunhofer.iais.eis.Message; +import de.fraunhofer.iais.eis.MessageProcessedNotificationMessageBuilder; +import de.fraunhofer.iais.eis.NotificationMessage; +import de.fraunhofer.iais.eis.RejectionMessage; +import de.fraunhofer.iais.eis.RejectionMessageBuilder; +import de.fraunhofer.iais.eis.RejectionReason; +import de.fraunhofer.iais.eis.RequestInProcessMessageBuilder; +import de.fraunhofer.iais.eis.ResponseMessage; +import de.fraunhofer.iais.eis.ResponseMessageBuilder; +import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; +import org.eclipse.dataspaceconnector.ids.spi.IdsType; +import org.eclipse.dataspaceconnector.ids.transform.IdsProtocol; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.net.URI; +import java.util.ArrayList; +import java.util.Collections; +import java.util.UUID; + +public class ResponseMessageUtil { + + public static ResponseMessage createDummyResponse( + @NotNull String connectorId, + @NotNull Message correlationMessage) { + var messageId = getMessageId(); + var connectorIdUri = getConnectorUrn(connectorId); + + return new ResponseMessageBuilder(messageId) + ._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._issuerConnector_(connectorIdUri) + ._senderAgent_(connectorIdUri) + ._correlationMessage_(correlationMessage.getId()) + ._recipientConnector_(new ArrayList<>(Collections.singletonList(correlationMessage.getIssuerConnector()))) + .build(); + } + + public static NotificationMessage createMessageProcessedNotificationMessage( + @NotNull String connectorId, + @NotNull Message correlationMessage) { + var messageId = getMessageId(); + var connectorIdUri = getConnectorUrn(connectorId); + + return new MessageProcessedNotificationMessageBuilder(messageId) + ._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._issuerConnector_(connectorIdUri) + ._senderAgent_(connectorIdUri) + ._correlationMessage_(correlationMessage.getId()) + ._recipientConnector_(new ArrayList<>(Collections.singletonList(correlationMessage.getIssuerConnector()))) + .build(); + } + + public static NotificationMessage createRequestInProcessMessage(@NotNull String connectorId, + @NotNull Message correlationMessage) { + var messageId = getMessageId(); + var connectorIdUri = getConnectorUrn(connectorId); + + return new RequestInProcessMessageBuilder(messageId) + ._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._issuerConnector_(connectorIdUri) + ._senderAgent_(connectorIdUri) + ._correlationMessage_(correlationMessage.getId()) + ._recipientConnector_(new ArrayList<>(Collections.singletonList(correlationMessage.getIssuerConnector()))) + .build(); + } + + @NotNull + public static RejectionMessage notFound( + @NotNull Message correlationMessage, @NotNull String connectorId) { + return createRejectionMessageBuilder(correlationMessage, connectorId) + ._rejectionReason_(RejectionReason.NOT_FOUND) + .build(); + } + + @NotNull + public static RejectionMessage notAuthenticated( + @NotNull Message correlationMessage, @NotNull String connectorId) { + return createRejectionMessageBuilder(correlationMessage, connectorId) + ._rejectionReason_(RejectionReason.NOT_AUTHENTICATED) + .build(); + } + + @NotNull + public static RejectionMessage notAuthorized( + @NotNull Message correlationMessage, @NotNull String connectorId) { + return createRejectionMessageBuilder(correlationMessage, connectorId) + ._rejectionReason_(RejectionReason.NOT_AUTHORIZED) + .build(); + } + + @NotNull + public static RejectionMessage malformedMessage( + @Nullable Message correlationMessage, @NotNull String connectorId) { + return createRejectionMessageBuilder(correlationMessage, connectorId) + ._rejectionReason_(RejectionReason.MALFORMED_MESSAGE) + .build(); + } + + @NotNull + public static RejectionMessage messageTypeNotSupported( + @NotNull Message correlationMessage, @NotNull String connectorId) { + return createRejectionMessageBuilder(correlationMessage, connectorId) + ._rejectionReason_(RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED) + .build(); + } + + @NotNull + public static RejectionMessage badParameters( + @NotNull Message correlationMessage, @NotNull String connectorId) { + return createRejectionMessageBuilder(correlationMessage, connectorId) + ._rejectionReason_(RejectionReason.BAD_PARAMETERS) + .build(); + } + + @NotNull + public static RejectionMessage internalRecipientError( + @NotNull Message correlationMessage, @NotNull String connectorId) { + return createRejectionMessageBuilder(correlationMessage, connectorId) + ._rejectionReason_(RejectionReason.INTERNAL_RECIPIENT_ERROR) + .build(); + } + + @NotNull + private static RejectionMessageBuilder createRejectionMessageBuilder( + @Nullable Message correlationMessage, @NotNull String connectorId) { + + var messageId = getMessageId(); + var connectorIdUri = getConnectorUrn(connectorId); + + var builder = new RejectionMessageBuilder(messageId) + ._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._issuerConnector_(connectorIdUri) + ._senderAgent_(connectorIdUri); + + //builder._issued_(CalendarUtil.gregorianNow()); TODO once https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/236 is done + + if (correlationMessage != null) { + builder._correlationMessage_(correlationMessage.getId()); + builder._recipientAgent_(new ArrayList<>(Collections.singletonList(correlationMessage.getSenderAgent()))); + builder._recipientConnector_(new ArrayList<>(Collections.singletonList(correlationMessage.getIssuerConnector()))); + } + + return builder; + } + + private static URI getMessageId() { + return URI.create(String.join( + IdsIdParser.DELIMITER, + IdsIdParser.SCHEME, + IdsType.MESSAGE.getValue(), + UUID.randomUUID().toString())); + } + + private static URI getConnectorUrn(String connectorId) { + return URI.create(String.join( + IdsIdParser.DELIMITER, + IdsIdParser.SCHEME, + IdsType.CONNECTOR.getValue(), + connectorId)); + } +} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/RejectionMessageUtilTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtilTest.java similarity index 88% rename from data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/RejectionMessageUtilTest.java rename to data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtilTest.java index 98a5aff72fc..583e2013465 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/RejectionMessageUtilTest.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtilTest.java @@ -30,7 +30,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -class RejectionMessageUtilTest { +class ResponseMessageUtilTest { private final String connectorId = "38bfeade-3566-11ec-8d3d-0242ac130003"; private final URI connectorIdUri = URI.create("urn:connector:" + connectorId); private final URI correlationMessageId = URI.create("urn:message:7c35205e-3566-11ec-8d3d-0242ac130003"); @@ -57,27 +57,27 @@ void tearDown() { @Test public void testNotFound() { - var rejectionMessage = RejectionMessageUtil + var rejectionMessage = ResponseMessageUtil .notFound(null, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_FOUND); // just correlationMessage, no connectorId - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .notFound(correlationMessage, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_FOUND); assertCorrelationMessagePropertiesMapped(rejectionMessage); // no correlationMessage, just connectorId - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .notFound(null, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_FOUND); assertConnectorIdPropertiesMapped(rejectionMessage); // both correlationMessage and connectorId - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .notFound(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_FOUND); @@ -87,24 +87,24 @@ public void testNotFound() { @Test public void testNotAuthenticated() { - var rejectionMessage = RejectionMessageUtil + var rejectionMessage = ResponseMessageUtil .notAuthenticated(null, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHENTICATED); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .notAuthenticated(correlationMessage, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHENTICATED); assertCorrelationMessagePropertiesMapped(rejectionMessage); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .notAuthenticated(null, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHENTICATED); assertConnectorIdPropertiesMapped(rejectionMessage); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .notAuthenticated(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHENTICATED); @@ -114,24 +114,24 @@ public void testNotAuthenticated() { @Test public void testNotAuthorized() { - var rejectionMessage = RejectionMessageUtil + var rejectionMessage = ResponseMessageUtil .notAuthorized(null, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHORIZED); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .notAuthorized(correlationMessage, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHORIZED); assertCorrelationMessagePropertiesMapped(rejectionMessage); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .notAuthorized(null, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHORIZED); assertConnectorIdPropertiesMapped(rejectionMessage); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .notAuthorized(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHORIZED); @@ -141,25 +141,25 @@ public void testNotAuthorized() { @Test public void testMalformedMessage() { - var rejectionMessage = RejectionMessageUtil + var rejectionMessage = ResponseMessageUtil .malformedMessage(null, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MALFORMED_MESSAGE); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .malformedMessage(correlationMessage, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MALFORMED_MESSAGE); assertCorrelationMessagePropertiesMapped(rejectionMessage); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .malformedMessage(null, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MALFORMED_MESSAGE); assertConnectorIdPropertiesMapped(rejectionMessage); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .malformedMessage(correlationMessage, connectorId); @@ -170,25 +170,25 @@ public void testMalformedMessage() { @Test public void testMessageTypeNotSupported() { - var rejectionMessage = RejectionMessageUtil + var rejectionMessage = ResponseMessageUtil .messageTypeNotSupported(null, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .messageTypeNotSupported(correlationMessage, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED); assertCorrelationMessagePropertiesMapped(rejectionMessage); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .messageTypeNotSupported(null, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED); assertConnectorIdPropertiesMapped(rejectionMessage); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .messageTypeNotSupported(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED); @@ -198,24 +198,24 @@ public void testMessageTypeNotSupported() { @Test public void testInternalRecipientError() { - var rejectionMessage = RejectionMessageUtil + var rejectionMessage = ResponseMessageUtil .internalRecipientError(null, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.INTERNAL_RECIPIENT_ERROR); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .internalRecipientError(correlationMessage, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.INTERNAL_RECIPIENT_ERROR); assertCorrelationMessagePropertiesMapped(rejectionMessage); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .internalRecipientError(null, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.INTERNAL_RECIPIENT_ERROR); assertConnectorIdPropertiesMapped(rejectionMessage); - rejectionMessage = RejectionMessageUtil + rejectionMessage = ResponseMessageUtil .internalRecipientError(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.INTERNAL_RECIPIENT_ERROR); From 034dc7346773368be1e9635cd026e4344a2259de Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Mon, 11 Jul 2022 08:46:30 +0200 Subject: [PATCH 04/45] chore: remove class IdsClientCredentialsScope --- .../ids/IdsClientCredentialsScope.java | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/IdsClientCredentialsScope.java diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/IdsClientCredentialsScope.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/IdsClientCredentialsScope.java deleted file mode 100644 index 252dcd6788c..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/ids/IdsClientCredentialsScope.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2022 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.message.ids; - -public class IdsClientCredentialsScope { - public static final String ALL = "idsc:IDS_CONNECTOR_ATTRIBUTES_ALL"; -} From 42b1156310ffa56b3a2dc5a605f8485417ba723f Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Mon, 11 Jul 2022 15:37:25 +0200 Subject: [PATCH 05/45] chore: do not use description sub-handlers --- .../IdsMultipartApiServiceExtension.java | 22 +-- .../multipart/handler/DescriptionHandler.java | 130 ++++++++++++------ .../DescriptionResponseMessageUtil.java | 2 +- .../description/MultipartResponseUtil.java | 2 +- 4 files changed, 95 insertions(+), 61 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java index 1d40ee4520b..a162d14e34e 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java @@ -30,11 +30,6 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.handler.Handler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.NotificationMessageHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.NotificationMessageHandlerRegistry; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.ArtifactDescriptionRequestHandler; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.ConnectorDescriptionRequestHandler; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DataCatalogDescriptionRequestHandler; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.RepresentationDescriptionRequestHandler; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.ResourceDescriptionRequestHandler; import org.eclipse.dataspaceconnector.ids.core.serialization.ObjectMapperFactory; import org.eclipse.dataspaceconnector.ids.spi.IdsId; import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; @@ -127,13 +122,6 @@ private void registerControllers(ServiceExtensionContext serviceExtensionContext var connectorId = resolveConnectorId(serviceExtensionContext); - // create description request handlers - var artifactDescriptionRequestHandler = new ArtifactDescriptionRequestHandler(monitor, connectorId, assetIndex, transformerRegistry); - var dataCatalogDescriptionRequestHandler = new DataCatalogDescriptionRequestHandler(monitor, connectorId, dataCatalogService, transformerRegistry); - var representationDescriptionRequestHandler = new RepresentationDescriptionRequestHandler(monitor, connectorId, assetIndex, transformerRegistry); - var resourceDescriptionRequestHandler = new ResourceDescriptionRequestHandler(monitor, connectorId, assetIndex, contractOfferService, transformerRegistry); - var connectorDescriptionRequestHandler = new ConnectorDescriptionRequestHandler(monitor, connectorId, connectorService, transformerRegistry); - // create & register controller // TODO ObjectMapper needs to be replaced by one capable to write proper IDS JSON-LD // once https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/236 is done @@ -141,14 +129,8 @@ private void registerControllers(ServiceExtensionContext serviceExtensionContext // create request handler var descriptionHandler = new DescriptionHandler( - monitor, - connectorId, - transformerRegistry, - artifactDescriptionRequestHandler, - dataCatalogDescriptionRequestHandler, - representationDescriptionRequestHandler, - resourceDescriptionRequestHandler, - connectorDescriptionRequestHandler); + monitor, connectorId, transformerRegistry, + assetIndex, dataCatalogService, contractOfferService, connectorService); var handlers = new LinkedList(); handlers.add(descriptionHandler); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java index 8db7b9383f4..7d0c4a65e22 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java @@ -14,55 +14,67 @@ package org.eclipse.dataspaceconnector.ids.api.multipart.handler; +import de.fraunhofer.iais.eis.Artifact; +import de.fraunhofer.iais.eis.Connector; import de.fraunhofer.iais.eis.DescriptionRequestMessage; import de.fraunhofer.iais.eis.Message; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.ArtifactDescriptionRequestHandler; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.ConnectorDescriptionRequestHandler; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DataCatalogDescriptionRequestHandler; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.RepresentationDescriptionRequestHandler; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.ResourceDescriptionRequestHandler; +import de.fraunhofer.iais.eis.ModelClass; +import de.fraunhofer.iais.eis.Representation; +import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.iais.eis.ResourceCatalog; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.eclipse.dataspaceconnector.ids.spi.IdsId; import org.eclipse.dataspaceconnector.ids.spi.IdsType; +import org.eclipse.dataspaceconnector.ids.spi.service.CatalogService; +import org.eclipse.dataspaceconnector.ids.spi.service.ConnectorService; import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; +import org.eclipse.dataspaceconnector.ids.spi.types.container.OfferedAsset; import org.eclipse.dataspaceconnector.spi.EdcException; +import org.eclipse.dataspaceconnector.spi.asset.AssetIndex; +import org.eclipse.dataspaceconnector.spi.contract.offer.ContractOfferQuery; +import org.eclipse.dataspaceconnector.spi.contract.offer.ContractOfferService; import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; +import org.eclipse.dataspaceconnector.spi.message.Range; import org.eclipse.dataspaceconnector.spi.monitor.Monitor; +import org.eclipse.dataspaceconnector.spi.query.Criterion; +import org.eclipse.dataspaceconnector.spi.result.Result; +import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; import org.jetbrains.annotations.NotNull; import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; +import static java.lang.String.format; +import static java.util.stream.Collectors.toList; +import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DescriptionResponseMessageUtil.createDescriptionResponseMessage; +import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartRequestUtil.getInt; +import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartResponseUtil.createBadParametersErrorMultipartResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; public class DescriptionHandler implements Handler { private final Monitor monitor; private final String connectorId; private final IdsTransformerRegistry transformerRegistry; - private final ArtifactDescriptionRequestHandler artifactDescriptionRequestHandler; - private final DataCatalogDescriptionRequestHandler dataCatalogDescriptionRequestHandler; - private final RepresentationDescriptionRequestHandler representationDescriptionRequestHandler; - private final ResourceDescriptionRequestHandler resourceDescriptionRequestHandler; - private final ConnectorDescriptionRequestHandler connectorDescriptionRequestHandler; + private final AssetIndex assetIndex; + private final CatalogService catalogService; + private final ContractOfferService contractOfferService; + private final ConnectorService connectorService; public DescriptionHandler( @NotNull Monitor monitor, @NotNull String connectorId, @NotNull IdsTransformerRegistry transformerRegistry, - @NotNull ArtifactDescriptionRequestHandler artifactDescriptionRequestHandler, - @NotNull DataCatalogDescriptionRequestHandler dataCatalogDescriptionRequestHandler, - @NotNull RepresentationDescriptionRequestHandler representationDescriptionRequestHandler, - @NotNull ResourceDescriptionRequestHandler resourceDescriptionRequestHandler, - @NotNull ConnectorDescriptionRequestHandler connectorDescriptionRequestHandler) { + @NotNull AssetIndex assetIndex, + @NotNull CatalogService catalogService, + @NotNull ContractOfferService contractOfferService, + @NotNull ConnectorService connectorService) { this.monitor = Objects.requireNonNull(monitor); this.connectorId = Objects.requireNonNull(connectorId); this.transformerRegistry = Objects.requireNonNull(transformerRegistry); - this.artifactDescriptionRequestHandler = Objects.requireNonNull(artifactDescriptionRequestHandler); - this.dataCatalogDescriptionRequestHandler = Objects.requireNonNull(dataCatalogDescriptionRequestHandler); - this.representationDescriptionRequestHandler = Objects.requireNonNull(representationDescriptionRequestHandler); - this.resourceDescriptionRequestHandler = Objects.requireNonNull(resourceDescriptionRequestHandler); - this.connectorDescriptionRequestHandler = Objects.requireNonNull(connectorDescriptionRequestHandler); + this.assetIndex = Objects.requireNonNull(assetIndex); + this.catalogService = Objects.requireNonNull(catalogService); + this.contractOfferService = Objects.requireNonNull(contractOfferService); + this.connectorService = Objects.requireNonNull(connectorService); } @Override @@ -81,7 +93,7 @@ public MultipartResponse handleRequest(@NotNull MultipartRequest multipartReques try { return handleRequestInternal(multipartRequest, claimToken); } catch (EdcException exception) { - monitor.severe(String.format("Could not handle multipart request: %s", exception.getMessage()), exception); + monitor.severe(format("Could not handle multipart request: %s", exception.getMessage()), exception); } return createErrorMultipartResponse(multipartRequest.getHeader()); @@ -94,49 +106,89 @@ public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipa var descriptionRequestMessage = (DescriptionRequestMessage) multipartRequest.getHeader(); - var payload = multipartRequest.getPayload(); - var requestedElement = descriptionRequestMessage.getRequestedElement(); IdsId idsId = null; if (requestedElement != null) { var result = transformerRegistry.transform(requestedElement, IdsId.class); if (result.failed()) { monitor.warning( - String.format( + format( "Could not transform URI to IdsId: [%s]", String.join(", ", result.getFailureMessages()) ) ); - return createBadParametersErrorMultipartResponse(descriptionRequestMessage); + return createBadParametersErrorMultipartResponse(connectorId, descriptionRequestMessage); } idsId = result.getContent(); } - + + //TODO: IDS REFACTORING: this should be a named property of the message object + // extract paging information, default to 0 ... Integer.MAX_VALUE + var from = getInt(descriptionRequestMessage, Range.FROM, 0); + var to = getInt(descriptionRequestMessage, Range.TO, Integer.MAX_VALUE); + var range = new Range(from, to); + + Result requestedElementResult; + if (idsId == null || (idsId.getType() == IdsType.CONNECTOR)) { - return connectorDescriptionRequestHandler.handle(descriptionRequestMessage, claimToken, payload); + requestedElementResult = retrieveConnector(claimToken, range); + } else { + requestedElementResult = retrieveRequestedElement(idsId, claimToken, range); + } + + if (requestedElementResult.failed()) { + if (idsId == null) { + monitor.warning(String.format("Could not construct connector description: [%s]", + String.join(", ", requestedElementResult.getFailureMessages()))); + } else { + monitor.warning(String.format("Could not retrieve requested element with ID %s:%s: [%s]", + idsId.getType(), idsId.getValue(), String.join(", ", requestedElementResult.getFailureMessages()))); + } + + return createBadParametersErrorMultipartResponse(connectorId, descriptionRequestMessage); } + + var descriptionResponseMessage = createDescriptionResponseMessage(connectorId, descriptionRequestMessage); + + return MultipartResponse.Builder.newInstance() + .header(descriptionResponseMessage) + .payload(requestedElementResult.getContent()) + .build(); + } + + private Result retrieveConnector(ClaimToken claimToken, Range range) { + return transformerRegistry.transform(connectorService.getConnector(claimToken, range), de.fraunhofer.iais.eis.Connector.class); + } + + private Result retrieveRequestedElement(IdsId idsId, ClaimToken claimToken, Range range) { var type = idsId.getType(); switch (type) { case ARTIFACT: - return artifactDescriptionRequestHandler.handle(descriptionRequestMessage, claimToken, payload); + return transformerRegistry.transform(assetIndex.findById(idsId.getValue()), Artifact.class); case CATALOG: - return dataCatalogDescriptionRequestHandler.handle(descriptionRequestMessage, claimToken, payload); + return transformerRegistry.transform(catalogService.getDataCatalog(claimToken, range), ResourceCatalog.class); case REPRESENTATION: - return representationDescriptionRequestHandler.handle(descriptionRequestMessage, claimToken, payload); + return transformerRegistry.transform(assetIndex.findById(idsId.getValue()), Representation.class); case RESOURCE: - return resourceDescriptionRequestHandler.handle(descriptionRequestMessage, claimToken, payload); + var assetId = idsId.getValue(); + var asset = assetIndex.findById(assetId); + if (asset == null) { + return Result.failure(format("Asset with ID %s does not exist.", assetId)); + } + + var contractOfferQuery = ContractOfferQuery.Builder.newInstance() + .claimToken(claimToken) + .criterion(new Criterion(Asset.PROPERTY_ID, "=", assetId)) + .build(); + var targetingContractOffers = contractOfferService.queryContractOffers(contractOfferQuery, range).collect(toList()); + + return transformerRegistry.transform(new OfferedAsset(asset, targetingContractOffers), Resource.class); default: - return createErrorMultipartResponse(descriptionRequestMessage); + return Result.failure(format("Unknown requested element type: %s", type)); } } - private MultipartResponse createBadParametersErrorMultipartResponse(Message message) { - return MultipartResponse.Builder.newInstance() - .header(badParameters(message, connectorId)) - .build(); - } - private MultipartResponse createErrorMultipartResponse(Message message) { return MultipartResponse.Builder.newInstance() .header(messageTypeNotSupported(message, connectorId)) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionResponseMessageUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionResponseMessageUtil.java index 24f84989a4f..e97fd912bb4 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionResponseMessageUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionResponseMessageUtil.java @@ -28,7 +28,7 @@ import java.util.Collections; import java.util.UUID; -class DescriptionResponseMessageUtil { +public class DescriptionResponseMessageUtil { public static DescriptionResponseMessage createDescriptionResponseMessage( @Nullable String connectorId, diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartResponseUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartResponseUtil.java index 9200afe5111..bc4dc299e0c 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartResponseUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartResponseUtil.java @@ -22,7 +22,7 @@ import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.notFound; -class MultipartResponseUtil { +public class MultipartResponseUtil { public static MultipartResponse createBadParametersErrorMultipartResponse(@Nullable String connectorId, @Nullable Message message) { return MultipartResponse.Builder.newInstance() From 6cfd5d7db01dd0447702849d2ab17abbd5b9fd6f Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 12 Jul 2022 09:13:32 +0200 Subject: [PATCH 06/45] chore: remove sub-handler classes --- .../multipart/handler/DescriptionHandler.java | 58 ++++++--- .../ArtifactDescriptionRequestHandler.java | 52 -------- .../ConnectorDescriptionRequestHandler.java | 108 --------------- .../DataCatalogDescriptionRequestHandler.java | 51 -------- .../PageableDescriptionRequestHandler.java | 123 ------------------ ...presentationDescriptionRequestHandler.java | 52 -------- .../ResourceDescriptionRequestHandler.java | 75 ----------- 7 files changed, 39 insertions(+), 480 deletions(-) delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ArtifactDescriptionRequestHandler.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ConnectorDescriptionRequestHandler.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DataCatalogDescriptionRequestHandler.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/PageableDescriptionRequestHandler.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/RepresentationDescriptionRequestHandler.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ResourceDescriptionRequestHandler.java diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java index 7d0c4a65e22..34e06536ed2 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java @@ -9,6 +9,7 @@ * * Contributors: * Daimler TSS GmbH - Initial API and Implementation + * Fraunhofer Institute for Software and Systems Engineering - refactoring * */ @@ -49,6 +50,7 @@ import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DescriptionResponseMessageUtil.createDescriptionResponseMessage; import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartRequestUtil.getInt; import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartResponseUtil.createBadParametersErrorMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartResponseUtil.createNotFoundErrorMultipartResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; public class DescriptionHandler implements Handler { @@ -109,18 +111,18 @@ public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipa var requestedElement = descriptionRequestMessage.getRequestedElement(); IdsId idsId = null; if (requestedElement != null) { - var result = transformerRegistry.transform(requestedElement, IdsId.class); - if (result.failed()) { + var idsIdResult = transformerRegistry.transform(requestedElement, IdsId.class); + if (idsIdResult.failed()) { monitor.warning( format( "Could not transform URI to IdsId: [%s]", - String.join(", ", result.getFailureMessages()) + String.join(", ", idsIdResult.getFailureMessages()) ) ); return createBadParametersErrorMultipartResponse(connectorId, descriptionRequestMessage); } - idsId = result.getContent(); + idsId = idsIdResult.getContent(); } //TODO: IDS REFACTORING: this should be a named property of the message object @@ -129,21 +131,24 @@ public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipa var to = getInt(descriptionRequestMessage, Range.TO, Integer.MAX_VALUE); var range = new Range(from, to); - Result requestedElementResult; - + Result result; if (idsId == null || (idsId.getType() == IdsType.CONNECTOR)) { - requestedElementResult = retrieveConnector(claimToken, range); + result = getConnector(claimToken, range); } else { - requestedElementResult = retrieveRequestedElement(idsId, claimToken, range); + var retrievedObject = retrieveRequestedElement(idsId, claimToken, range); + if (retrievedObject == null) { + return createNotFoundErrorMultipartResponse(connectorId, descriptionRequestMessage); + } + result = transformRequestedElement(idsId, retrievedObject); } - if (requestedElementResult.failed()) { + if (result.failed()) { if (idsId == null) { monitor.warning(String.format("Could not construct connector description: [%s]", - String.join(", ", requestedElementResult.getFailureMessages()))); + String.join(", ", result.getFailureMessages()))); } else { monitor.warning(String.format("Could not retrieve requested element with ID %s:%s: [%s]", - idsId.getType(), idsId.getValue(), String.join(", ", requestedElementResult.getFailureMessages()))); + idsId.getType(), idsId.getValue(), String.join(", ", result.getFailureMessages()))); } return createBadParametersErrorMultipartResponse(connectorId, descriptionRequestMessage); @@ -153,23 +158,22 @@ public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipa return MultipartResponse.Builder.newInstance() .header(descriptionResponseMessage) - .payload(requestedElementResult.getContent()) + .payload(result.getContent()) .build(); } - private Result retrieveConnector(ClaimToken claimToken, Range range) { + private Result getConnector(ClaimToken claimToken, Range range) { return transformerRegistry.transform(connectorService.getConnector(claimToken, range), de.fraunhofer.iais.eis.Connector.class); } - private Result retrieveRequestedElement(IdsId idsId, ClaimToken claimToken, Range range) { + private Object retrieveRequestedElement(IdsId idsId, ClaimToken claimToken, Range range) { var type = idsId.getType(); switch (type) { case ARTIFACT: - return transformerRegistry.transform(assetIndex.findById(idsId.getValue()), Artifact.class); - case CATALOG: - return transformerRegistry.transform(catalogService.getDataCatalog(claimToken, range), ResourceCatalog.class); case REPRESENTATION: - return transformerRegistry.transform(assetIndex.findById(idsId.getValue()), Representation.class); + return assetIndex.findById(idsId.getValue()); + case CATALOG: + return catalogService.getDataCatalog(claimToken, range); case RESOURCE: var assetId = idsId.getValue(); var asset = assetIndex.findById(assetId); @@ -183,7 +187,23 @@ private Result retrieveRequestedElement(IdsId idsId, Claim .build(); var targetingContractOffers = contractOfferService.queryContractOffers(contractOfferQuery, range).collect(toList()); - return transformerRegistry.transform(new OfferedAsset(asset, targetingContractOffers), Resource.class); + return new OfferedAsset(asset, targetingContractOffers); + default: + return null; + } + } + + private Result transformRequestedElement(IdsId idsId, Object object) { + var type = idsId.getType(); + switch (type) { + case ARTIFACT: + return transformerRegistry.transform(object, Artifact.class); + case CATALOG: + return transformerRegistry.transform(object, ResourceCatalog.class); + case REPRESENTATION: + return transformerRegistry.transform(object, Representation.class); + case RESOURCE: + return transformerRegistry.transform(object, Resource.class); default: return Result.failure(format("Unknown requested element type: %s", type)); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ArtifactDescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ArtifactDescriptionRequestHandler.java deleted file mode 100644 index 43c4a4ca6ea..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ArtifactDescriptionRequestHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; - -import de.fraunhofer.iais.eis.Artifact; -import org.eclipse.dataspaceconnector.ids.spi.IdsId; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; -import org.eclipse.dataspaceconnector.spi.asset.AssetIndex; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; -import org.eclipse.dataspaceconnector.spi.message.Range; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; - -public class ArtifactDescriptionRequestHandler extends PageableDescriptionRequestHandler { - private final AssetIndex assetIndex; - - public ArtifactDescriptionRequestHandler( - @NotNull Monitor monitor, - @NotNull String connectorId, - @NotNull AssetIndex assetIndex, - @NotNull IdsTransformerRegistry transformerRegistry) { - super( - connectorId, - monitor, - transformerRegistry, - IdsType.ARTIFACT, - Artifact.class - ); - this.assetIndex = Objects.requireNonNull(assetIndex); - } - - @Override - protected Asset retrieveObject(@NotNull IdsId idsId, @NotNull ClaimToken claimToken, Range range) { - return assetIndex.findById(idsId.getValue()); - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ConnectorDescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ConnectorDescriptionRequestHandler.java deleted file mode 100644 index 1fe79d73b66..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ConnectorDescriptionRequestHandler.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; - -import de.fraunhofer.iais.eis.Connector; -import de.fraunhofer.iais.eis.DescriptionRequestMessage; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; -import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.spi.service.ConnectorService; -import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; -import org.eclipse.dataspaceconnector.spi.message.Range; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.net.URI; -import java.util.Objects; - -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DescriptionResponseMessageUtil.createDescriptionResponseMessage; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartRequestUtil.getInt; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartResponseUtil.createBadParametersErrorMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartResponseUtil.createErrorMultipartResponse; - -public class ConnectorDescriptionRequestHandler implements DescriptionRequestHandler { - private final String connectorId; - private final Monitor monitor; - private final ConnectorService connectorService; - private final IdsTransformerRegistry transformerRegistry; - - public ConnectorDescriptionRequestHandler( - @NotNull Monitor monitor, - @NotNull String connectorId, - @NotNull ConnectorService connectorService, - @NotNull IdsTransformerRegistry transformerRegistry) { - this.monitor = Objects.requireNonNull(monitor); - this.connectorService = Objects.requireNonNull(connectorService); - this.transformerRegistry = Objects.requireNonNull(transformerRegistry); - this.connectorId = Objects.requireNonNull(connectorId); - } - - @Override - public MultipartResponse handle(@NotNull DescriptionRequestMessage descriptionRequestMessage, - @NotNull ClaimToken claimToken, - @Nullable String payload) { - Objects.requireNonNull(claimToken); - Objects.requireNonNull(descriptionRequestMessage); - - if (!isRequestingCurrentConnectorsDescription(descriptionRequestMessage)) { - return createErrorMultipartResponse(connectorId, descriptionRequestMessage); - } - - //TODO: IDS REFACTORING: this should be a named property of the message object - // extract paging information, default to 0 ... Integer.MAX_VALUE - var from = getInt(descriptionRequestMessage, Range.FROM, 0); - var to = getInt(descriptionRequestMessage, Range.TO, Integer.MAX_VALUE); - var range = new Range(from, to); - - var descriptionResponseMessage = createDescriptionResponseMessage(connectorId, descriptionRequestMessage); - - var transformResult = transformerRegistry.transform(connectorService.getConnector(claimToken, range), Connector.class); - if (transformResult.failed()) { - monitor.warning( - String.format( - "Could not transform Connector: [%s]", - String.join(", ", transformResult.getFailureMessages()) - ) - ); - return createBadParametersErrorMultipartResponse(connectorId, descriptionRequestMessage); - } - - Connector connector = transformResult.getContent(); - - return MultipartResponse.Builder.newInstance() - .header(descriptionResponseMessage) - .payload(connector) - .build(); - } - - private boolean isRequestingCurrentConnectorsDescription(DescriptionRequestMessage descriptionRequestMessage) { - URI requestedConnectorId = descriptionRequestMessage.getRequestedElement(); - - if (requestedConnectorId == null) { - return true; - } - - URI connectorIdUri = URI.create(String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.CONNECTOR.getValue(), - connectorId)); - - return requestedConnectorId.equals(connectorIdUri); - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DataCatalogDescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DataCatalogDescriptionRequestHandler.java deleted file mode 100644 index b006c9086f1..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DataCatalogDescriptionRequestHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2021 - 2022 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - improvements - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; - -import de.fraunhofer.iais.eis.ResourceCatalog; -import org.eclipse.dataspaceconnector.ids.spi.IdsId; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.spi.service.CatalogService; -import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; -import org.eclipse.dataspaceconnector.spi.message.Range; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.types.domain.catalog.Catalog; -import org.jetbrains.annotations.NotNull; - -public class DataCatalogDescriptionRequestHandler extends PageableDescriptionRequestHandler { - private final CatalogService dataCatalogService; - - public DataCatalogDescriptionRequestHandler( - @NotNull Monitor monitor, - @NotNull String connectorId, - @NotNull CatalogService dataCatalogService, - @NotNull IdsTransformerRegistry transformerRegistry) { - super( - connectorId, - monitor, - transformerRegistry, - IdsType.CATALOG, - ResourceCatalog.class - ); - this.dataCatalogService = dataCatalogService; - } - - @Override - protected Catalog retrieveObject(@NotNull IdsId idsId, @NotNull ClaimToken claimToken, Range range) { - return dataCatalogService.getDataCatalog(claimToken, range); - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/PageableDescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/PageableDescriptionRequestHandler.java deleted file mode 100644 index d887f8a4065..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/PageableDescriptionRequestHandler.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; - -import de.fraunhofer.iais.eis.DescriptionRequestMessage; -import de.fraunhofer.iais.eis.DescriptionResponseMessage; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; -import org.eclipse.dataspaceconnector.ids.spi.IdsId; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; -import org.eclipse.dataspaceconnector.spi.message.Range; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.result.Result; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.net.URI; -import java.util.Objects; - -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DescriptionResponseMessageUtil.createDescriptionResponseMessage; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartRequestUtil.getInt; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartResponseUtil.createBadParametersErrorMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartResponseUtil.createNotFoundErrorMultipartResponse; - -abstract class PageableDescriptionRequestHandler implements DescriptionRequestHandler { - protected final String connectorId; - protected final Monitor monitor; - protected final IdsTransformerRegistry transformerRegistry; - protected final IdsType targetIdsType; - protected final Class resultType; - - protected PageableDescriptionRequestHandler( - @NotNull String connectorId, - @NotNull Monitor monitor, - @NotNull IdsTransformerRegistry transformerRegistry, - @NotNull IdsType targetIdsType, - @NotNull Class resultType - ) { - this.connectorId = Objects.requireNonNull(connectorId); - this.monitor = Objects.requireNonNull(monitor); - this.transformerRegistry = Objects.requireNonNull(transformerRegistry); - this.targetIdsType = Objects.requireNonNull(targetIdsType); - this.resultType = Objects.requireNonNull(resultType); - } - - @Override - public final MultipartResponse handle( - @NotNull DescriptionRequestMessage descriptionRequestMessage, - @NotNull ClaimToken claimToken, - @Nullable String payload) { - Objects.requireNonNull(descriptionRequestMessage); - - URI uri = descriptionRequestMessage.getRequestedElement(); - if (uri == null) { - return createBadParametersErrorMultipartResponse(connectorId, descriptionRequestMessage); - } - - var result = transformerRegistry.transform(uri, IdsId.class); - if (result.failed()) { - monitor.warning( - String.format( - "Could not transform URI to IdsId: [%s]", - String.join(", ", result.getFailureMessages()) - ) - ); - return createBadParametersErrorMultipartResponse(connectorId, descriptionRequestMessage); - } - - IdsId idsId = result.getContent(); - if (Objects.requireNonNull(idsId).getType() != targetIdsType) { - return createBadParametersErrorMultipartResponse(connectorId, descriptionRequestMessage); - } - - //TODO: IDS REFACTORING: this should be a named property of the message object - // extract paging information, default to 0 ... Integer.MAX_VALUE - var from = getInt(descriptionRequestMessage, Range.FROM, 0); - var to = getInt(descriptionRequestMessage, Range.TO, Integer.MAX_VALUE); - var range = new Range(from, to); - - T retrievedObject = retrieveObject(idsId, claimToken, range); - if (retrievedObject == null) { - return createNotFoundErrorMultipartResponse(connectorId, descriptionRequestMessage); - } - - Result transformResult = transformerRegistry.transform(retrievedObject, resultType); - if (transformResult.failed()) { - monitor.warning( - String.format( - "Could not transform %s to %S: [%s]", - retrievedObject.getClass().getSimpleName(), - resultType.getSimpleName(), - String.join(", ", transformResult.getFailureMessages()) - ) - ); - return createBadParametersErrorMultipartResponse(connectorId, descriptionRequestMessage); - } - - S handlerResult = transformResult.getContent(); - - DescriptionResponseMessage descriptionResponseMessage = createDescriptionResponseMessage(connectorId, descriptionRequestMessage); - - return MultipartResponse.Builder.newInstance() - .header(descriptionResponseMessage) - .payload(handlerResult) - .build(); - } - - protected abstract T retrieveObject(@NotNull IdsId idsId, @NotNull ClaimToken verificationResult, Range range); - -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/RepresentationDescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/RepresentationDescriptionRequestHandler.java deleted file mode 100644 index d097ff9682c..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/RepresentationDescriptionRequestHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; - -import de.fraunhofer.iais.eis.Representation; -import org.eclipse.dataspaceconnector.ids.spi.IdsId; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; -import org.eclipse.dataspaceconnector.spi.asset.AssetIndex; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; -import org.eclipse.dataspaceconnector.spi.message.Range; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; - -public class RepresentationDescriptionRequestHandler extends PageableDescriptionRequestHandler { - private final AssetIndex assetIndex; - - public RepresentationDescriptionRequestHandler( - @NotNull Monitor monitor, - @NotNull String connectorId, - @NotNull AssetIndex assetIndex, - @NotNull IdsTransformerRegistry transformerRegistry) { - super( - connectorId, - monitor, - transformerRegistry, - IdsType.REPRESENTATION, - Representation.class - ); - this.assetIndex = Objects.requireNonNull(assetIndex); - } - - @Override - protected Asset retrieveObject(@NotNull IdsId idsId, @NotNull ClaimToken claimToken, Range range) { - return assetIndex.findById(idsId.getValue()); - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ResourceDescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ResourceDescriptionRequestHandler.java deleted file mode 100644 index 35fe78ff236..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ResourceDescriptionRequestHandler.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; - -import de.fraunhofer.iais.eis.Resource; -import org.eclipse.dataspaceconnector.ids.spi.IdsId; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; -import org.eclipse.dataspaceconnector.ids.spi.types.container.OfferedAsset; -import org.eclipse.dataspaceconnector.spi.asset.AssetIndex; -import org.eclipse.dataspaceconnector.spi.contract.offer.ContractOfferQuery; -import org.eclipse.dataspaceconnector.spi.contract.offer.ContractOfferService; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; -import org.eclipse.dataspaceconnector.spi.message.Range; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.query.Criterion; -import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; -import org.eclipse.dataspaceconnector.spi.types.domain.contract.offer.ContractOffer; -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.Objects; - -import static java.util.stream.Collectors.toList; - -public class ResourceDescriptionRequestHandler extends PageableDescriptionRequestHandler { - private final AssetIndex assetIndex; - private final ContractOfferService contractOfferService; - - public ResourceDescriptionRequestHandler( - @NotNull Monitor monitor, - @NotNull String connectorId, - @NotNull AssetIndex assetIndex, - @NotNull ContractOfferService contractOfferService, - @NotNull IdsTransformerRegistry transformerRegistry) { - super( - connectorId, - monitor, - transformerRegistry, - IdsType.RESOURCE, - Resource.class - ); - this.assetIndex = Objects.requireNonNull(assetIndex); - this.contractOfferService = Objects.requireNonNull(contractOfferService); - } - - @Override - protected OfferedAsset retrieveObject(@NotNull IdsId idsId, @NotNull ClaimToken claimToken, Range range) { - String assetId = idsId.getValue(); - Asset asset = assetIndex.findById(assetId); - if (asset == null) { - return null; - } - - ContractOfferQuery contractOfferQuery = ContractOfferQuery.Builder.newInstance() - .claimToken(claimToken) - .criterion(new Criterion(Asset.PROPERTY_ID, "=", assetId)) - .build(); - List targetingContractOffers = contractOfferService.queryContractOffers(contractOfferQuery, range).collect(toList()); - - return new OfferedAsset(asset, targetingContractOffers); - } -} From 5f32658edab10470689c3e373982706d9ac2b908 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 12 Jul 2022 09:14:16 +0200 Subject: [PATCH 07/45] chore: remove DescriptionRequestHandler interface --- .../DescriptionRequestHandler.java | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionRequestHandler.java diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionRequestHandler.java deleted file mode 100644 index e1a909b7ff7..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionRequestHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; - -import de.fraunhofer.iais.eis.DescriptionRequestMessage; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - - -public interface DescriptionRequestHandler { - - @Nullable - MultipartResponse handle( - @NotNull DescriptionRequestMessage descriptionRequestMessage, - @NotNull ClaimToken claimToken, - @Nullable String payload); -} From be3c483d69befd7a576427365c1832e2d3fa0667 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 12 Jul 2022 09:34:14 +0200 Subject: [PATCH 08/45] chore: remove DescriptionResponseMessageUtil --- .../multipart/handler/DescriptionHandler.java | 41 +++++++++- .../DescriptionResponseMessageUtil.java | 75 ------------------- 2 files changed, 40 insertions(+), 76 deletions(-) delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionResponseMessageUtil.java diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java index 34e06536ed2..679233c1885 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java @@ -18,6 +18,8 @@ import de.fraunhofer.iais.eis.Artifact; import de.fraunhofer.iais.eis.Connector; import de.fraunhofer.iais.eis.DescriptionRequestMessage; +import de.fraunhofer.iais.eis.DescriptionResponseMessage; +import de.fraunhofer.iais.eis.DescriptionResponseMessageBuilder; import de.fraunhofer.iais.eis.Message; import de.fraunhofer.iais.eis.ModelClass; import de.fraunhofer.iais.eis.Representation; @@ -26,11 +28,13 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.eclipse.dataspaceconnector.ids.spi.IdsId; +import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; import org.eclipse.dataspaceconnector.ids.spi.IdsType; import org.eclipse.dataspaceconnector.ids.spi.service.CatalogService; import org.eclipse.dataspaceconnector.ids.spi.service.ConnectorService; import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; import org.eclipse.dataspaceconnector.ids.spi.types.container.OfferedAsset; +import org.eclipse.dataspaceconnector.ids.transform.IdsProtocol; import org.eclipse.dataspaceconnector.spi.EdcException; import org.eclipse.dataspaceconnector.spi.asset.AssetIndex; import org.eclipse.dataspaceconnector.spi.contract.offer.ContractOfferQuery; @@ -42,12 +46,16 @@ import org.eclipse.dataspaceconnector.spi.result.Result; import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.net.URI; +import java.util.ArrayList; +import java.util.Collections; import java.util.Objects; +import java.util.UUID; import static java.lang.String.format; import static java.util.stream.Collectors.toList; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DescriptionResponseMessageUtil.createDescriptionResponseMessage; import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartRequestUtil.getInt; import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartResponseUtil.createBadParametersErrorMultipartResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartResponseUtil.createNotFoundErrorMultipartResponse; @@ -214,4 +222,35 @@ private MultipartResponse createErrorMultipartResponse(Message message) { .header(messageTypeNotSupported(message, connectorId)) .build(); } + + private DescriptionResponseMessage createDescriptionResponseMessage( + @Nullable String connectorId, + @NotNull Message correlationMessage) { + + var messageId = URI.create(String.join( + IdsIdParser.DELIMITER, + IdsIdParser.SCHEME, + IdsType.MESSAGE.getValue(), + UUID.randomUUID().toString())); + + var connectorIdUrn = String.join( + IdsIdParser.DELIMITER, + IdsIdParser.SCHEME, + IdsType.CONNECTOR.getValue(), + connectorId); + + var connectorIdUri = URI.create(connectorIdUrn); + + return new DescriptionResponseMessageBuilder(messageId) + ._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._issuerConnector_(connectorIdUri) + ._senderAgent_(connectorIdUri) + ._correlationMessage_(correlationMessage.getId()) + ._recipientAgent_(new ArrayList<>(Collections.singletonList(correlationMessage.getSenderAgent()))) + ._recipientConnector_(new ArrayList<>(Collections.singletonList(correlationMessage.getIssuerConnector()))) + .build(); + + //builder._issued_(CalendarUtil.gregorianNow()); TODO once https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/236 is done + } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionResponseMessageUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionResponseMessageUtil.java deleted file mode 100644 index e97fd912bb4..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionResponseMessageUtil.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; - -import de.fraunhofer.iais.eis.DescriptionResponseMessage; -import de.fraunhofer.iais.eis.DescriptionResponseMessageBuilder; -import de.fraunhofer.iais.eis.Message; -import org.eclipse.dataspaceconnector.ids.core.util.CalendarUtil; -import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.transform.IdsProtocol; -import org.jetbrains.annotations.Nullable; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.UUID; - -public class DescriptionResponseMessageUtil { - - public static DescriptionResponseMessage createDescriptionResponseMessage( - @Nullable String connectorId, - @Nullable Message correlationMessage) { - - URI messageId = URI.create(String.join(IdsIdParser.DELIMITER, IdsIdParser.SCHEME, IdsType.MESSAGE.getValue(), UUID.randomUUID().toString())); - DescriptionResponseMessageBuilder builder = new DescriptionResponseMessageBuilder(messageId); - - builder._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); - builder._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION); - - String connectorIdUrn = String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.CONNECTOR.getValue(), - connectorId); - - URI connectorIdUri = URI.create(connectorIdUrn); - - builder._issuerConnector_(connectorIdUri); - builder._senderAgent_(connectorIdUri); - - builder._issued_(CalendarUtil.gregorianNow()); - - if (correlationMessage != null) { - URI id = correlationMessage.getId(); - if (id != null) { - builder._correlationMessage_(id); - } - - URI senderAgent = correlationMessage.getSenderAgent(); - if (senderAgent != null) { - builder._recipientAgent_(new ArrayList<>(Collections.singletonList(senderAgent))); - } - - URI issuerConnector = correlationMessage.getIssuerConnector(); - if (issuerConnector != null) { - builder._recipientConnector_(new ArrayList<>(Collections.singletonList(issuerConnector))); - } - } - - return builder.build(); - } -} From d90f447bc50237a8cbfda75d549e002ea16279d7 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 12 Jul 2022 09:38:06 +0200 Subject: [PATCH 09/45] chore: move util classes to util package --- .../ids/api/multipart/handler/DescriptionHandler.java | 6 +++--- .../{handler/description => util}/MultipartRequestUtil.java | 2 +- .../description => util}/MultipartResponseUtil.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/{handler/description => util}/MultipartRequestUtil.java (94%) rename data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/{handler/description => util}/MultipartResponseUtil.java (95%) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java index 679233c1885..93dfd46b91a 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java @@ -56,9 +56,9 @@ import static java.lang.String.format; import static java.util.stream.Collectors.toList; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartRequestUtil.getInt; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartResponseUtil.createBadParametersErrorMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.MultipartResponseUtil.createNotFoundErrorMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartRequestUtil.getInt; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createNotFoundErrorMultipartResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; public class DescriptionHandler implements Handler { diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartRequestUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartRequestUtil.java similarity index 94% rename from data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartRequestUtil.java rename to data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartRequestUtil.java index 525c15f92f8..15bc69e41fe 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartRequestUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartRequestUtil.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; +package org.eclipse.dataspaceconnector.ids.api.multipart.util; import de.fraunhofer.iais.eis.DescriptionRequestMessage; import org.jetbrains.annotations.NotNull; diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartResponseUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java similarity index 95% rename from data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartResponseUtil.java rename to data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java index bc4dc299e0c..a7dedff68be 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/MultipartResponseUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java @@ -12,7 +12,7 @@ * */ -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; +package org.eclipse.dataspaceconnector.ids.api.multipart.util; import de.fraunhofer.iais.eis.Message; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; From 7582399e0c182f74547cf999f977404d25ce0ce4 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 12 Jul 2022 10:58:07 +0200 Subject: [PATCH 10/45] chore: add token to all response headers --- .../controller/MultipartController.java | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java index 366e5a9774e..833050c0707 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java @@ -19,7 +19,9 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.Connector; +import de.fraunhofer.iais.eis.DynamicAttributeTokenBuilder; import de.fraunhofer.iais.eis.Message; +import de.fraunhofer.iais.eis.TokenFormat; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; @@ -31,6 +33,7 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.eclipse.dataspaceconnector.spi.EdcException; import org.eclipse.dataspaceconnector.spi.iam.IdentityService; +import org.eclipse.dataspaceconnector.spi.iam.TokenParameters; import org.eclipse.dataspaceconnector.spi.iam.TokenRepresentation; import org.eclipse.dataspaceconnector.spi.monitor.Monitor; import org.glassfish.jersey.media.multipart.FormDataBodyPart; @@ -57,6 +60,7 @@ public class MultipartController { public static final String PATH = "/data"; private static final String HEADER = "header"; private static final String PAYLOAD = "payload"; + private static final String TOKEN_SCOPE = "idsc:IDS_CONNECTOR_ATTRIBUTES_ALL"; private final Monitor monitor; private final String connectorId; @@ -83,29 +87,29 @@ public MultipartController(@NotNull Monitor monitor, public Response request(@FormDataParam(HEADER) InputStream headerInputStream, @FormDataParam(PAYLOAD) String payload) { if (headerInputStream == null) { - return Response.ok(createFormDataMultiPart(malformedMessage(null, connectorId))).build(); + return Response.ok(createResponse(malformedMessage(null, connectorId))).build(); } Message header; try { header = objectMapper.readValue(headerInputStream, Message.class); } catch (IOException e) { - return Response.ok(createFormDataMultiPart(malformedMessage(null, connectorId))).build(); + return Response.ok(createResponse(malformedMessage(null, connectorId))).build(); } if (header == null) { - return Response.ok(createFormDataMultiPart(malformedMessage(null, connectorId))).build(); + return Response.ok(createResponse(malformedMessage(null, connectorId))).build(); } // Check if any required field missing if (header.getId() == null || header.getIssuerConnector() == null || header.getSenderAgent() == null) { - return Response.ok(createFormDataMultiPart(malformedMessage(header, connectorId))).build(); + return Response.ok(createResponse(malformedMessage(header, connectorId))).build(); } var dynamicAttributeToken = header.getSecurityToken(); if (dynamicAttributeToken == null || dynamicAttributeToken.getTokenValue() == null) { monitor.warning("MultipartController: Token is missing in header"); - return Response.ok(createFormDataMultiPart(notAuthenticated(header, connectorId))).build(); + return Response.ok(createResponse(notAuthenticated(header, connectorId))).build(); } var additional = new HashMap(); @@ -126,7 +130,7 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, if (verificationResult.failed()) { monitor.warning(format("MultipartController: Token validation failed %s", verificationResult.getFailure().getMessages())); - return Response.ok(createFormDataMultiPart(notAuthenticated(header, connectorId))).build(); + return Response.ok(createResponse(notAuthenticated(header, connectorId))).build(); } var claimToken = verificationResult.getContent(); @@ -141,27 +145,29 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, .findFirst() .orElse(null); if (handler == null) { - return Response.ok(createFormDataMultiPart(messageTypeNotSupported(header, connectorId))).build(); + return Response.ok(createResponse(messageTypeNotSupported(header, connectorId))).build(); } var multipartResponse = handler.handleRequest(multipartRequest, claimToken); if (multipartResponse != null) { - return Response.ok(createFormDataMultiPart(multipartResponse)).build(); + return Response.ok(createResponse(multipartResponse)).build(); } - return Response.ok(createFormDataMultiPart(notFound(header, connectorId))).build(); + return Response.ok(createResponse(notFound(header, connectorId))).build(); } - private FormDataMultiPart createFormDataMultiPart(MultipartResponse multipartResponse) { + private FormDataMultiPart createResponse(MultipartResponse multipartResponse) { + addTokenToResponseHeader(multipartResponse.getHeader()); return createFormDataMultiPart(multipartResponse.getHeader(), multipartResponse.getPayload()); } - private FormDataMultiPart createFormDataMultiPart(Object header) { + private FormDataMultiPart createResponse(Message header) { + addTokenToResponseHeader(header); return createFormDataMultiPart(header, null); } - private FormDataMultiPart createFormDataMultiPart(Object header, Object payload) { - FormDataMultiPart multiPart = new FormDataMultiPart(); + private FormDataMultiPart createFormDataMultiPart(Message header, Object payload) { + var multiPart = new FormDataMultiPart(); if (header != null) { multiPart.bodyPart(new FormDataBodyPart(HEADER, toJson(header), MediaType.APPLICATION_JSON_TYPE)); } @@ -172,6 +178,24 @@ private FormDataMultiPart createFormDataMultiPart(Object header, Object payload) return multiPart; } + + private void addTokenToResponseHeader(Message header) { + var tokenBuilder = new DynamicAttributeTokenBuilder() + ._tokenFormat_(TokenFormat.JWT); + + var tokenParameters = TokenParameters.Builder.newInstance() + .scope(TOKEN_SCOPE) + .audience(header.getIssuerConnector().toString()) + .build(); + var tokenResult = identityService.obtainClientCredentials(tokenParameters); + + if (tokenResult.succeeded()) { + tokenBuilder._tokenValue_(tokenResult.getContent().getToken()); + } else { + tokenBuilder._tokenValue_("invalid"); + } + header.setSecurityToken(tokenBuilder.build()); + } private byte[] toJson(Object object) { try { From fc11082b7d3977ede6a8117f934544de9305c465 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 12 Jul 2022 11:40:52 +0200 Subject: [PATCH 11/45] chore: add Javadoc to MultipartController --- .../controller/MultipartController.java | 45 +++++++++++++++++-- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java index 833050c0707..b956c5f3d29 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java @@ -57,6 +57,7 @@ @Produces({MediaType.MULTIPART_FORM_DATA}) @Path(MultipartController.PATH) public class MultipartController { + public static final String PATH = "/data"; private static final String HEADER = "header"; private static final String PAYLOAD = "payload"; @@ -82,7 +83,16 @@ public MultipartController(@NotNull Monitor monitor, this.identityService = Objects.requireNonNull(identityService); this.idsWebhookAddress = Objects.requireNonNull(idsWebhookAddress); } - + + /** + * Processes an incoming IDS multipart request. Validates the message header before passing the + * request to a handler depending on the message type. + * + * @param headerInputStream the multipart header part. + * @param payload the multipart payload part. + * @return a multipart response with code 200. In case of error, the multipart header is a + * rejection message. + */ @POST public Response request(@FormDataParam(HEADER) InputStream headerInputStream, @FormDataParam(PAYLOAD) String payload) { @@ -155,17 +165,38 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, return Response.ok(createResponse(notFound(header, connectorId))).build(); } - + + /** + * Creates a multipart body for the given response. Adds the security token to the response + * header. + * + * @param multipartResponse the multipart response. + * @return a multipart body. + */ private FormDataMultiPart createResponse(MultipartResponse multipartResponse) { addTokenToResponseHeader(multipartResponse.getHeader()); return createFormDataMultiPart(multipartResponse.getHeader(), multipartResponse.getPayload()); } - + + /** + * Creates a multipart body with the given message header and no payload. Adds the security + * token to the response header. + * + * @param header the multipart response. + * @return a multipart body. + */ private FormDataMultiPart createResponse(Message header) { addTokenToResponseHeader(header); return createFormDataMultiPart(header, null); } - + + /** + * Builds a form-data multipart body with the given header and payload. + * + * @param header the header. + * @param payload the payload. + * @return a multipart body. + */ private FormDataMultiPart createFormDataMultiPart(Message header, Object payload) { var multiPart = new FormDataMultiPart(); if (header != null) { @@ -179,6 +210,11 @@ private FormDataMultiPart createFormDataMultiPart(Message header, Object payload return multiPart; } + /** + * Retrieves an identity token and adds it to the given message. + * + * @param header the message. + */ private void addTokenToResponseHeader(Message header) { var tokenBuilder = new DynamicAttributeTokenBuilder() ._tokenFormat_(TokenFormat.JWT); @@ -194,6 +230,7 @@ private void addTokenToResponseHeader(Message header) { } else { tokenBuilder._tokenValue_("invalid"); } + header.setSecurityToken(tokenBuilder.build()); } From 1896f7b555fd3384e2f7dab8d03c16b2ea3141da Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 12 Jul 2022 13:16:55 +0200 Subject: [PATCH 12/45] chore: move method for building description response to util --- .../multipart/handler/DescriptionHandler.java | 54 ++----------------- .../multipart/util/ResponseMessageUtil.java | 27 +++++++++- 2 files changed, 30 insertions(+), 51 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java index 93dfd46b91a..12cc6176324 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java @@ -18,8 +18,6 @@ import de.fraunhofer.iais.eis.Artifact; import de.fraunhofer.iais.eis.Connector; import de.fraunhofer.iais.eis.DescriptionRequestMessage; -import de.fraunhofer.iais.eis.DescriptionResponseMessage; -import de.fraunhofer.iais.eis.DescriptionResponseMessageBuilder; import de.fraunhofer.iais.eis.Message; import de.fraunhofer.iais.eis.ModelClass; import de.fraunhofer.iais.eis.Representation; @@ -28,13 +26,11 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.eclipse.dataspaceconnector.ids.spi.IdsId; -import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; import org.eclipse.dataspaceconnector.ids.spi.IdsType; import org.eclipse.dataspaceconnector.ids.spi.service.CatalogService; import org.eclipse.dataspaceconnector.ids.spi.service.ConnectorService; import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; import org.eclipse.dataspaceconnector.ids.spi.types.container.OfferedAsset; -import org.eclipse.dataspaceconnector.ids.transform.IdsProtocol; import org.eclipse.dataspaceconnector.spi.EdcException; import org.eclipse.dataspaceconnector.spi.asset.AssetIndex; import org.eclipse.dataspaceconnector.spi.contract.offer.ContractOfferQuery; @@ -46,19 +42,15 @@ import org.eclipse.dataspaceconnector.spi.result.Result; import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; import java.util.Objects; -import java.util.UUID; import static java.lang.String.format; import static java.util.stream.Collectors.toList; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartRequestUtil.getInt; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createNotFoundErrorMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createDescriptionResponseMessage; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; public class DescriptionHandler implements Handler { @@ -121,12 +113,8 @@ public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipa if (requestedElement != null) { var idsIdResult = transformerRegistry.transform(requestedElement, IdsId.class); if (idsIdResult.failed()) { - monitor.warning( - format( - "Could not transform URI to IdsId: [%s]", - String.join(", ", idsIdResult.getFailureMessages()) - ) - ); + monitor.warning(format("Could not transform URI to IdsId: [%s]", + String.join(", ", idsIdResult.getFailureMessages()))); return createBadParametersErrorMultipartResponse(connectorId, descriptionRequestMessage); } @@ -147,7 +135,7 @@ public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipa if (retrievedObject == null) { return createNotFoundErrorMultipartResponse(connectorId, descriptionRequestMessage); } - result = transformRequestedElement(idsId, retrievedObject); + result = transformRequestedElement(retrievedObject, idsId.getType()); } if (result.failed()) { @@ -201,8 +189,7 @@ private Object retrieveRequestedElement(IdsId idsId, ClaimToken claimToken, Rang } } - private Result transformRequestedElement(IdsId idsId, Object object) { - var type = idsId.getType(); + private Result transformRequestedElement(Object object, IdsType type) { switch (type) { case ARTIFACT: return transformerRegistry.transform(object, Artifact.class); @@ -222,35 +209,4 @@ private MultipartResponse createErrorMultipartResponse(Message message) { .header(messageTypeNotSupported(message, connectorId)) .build(); } - - private DescriptionResponseMessage createDescriptionResponseMessage( - @Nullable String connectorId, - @NotNull Message correlationMessage) { - - var messageId = URI.create(String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.MESSAGE.getValue(), - UUID.randomUUID().toString())); - - var connectorIdUrn = String.join( - IdsIdParser.DELIMITER, - IdsIdParser.SCHEME, - IdsType.CONNECTOR.getValue(), - connectorId); - - var connectorIdUri = URI.create(connectorIdUrn); - - return new DescriptionResponseMessageBuilder(messageId) - ._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) - ._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) - ._issuerConnector_(connectorIdUri) - ._senderAgent_(connectorIdUri) - ._correlationMessage_(correlationMessage.getId()) - ._recipientAgent_(new ArrayList<>(Collections.singletonList(correlationMessage.getSenderAgent()))) - ._recipientConnector_(new ArrayList<>(Collections.singletonList(correlationMessage.getIssuerConnector()))) - .build(); - - //builder._issued_(CalendarUtil.gregorianNow()); TODO once https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/236 is done - } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java index 3a92ea129aa..094ff93a904 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java @@ -16,6 +16,8 @@ package org.eclipse.dataspaceconnector.ids.api.multipart.util; +import de.fraunhofer.iais.eis.DescriptionResponseMessage; +import de.fraunhofer.iais.eis.DescriptionResponseMessageBuilder; import de.fraunhofer.iais.eis.Message; import de.fraunhofer.iais.eis.MessageProcessedNotificationMessageBuilder; import de.fraunhofer.iais.eis.NotificationMessage; @@ -36,6 +38,8 @@ import java.util.Collections; import java.util.UUID; +import static org.eclipse.dataspaceconnector.ids.core.util.CalendarUtil.gregorianNow; + public class ResponseMessageUtil { public static ResponseMessage createDummyResponse( @@ -47,6 +51,7 @@ public static ResponseMessage createDummyResponse( return new ResponseMessageBuilder(messageId) ._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) ._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._issued_(gregorianNow()) ._issuerConnector_(connectorIdUri) ._senderAgent_(connectorIdUri) ._correlationMessage_(correlationMessage.getId()) @@ -63,6 +68,7 @@ public static NotificationMessage createMessageProcessedNotificationMessage( return new MessageProcessedNotificationMessageBuilder(messageId) ._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) ._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._issued_(gregorianNow()) ._issuerConnector_(connectorIdUri) ._senderAgent_(connectorIdUri) ._correlationMessage_(correlationMessage.getId()) @@ -78,9 +84,27 @@ public static NotificationMessage createRequestInProcessMessage(@NotNull String return new RequestInProcessMessageBuilder(messageId) ._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) ._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._issued_(gregorianNow()) + ._issuerConnector_(connectorIdUri) + ._senderAgent_(connectorIdUri) + ._correlationMessage_(correlationMessage.getId()) + ._recipientConnector_(new ArrayList<>(Collections.singletonList(correlationMessage.getIssuerConnector()))) + .build(); + } + + public static DescriptionResponseMessage createDescriptionResponseMessage(@Nullable String connectorId, + @NotNull Message correlationMessage) { + var messageId = getMessageId(); + var connectorIdUri = getConnectorUrn(connectorId); + + return new DescriptionResponseMessageBuilder(messageId) + ._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._issued_(gregorianNow()) ._issuerConnector_(connectorIdUri) ._senderAgent_(connectorIdUri) ._correlationMessage_(correlationMessage.getId()) + ._recipientAgent_(new ArrayList<>(Collections.singletonList(correlationMessage.getSenderAgent()))) ._recipientConnector_(new ArrayList<>(Collections.singletonList(correlationMessage.getIssuerConnector()))) .build(); } @@ -151,11 +175,10 @@ private static RejectionMessageBuilder createRejectionMessageBuilder( var builder = new RejectionMessageBuilder(messageId) ._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) ._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) + ._issued_(gregorianNow()) ._issuerConnector_(connectorIdUri) ._senderAgent_(connectorIdUri); - //builder._issued_(CalendarUtil.gregorianNow()); TODO once https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/236 is done - if (correlationMessage != null) { builder._correlationMessage_(correlationMessage.getId()); builder._recipientAgent_(new ArrayList<>(Collections.singletonList(correlationMessage.getSenderAgent()))); From 84f70e587293cfb65f794222ca256e190bc5c10a Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 12 Jul 2022 13:39:51 +0200 Subject: [PATCH 13/45] chore: return RequestInProcessMessage for artifact requests --- .../handler/ArtifactRequestHandler.java | 4 ++-- .../multipart/util/ResponseMessageUtil.java | 19 ------------------- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index 24a43265409..b42b9a098dd 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -41,7 +41,7 @@ import java.util.Optional; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createDummyResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createRequestInProcessMessage; import static org.eclipse.dataspaceconnector.ids.spi.IdsConstants.IDS_WEBHOOK_ADDRESS_PROPERTY; public class ArtifactRequestHandler implements Handler { @@ -161,7 +161,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } return MultipartResponse.Builder.newInstance() - .header(createDummyResponse(connectorId, artifactRequestMessage)) // TODO Change this response so that it matches our UML pictures + .header(createRequestInProcessMessage(connectorId, artifactRequestMessage)) .build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java index 094ff93a904..6c2971b1b8a 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java @@ -25,8 +25,6 @@ import de.fraunhofer.iais.eis.RejectionMessageBuilder; import de.fraunhofer.iais.eis.RejectionReason; import de.fraunhofer.iais.eis.RequestInProcessMessageBuilder; -import de.fraunhofer.iais.eis.ResponseMessage; -import de.fraunhofer.iais.eis.ResponseMessageBuilder; import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; import org.eclipse.dataspaceconnector.ids.spi.IdsType; import org.eclipse.dataspaceconnector.ids.transform.IdsProtocol; @@ -42,23 +40,6 @@ public class ResponseMessageUtil { - public static ResponseMessage createDummyResponse( - @NotNull String connectorId, - @NotNull Message correlationMessage) { - var messageId = getMessageId(); - var connectorIdUri = getConnectorUrn(connectorId); - - return new ResponseMessageBuilder(messageId) - ._contentVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) - ._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) - ._issued_(gregorianNow()) - ._issuerConnector_(connectorIdUri) - ._senderAgent_(connectorIdUri) - ._correlationMessage_(correlationMessage.getId()) - ._recipientConnector_(new ArrayList<>(Collections.singletonList(correlationMessage.getIssuerConnector()))) - .build(); - } - public static NotificationMessage createMessageProcessedNotificationMessage( @NotNull String connectorId, @NotNull Message correlationMessage) { From 20df6035d4fd21d68ec5eef8cad1dd3209c75863 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 12 Jul 2022 13:46:56 +0200 Subject: [PATCH 14/45] chore: make response depend on status result from state machine --- .../handler/ArtifactRequestHandler.java | 6 +++--- .../handler/ContractRequestHandler.java | 16 ++-------------- .../api/multipart/util/ResponseMessageUtil.java | 13 +++++++++++++ 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index b42b9a098dd..54b3abbc190 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -41,7 +41,7 @@ import java.util.Optional; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createRequestInProcessMessage; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createResponseMessageForStatusResult; import static org.eclipse.dataspaceconnector.ids.spi.IdsConstants.IDS_WEBHOOK_ADDRESS_PROPERTY; public class ArtifactRequestHandler implements Handler { @@ -154,14 +154,14 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { .connectorAddress(idsWebhookAddress) .build(); - var result = transferProcessManager.initiateProviderRequest(dataRequest); + var transferInitiateResult = transferProcessManager.initiateProviderRequest(dataRequest); if (artifactRequestMessagePayload.getSecret() != null) { vault.storeSecret(dataAddress.getKeyName(), artifactRequestMessagePayload.getSecret()); } return MultipartResponse.Builder.newInstance() - .header(createRequestInProcessMessage(connectorId, artifactRequestMessage)) + .header(createResponseMessageForStatusResult(transferInitiateResult, connectorId, artifactRequestMessage)) .build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java index 40fd0c5325f..132d9a7ad5a 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java @@ -39,8 +39,7 @@ import java.util.Objects; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createRequestInProcessMessage; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.internalRecipientError; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createResponseMessageForStatusResult; import static org.eclipse.dataspaceconnector.ids.spi.IdsConstants.IDS_WEBHOOK_ADDRESS_PROPERTY; /** @@ -145,20 +144,9 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { .build(); var negotiationInitiateResult = negotiationManager.requested(claimToken, requestObj); - - Message response; - if (negotiationInitiateResult.succeeded()) { - response = createRequestInProcessMessage(connectorId, message); - } else { - if (negotiationInitiateResult.fatalError()) { - response = badParameters(message, connectorId); - } else { - response = internalRecipientError(message, connectorId); - } - } return MultipartResponse.Builder.newInstance() - .header(response) + .header(createResponseMessageForStatusResult(negotiationInitiateResult, connectorId, message)) .build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java index 6c2971b1b8a..91359837050 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java @@ -28,6 +28,7 @@ import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; import org.eclipse.dataspaceconnector.ids.spi.IdsType; import org.eclipse.dataspaceconnector.ids.transform.IdsProtocol; +import org.eclipse.dataspaceconnector.spi.response.StatusResult; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -90,6 +91,18 @@ public static DescriptionResponseMessage createDescriptionResponseMessage(@Nulla .build(); } + public static Message createResponseMessageForStatusResult(StatusResult statusResult, String connectorId, Message correlationMessage) { + if (statusResult.succeeded()) { + return createRequestInProcessMessage(connectorId, correlationMessage); + } else { + if (statusResult.fatalError()) { + return badParameters(correlationMessage, connectorId); + } else { + return internalRecipientError(correlationMessage, connectorId); + } + } + } + @NotNull public static RejectionMessage notFound( @NotNull Message correlationMessage, @NotNull String connectorId) { From eb078685343113f909957fc6c0cfccba4a41ee97 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 12 Jul 2022 16:22:48 +0200 Subject: [PATCH 15/45] chore: do not build message in ArtifactRequestHandler --- .../handler/ArtifactRequestHandler.java | 30 +++++-------------- .../multipart/util/MultipartResponseUtil.java | 7 +++++ 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index 54b3abbc190..3142431aaeb 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -16,7 +16,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.ArtifactRequestMessage; -import de.fraunhofer.iais.eis.Message; import org.eclipse.dataspaceconnector.common.string.StringUtils; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; @@ -40,7 +39,7 @@ import java.util.Objects; import java.util.Optional; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createResponseMessageForStatusResult; import static org.eclipse.dataspaceconnector.ids.spi.IdsConstants.IDS_WEBHOOK_ADDRESS_PROPERTY; @@ -89,31 +88,31 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var artifactIdsId = IdsIdParser.parse(artifactUri.toString()); if (artifactIdsId.getType() != IdsType.ARTIFACT) { monitor.debug("ArtifactRequestHandler: Requested artifact URI not of type artifact."); - return createBadParametersErrorMultipartResponse(multipartRequest.getHeader()); + return createBadParametersErrorMultipartResponse(connectorId, multipartRequest.getHeader()); } var contractUri = artifactRequestMessage.getTransferContract(); var contractIdsId = IdsIdParser.parse(contractUri.toString()); if (contractIdsId.getType() != IdsType.CONTRACT) { monitor.debug("ArtifactRequestHandler: Transfer contract URI not of type contract."); - return createBadParametersErrorMultipartResponse(multipartRequest.getHeader()); + return createBadParametersErrorMultipartResponse(connectorId, multipartRequest.getHeader()); } var contractAgreement = contractNegotiationStore.findContractAgreement(contractIdsId.getValue()); if (contractAgreement == null) { monitor.debug(String.format("ArtifactRequestHandler: No contract agreement with id %s found.", contractIdsId.getValue())); - return createBadParametersErrorMultipartResponse(multipartRequest.getHeader()); + return createBadParametersErrorMultipartResponse(connectorId, multipartRequest.getHeader()); } var isContractValid = contractValidationService.validate(claimToken, contractAgreement); if (!isContractValid) { monitor.debug("ArtifactRequestHandler: Contract is invalid"); - return createBadParametersErrorMultipartResponse(multipartRequest.getHeader()); + return createBadParametersErrorMultipartResponse(connectorId, multipartRequest.getHeader()); } if (!artifactIdsId.getValue().equals(contractAgreement.getAssetId())) { monitor.debug(String.format("ArtifactRequestHandler: invalid artifact id specified %s for contract: %s", artifactIdsId.getValue(), contractIdsId.getValue())); - return createBadParametersErrorMultipartResponse(multipartRequest.getHeader()); + return createBadParametersErrorMultipartResponse(connectorId, multipartRequest.getHeader()); } ArtifactRequestMessagePayload artifactRequestMessagePayload; @@ -121,7 +120,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { artifactRequestMessagePayload = objectMapper.readValue(multipartRequest.getPayload(), ArtifactRequestMessagePayload.class); } catch (IOException e) { - return createBadParametersErrorMultipartResponse(artifactRequestMessage); + return createBadParametersErrorMultipartResponse(connectorId, artifactRequestMessage); } var dataAddress = artifactRequestMessagePayload.getDataDestination(); @@ -137,7 +136,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { if (StringUtils.isNullOrBlank(idsWebhookAddress)) { var msg = "Ids webhook address is invalid"; monitor.debug(String.format("%s: %s", getClass().getSimpleName(), msg)); - return createBadParametersErrorMultipartResponse(artifactRequestMessage, msg); + return createBadParametersErrorMultipartResponse(connectorId, artifactRequestMessage, msg); } // NB: DO NOT use the asset id provided by the client as that can open aan attack vector where a client references an artifact that @@ -164,17 +163,4 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { .header(createResponseMessageForStatusResult(transferInitiateResult, connectorId, artifactRequestMessage)) .build(); } - - private MultipartResponse createBadParametersErrorMultipartResponse(Message message) { - return MultipartResponse.Builder.newInstance() - .header(badParameters(message, connectorId)) - .build(); - } - - private MultipartResponse createBadParametersErrorMultipartResponse(Message message, String payload) { - return MultipartResponse.Builder.newInstance() - .header(badParameters(message, connectorId)) - .payload(payload) - .build(); - } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java index a7dedff68be..04126241a16 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java @@ -29,6 +29,13 @@ public static MultipartResponse createBadParametersErrorMultipartResponse(@Nulla .header(badParameters(message, connectorId)) .build(); } + + public static MultipartResponse createBadParametersErrorMultipartResponse(@Nullable String connectorId, @Nullable Message message, String payload) { + return MultipartResponse.Builder.newInstance() + .header(badParameters(message, connectorId)) + .payload(payload) + .build(); + } public static MultipartResponse createNotFoundErrorMultipartResponse(@Nullable String connectorId, @Nullable Message message) { return MultipartResponse.Builder.newInstance() From 7a05a51b883e569793dad9219d31707f306eb463 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 13 Jul 2022 13:04:23 +0200 Subject: [PATCH 16/45] chore: rename DescriptionRequestHandler --- .../ids/api/multipart/IdsMultipartApiServiceExtension.java | 4 ++-- ...DescriptionHandler.java => DescriptionRequestHandler.java} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/{DescriptionHandler.java => DescriptionRequestHandler.java} (99%) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java index a162d14e34e..82fdccd6813 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java @@ -25,7 +25,7 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.handler.ContractOfferHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.ContractRejectionHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.ContractRequestHandler; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.DescriptionHandler; +import org.eclipse.dataspaceconnector.ids.api.multipart.handler.DescriptionRequestHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.EndpointDataReferenceHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.Handler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.NotificationMessageHandler; @@ -128,7 +128,7 @@ private void registerControllers(ServiceExtensionContext serviceExtensionContext var objectMapper = objectMapperFactory.getObjectMapper(); // create request handler - var descriptionHandler = new DescriptionHandler( + var descriptionHandler = new DescriptionRequestHandler( monitor, connectorId, transformerRegistry, assetIndex, dataCatalogService, contractOfferService, connectorService); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java similarity index 99% rename from data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java rename to data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java index 12cc6176324..bcf4e2aee37 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java @@ -53,7 +53,7 @@ import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createDescriptionResponseMessage; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; -public class DescriptionHandler implements Handler { +public class DescriptionRequestHandler implements Handler { private final Monitor monitor; private final String connectorId; private final IdsTransformerRegistry transformerRegistry; @@ -62,7 +62,7 @@ public class DescriptionHandler implements Handler { private final ContractOfferService contractOfferService; private final ConnectorService connectorService; - public DescriptionHandler( + public DescriptionRequestHandler( @NotNull Monitor monitor, @NotNull String connectorId, @NotNull IdsTransformerRegistry transformerRegistry, From 761f359b0e54589d984b7991e288acf3336ffd06 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 13 Jul 2022 13:10:38 +0200 Subject: [PATCH 17/45] chore: align parameter order in ResponseMessageUtil --- .../handler/ContractAgreementHandler.java | 2 +- .../handler/ContractRejectionHandler.java | 2 +- .../handler/DescriptionRequestHandler.java | 2 +- .../handler/EndpointDataReferenceHandler.java | 2 +- .../multipart/util/ResponseMessageUtil.java | 51 ++++++++++--------- 5 files changed, 30 insertions(+), 29 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java index 1557abcb4e5..73cd449498e 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java @@ -116,7 +116,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } return MultipartResponse.Builder.newInstance() - .header(createMessageProcessedNotificationMessage(connectorId, message)) + .header(createMessageProcessedNotificationMessage(message, connectorId)) .build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java index c1be79aab0b..6bdd8532b7c 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java @@ -86,7 +86,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } return MultipartResponse.Builder.newInstance() - .header(createMessageProcessedNotificationMessage(connectorId, message)) + .header(createMessageProcessedNotificationMessage(message, connectorId)) .build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java index bcf4e2aee37..1d92a9a186f 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java @@ -150,7 +150,7 @@ public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipa return createBadParametersErrorMultipartResponse(connectorId, descriptionRequestMessage); } - var descriptionResponseMessage = createDescriptionResponseMessage(connectorId, descriptionRequestMessage); + var descriptionResponseMessage = createDescriptionResponseMessage(descriptionRequestMessage, connectorId); return MultipartResponse.Builder.newInstance() .header(descriptionResponseMessage) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java index 47859ef8354..76aced1f389 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java @@ -85,7 +85,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } return MultipartResponse.Builder.newInstance() - .header(createMessageProcessedNotificationMessage(connectorId, multipartRequest.getHeader())) + .header(createMessageProcessedNotificationMessage(multipartRequest.getHeader(), connectorId)) .build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java index 91359837050..6c850f05864 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java @@ -41,9 +41,8 @@ public class ResponseMessageUtil { - public static NotificationMessage createMessageProcessedNotificationMessage( - @NotNull String connectorId, - @NotNull Message correlationMessage) { + public static NotificationMessage createMessageProcessedNotificationMessage(@NotNull Message correlationMessage, + @NotNull String connectorId) { var messageId = getMessageId(); var connectorIdUri = getConnectorUrn(connectorId); @@ -58,8 +57,8 @@ public static NotificationMessage createMessageProcessedNotificationMessage( .build(); } - public static NotificationMessage createRequestInProcessMessage(@NotNull String connectorId, - @NotNull Message correlationMessage) { + public static NotificationMessage createRequestInProcessMessage(@NotNull Message correlationMessage, + @NotNull String connectorId) { var messageId = getMessageId(); var connectorIdUri = getConnectorUrn(connectorId); @@ -74,8 +73,8 @@ public static NotificationMessage createRequestInProcessMessage(@NotNull String .build(); } - public static DescriptionResponseMessage createDescriptionResponseMessage(@Nullable String connectorId, - @NotNull Message correlationMessage) { + public static DescriptionResponseMessage createDescriptionResponseMessage(@NotNull Message correlationMessage, + @NotNull String connectorId) { var messageId = getMessageId(); var connectorIdUri = getConnectorUrn(connectorId); @@ -91,9 +90,11 @@ public static DescriptionResponseMessage createDescriptionResponseMessage(@Nulla .build(); } - public static Message createResponseMessageForStatusResult(StatusResult statusResult, String connectorId, Message correlationMessage) { + public static Message createResponseMessageForStatusResult(@NotNull StatusResult statusResult, + @NotNull String connectorId, + @NotNull Message correlationMessage) { if (statusResult.succeeded()) { - return createRequestInProcessMessage(connectorId, correlationMessage); + return createRequestInProcessMessage(correlationMessage, connectorId); } else { if (statusResult.fatalError()) { return badParameters(correlationMessage, connectorId); @@ -104,64 +105,64 @@ public static Message createResponseMessageForStatusResult(StatusResult statu } @NotNull - public static RejectionMessage notFound( - @NotNull Message correlationMessage, @NotNull String connectorId) { + public static RejectionMessage notFound(@NotNull Message correlationMessage, + @NotNull String connectorId) { return createRejectionMessageBuilder(correlationMessage, connectorId) ._rejectionReason_(RejectionReason.NOT_FOUND) .build(); } @NotNull - public static RejectionMessage notAuthenticated( - @NotNull Message correlationMessage, @NotNull String connectorId) { + public static RejectionMessage notAuthenticated(@NotNull Message correlationMessage, + @NotNull String connectorId) { return createRejectionMessageBuilder(correlationMessage, connectorId) ._rejectionReason_(RejectionReason.NOT_AUTHENTICATED) .build(); } @NotNull - public static RejectionMessage notAuthorized( - @NotNull Message correlationMessage, @NotNull String connectorId) { + public static RejectionMessage notAuthorized(@NotNull Message correlationMessage, + @NotNull String connectorId) { return createRejectionMessageBuilder(correlationMessage, connectorId) ._rejectionReason_(RejectionReason.NOT_AUTHORIZED) .build(); } @NotNull - public static RejectionMessage malformedMessage( - @Nullable Message correlationMessage, @NotNull String connectorId) { + public static RejectionMessage malformedMessage(@Nullable Message correlationMessage, + @NotNull String connectorId) { return createRejectionMessageBuilder(correlationMessage, connectorId) ._rejectionReason_(RejectionReason.MALFORMED_MESSAGE) .build(); } @NotNull - public static RejectionMessage messageTypeNotSupported( - @NotNull Message correlationMessage, @NotNull String connectorId) { + public static RejectionMessage messageTypeNotSupported(@NotNull Message correlationMessage, + @NotNull String connectorId) { return createRejectionMessageBuilder(correlationMessage, connectorId) ._rejectionReason_(RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED) .build(); } @NotNull - public static RejectionMessage badParameters( - @NotNull Message correlationMessage, @NotNull String connectorId) { + public static RejectionMessage badParameters(@NotNull Message correlationMessage, + @NotNull String connectorId) { return createRejectionMessageBuilder(correlationMessage, connectorId) ._rejectionReason_(RejectionReason.BAD_PARAMETERS) .build(); } @NotNull - public static RejectionMessage internalRecipientError( - @NotNull Message correlationMessage, @NotNull String connectorId) { + public static RejectionMessage internalRecipientError(@NotNull Message correlationMessage, + @NotNull String connectorId) { return createRejectionMessageBuilder(correlationMessage, connectorId) ._rejectionReason_(RejectionReason.INTERNAL_RECIPIENT_ERROR) .build(); } @NotNull - private static RejectionMessageBuilder createRejectionMessageBuilder( - @Nullable Message correlationMessage, @NotNull String connectorId) { + private static RejectionMessageBuilder createRejectionMessageBuilder(@Nullable Message correlationMessage, + @NotNull String connectorId) { var messageId = getMessageId(); var connectorIdUri = getConnectorUrn(connectorId); From 4786e6bdb8519b99194db380082a06a017160c25 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 13 Jul 2022 13:49:20 +0200 Subject: [PATCH 18/45] docs: add Javadoc for ResponseMessageUtil --- .../handler/ArtifactRequestHandler.java | 2 +- .../handler/ContractRequestHandler.java | 2 +- .../multipart/util/ResponseMessageUtil.java | 108 +++++++++++++++++- 3 files changed, 107 insertions(+), 5 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index 3142431aaeb..8b9c6729e6b 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -160,7 +160,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } return MultipartResponse.Builder.newInstance() - .header(createResponseMessageForStatusResult(transferInitiateResult, connectorId, artifactRequestMessage)) + .header(createResponseMessageForStatusResult(transferInitiateResult, artifactRequestMessage, connectorId)) .build(); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java index 132d9a7ad5a..7a3a073e576 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java @@ -146,7 +146,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var negotiationInitiateResult = negotiationManager.requested(claimToken, requestObj); return MultipartResponse.Builder.newInstance() - .header(createResponseMessageForStatusResult(negotiationInitiateResult, connectorId, message)) + .header(createResponseMessageForStatusResult(negotiationInitiateResult, message, connectorId)) .build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java index 6c850f05864..682b0ee09a6 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java @@ -39,8 +39,18 @@ import static org.eclipse.dataspaceconnector.ids.core.util.CalendarUtil.gregorianNow; +/** + * Provides utility methods for building IDS {@link Message}s for responses. + */ public class ResponseMessageUtil { - + + /** + * Creates a MessageProcessedNotificationMessage. + * + * @param correlationMessage the request. + * @param connectorId the connector ID. + * @return a MessageProcessedNotificationMessage. + */ public static NotificationMessage createMessageProcessedNotificationMessage(@NotNull Message correlationMessage, @NotNull String connectorId) { var messageId = getMessageId(); @@ -57,6 +67,13 @@ public static NotificationMessage createMessageProcessedNotificationMessage(@Not .build(); } + /** + * Creates a RequestInProcessMessage. + * + * @param correlationMessage the request. + * @param connectorId the connector ID. + * @return a RequestInProcessMessage. + */ public static NotificationMessage createRequestInProcessMessage(@NotNull Message correlationMessage, @NotNull String connectorId) { var messageId = getMessageId(); @@ -73,6 +90,13 @@ public static NotificationMessage createRequestInProcessMessage(@NotNull Message .build(); } + /** + * Creates a DescriptionResponseMessage. + * + * @param correlationMessage the request. + * @param connectorId the connector ID. + * @return a DescriptionResponseMessage. + */ public static DescriptionResponseMessage createDescriptionResponseMessage(@NotNull Message correlationMessage, @NotNull String connectorId) { var messageId = getMessageId(); @@ -90,9 +114,20 @@ public static DescriptionResponseMessage createDescriptionResponseMessage(@NotNu .build(); } + /** + * Creates a response message depending on the status result of a previously executed action. + * Returns a RequestInProcessMessage, if the result is succeeded and a rejection message otherwise. + * The rejection reason is BAD_PARAMETERS if the action can be retried and INTERNAL_RECIPIENT_ERROR + * for a fatal error. + * + * @param statusResult the status result. + * @param correlationMessage the request. + * @param connectorId the connector ID. + * @return the response message depending on the status result. + */ public static Message createResponseMessageForStatusResult(@NotNull StatusResult statusResult, - @NotNull String connectorId, - @NotNull Message correlationMessage) { + @NotNull Message correlationMessage, + @NotNull String connectorId) { if (statusResult.succeeded()) { return createRequestInProcessMessage(correlationMessage, connectorId); } else { @@ -104,6 +139,13 @@ public static Message createResponseMessageForStatusResult(@NotNull StatusResult } } + /** + * Creates a rejection message with reason NOT_FOUND. + * + * @param correlationMessage the request. + * @param connectorId the connector ID. + * @return the rejection message. + */ @NotNull public static RejectionMessage notFound(@NotNull Message correlationMessage, @NotNull String connectorId) { @@ -112,6 +154,13 @@ public static RejectionMessage notFound(@NotNull Message correlationMessage, .build(); } + /** + * Creates a rejection message with reason NOT_AUTHENTICATED. + * + * @param correlationMessage the request. + * @param connectorId the connector ID. + * @return the rejection message. + */ @NotNull public static RejectionMessage notAuthenticated(@NotNull Message correlationMessage, @NotNull String connectorId) { @@ -120,6 +169,13 @@ public static RejectionMessage notAuthenticated(@NotNull Message correlationMess .build(); } + /** + * Creates a rejection message with reason NOT_AUTHORIZED. + * + * @param correlationMessage the request. + * @param connectorId the connector ID. + * @return the rejection message. + */ @NotNull public static RejectionMessage notAuthorized(@NotNull Message correlationMessage, @NotNull String connectorId) { @@ -128,6 +184,13 @@ public static RejectionMessage notAuthorized(@NotNull Message correlationMessage .build(); } + /** + * Creates a rejection message with reason MALFORMED_MESSAGE. + * + * @param correlationMessage the request. + * @param connectorId the connector ID. + * @return the rejection message. + */ @NotNull public static RejectionMessage malformedMessage(@Nullable Message correlationMessage, @NotNull String connectorId) { @@ -136,6 +199,13 @@ public static RejectionMessage malformedMessage(@Nullable Message correlationMes .build(); } + /** + * Creates a rejection message with reason MESSAGE_TYPE_NOT_SUPPORTED. + * + * @param correlationMessage the request. + * @param connectorId the connector ID. + * @return the rejection message. + */ @NotNull public static RejectionMessage messageTypeNotSupported(@NotNull Message correlationMessage, @NotNull String connectorId) { @@ -144,6 +214,13 @@ public static RejectionMessage messageTypeNotSupported(@NotNull Message correlat .build(); } + /** + * Creates a rejection message with reason BAD_PARAMETERS. + * + * @param correlationMessage the request. + * @param connectorId the connector ID. + * @return the rejection message. + */ @NotNull public static RejectionMessage badParameters(@NotNull Message correlationMessage, @NotNull String connectorId) { @@ -152,6 +229,13 @@ public static RejectionMessage badParameters(@NotNull Message correlationMessage .build(); } + /** + * Creates a rejection message with reason INTERNAL_RECIPIENT_ERROR. + * + * @param correlationMessage the request. + * @param connectorId the connector ID. + * @return the rejection message. + */ @NotNull public static RejectionMessage internalRecipientError(@NotNull Message correlationMessage, @NotNull String connectorId) { @@ -160,6 +244,13 @@ public static RejectionMessage internalRecipientError(@NotNull Message correlati .build(); } + /** + * Creates a generic rejection message builder without rejection reason. + * + * @param correlationMessage the request. + * @param connectorId the connector ID. + * @return the rejection message builder. + */ @NotNull private static RejectionMessageBuilder createRejectionMessageBuilder(@Nullable Message correlationMessage, @NotNull String connectorId) { @@ -183,6 +274,11 @@ private static RejectionMessageBuilder createRejectionMessageBuilder(@Nullable M return builder; } + /** + * Creates an ID for IDS messages. + * + * @return the ID. + */ private static URI getMessageId() { return URI.create(String.join( IdsIdParser.DELIMITER, @@ -191,6 +287,12 @@ private static URI getMessageId() { UUID.randomUUID().toString())); } + /** + * Creates the connector URN from the connector ID. + * + * @param connectorId the connector ID. + * @return the connector URN. + */ private static URI getConnectorUrn(String connectorId) { return URI.create(String.join( IdsIdParser.DELIMITER, From 5d6651c381b87c9f1e3e69ca8eb0963b1f4660c0 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 13 Jul 2022 13:54:24 +0200 Subject: [PATCH 19/45] chore: remove unused method --- .../ids/api/multipart/util/MultipartResponseUtil.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java index 04126241a16..2849bca764f 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java @@ -42,10 +42,4 @@ public static MultipartResponse createNotFoundErrorMultipartResponse(@Nullable S .header(notFound(message, connectorId)) .build(); } - - public static MultipartResponse createErrorMultipartResponse(@Nullable String connectorId, @Nullable Message message) { - return MultipartResponse.Builder.newInstance() - .header(messageTypeNotSupported(message, connectorId)) - .build(); - } } From 1344b2def286cc70a944bdf170f4b7681055f9c8 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 13 Jul 2022 14:25:43 +0200 Subject: [PATCH 20/45] docs: add Javadoc for MultipartResponseUtil --- .../handler/ContractRejectionHandler.java | 10 +---- .../multipart/util/MultipartResponseUtil.java | 39 +++++++++++++++---- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java index 6bdd8532b7c..95b1f1ad7ee 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java @@ -15,7 +15,6 @@ package org.eclipse.dataspaceconnector.ids.api.multipart.handler; import de.fraunhofer.iais.eis.ContractRejectionMessage; -import de.fraunhofer.iais.eis.Message; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.eclipse.dataspaceconnector.spi.contract.negotiation.ConsumerContractNegotiationManager; @@ -27,7 +26,7 @@ import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createMessageProcessedNotificationMessage; /** @@ -72,7 +71,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { correlationId, rejectionReason)); if (correlationId == null) { - return createBadParametersErrorMultipartResponse(message); + return createBadParametersErrorMultipartResponse(connectorId, message); } // abort negotiation process (one of them can handle this process by id) @@ -90,9 +89,4 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { .build(); } - private MultipartResponse createBadParametersErrorMultipartResponse(Message message) { - return MultipartResponse.Builder.newInstance() - .header(badParameters(message, connectorId)) - .build(); - } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java index 2849bca764f..d55da971fad 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java @@ -16,28 +16,53 @@ import de.fraunhofer.iais.eis.Message; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.notFound; +/** + * Provides utility methods for building IDS multipart responses for common errors. + */ public class MultipartResponseUtil { - - public static MultipartResponse createBadParametersErrorMultipartResponse(@Nullable String connectorId, @Nullable Message message) { + + /** + * Creates a multipart response with a rejection message with reason BAD_PARAMETERS as header. + * + * @param connectorId the connector ID. + * @param message the request. + * @return the multipart response. + */ + public static MultipartResponse createBadParametersErrorMultipartResponse(@NotNull String connectorId, @NotNull Message message) { return MultipartResponse.Builder.newInstance() .header(badParameters(message, connectorId)) .build(); } - public static MultipartResponse createBadParametersErrorMultipartResponse(@Nullable String connectorId, @Nullable Message message, String payload) { + /** + * Creates a multipart response with a rejection message with reason BAD_PARAMETERS as header + * and the given payload. + * + * @param connectorId the connector ID. + * @param message the request. + * @param payload the response payload. + * @return the multipart response. + */ + public static MultipartResponse createBadParametersErrorMultipartResponse(@NotNull String connectorId, @NotNull Message message, String payload) { return MultipartResponse.Builder.newInstance() .header(badParameters(message, connectorId)) .payload(payload) .build(); } - - public static MultipartResponse createNotFoundErrorMultipartResponse(@Nullable String connectorId, @Nullable Message message) { + + /** + * Creates a multipart response with a rejection message with reason NOT_FOUND as header. + * + * @param connectorId the connector ID. + * @param message the request. + * @return the multipart response. + */ + public static MultipartResponse createNotFoundErrorMultipartResponse(@NotNull String connectorId, @NotNull Message message) { return MultipartResponse.Builder.newInstance() .header(notFound(message, connectorId)) .build(); From 4db8bf71ff163ea737c0664e4ba5ddc444fbb098 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Mon, 18 Jul 2022 09:22:14 +0200 Subject: [PATCH 21/45] refactor: remove duplicated methods from handlers --- .../handler/ArtifactRequestHandler.java | 6 +-- .../handler/ContractAgreementHandler.java | 29 ++++-------- .../handler/ContractOfferHandler.java | 20 ++------ .../handler/ContractRejectionHandler.java | 2 +- .../handler/ContractRequestHandler.java | 36 ++++---------- .../handler/DescriptionRequestHandler.java | 11 ++--- .../handler/EndpointDataReferenceHandler.java | 11 ++--- .../handler/NotificationMessageHandler.java | 11 +---- .../multipart/util/MultipartResponseUtil.java | 47 ++++++++++++++++++- 9 files changed, 79 insertions(+), 94 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index 8b9c6729e6b..a851a0aa427 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -40,7 +40,7 @@ import java.util.Optional; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createResponseMessageForStatusResult; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createMultipartResponseFromStatusResult; import static org.eclipse.dataspaceconnector.ids.spi.IdsConstants.IDS_WEBHOOK_ADDRESS_PROPERTY; public class ArtifactRequestHandler implements Handler { @@ -159,8 +159,6 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { vault.storeSecret(dataAddress.getKeyName(), artifactRequestMessagePayload.getSecret()); } - return MultipartResponse.Builder.newInstance() - .header(createResponseMessageForStatusResult(transferInitiateResult, artifactRequestMessage, connectorId)) - .build(); + return createMultipartResponseFromStatusResult(connectorId, artifactRequestMessage, transferInitiateResult); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java index 73cd449498e..d9d805f6131 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java @@ -16,7 +16,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.ContractAgreementMessage; -import de.fraunhofer.iais.eis.Message; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.eclipse.dataspaceconnector.ids.spi.transform.ContractAgreementTransformerOutput; @@ -32,8 +31,8 @@ import java.io.IOException; import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createMessageProcessedNotificationMessage; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createMultipartResponseFromStatusResult; /** * This class handles and processes incoming IDS {@link ContractAgreementMessage}s. @@ -78,14 +77,14 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { contractAgreement = objectMapper.readValue(multipartRequest.getPayload(), de.fraunhofer.iais.eis.ContractAgreement.class); } catch (IOException e) { monitor.severe("ContractAgreementHandler: Contract Agreement is invalid", e); - return createBadParametersErrorMultipartResponse(message); + return createBadParametersErrorMultipartResponse(connectorId, message); } // extract target from contract request var permission = contractAgreement.getPermission().get(0); if (permission == null) { monitor.debug("ContractAgreementHandler: Contract Agreement is invalid"); - return createBadParametersErrorMultipartResponse(message); + return createBadParametersErrorMultipartResponse(connectorId, message); } // search for matching asset @@ -102,28 +101,16 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { if (result.failed()) { monitor.debug(String.format("Could not transform contract agreement: [%s]", String.join(", ", result.getFailureMessages()))); - return createBadParametersErrorMultipartResponse(message); + return createBadParametersErrorMultipartResponse(connectorId, message); } // TODO get hash from message var output = result.getContent(); var processId = message.getTransferContract(); - var negotiationResponse = negotiationManager.confirmed(claimToken, + var negotiationConfirmResult = negotiationManager.confirmed(claimToken, String.valueOf(processId), output.getContractAgreement(), output.getPolicy()); - if (negotiationResponse.fatalError()) { - monitor.debug("ContractAgreementHandler: Could not process contract agreement " + negotiationResponse.getFailureMessages()); - return createBadParametersErrorMultipartResponse(message); - } - - return MultipartResponse.Builder.newInstance() - .header(createMessageProcessedNotificationMessage(message, connectorId)) - .build(); - } - - private MultipartResponse createBadParametersErrorMultipartResponse(Message message) { - return MultipartResponse.Builder.newInstance() - .header(badParameters(message, connectorId)) - .build(); + + return createMultipartResponseFromStatusResult(connectorId, message, negotiationConfirmResult); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java index 4ac559a0902..03619821c7a 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java @@ -18,7 +18,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.ContractOffer; import de.fraunhofer.iais.eis.ContractOfferMessage; -import de.fraunhofer.iais.eis.Message; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.eclipse.dataspaceconnector.spi.contract.negotiation.ConsumerContractNegotiationManager; @@ -31,8 +30,8 @@ import java.io.IOException; import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createMessageTypeNotSupportedErrorMultipartResponse; /** * This class handles and processes incoming IDS {@link ContractOfferMessage}s. @@ -77,21 +76,10 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { contractOffer = objectMapper.readValue(multipartRequest.getPayload(), ContractOffer.class); } catch (IOException e) { monitor.severe("ContractOfferHandler: Contract Offer is invalid", e); - return createBadParametersErrorMultipartResponse(message); + return createBadParametersErrorMultipartResponse(connectorId, message); } // TODO similar implementation to ContractRequestHandler (only required if counter offers supported, not needed for M1) - - var response = messageTypeNotSupported(message, connectorId); - - return MultipartResponse.Builder.newInstance() - .header(response) - .build(); - } - - private MultipartResponse createBadParametersErrorMultipartResponse(Message message) { - return MultipartResponse.Builder.newInstance() - .header(badParameters(message, connectorId)) - .build(); + return createMessageTypeNotSupportedErrorMultipartResponse(connectorId, message); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java index 95b1f1ad7ee..0db35042f28 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java @@ -63,7 +63,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(claimToken); var message = (ContractRejectionMessage) multipartRequest.getHeader(); - var correlationMessageId = message.getCorrelationMessage(); // TODO correlation msg missing + var correlationMessageId = message.getCorrelationMessage(); var correlationId = message.getTransferContract(); var rejectionReason = message.getContractRejectionReason(); monitor.debug(String.format("ContractRejectionHandler: Received contract rejection to " + diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java index 7a3a073e576..39cc9217955 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java @@ -18,7 +18,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.ContractRequest; import de.fraunhofer.iais.eis.ContractRequestMessage; -import de.fraunhofer.iais.eis.Message; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; @@ -38,8 +37,8 @@ import java.io.IOException; import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createResponseMessageForStatusResult; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createMultipartResponseFromStatusResult; import static org.eclipse.dataspaceconnector.ids.spi.IdsConstants.IDS_WEBHOOK_ADDRESS_PROPERTY; /** @@ -88,27 +87,27 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { contractRequest = objectMapper.readValue(multipartRequest.getPayload(), ContractRequest.class); } catch (IOException e) { monitor.severe("ContractRequestHandler: Contract Request is invalid", e); - return createBadParametersErrorMultipartResponse(message); + return createBadParametersErrorMultipartResponse(connectorId, message); } var idsWebhookAddress = message.getProperties().get(IDS_WEBHOOK_ADDRESS_PROPERTY); if (idsWebhookAddress == null || idsWebhookAddress.toString().isBlank()) { var msg = "Ids webhook address is invalid"; monitor.debug(String.format("ContractRequestHandler: %s", msg)); - return createBadParametersErrorMultipartResponse(message, msg); + return createBadParametersErrorMultipartResponse(connectorId, message, msg); } // extract target from contract request var permission = contractRequest.getPermission().stream().findFirst().orElse(null); if (permission == null) { monitor.debug("ContractRequestHandler: Contract Request is invalid"); - return createBadParametersErrorMultipartResponse(message); + return createBadParametersErrorMultipartResponse(connectorId, message); } var target = permission.getTarget(); if (target == null || String.valueOf(target).isBlank()) { monitor.debug("ContractRequestHandler: Contract Request is invalid"); - return createBadParametersErrorMultipartResponse(message); + return createBadParametersErrorMultipartResponse(connectorId, message); } // search for matching asset @@ -117,7 +116,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { if (asset == null) { var msg = "Target id is invalid"; monitor.debug(String.format("ContractRequestHandler: %s", msg)); - return createBadParametersErrorMultipartResponse(message, msg); + return createBadParametersErrorMultipartResponse(connectorId, message, msg); } // Create contract offer request @@ -130,7 +129,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { if (result.failed()) { monitor.debug(String.format("Could not transform contract request: [%s]", String.join(", ", result.getFailureMessages()))); - return createBadParametersErrorMultipartResponse(message); + return createBadParametersErrorMultipartResponse(connectorId, message); } var contractOffer = result.getContent(); @@ -144,22 +143,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { .build(); var negotiationInitiateResult = negotiationManager.requested(claimToken, requestObj); - - return MultipartResponse.Builder.newInstance() - .header(createResponseMessageForStatusResult(negotiationInitiateResult, message, connectorId)) - .build(); - } - - private MultipartResponse createBadParametersErrorMultipartResponse(Message message) { - return MultipartResponse.Builder.newInstance() - .header(badParameters(message, connectorId)) - .build(); - } - - private MultipartResponse createBadParametersErrorMultipartResponse(Message message, String payload) { - return MultipartResponse.Builder.newInstance() - .header(badParameters(message, connectorId)) - .payload(payload) - .build(); + + return createMultipartResponseFromStatusResult(connectorId, message, negotiationInitiateResult); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java index 1d92a9a186f..651638476be 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java @@ -18,7 +18,6 @@ import de.fraunhofer.iais.eis.Artifact; import de.fraunhofer.iais.eis.Connector; import de.fraunhofer.iais.eis.DescriptionRequestMessage; -import de.fraunhofer.iais.eis.Message; import de.fraunhofer.iais.eis.ModelClass; import de.fraunhofer.iais.eis.Representation; import de.fraunhofer.iais.eis.Resource; @@ -98,7 +97,9 @@ public MultipartResponse handleRequest(@NotNull MultipartRequest multipartReques monitor.severe(format("Could not handle multipart request: %s", exception.getMessage()), exception); } - return createErrorMultipartResponse(multipartRequest.getHeader()); + return MultipartResponse.Builder.newInstance() + .header(messageTypeNotSupported(multipartRequest.getHeader(), connectorId)) + .build(); } public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipartRequest, @@ -203,10 +204,4 @@ private Result transformRequestedElement(Object object, Id return Result.failure(format("Unknown requested element type: %s", type)); } } - - private MultipartResponse createErrorMultipartResponse(Message message) { - return MultipartResponse.Builder.newInstance() - .header(messageTypeNotSupported(message, connectorId)) - .build(); - } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java index 76aced1f389..03f47f5d30e 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java @@ -29,8 +29,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createInternalRecipientErrorMultipartResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createMessageProcessedNotificationMessage; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.internalRecipientError; /** * Implementation of the {@link Handler} class for handling of {@link EndpointDataReferenceMessage}. @@ -73,7 +73,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var transformationResult = transformerRegistry.transform(edr); if (transformationResult.failed()) { monitor.severe("EDR transformation failed: " + String.join(", ", transformationResult.getFailureMessages())); - return createErrorMultipartResponse(multipartRequest); + return createInternalRecipientErrorMultipartResponse(connectorId, multipartRequest.getHeader()); } var transformedEdr = transformationResult.getContent(); @@ -81,7 +81,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var receiveResult = receiverRegistry.receiveAll(transformedEdr).join(); if (receiveResult.failed()) { monitor.severe("EDR dispatch failed: " + String.join(", ", receiveResult.getFailureMessages())); - return createErrorMultipartResponse(multipartRequest); + return createInternalRecipientErrorMultipartResponse(connectorId, multipartRequest.getHeader()); } return MultipartResponse.Builder.newInstance() @@ -89,9 +89,4 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { .build(); } - private MultipartResponse createErrorMultipartResponse(MultipartRequest request) { - return MultipartResponse.Builder.newInstance() - .header(internalRecipientError(request.getHeader(), connectorId)) - .build(); - } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java index 04c48e40dea..f71ae84f519 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java @@ -14,7 +14,6 @@ package org.eclipse.dataspaceconnector.ids.api.multipart.handler; -import de.fraunhofer.iais.eis.Message; import de.fraunhofer.iais.eis.NotificationMessage; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; @@ -22,7 +21,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createMessageTypeNotSupportedErrorMultipartResponse; /** * Implementation of the {@link Handler} class for handling of {@link NotificationMessage} @@ -54,14 +53,8 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var notification = (NotificationMessage) multipartRequest.getHeader(); var subhandler = subhandlers.getHandler(notification.getClass()); if (subhandler == null) { - return createErrorMultipartResponse(multipartRequest.getHeader()); + return createMessageTypeNotSupportedErrorMultipartResponse(connectorId, multipartRequest.getHeader()); } return subhandler.handleRequest(multipartRequest, claimToken); } - - private MultipartResponse createErrorMultipartResponse(Message message) { - return MultipartResponse.Builder.newInstance() - .header(messageTypeNotSupported(message, connectorId)) - .build(); - } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java index d55da971fad..44e11196ed0 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java @@ -16,13 +16,17 @@ import de.fraunhofer.iais.eis.Message; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; +import org.eclipse.dataspaceconnector.spi.response.StatusResult; import org.jetbrains.annotations.NotNull; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createResponseMessageForStatusResult; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.internalRecipientError; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.notFound; /** - * Provides utility methods for building IDS multipart responses for common errors. + * Provides utility methods for building IDS multipart responses for common responses. */ public class MultipartResponseUtil { @@ -67,4 +71,45 @@ public static MultipartResponse createNotFoundErrorMultipartResponse(@NotNull St .header(notFound(message, connectorId)) .build(); } + + /** + * Creates a multipart response with a rejection message with reason INTERNAL_RECIPIENT_ERROR as header. + * + * @param connectorId the connector ID. + * @param message the request. + * @return the multipart response. + */ + public static MultipartResponse createInternalRecipientErrorMultipartResponse(@NotNull String connectorId, @NotNull Message message) { + return MultipartResponse.Builder.newInstance() + .header(internalRecipientError(message, connectorId)) + .build(); + } + + /** + * Creates a multipart response with a rejection message with reason MESSAGE_TYPE_NOT_SUPPORTED as header. + * + * @param connectorId the connector ID. + * @param message the request. + * @return the multipart response. + */ + public static MultipartResponse createMessageTypeNotSupportedErrorMultipartResponse(@NotNull String connectorId, @NotNull Message message) { + return MultipartResponse.Builder.newInstance() + .header(messageTypeNotSupported(message, connectorId)) + .build(); + } + + /** + * Creates a multipart response from a status result. Will return a rejection message or a + * RequestInProcessMessage depending on the result. + * + * @param connectorId the connector ID. + * @param message the request. + * @param result the status result. + * @return the multipart response. + */ + public static MultipartResponse createMultipartResponseFromStatusResult(@NotNull String connectorId, @NotNull Message message, @NotNull StatusResult result) { + return MultipartResponse.Builder.newInstance() + .header(createResponseMessageForStatusResult(result, message, connectorId)) + .build(); + } } From 83f5e59cd63c462103e460042fb91728df45f47b Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Mon, 18 Jul 2022 09:54:14 +0200 Subject: [PATCH 22/45] refactor: remove MultipartResponseUtil --- .../controller/MultipartController.java | 10 +- .../handler/ArtifactRequestHandler.java | 22 ++-- .../handler/ContractAgreementHandler.java | 15 +-- .../handler/ContractOfferHandler.java | 11 +- .../handler/ContractRejectionHandler.java | 13 +- .../handler/ContractRequestHandler.java | 21 ++-- .../handler/DescriptionRequestHandler.java | 28 ++--- .../handler/EndpointDataReferenceHandler.java | 14 +-- .../handler/NotificationMessageHandler.java | 6 +- .../multipart/util/MultipartResponseUtil.java | 115 ------------------ ...onseMessageUtil.java => ResponseUtil.java} | 53 ++++++-- ...ageUtilTest.java => ResponseUtilTest.java} | 50 ++++---- 12 files changed, 136 insertions(+), 222 deletions(-) delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java rename data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/{ResponseMessageUtil.java => ResponseUtil.java} (86%) rename data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/{ResponseMessageUtilTest.java => ResponseUtilTest.java} (88%) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java index b956c5f3d29..46141469560 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java @@ -9,7 +9,7 @@ * * Contributors: * Daimler TSS GmbH - Initial API and Implementation - * Fraunhofer Institute for Software and Systems Engineering - Improvements + * Fraunhofer Institute for Software and Systems Engineering - Improvements, refactoring * Microsoft Corporation - Use IDS Webhook address for JWT audience claim * */ @@ -48,10 +48,10 @@ import java.util.Objects; import static java.lang.String.format; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.malformedMessage; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.notAuthenticated; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.notFound; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.malformedMessage; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageTypeNotSupported; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.notAuthenticated; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.notFound; @Consumes({MediaType.MULTIPART_FORM_DATA}) @Produces({MediaType.MULTIPART_FORM_DATA}) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index a851a0aa427..c1842c2180f 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -9,6 +9,7 @@ * * Contributors: * Microsoft Corporation - initial API and implementation + * Fraunhofer Institute for Software and Systems Engineering - refactoring * */ @@ -39,8 +40,9 @@ import java.util.Objects; import java.util.Optional; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createMultipartResponseFromStatusResult; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.fromStatusResult; import static org.eclipse.dataspaceconnector.ids.spi.IdsConstants.IDS_WEBHOOK_ADDRESS_PROPERTY; public class ArtifactRequestHandler implements Handler { @@ -88,31 +90,31 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var artifactIdsId = IdsIdParser.parse(artifactUri.toString()); if (artifactIdsId.getType() != IdsType.ARTIFACT) { monitor.debug("ArtifactRequestHandler: Requested artifact URI not of type artifact."); - return createBadParametersErrorMultipartResponse(connectorId, multipartRequest.getHeader()); + return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } var contractUri = artifactRequestMessage.getTransferContract(); var contractIdsId = IdsIdParser.parse(contractUri.toString()); if (contractIdsId.getType() != IdsType.CONTRACT) { monitor.debug("ArtifactRequestHandler: Transfer contract URI not of type contract."); - return createBadParametersErrorMultipartResponse(connectorId, multipartRequest.getHeader()); + return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } var contractAgreement = contractNegotiationStore.findContractAgreement(contractIdsId.getValue()); if (contractAgreement == null) { monitor.debug(String.format("ArtifactRequestHandler: No contract agreement with id %s found.", contractIdsId.getValue())); - return createBadParametersErrorMultipartResponse(connectorId, multipartRequest.getHeader()); + return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } var isContractValid = contractValidationService.validate(claimToken, contractAgreement); if (!isContractValid) { monitor.debug("ArtifactRequestHandler: Contract is invalid"); - return createBadParametersErrorMultipartResponse(connectorId, multipartRequest.getHeader()); + return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } if (!artifactIdsId.getValue().equals(contractAgreement.getAssetId())) { monitor.debug(String.format("ArtifactRequestHandler: invalid artifact id specified %s for contract: %s", artifactIdsId.getValue(), contractIdsId.getValue())); - return createBadParametersErrorMultipartResponse(connectorId, multipartRequest.getHeader()); + return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } ArtifactRequestMessagePayload artifactRequestMessagePayload; @@ -120,7 +122,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { artifactRequestMessagePayload = objectMapper.readValue(multipartRequest.getPayload(), ArtifactRequestMessagePayload.class); } catch (IOException e) { - return createBadParametersErrorMultipartResponse(connectorId, artifactRequestMessage); + return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } var dataAddress = artifactRequestMessagePayload.getDataDestination(); @@ -136,7 +138,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { if (StringUtils.isNullOrBlank(idsWebhookAddress)) { var msg = "Ids webhook address is invalid"; monitor.debug(String.format("%s: %s", getClass().getSimpleName(), msg)); - return createBadParametersErrorMultipartResponse(connectorId, artifactRequestMessage, msg); + return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } // NB: DO NOT use the asset id provided by the client as that can open aan attack vector where a client references an artifact that @@ -159,6 +161,6 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { vault.storeSecret(dataAddress.getKeyName(), artifactRequestMessagePayload.getSecret()); } - return createMultipartResponseFromStatusResult(connectorId, artifactRequestMessage, transferInitiateResult); + return createMultipartResponse(fromStatusResult(transferInitiateResult, multipartRequest.getHeader(), connectorId)); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java index d9d805f6131..bfd39313d21 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java @@ -8,7 +8,7 @@ * SPDX-License-Identifier: Apache-2.0 * * Contributors: - * Fraunhofer Institute for Software and Systems Engineering - initial API and implementation + * Fraunhofer Institute for Software and Systems Engineering - initial API and implementation, refactoring * */ @@ -31,8 +31,9 @@ import java.io.IOException; import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createMultipartResponseFromStatusResult; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.fromStatusResult; /** * This class handles and processes incoming IDS {@link ContractAgreementMessage}s. @@ -77,14 +78,14 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { contractAgreement = objectMapper.readValue(multipartRequest.getPayload(), de.fraunhofer.iais.eis.ContractAgreement.class); } catch (IOException e) { monitor.severe("ContractAgreementHandler: Contract Agreement is invalid", e); - return createBadParametersErrorMultipartResponse(connectorId, message); + return createMultipartResponse(badParameters(message, connectorId)); } // extract target from contract request var permission = contractAgreement.getPermission().get(0); if (permission == null) { monitor.debug("ContractAgreementHandler: Contract Agreement is invalid"); - return createBadParametersErrorMultipartResponse(connectorId, message); + return createMultipartResponse(badParameters(message, connectorId)); } // search for matching asset @@ -101,7 +102,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { if (result.failed()) { monitor.debug(String.format("Could not transform contract agreement: [%s]", String.join(", ", result.getFailureMessages()))); - return createBadParametersErrorMultipartResponse(connectorId, message); + return createMultipartResponse(badParameters(message, connectorId)); } // TODO get hash from message @@ -110,7 +111,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var negotiationConfirmResult = negotiationManager.confirmed(claimToken, String.valueOf(processId), output.getContractAgreement(), output.getPolicy()); - return createMultipartResponseFromStatusResult(connectorId, message, negotiationConfirmResult); + return createMultipartResponse(fromStatusResult(negotiationConfirmResult, message, connectorId)); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java index 03619821c7a..b96c132cda1 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java @@ -8,7 +8,7 @@ * SPDX-License-Identifier: Apache-2.0 * * Contributors: - * Fraunhofer Institute for Software and Systems Engineering - initial API and implementation + * Fraunhofer Institute for Software and Systems Engineering - initial API and implementation, refactoring * Daimler TSS GmbH - introduce factory to create RequestInProcessMessage * */ @@ -30,8 +30,9 @@ import java.io.IOException; import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createMessageTypeNotSupportedErrorMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageTypeNotSupported; /** * This class handles and processes incoming IDS {@link ContractOfferMessage}s. @@ -76,10 +77,10 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { contractOffer = objectMapper.readValue(multipartRequest.getPayload(), ContractOffer.class); } catch (IOException e) { monitor.severe("ContractOfferHandler: Contract Offer is invalid", e); - return createBadParametersErrorMultipartResponse(connectorId, message); + return createMultipartResponse(badParameters(message, connectorId)); } // TODO similar implementation to ContractRequestHandler (only required if counter offers supported, not needed for M1) - return createMessageTypeNotSupportedErrorMultipartResponse(connectorId, message); + return createMultipartResponse(messageTypeNotSupported(message, connectorId)); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java index 0db35042f28..035885357f0 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java @@ -8,7 +8,7 @@ * SPDX-License-Identifier: Apache-2.0 * * Contributors: - * Fraunhofer Institute for Software and Systems Engineering - initial API and implementation + * Fraunhofer Institute for Software and Systems Engineering - initial API and implementation, refactoring * */ @@ -26,8 +26,9 @@ import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createMessageProcessedNotificationMessage; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageProcessedNotification; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; /** * This class handles and processes incoming IDS {@link ContractRejectionMessage}s. @@ -71,7 +72,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { correlationId, rejectionReason)); if (correlationId == null) { - return createBadParametersErrorMultipartResponse(connectorId, message); + return createMultipartResponse(badParameters(message, connectorId)); } // abort negotiation process (one of them can handle this process by id) @@ -84,9 +85,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { monitor.debug("ContractRejectionHandler: Could not process contract rejection"); } - return MultipartResponse.Builder.newInstance() - .header(createMessageProcessedNotificationMessage(message, connectorId)) - .build(); + return createMultipartResponse(messageProcessedNotification(message, connectorId)); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java index 39cc9217955..0dee768a6c1 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java @@ -8,7 +8,7 @@ * SPDX-License-Identifier: Apache-2.0 * * Contributors: - * Fraunhofer Institute for Software and Systems Engineering - initial API and implementation + * Fraunhofer Institute for Software and Systems Engineering - initial API and implementation, refactoring * Daimler TSS GmbH - introduce factory to create RequestInProcessMessage * */ @@ -37,8 +37,9 @@ import java.io.IOException; import java.util.Objects; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createMultipartResponseFromStatusResult; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.fromStatusResult; import static org.eclipse.dataspaceconnector.ids.spi.IdsConstants.IDS_WEBHOOK_ADDRESS_PROPERTY; /** @@ -87,27 +88,27 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { contractRequest = objectMapper.readValue(multipartRequest.getPayload(), ContractRequest.class); } catch (IOException e) { monitor.severe("ContractRequestHandler: Contract Request is invalid", e); - return createBadParametersErrorMultipartResponse(connectorId, message); + return createMultipartResponse(badParameters(message, connectorId)); } var idsWebhookAddress = message.getProperties().get(IDS_WEBHOOK_ADDRESS_PROPERTY); if (idsWebhookAddress == null || idsWebhookAddress.toString().isBlank()) { var msg = "Ids webhook address is invalid"; monitor.debug(String.format("ContractRequestHandler: %s", msg)); - return createBadParametersErrorMultipartResponse(connectorId, message, msg); + return createMultipartResponse(badParameters(message, connectorId), msg); } // extract target from contract request var permission = contractRequest.getPermission().stream().findFirst().orElse(null); if (permission == null) { monitor.debug("ContractRequestHandler: Contract Request is invalid"); - return createBadParametersErrorMultipartResponse(connectorId, message); + return createMultipartResponse(badParameters(message, connectorId)); } var target = permission.getTarget(); if (target == null || String.valueOf(target).isBlank()) { monitor.debug("ContractRequestHandler: Contract Request is invalid"); - return createBadParametersErrorMultipartResponse(connectorId, message); + return createMultipartResponse(badParameters(message, connectorId)); } // search for matching asset @@ -116,7 +117,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { if (asset == null) { var msg = "Target id is invalid"; monitor.debug(String.format("ContractRequestHandler: %s", msg)); - return createBadParametersErrorMultipartResponse(connectorId, message, msg); + return createMultipartResponse(badParameters(message, connectorId), msg); } // Create contract offer request @@ -129,7 +130,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { if (result.failed()) { monitor.debug(String.format("Could not transform contract request: [%s]", String.join(", ", result.getFailureMessages()))); - return createBadParametersErrorMultipartResponse(connectorId, message); + return createMultipartResponse(badParameters(message, connectorId)); } var contractOffer = result.getContent(); @@ -144,6 +145,6 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var negotiationInitiateResult = negotiationManager.requested(claimToken, requestObj); - return createMultipartResponseFromStatusResult(connectorId, message, negotiationInitiateResult); + return createMultipartResponse(fromStatusResult(negotiationInitiateResult, message, connectorId)); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java index 651638476be..3fc18ab149c 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java @@ -47,10 +47,11 @@ import static java.lang.String.format; import static java.util.stream.Collectors.toList; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartRequestUtil.getInt; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createBadParametersErrorMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createNotFoundErrorMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createDescriptionResponseMessage; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.descriptionResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageTypeNotSupported; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.notFound; public class DescriptionRequestHandler implements Handler { private final Monitor monitor; @@ -96,10 +97,8 @@ public MultipartResponse handleRequest(@NotNull MultipartRequest multipartReques } catch (EdcException exception) { monitor.severe(format("Could not handle multipart request: %s", exception.getMessage()), exception); } - - return MultipartResponse.Builder.newInstance() - .header(messageTypeNotSupported(multipartRequest.getHeader(), connectorId)) - .build(); + + return createMultipartResponse(messageTypeNotSupported(multipartRequest.getHeader(), connectorId)); } public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipartRequest, @@ -116,7 +115,7 @@ public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipa if (idsIdResult.failed()) { monitor.warning(format("Could not transform URI to IdsId: [%s]", String.join(", ", idsIdResult.getFailureMessages()))); - return createBadParametersErrorMultipartResponse(connectorId, descriptionRequestMessage); + return createMultipartResponse(badParameters(descriptionRequestMessage, connectorId)); } idsId = idsIdResult.getContent(); @@ -134,7 +133,7 @@ public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipa } else { var retrievedObject = retrieveRequestedElement(idsId, claimToken, range); if (retrievedObject == null) { - return createNotFoundErrorMultipartResponse(connectorId, descriptionRequestMessage); + return createMultipartResponse(notFound(descriptionRequestMessage, connectorId)); } result = transformRequestedElement(retrievedObject, idsId.getType()); } @@ -148,15 +147,12 @@ public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipa idsId.getType(), idsId.getValue(), String.join(", ", result.getFailureMessages()))); } - return createBadParametersErrorMultipartResponse(connectorId, descriptionRequestMessage); + return createMultipartResponse(badParameters(descriptionRequestMessage, connectorId)); } - var descriptionResponseMessage = createDescriptionResponseMessage(descriptionRequestMessage, connectorId); + var descriptionResponseMessage = descriptionResponse(descriptionRequestMessage, connectorId); - return MultipartResponse.Builder.newInstance() - .header(descriptionResponseMessage) - .payload(result.getContent()) - .build(); + return createMultipartResponse(descriptionResponseMessage, result.getContent()); } private Result getConnector(ClaimToken claimToken, Range range) { diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java index 03f47f5d30e..2c0dbadfbf0 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java @@ -9,6 +9,7 @@ * * Contributors: * Amadeus - initial API and implementation + * Fraunhofer Institute for Software and Systems Engineering - refactoring * */ @@ -29,8 +30,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createInternalRecipientErrorMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createMessageProcessedNotificationMessage; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageProcessedNotification; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.internalRecipientError; /** * Implementation of the {@link Handler} class for handling of {@link EndpointDataReferenceMessage}. @@ -73,7 +75,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var transformationResult = transformerRegistry.transform(edr); if (transformationResult.failed()) { monitor.severe("EDR transformation failed: " + String.join(", ", transformationResult.getFailureMessages())); - return createInternalRecipientErrorMultipartResponse(connectorId, multipartRequest.getHeader()); + return createMultipartResponse(internalRecipientError(multipartRequest.getHeader(), connectorId)); } var transformedEdr = transformationResult.getContent(); @@ -81,12 +83,10 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var receiveResult = receiverRegistry.receiveAll(transformedEdr).join(); if (receiveResult.failed()) { monitor.severe("EDR dispatch failed: " + String.join(", ", receiveResult.getFailureMessages())); - return createInternalRecipientErrorMultipartResponse(connectorId, multipartRequest.getHeader()); + return createMultipartResponse(internalRecipientError(multipartRequest.getHeader(), connectorId)); } - return MultipartResponse.Builder.newInstance() - .header(createMessageProcessedNotificationMessage(multipartRequest.getHeader(), connectorId)) - .build(); + return createMultipartResponse(messageProcessedNotification(multipartRequest.getHeader(), connectorId)); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java index f71ae84f519..4142d6d5d0d 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java @@ -9,6 +9,7 @@ * * Contributors: * Amadeus - initial API and implementation + * Fraunhofer Institute for Software and Systems Engineering - refactoring * */ @@ -21,7 +22,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartResponseUtil.createMessageTypeNotSupportedErrorMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageTypeNotSupported; /** * Implementation of the {@link Handler} class for handling of {@link NotificationMessage} @@ -53,7 +55,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var notification = (NotificationMessage) multipartRequest.getHeader(); var subhandler = subhandlers.getHandler(notification.getClass()); if (subhandler == null) { - return createMessageTypeNotSupportedErrorMultipartResponse(connectorId, multipartRequest.getHeader()); + return createMultipartResponse(messageTypeNotSupported(multipartRequest.getHeader(), connectorId)); } return subhandler.handleRequest(multipartRequest, claimToken); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java deleted file mode 100644 index 44e11196ed0..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartResponseUtil.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.util; - -import de.fraunhofer.iais.eis.Message; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; -import org.eclipse.dataspaceconnector.spi.response.StatusResult; -import org.jetbrains.annotations.NotNull; - -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.createResponseMessageForStatusResult; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.internalRecipientError; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.messageTypeNotSupported; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseMessageUtil.notFound; - -/** - * Provides utility methods for building IDS multipart responses for common responses. - */ -public class MultipartResponseUtil { - - /** - * Creates a multipart response with a rejection message with reason BAD_PARAMETERS as header. - * - * @param connectorId the connector ID. - * @param message the request. - * @return the multipart response. - */ - public static MultipartResponse createBadParametersErrorMultipartResponse(@NotNull String connectorId, @NotNull Message message) { - return MultipartResponse.Builder.newInstance() - .header(badParameters(message, connectorId)) - .build(); - } - - /** - * Creates a multipart response with a rejection message with reason BAD_PARAMETERS as header - * and the given payload. - * - * @param connectorId the connector ID. - * @param message the request. - * @param payload the response payload. - * @return the multipart response. - */ - public static MultipartResponse createBadParametersErrorMultipartResponse(@NotNull String connectorId, @NotNull Message message, String payload) { - return MultipartResponse.Builder.newInstance() - .header(badParameters(message, connectorId)) - .payload(payload) - .build(); - } - - /** - * Creates a multipart response with a rejection message with reason NOT_FOUND as header. - * - * @param connectorId the connector ID. - * @param message the request. - * @return the multipart response. - */ - public static MultipartResponse createNotFoundErrorMultipartResponse(@NotNull String connectorId, @NotNull Message message) { - return MultipartResponse.Builder.newInstance() - .header(notFound(message, connectorId)) - .build(); - } - - /** - * Creates a multipart response with a rejection message with reason INTERNAL_RECIPIENT_ERROR as header. - * - * @param connectorId the connector ID. - * @param message the request. - * @return the multipart response. - */ - public static MultipartResponse createInternalRecipientErrorMultipartResponse(@NotNull String connectorId, @NotNull Message message) { - return MultipartResponse.Builder.newInstance() - .header(internalRecipientError(message, connectorId)) - .build(); - } - - /** - * Creates a multipart response with a rejection message with reason MESSAGE_TYPE_NOT_SUPPORTED as header. - * - * @param connectorId the connector ID. - * @param message the request. - * @return the multipart response. - */ - public static MultipartResponse createMessageTypeNotSupportedErrorMultipartResponse(@NotNull String connectorId, @NotNull Message message) { - return MultipartResponse.Builder.newInstance() - .header(messageTypeNotSupported(message, connectorId)) - .build(); - } - - /** - * Creates a multipart response from a status result. Will return a rejection message or a - * RequestInProcessMessage depending on the result. - * - * @param connectorId the connector ID. - * @param message the request. - * @param result the status result. - * @return the multipart response. - */ - public static MultipartResponse createMultipartResponseFromStatusResult(@NotNull String connectorId, @NotNull Message message, @NotNull StatusResult result) { - return MultipartResponse.Builder.newInstance() - .header(createResponseMessageForStatusResult(result, message, connectorId)) - .build(); - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtil.java similarity index 86% rename from data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java rename to data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtil.java index 682b0ee09a6..193df593ed2 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtil.java @@ -9,7 +9,7 @@ * * Contributors: * Daimler TSS GmbH - Initial API and Implementation - * Fraunhofer Institute for Software and Systems Engineering - additional message building methods + * Fraunhofer Institute for Software and Systems Engineering - additional message building methods, refactoring * Daimler TSS GmbH - introduce factory to create RequestInProcessMessage * */ @@ -25,6 +25,7 @@ import de.fraunhofer.iais.eis.RejectionMessageBuilder; import de.fraunhofer.iais.eis.RejectionReason; import de.fraunhofer.iais.eis.RequestInProcessMessageBuilder; +import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; import org.eclipse.dataspaceconnector.ids.spi.IdsType; import org.eclipse.dataspaceconnector.ids.transform.IdsProtocol; @@ -40,9 +41,35 @@ import static org.eclipse.dataspaceconnector.ids.core.util.CalendarUtil.gregorianNow; /** - * Provides utility methods for building IDS {@link Message}s for responses. + * Provides utility methods for building IDS Multipart responses. */ -public class ResponseMessageUtil { +public class ResponseUtil { + + /** + * Creates a multipart response with the given header. + * + * @param header the header. + * @return a multipart response. + */ + public static MultipartResponse createMultipartResponse(@NotNull Message header) { + return MultipartResponse.Builder.newInstance() + .header(header) + .build(); + } + + /** + * Creates a multipart response with the given header and payload. + * + * @param header the header. + * @param payload the payload. + * @return a multipart response. + */ + public static MultipartResponse createMultipartResponse(@NotNull Message header, @NotNull Object payload) { + return MultipartResponse.Builder.newInstance() + .header(header) + .payload(payload) + .build(); + } /** * Creates a MessageProcessedNotificationMessage. @@ -51,8 +78,8 @@ public class ResponseMessageUtil { * @param connectorId the connector ID. * @return a MessageProcessedNotificationMessage. */ - public static NotificationMessage createMessageProcessedNotificationMessage(@NotNull Message correlationMessage, - @NotNull String connectorId) { + public static NotificationMessage messageProcessedNotification(@NotNull Message correlationMessage, + @NotNull String connectorId) { var messageId = getMessageId(); var connectorIdUri = getConnectorUrn(connectorId); @@ -74,8 +101,8 @@ public static NotificationMessage createMessageProcessedNotificationMessage(@Not * @param connectorId the connector ID. * @return a RequestInProcessMessage. */ - public static NotificationMessage createRequestInProcessMessage(@NotNull Message correlationMessage, - @NotNull String connectorId) { + public static NotificationMessage requestInProcess(@NotNull Message correlationMessage, + @NotNull String connectorId) { var messageId = getMessageId(); var connectorIdUri = getConnectorUrn(connectorId); @@ -97,8 +124,8 @@ public static NotificationMessage createRequestInProcessMessage(@NotNull Message * @param connectorId the connector ID. * @return a DescriptionResponseMessage. */ - public static DescriptionResponseMessage createDescriptionResponseMessage(@NotNull Message correlationMessage, - @NotNull String connectorId) { + public static DescriptionResponseMessage descriptionResponse(@NotNull Message correlationMessage, + @NotNull String connectorId) { var messageId = getMessageId(); var connectorIdUri = getConnectorUrn(connectorId); @@ -125,11 +152,11 @@ public static DescriptionResponseMessage createDescriptionResponseMessage(@NotNu * @param connectorId the connector ID. * @return the response message depending on the status result. */ - public static Message createResponseMessageForStatusResult(@NotNull StatusResult statusResult, - @NotNull Message correlationMessage, - @NotNull String connectorId) { + public static Message fromStatusResult(@NotNull StatusResult statusResult, + @NotNull Message correlationMessage, + @NotNull String connectorId) { if (statusResult.succeeded()) { - return createRequestInProcessMessage(correlationMessage, connectorId); + return requestInProcess(correlationMessage, connectorId); } else { if (statusResult.fatalError()) { return badParameters(correlationMessage, connectorId); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtilTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtilTest.java similarity index 88% rename from data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtilTest.java rename to data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtilTest.java index 583e2013465..75dfa015978 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseMessageUtilTest.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtilTest.java @@ -30,7 +30,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -class ResponseMessageUtilTest { +class ResponseUtilTest { private final String connectorId = "38bfeade-3566-11ec-8d3d-0242ac130003"; private final URI connectorIdUri = URI.create("urn:connector:" + connectorId); private final URI correlationMessageId = URI.create("urn:message:7c35205e-3566-11ec-8d3d-0242ac130003"); @@ -57,27 +57,27 @@ void tearDown() { @Test public void testNotFound() { - var rejectionMessage = ResponseMessageUtil + var rejectionMessage = ResponseUtil .notFound(null, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_FOUND); // just correlationMessage, no connectorId - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .notFound(correlationMessage, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_FOUND); assertCorrelationMessagePropertiesMapped(rejectionMessage); // no correlationMessage, just connectorId - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .notFound(null, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_FOUND); assertConnectorIdPropertiesMapped(rejectionMessage); // both correlationMessage and connectorId - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .notFound(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_FOUND); @@ -87,24 +87,24 @@ public void testNotFound() { @Test public void testNotAuthenticated() { - var rejectionMessage = ResponseMessageUtil + var rejectionMessage = ResponseUtil .notAuthenticated(null, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHENTICATED); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .notAuthenticated(correlationMessage, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHENTICATED); assertCorrelationMessagePropertiesMapped(rejectionMessage); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .notAuthenticated(null, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHENTICATED); assertConnectorIdPropertiesMapped(rejectionMessage); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .notAuthenticated(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHENTICATED); @@ -114,24 +114,24 @@ public void testNotAuthenticated() { @Test public void testNotAuthorized() { - var rejectionMessage = ResponseMessageUtil + var rejectionMessage = ResponseUtil .notAuthorized(null, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHORIZED); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .notAuthorized(correlationMessage, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHORIZED); assertCorrelationMessagePropertiesMapped(rejectionMessage); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .notAuthorized(null, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHORIZED); assertConnectorIdPropertiesMapped(rejectionMessage); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .notAuthorized(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHORIZED); @@ -141,25 +141,25 @@ public void testNotAuthorized() { @Test public void testMalformedMessage() { - var rejectionMessage = ResponseMessageUtil + var rejectionMessage = ResponseUtil .malformedMessage(null, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MALFORMED_MESSAGE); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .malformedMessage(correlationMessage, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MALFORMED_MESSAGE); assertCorrelationMessagePropertiesMapped(rejectionMessage); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .malformedMessage(null, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MALFORMED_MESSAGE); assertConnectorIdPropertiesMapped(rejectionMessage); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .malformedMessage(correlationMessage, connectorId); @@ -170,25 +170,25 @@ public void testMalformedMessage() { @Test public void testMessageTypeNotSupported() { - var rejectionMessage = ResponseMessageUtil + var rejectionMessage = ResponseUtil .messageTypeNotSupported(null, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .messageTypeNotSupported(correlationMessage, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED); assertCorrelationMessagePropertiesMapped(rejectionMessage); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .messageTypeNotSupported(null, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED); assertConnectorIdPropertiesMapped(rejectionMessage); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .messageTypeNotSupported(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED); @@ -198,24 +198,24 @@ public void testMessageTypeNotSupported() { @Test public void testInternalRecipientError() { - var rejectionMessage = ResponseMessageUtil + var rejectionMessage = ResponseUtil .internalRecipientError(null, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.INTERNAL_RECIPIENT_ERROR); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .internalRecipientError(correlationMessage, null); assertBasePropertiesMapped(rejectionMessage, RejectionReason.INTERNAL_RECIPIENT_ERROR); assertCorrelationMessagePropertiesMapped(rejectionMessage); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .internalRecipientError(null, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.INTERNAL_RECIPIENT_ERROR); assertConnectorIdPropertiesMapped(rejectionMessage); - rejectionMessage = ResponseMessageUtil + rejectionMessage = ResponseUtil .internalRecipientError(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.INTERNAL_RECIPIENT_ERROR); From 0dad8e231764170c01b98567ad111e99068e0e1d Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Mon, 18 Jul 2022 13:20:11 +0200 Subject: [PATCH 23/45] refactor: process status result in contract handlers --- .../handler/ArtifactRequestHandler.java | 4 +-- .../handler/ContractAgreementHandler.java | 6 ++-- .../handler/ContractRejectionHandler.java | 16 ++++------ .../handler/ContractRequestHandler.java | 4 +-- .../ids/api/multipart/util/ResponseUtil.java | 31 +++++++++++++++++-- 5 files changed, 41 insertions(+), 20 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index c1842c2180f..8e8027b1002 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -42,7 +42,7 @@ import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.fromStatusResult; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.inProcessFromStatusResult; import static org.eclipse.dataspaceconnector.ids.spi.IdsConstants.IDS_WEBHOOK_ADDRESS_PROPERTY; public class ArtifactRequestHandler implements Handler { @@ -161,6 +161,6 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { vault.storeSecret(dataAddress.getKeyName(), artifactRequestMessagePayload.getSecret()); } - return createMultipartResponse(fromStatusResult(transferInitiateResult, multipartRequest.getHeader(), connectorId)); + return createMultipartResponse(inProcessFromStatusResult(transferInitiateResult, multipartRequest.getHeader(), connectorId)); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java index bfd39313d21..fc5464c486d 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java @@ -33,7 +33,7 @@ import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.fromStatusResult; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.processedFromStatusResult; /** * This class handles and processes incoming IDS {@link ContractAgreementMessage}s. @@ -110,8 +110,8 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var processId = message.getTransferContract(); var negotiationConfirmResult = negotiationManager.confirmed(claimToken, String.valueOf(processId), output.getContractAgreement(), output.getPolicy()); - - return createMultipartResponse(fromStatusResult(negotiationConfirmResult, message, connectorId)); + + return createMultipartResponse(processedFromStatusResult(negotiationConfirmResult, message, connectorId)); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java index 035885357f0..e84aaf284d6 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java @@ -27,8 +27,8 @@ import java.util.Objects; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageProcessedNotification; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.processedFromStatusResult; /** * This class handles and processes incoming IDS {@link ContractRejectionMessage}s. @@ -76,16 +76,12 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } // abort negotiation process (one of them can handle this process by id) - var result = providerNegotiationManager.declined(claimToken, String.valueOf(correlationId)); - if (result.fatalError()) { - result = consumerNegotiationManager.declined(claimToken, String.valueOf(correlationId)); + var negotiationDeclineResult = providerNegotiationManager.declined(claimToken, String.valueOf(correlationId)); + if (negotiationDeclineResult.fatalError()) { + negotiationDeclineResult = consumerNegotiationManager.declined(claimToken, String.valueOf(correlationId)); } - - if (result.fatalError()) { - monitor.debug("ContractRejectionHandler: Could not process contract rejection"); - } - - return createMultipartResponse(messageProcessedNotification(message, connectorId)); + + return createMultipartResponse(processedFromStatusResult(negotiationDeclineResult, message, connectorId)); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java index 0dee768a6c1..61f2da56b2d 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java @@ -39,7 +39,7 @@ import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.fromStatusResult; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.inProcessFromStatusResult; import static org.eclipse.dataspaceconnector.ids.spi.IdsConstants.IDS_WEBHOOK_ADDRESS_PROPERTY; /** @@ -145,6 +145,6 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var negotiationInitiateResult = negotiationManager.requested(claimToken, requestObj); - return createMultipartResponse(fromStatusResult(negotiationInitiateResult, message, connectorId)); + return createMultipartResponse(inProcessFromStatusResult(negotiationInitiateResult, message, connectorId)); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtil.java index 193df593ed2..ecaf6f6c5d0 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtil.java @@ -152,9 +152,9 @@ public static DescriptionResponseMessage descriptionResponse(@NotNull Message co * @param connectorId the connector ID. * @return the response message depending on the status result. */ - public static Message fromStatusResult(@NotNull StatusResult statusResult, - @NotNull Message correlationMessage, - @NotNull String connectorId) { + public static Message inProcessFromStatusResult(@NotNull StatusResult statusResult, + @NotNull Message correlationMessage, + @NotNull String connectorId) { if (statusResult.succeeded()) { return requestInProcess(correlationMessage, connectorId); } else { @@ -166,6 +166,31 @@ public static Message fromStatusResult(@NotNull StatusResult statusResult, } } + /** + * Creates a response message depending on the status result of a previously executed action. + * Returns a MessageProcessedNotificationMessage, if the result is succeeded and a rejection message otherwise. + * The rejection reason is BAD_PARAMETERS if the action can be retried and INTERNAL_RECIPIENT_ERROR + * for a fatal error. + * + * @param statusResult the status result. + * @param correlationMessage the request. + * @param connectorId the connector ID. + * @return the response message depending on the status result. + */ + public static Message processedFromStatusResult(@NotNull StatusResult statusResult, + @NotNull Message correlationMessage, + @NotNull String connectorId) { + if (statusResult.succeeded()) { + return messageProcessedNotification(correlationMessage, connectorId); + } else { + if (statusResult.fatalError()) { + return badParameters(correlationMessage, connectorId); + } else { + return internalRecipientError(correlationMessage, connectorId); + } + } + } + /** * Creates a rejection message with reason NOT_FOUND. * From 62b30c8051f78a5bf14900992978ccb7376a5cc4 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Mon, 18 Jul 2022 15:21:30 +0200 Subject: [PATCH 24/45] refactor: remove notification sub-handlers --- .../IdsMultipartApiServiceExtension.java | 25 ++------ .../handler/EndpointDataReferenceHandler.java | 4 ++ .../multipart/handler/HandlerRegistry.java | 43 ------------- .../handler/NotificationMessageHandler.java | 62 ------------------- .../NotificationMessageHandlerRegistry.java | 24 ------- 5 files changed, 10 insertions(+), 148 deletions(-) delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/HandlerRegistry.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandlerRegistry.java diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java index 82fdccd6813..55def046551 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java @@ -17,7 +17,6 @@ package org.eclipse.dataspaceconnector.ids.api.multipart; -import de.fraunhofer.iais.eis.ParticipantUpdateMessage; import org.eclipse.dataspaceconnector.ids.api.configuration.IdsApiConfiguration; import org.eclipse.dataspaceconnector.ids.api.multipart.controller.MultipartController; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.ArtifactRequestHandler; @@ -28,8 +27,6 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.handler.DescriptionRequestHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.EndpointDataReferenceHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.Handler; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.NotificationMessageHandler; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.NotificationMessageHandlerRegistry; import org.eclipse.dataspaceconnector.ids.core.serialization.ObjectMapperFactory; import org.eclipse.dataspaceconnector.ids.spi.IdsId; import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; @@ -127,29 +124,19 @@ private void registerControllers(ServiceExtensionContext serviceExtensionContext // once https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/236 is done var objectMapper = objectMapperFactory.getObjectMapper(); - // create request handler - var descriptionHandler = new DescriptionRequestHandler( - monitor, connectorId, transformerRegistry, - assetIndex, dataCatalogService, contractOfferService, connectorService); - + // create request handlers var handlers = new LinkedList(); - handlers.add(descriptionHandler); - - var artifactRequestHandler = new ArtifactRequestHandler(monitor, connectorId, objectMapper, contractNegotiationStore, contractValidationService, transferProcessManager, vault); - handlers.add(artifactRequestHandler); + + handlers.add(new DescriptionRequestHandler(monitor, connectorId, transformerRegistry, assetIndex, dataCatalogService, contractOfferService, connectorService)); + handlers.add(new ArtifactRequestHandler(monitor, connectorId, objectMapper, contractNegotiationStore, contractValidationService, transferProcessManager, vault)); + handlers.add(new EndpointDataReferenceHandler(monitor, connectorId, endpointDataReferenceReceiverRegistry, endpointDataReferenceTransformerRegistry, serviceExtensionContext.getTypeManager())); - // create contract message handlers + // contract message handlers handlers.add(new ContractRequestHandler(monitor, connectorId, objectMapper, providerNegotiationManager, transformerRegistry, assetIndex)); handlers.add(new ContractAgreementHandler(monitor, connectorId, objectMapper, consumerNegotiationManager, transformerRegistry)); handlers.add(new ContractOfferHandler(monitor, connectorId, objectMapper, providerNegotiationManager, consumerNegotiationManager)); handlers.add(new ContractRejectionHandler(monitor, connectorId, providerNegotiationManager, consumerNegotiationManager)); - // add notification handler and sub-handlers - var notificationHandlersRegistry = new NotificationMessageHandlerRegistry(); - var endpointDataReferenceHandler = new EndpointDataReferenceHandler(monitor, connectorId, endpointDataReferenceReceiverRegistry, endpointDataReferenceTransformerRegistry, serviceExtensionContext.getTypeManager()); - notificationHandlersRegistry.addHandler(ParticipantUpdateMessage.class, endpointDataReferenceHandler); - handlers.add(new NotificationMessageHandler(connectorId, notificationHandlersRegistry)); - // create & register controller var multipartController = new MultipartController(monitor, connectorId, objectMapper, identityService, handlers, idsApiConfiguration.getIdsWebhookAddress()); webService.registerResource(idsApiConfiguration.getContextAlias(), multipartController); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java index 2c0dbadfbf0..2c3cd95cd7e 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java @@ -15,6 +15,8 @@ package org.eclipse.dataspaceconnector.ids.api.multipart.handler; +import java.util.Objects; + import de.fraunhofer.iais.eis.ParticipantUpdateMessage; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; @@ -60,6 +62,8 @@ public EndpointDataReferenceHandler(@NotNull Monitor monitor, @Override public boolean canHandle(@NotNull MultipartRequest multipartRequest) { + Objects.requireNonNull(multipartRequest); + return multipartRequest.getHeader() instanceof ParticipantUpdateMessage; } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/HandlerRegistry.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/HandlerRegistry.java deleted file mode 100644 index e1c825e47f4..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/HandlerRegistry.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler; - -import org.jetbrains.annotations.Nullable; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - - -/** - * An in-memory {@link Handler} registry. - */ -public class HandlerRegistry { - private final Map, Handler> handlers = new HashMap<>(); - - public void addHandler(Class clazz, Handler handler) { - handlers.put(clazz, handler); - } - - public @Nullable Handler getHandler(Class clazz) { - return Arrays.stream(clazz.getInterfaces()) - .map(handlers::get) - .filter(Objects::nonNull) - .findFirst() - .orElse(null); - - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java deleted file mode 100644 index 4142d6d5d0d..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandler.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * Fraunhofer Institute for Software and Systems Engineering - refactoring - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler; - -import de.fraunhofer.iais.eis.NotificationMessage; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageTypeNotSupported; - -/** - * Implementation of the {@link Handler} class for handling of {@link NotificationMessage} - */ -public class NotificationMessageHandler implements Handler { - - private final String connectorId; - private final NotificationMessageHandlerRegistry subhandlers; - - public NotificationMessageHandler(String connectorId, @NotNull NotificationMessageHandlerRegistry subhandlers) { - this.connectorId = connectorId; - this.subhandlers = subhandlers; - } - - @Override - public boolean canHandle(@NotNull MultipartRequest multipartRequest) { - if (!(multipartRequest.getHeader() instanceof NotificationMessage)) { - return false; - } - var notification = (NotificationMessage) multipartRequest.getHeader(); - return subhandlers.getHandler(notification.getClass()) != null; - } - - /** - * Delegate the processing of the request to the first {@link Handler} in the registry that accepts this kind of request, if any. - */ - @Override - public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest, @NotNull ClaimToken claimToken) { - var notification = (NotificationMessage) multipartRequest.getHeader(); - var subhandler = subhandlers.getHandler(notification.getClass()); - if (subhandler == null) { - return createMultipartResponse(messageTypeNotSupported(multipartRequest.getHeader(), connectorId)); - } - return subhandler.handleRequest(multipartRequest, claimToken); - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandlerRegistry.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandlerRegistry.java deleted file mode 100644 index a8488e8891d..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandlerRegistry.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler; - -import de.fraunhofer.iais.eis.NotificationMessage; - -/** - * {@link NotificationMessage} has several implementations. This registry is used to hold the {{@link Handler} - * associated with each implementation. - */ -public class NotificationMessageHandlerRegistry extends HandlerRegistry { -} From 39fb36cfdea36dfb0fcfaf309c54f853a6e9cc61 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Mon, 18 Jul 2022 15:42:45 +0200 Subject: [PATCH 25/45] chore: remove check for connector payload in MultipartController --- .../multipart/controller/MultipartController.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java index 46141469560..3f46ff4f909 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java @@ -116,28 +116,24 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, return Response.ok(createResponse(malformedMessage(header, connectorId))).build(); } + // Check if DAT present var dynamicAttributeToken = header.getSecurityToken(); if (dynamicAttributeToken == null || dynamicAttributeToken.getTokenValue() == null) { monitor.warning("MultipartController: Token is missing in header"); return Response.ok(createResponse(notAuthenticated(header, connectorId))).build(); } - + + // Prepare DAT validation: IDS token validation requires issuerConnector var additional = new HashMap(); - //IDS token validation requires issuerConnector and securityProfile additional.put("issuerConnector", header.getIssuerConnector()); - try { - additional.put("securityProfile", objectMapper.readValue(payload, Connector.class).getSecurityProfile()); - } catch (Exception e) { - //payload no connector instance, nothing to do - } var tokenRepresentation = TokenRepresentation.Builder.newInstance() .token(dynamicAttributeToken.getTokenValue()) .additional(additional) .build(); - + + // Validate DAT var verificationResult = identityService.verifyJwtToken(tokenRepresentation, idsWebhookAddress); - if (verificationResult.failed()) { monitor.warning(format("MultipartController: Token validation failed %s", verificationResult.getFailure().getMessages())); return Response.ok(createResponse(notAuthenticated(header, connectorId))).build(); From 755e5d7210a2dcdbd450f29515f4ebec23f274f2 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Mon, 18 Jul 2022 15:45:01 +0200 Subject: [PATCH 26/45] refactor: remove superfluous claim token parameter --- .../IdsMultipartApiServiceExtension.java | 33 ++++++------------- .../controller/MultipartController.java | 3 +- .../handler/ArtifactRequestHandler.java | 19 +++++------ .../handler/ContractAgreementHandler.java | 7 ++-- .../handler/ContractOfferHandler.java | 4 +-- .../handler/ContractRejectionHandler.java | 7 ++-- .../handler/ContractRequestHandler.java | 7 ++-- .../handler/DescriptionRequestHandler.java | 8 ++--- .../handler/EndpointDataReferenceHandler.java | 5 +-- .../ids/api/multipart/handler/Handler.java | 3 +- .../multipart/message/MultipartRequest.java | 6 ++-- 11 files changed, 41 insertions(+), 61 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java index 55def046551..395831f4ebd 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java @@ -28,7 +28,6 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.handler.EndpointDataReferenceHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.Handler; import org.eclipse.dataspaceconnector.ids.core.serialization.ObjectMapperFactory; -import org.eclipse.dataspaceconnector.ids.spi.IdsId; import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; import org.eclipse.dataspaceconnector.ids.spi.IdsType; import org.eclipse.dataspaceconnector.ids.spi.service.CatalogService; @@ -109,29 +108,24 @@ public String name() { @Override - public void initialize(ServiceExtensionContext serviceExtensionContext) { - monitor = serviceExtensionContext.getMonitor(); + public void initialize(ServiceExtensionContext context) { + monitor = context.getMonitor(); - registerControllers(serviceExtensionContext); + registerControllers(context); } - private void registerControllers(ServiceExtensionContext serviceExtensionContext) { - - var connectorId = resolveConnectorId(serviceExtensionContext); - - // create & register controller + private void registerControllers(ServiceExtensionContext context) { + var connectorId = resolveConnectorId(context); + // TODO ObjectMapper needs to be replaced by one capable to write proper IDS JSON-LD // once https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/issues/236 is done var objectMapper = objectMapperFactory.getObjectMapper(); // create request handlers var handlers = new LinkedList(); - handlers.add(new DescriptionRequestHandler(monitor, connectorId, transformerRegistry, assetIndex, dataCatalogService, contractOfferService, connectorService)); handlers.add(new ArtifactRequestHandler(monitor, connectorId, objectMapper, contractNegotiationStore, contractValidationService, transferProcessManager, vault)); - handlers.add(new EndpointDataReferenceHandler(monitor, connectorId, endpointDataReferenceReceiverRegistry, endpointDataReferenceTransformerRegistry, serviceExtensionContext.getTypeManager())); - - // contract message handlers + handlers.add(new EndpointDataReferenceHandler(monitor, connectorId, endpointDataReferenceReceiverRegistry, endpointDataReferenceTransformerRegistry, context.getTypeManager())); handlers.add(new ContractRequestHandler(monitor, connectorId, objectMapper, providerNegotiationManager, transformerRegistry, assetIndex)); handlers.add(new ContractAgreementHandler(monitor, connectorId, objectMapper, consumerNegotiationManager, transformerRegistry)); handlers.add(new ContractOfferHandler(monitor, connectorId, objectMapper, providerNegotiationManager, consumerNegotiationManager)); @@ -145,22 +139,15 @@ private void registerControllers(ServiceExtensionContext serviceExtensionContext private String resolveConnectorId(@NotNull ServiceExtensionContext context) { Objects.requireNonNull(context); - String value = context.getSetting(EDC_IDS_ID, null); - - if (value == null) { - String message = "IDS Settings: No setting found for key '%s'. Using default value '%s'"; - monitor.warning(String.format(message, EDC_IDS_ID, DEFAULT_EDC_IDS_ID)); - value = DEFAULT_EDC_IDS_ID; - } - + var value = context.getSetting(EDC_IDS_ID, DEFAULT_EDC_IDS_ID); try { // Hint: use stringified uri to keep uri path and query - IdsId idsId = IdsIdParser.parse(value); + var idsId = IdsIdParser.parse(value); if (idsId != null && idsId.getType() == IdsType.CONNECTOR) { return idsId.getValue(); } } catch (IllegalArgumentException e) { - String message = "IDS Settings: Expected valid URN for setting '%s', but was %s'. Expected format: 'urn:connector:[id]'"; + var message = "IDS Settings: Expected valid URN for setting '%s', but was %s'. Expected format: 'urn:connector:[id]'"; throw new EdcException(String.format(message, EDC_IDS_ID, DEFAULT_EDC_IDS_ID)); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java index 3f46ff4f909..83f16becc0c 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java @@ -18,7 +18,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import de.fraunhofer.iais.eis.Connector; import de.fraunhofer.iais.eis.DynamicAttributeTokenBuilder; import de.fraunhofer.iais.eis.Message; import de.fraunhofer.iais.eis.TokenFormat; @@ -154,7 +153,7 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, return Response.ok(createResponse(messageTypeNotSupported(header, connectorId))).build(); } - var multipartResponse = handler.handleRequest(multipartRequest, claimToken); + var multipartResponse = handler.handleRequest(multipartRequest); if (multipartResponse != null) { return Response.ok(createResponse(multipartResponse)).build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index 8e8027b1002..725bade77bd 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -26,7 +26,6 @@ import org.eclipse.dataspaceconnector.ids.spi.spec.extension.ArtifactRequestMessagePayload; import org.eclipse.dataspaceconnector.spi.contract.negotiation.store.ContractNegotiationStore; import org.eclipse.dataspaceconnector.spi.contract.validation.ContractValidationService; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; import org.eclipse.dataspaceconnector.spi.monitor.Monitor; import org.eclipse.dataspaceconnector.spi.security.Vault; import org.eclipse.dataspaceconnector.spi.transfer.TransferProcessManager; @@ -80,20 +79,20 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } @Override - public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest, @NotNull ClaimToken claimToken) { + public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); - Objects.requireNonNull(claimToken); + + var claimToken = multipartRequest.getClaimToken(); + var message = (ArtifactRequestMessage) multipartRequest.getHeader(); - var artifactRequestMessage = (ArtifactRequestMessage) multipartRequest.getHeader(); - - var artifactUri = artifactRequestMessage.getRequestedArtifact(); + var artifactUri = message.getRequestedArtifact(); var artifactIdsId = IdsIdParser.parse(artifactUri.toString()); if (artifactIdsId.getType() != IdsType.ARTIFACT) { monitor.debug("ArtifactRequestHandler: Requested artifact URI not of type artifact."); return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } - var contractUri = artifactRequestMessage.getTransferContract(); + var contractUri = message.getTransferContract(); var contractIdsId = IdsIdParser.parse(contractUri.toString()); if (contractIdsId.getType() != IdsType.CONTRACT) { monitor.debug("ArtifactRequestHandler: Transfer contract URI not of type contract."); @@ -128,8 +127,8 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var dataAddress = artifactRequestMessagePayload.getDataDestination(); Map props = new HashMap<>(); - if (artifactRequestMessage.getProperties() != null) { - artifactRequestMessage.getProperties().forEach((k, v) -> props.put(k, v.toString())); + if (message.getProperties() != null) { + message.getProperties().forEach((k, v) -> props.put(k, v.toString())); } var idsWebhookAddress = Optional.ofNullable(props.remove(IDS_WEBHOOK_ADDRESS_PROPERTY)) @@ -145,7 +144,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { // is different from the one specified by the contract var dataRequest = DataRequest.Builder.newInstance() - .id(artifactRequestMessage.getId().toString()) + .id(message.getId().toString()) .protocol(Protocols.IDS_MULTIPART) .dataDestination(dataAddress) .connectorId(connectorId) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java index fc5464c486d..2c962fc8d02 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java @@ -22,7 +22,6 @@ import org.eclipse.dataspaceconnector.ids.spi.transform.ContractTransformerInput; import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; import org.eclipse.dataspaceconnector.spi.contract.negotiation.ConsumerContractNegotiationManager; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; import org.eclipse.dataspaceconnector.spi.monitor.Monitor; import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; import org.jetbrains.annotations.NotNull; @@ -67,10 +66,10 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } @Override - public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest, @NotNull ClaimToken claimToken) { + public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); - Objects.requireNonNull(claimToken); - + + var claimToken = multipartRequest.getClaimToken(); var message = (ContractAgreementMessage) multipartRequest.getHeader(); de.fraunhofer.iais.eis.ContractAgreement contractAgreement; diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java index b96c132cda1..1a75fb4240f 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java @@ -22,7 +22,6 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.eclipse.dataspaceconnector.spi.contract.negotiation.ConsumerContractNegotiationManager; import org.eclipse.dataspaceconnector.spi.contract.negotiation.ProviderContractNegotiationManager; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; import org.eclipse.dataspaceconnector.spi.monitor.Monitor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -66,9 +65,8 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } @Override - public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest, @NotNull ClaimToken claimToken) { + public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); - Objects.requireNonNull(claimToken); var message = (ContractOfferMessage) multipartRequest.getHeader(); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java index e84aaf284d6..efb6655eb5e 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java @@ -19,7 +19,6 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.eclipse.dataspaceconnector.spi.contract.negotiation.ConsumerContractNegotiationManager; import org.eclipse.dataspaceconnector.spi.contract.negotiation.ProviderContractNegotiationManager; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; import org.eclipse.dataspaceconnector.spi.monitor.Monitor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -59,10 +58,10 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } @Override - public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest, @NotNull ClaimToken claimToken) { + public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); - Objects.requireNonNull(claimToken); - + + var claimToken = multipartRequest.getClaimToken(); var message = (ContractRejectionMessage) multipartRequest.getHeader(); var correlationMessageId = message.getCorrelationMessage(); var correlationId = message.getTransferContract(); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java index 61f2da56b2d..6a4c77885fc 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java @@ -26,7 +26,6 @@ import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; import org.eclipse.dataspaceconnector.spi.asset.AssetIndex; import org.eclipse.dataspaceconnector.spi.contract.negotiation.ProviderContractNegotiationManager; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; import org.eclipse.dataspaceconnector.spi.monitor.Monitor; import org.eclipse.dataspaceconnector.spi.result.Result; import org.eclipse.dataspaceconnector.spi.types.domain.contract.negotiation.ContractOfferRequest; @@ -77,10 +76,10 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } @Override - public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest, @NotNull ClaimToken claimToken) { + public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); - Objects.requireNonNull(claimToken); - + + var claimToken = multipartRequest.getClaimToken(); var message = (ContractRequestMessage) multipartRequest.getHeader(); ContractRequest contractRequest; diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java index 3fc18ab149c..be49a7fc590 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java @@ -87,13 +87,11 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } @Override - public MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest, - @NotNull ClaimToken claimToken) { + public MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); - Objects.requireNonNull(claimToken); - + try { - return handleRequestInternal(multipartRequest, claimToken); + return handleRequestInternal(multipartRequest, multipartRequest.getClaimToken()); } catch (EdcException exception) { monitor.severe(format("Could not handle multipart request: %s", exception.getMessage()), exception); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java index 2c3cd95cd7e..17fc90ffd5d 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java @@ -20,7 +20,6 @@ import de.fraunhofer.iais.eis.ParticipantUpdateMessage; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; import org.eclipse.dataspaceconnector.spi.monitor.Monitor; import org.eclipse.dataspaceconnector.spi.transfer.edr.EndpointDataReferenceReceiver; import org.eclipse.dataspaceconnector.spi.transfer.edr.EndpointDataReferenceReceiverRegistry; @@ -74,7 +73,9 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { * - finally apply {@link EndpointDataReferenceReceiver} to the resulting EDR to dispatch it into the consumer environment. */ @Override - public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest, @NotNull ClaimToken claimToken) { + public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { + Objects.requireNonNull(multipartRequest); + var edr = typeManager.readValue(multipartRequest.getPayload(), EndpointDataReference.class); var transformationResult = transformerRegistry.transform(edr); if (transformationResult.failed()) { diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/Handler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/Handler.java index 77070ddadcc..5ed487569ad 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/Handler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/Handler.java @@ -16,7 +16,6 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -36,5 +35,5 @@ public interface Handler { * @param multipartRequest from another connector * @return {@link MultipartResponse} or null, if the request cannot be handled (e.g. when content missing) */ - @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest, @NotNull ClaimToken claimToken); + @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartRequest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartRequest.java index 20ac1cca80a..2bdb77e9b08 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartRequest.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartRequest.java @@ -61,7 +61,7 @@ public static Builder newInstance() { return new Builder(); } - public Builder header(@Nullable Message header) { + public Builder header(@NotNull Message header) { this.header = header; return this; } @@ -71,12 +71,14 @@ public Builder payload(@Nullable String payload) { return this; } - public Builder claimToken(ClaimToken claimToken) { + public Builder claimToken(@NotNull ClaimToken claimToken) { this.claimToken = claimToken; return this; } public MultipartRequest build() { + Objects.requireNonNull(header, "Multipart request header is null."); + Objects.requireNonNull(claimToken, "Multipart request claim token is null."); return new MultipartRequest(header, payload, claimToken); } } From a61cdf9f60995541677496ea8cb61fa96dc2ce2f Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Mon, 18 Jul 2022 15:50:33 +0200 Subject: [PATCH 27/45] refactor: remove internal handle method from DescriptionRequestHandler --- .../handler/DescriptionRequestHandler.java | 42 ++++++------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java index be49a7fc590..770a382fb4c 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java @@ -30,7 +30,6 @@ import org.eclipse.dataspaceconnector.ids.spi.service.ConnectorService; import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; import org.eclipse.dataspaceconnector.ids.spi.types.container.OfferedAsset; -import org.eclipse.dataspaceconnector.spi.EdcException; import org.eclipse.dataspaceconnector.spi.asset.AssetIndex; import org.eclipse.dataspaceconnector.spi.contract.offer.ContractOfferQuery; import org.eclipse.dataspaceconnector.spi.contract.offer.ContractOfferService; @@ -89,49 +88,36 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { @Override public MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); - - try { - return handleRequestInternal(multipartRequest, multipartRequest.getClaimToken()); - } catch (EdcException exception) { - monitor.severe(format("Could not handle multipart request: %s", exception.getMessage()), exception); - } - - return createMultipartResponse(messageTypeNotSupported(multipartRequest.getHeader(), connectorId)); - } - public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipartRequest, - @NotNull ClaimToken claimToken) { - Objects.requireNonNull(multipartRequest); - Objects.requireNonNull(claimToken); - - var descriptionRequestMessage = (DescriptionRequestMessage) multipartRequest.getHeader(); - - var requestedElement = descriptionRequestMessage.getRequestedElement(); + var claimToken = multipartRequest.getClaimToken(); + var message = (DescriptionRequestMessage) multipartRequest.getHeader(); + + var requestedElement = message.getRequestedElement(); IdsId idsId = null; if (requestedElement != null) { var idsIdResult = transformerRegistry.transform(requestedElement, IdsId.class); if (idsIdResult.failed()) { monitor.warning(format("Could not transform URI to IdsId: [%s]", String.join(", ", idsIdResult.getFailureMessages()))); - return createMultipartResponse(badParameters(descriptionRequestMessage, connectorId)); + return createMultipartResponse(badParameters(message, connectorId)); } - + idsId = idsIdResult.getContent(); } //TODO: IDS REFACTORING: this should be a named property of the message object // extract paging information, default to 0 ... Integer.MAX_VALUE - var from = getInt(descriptionRequestMessage, Range.FROM, 0); - var to = getInt(descriptionRequestMessage, Range.TO, Integer.MAX_VALUE); + var from = getInt(message, Range.FROM, 0); + var to = getInt(message, Range.TO, Integer.MAX_VALUE); var range = new Range(from, to); - + Result result; if (idsId == null || (idsId.getType() == IdsType.CONNECTOR)) { result = getConnector(claimToken, range); } else { var retrievedObject = retrieveRequestedElement(idsId, claimToken, range); if (retrievedObject == null) { - return createMultipartResponse(notFound(descriptionRequestMessage, connectorId)); + return createMultipartResponse(notFound(message, connectorId)); } result = transformRequestedElement(retrievedObject, idsId.getType()); } @@ -144,13 +130,11 @@ public MultipartResponse handleRequestInternal(@NotNull MultipartRequest multipa monitor.warning(String.format("Could not retrieve requested element with ID %s:%s: [%s]", idsId.getType(), idsId.getValue(), String.join(", ", result.getFailureMessages()))); } - - return createMultipartResponse(badParameters(descriptionRequestMessage, connectorId)); - } - var descriptionResponseMessage = descriptionResponse(descriptionRequestMessage, connectorId); + return createMultipartResponse(badParameters(message, connectorId)); + } - return createMultipartResponse(descriptionResponseMessage, result.getContent()); + return createMultipartResponse(descriptionResponse(message, connectorId), result.getContent()); } private Result getConnector(ClaimToken claimToken, Range range) { From dea5fcf493f3d5e163bdc4dac1c707c4066947e3 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 19 Jul 2022 14:03:32 +0200 Subject: [PATCH 28/45] docs: add comments and Javadoc --- .../controller/MultipartController.java | 4 +++- .../handler/ArtifactRequestHandler.java | 18 +++++++++++++----- .../handler/ContractRequestHandler.java | 3 ++- .../handler/DescriptionRequestHandler.java | 19 ++++++++++++++++++- .../handler/EndpointDataReferenceHandler.java | 2 ++ .../multipart/message/MultipartRequest.java | 4 ++++ .../multipart/message/MultipartResponse.java | 3 +++ 7 files changed, 45 insertions(+), 8 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java index 83f16becc0c..ec1dc9e5035 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java @@ -110,7 +110,7 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, return Response.ok(createResponse(malformedMessage(null, connectorId))).build(); } - // Check if any required field missing + // Check if any required header field missing if (header.getId() == null || header.getIssuerConnector() == null || header.getSenderAgent() == null) { return Response.ok(createResponse(malformedMessage(header, connectorId))).build(); } @@ -138,6 +138,7 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, return Response.ok(createResponse(notAuthenticated(header, connectorId))).build(); } + // Build the multipart request var claimToken = verificationResult.getContent(); var multipartRequest = MultipartRequest.Builder.newInstance() .header(header) @@ -145,6 +146,7 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, .claimToken(claimToken) .build(); + // Find handler for the multipart request var handler = multipartHandlers.stream() .filter(h -> h.canHandle(multipartRequest)) .findFirst() diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index 725bade77bd..fa3362c3c7d 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -85,6 +85,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var claimToken = multipartRequest.getClaimToken(); var message = (ArtifactRequestMessage) multipartRequest.getHeader(); + // Validate request artifact ID var artifactUri = message.getRequestedArtifact(); var artifactIdsId = IdsIdParser.parse(artifactUri.toString()); if (artifactIdsId.getType() != IdsType.ARTIFACT) { @@ -92,6 +93,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } + // Validate contract ID var contractUri = message.getTransferContract(); var contractIdsId = IdsIdParser.parse(contractUri.toString()); if (contractIdsId.getType() != IdsType.CONTRACT) { @@ -99,38 +101,43 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } + // Get contract agreement for received contract ID var contractAgreement = contractNegotiationStore.findContractAgreement(contractIdsId.getValue()); if (contractAgreement == null) { monitor.debug(String.format("ArtifactRequestHandler: No contract agreement with id %s found.", contractIdsId.getValue())); return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } + // Validate contract agreement var isContractValid = contractValidationService.validate(claimToken, contractAgreement); if (!isContractValid) { monitor.debug("ArtifactRequestHandler: Contract is invalid"); return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } + // Verify that contract agreement is valid for requested artifact if (!artifactIdsId.getValue().equals(contractAgreement.getAssetId())) { monitor.debug(String.format("ArtifactRequestHandler: invalid artifact id specified %s for contract: %s", artifactIdsId.getValue(), contractIdsId.getValue())); return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } + // Read request payload, which contains the data destination and an optional secret ArtifactRequestMessagePayload artifactRequestMessagePayload; try { - artifactRequestMessagePayload = - objectMapper.readValue(multipartRequest.getPayload(), ArtifactRequestMessagePayload.class); + artifactRequestMessagePayload = objectMapper.readValue(multipartRequest.getPayload(), ArtifactRequestMessagePayload.class); } catch (IOException e) { return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } - var dataAddress = artifactRequestMessagePayload.getDataDestination(); + var dataDestination = artifactRequestMessagePayload.getDataDestination(); + // Read request message properties Map props = new HashMap<>(); if (message.getProperties() != null) { message.getProperties().forEach((k, v) -> props.put(k, v.toString())); } + // Get webhook address of requesting connector from message properties var idsWebhookAddress = Optional.ofNullable(props.remove(IDS_WEBHOOK_ADDRESS_PROPERTY)) .map(Object::toString) .orElse(null); @@ -146,7 +153,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var dataRequest = DataRequest.Builder.newInstance() .id(message.getId().toString()) .protocol(Protocols.IDS_MULTIPART) - .dataDestination(dataAddress) + .dataDestination(dataDestination) .connectorId(connectorId) .assetId(contractAgreement.getAssetId()) .contractId(contractAgreement.getId()) @@ -154,10 +161,11 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { .connectorAddress(idsWebhookAddress) .build(); + // Initiate a transfer process for the request var transferInitiateResult = transferProcessManager.initiateProviderRequest(dataRequest); if (artifactRequestMessagePayload.getSecret() != null) { - vault.storeSecret(dataAddress.getKeyName(), artifactRequestMessagePayload.getSecret()); + vault.storeSecret(dataDestination.getKeyName(), artifactRequestMessagePayload.getSecret()); } return createMultipartResponse(inProcessFromStatusResult(transferInitiateResult, multipartRequest.getHeader(), connectorId)); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java index 6a4c77885fc..8c91a45e6a6 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java @@ -89,7 +89,8 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { monitor.severe("ContractRequestHandler: Contract Request is invalid", e); return createMultipartResponse(badParameters(message, connectorId)); } - + + // Get webhook address of requesting connector from message properties var idsWebhookAddress = message.getProperties().get(IDS_WEBHOOK_ADDRESS_PROPERTY); if (idsWebhookAddress == null || idsWebhookAddress.toString().isBlank()) { var msg = "Ids webhook address is invalid"; diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java index 770a382fb4c..585891a63b3 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java @@ -49,7 +49,6 @@ import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.descriptionResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageTypeNotSupported; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.notFound; public class DescriptionRequestHandler implements Handler { @@ -92,6 +91,7 @@ public MultipartResponse handleRequest(@NotNull MultipartRequest multipartReques var claimToken = multipartRequest.getClaimToken(); var message = (DescriptionRequestMessage) multipartRequest.getHeader(); + // Get ID of requested element var requestedElement = message.getRequestedElement(); IdsId idsId = null; if (requestedElement != null) { @@ -111,6 +111,7 @@ public MultipartResponse handleRequest(@NotNull MultipartRequest multipartReques var to = getInt(message, Range.TO, Integer.MAX_VALUE); var range = new Range(from, to); + // Retrieve and transform requested element Result result; if (idsId == null || (idsId.getType() == IdsType.CONNECTOR)) { result = getConnector(claimToken, range); @@ -141,6 +142,15 @@ private Result getConnector(ClaimToken claimToken, Range range) { return transformerRegistry.transform(connectorService.getConnector(claimToken, range), de.fraunhofer.iais.eis.Connector.class); } + /** + * Retrieves the requested element specified by the IdsId. If the requested element is a + * catalog or resource, the given range is used. + * + * @param idsId the ID. + * @param claimToken the claim token of the requesting connector. + * @param range the range. + * @return the requested element. + */ private Object retrieveRequestedElement(IdsId idsId, ClaimToken claimToken, Range range) { var type = idsId.getType(); switch (type) { @@ -168,6 +178,13 @@ private Object retrieveRequestedElement(IdsId idsId, ClaimToken claimToken, Rang } } + /** + * Transforms the requested element as defined by the IdsType. + * + * @param object the object to transform. + * @param type the IDS target type. + * @return the transformation result, + */ private Result transformRequestedElement(Object object, IdsType type) { switch (type) { case ARTIFACT: diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java index 17fc90ffd5d..c4ffa7039b2 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java @@ -76,6 +76,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); + // Read and transform the endpoint data reference from the request payload var edr = typeManager.readValue(multipartRequest.getPayload(), EndpointDataReference.class); var transformationResult = transformerRegistry.transform(edr); if (transformationResult.failed()) { @@ -85,6 +86,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var transformedEdr = transformationResult.getContent(); + // Apply all endpoint data reference receivers to the endpoint data reference var receiveResult = receiverRegistry.receiveAll(transformedEdr).join(); if (receiveResult.failed()) { monitor.severe("EDR dispatch failed: " + String.join(", ", receiveResult.getFailureMessages())); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartRequest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartRequest.java index 2bdb77e9b08..aa7b80c0e88 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartRequest.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartRequest.java @@ -21,6 +21,10 @@ import java.util.Objects; +/** + * Represents an IDS multipart request. Contains the IDS message header, an optional payload and + * the claim token for the requesting connector. + */ public class MultipartRequest { private final Message header; diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartResponse.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartResponse.java index 94c5f1711c3..8c523b3c0e5 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartResponse.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartResponse.java @@ -20,6 +20,9 @@ import java.util.Objects; +/** + * Represents an IDS multipart response. Contains the IDS message header and an optional payload. + */ public class MultipartResponse { private final Message header; From 199ff974314347f88e725c2d1898c54f5b24659c Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 19 Jul 2022 14:12:58 +0200 Subject: [PATCH 29/45] refactor: make handleRequest in Handler @NotNull --- .../controller/MultipartController.java | 25 ++++++++----------- .../handler/ArtifactRequestHandler.java | 3 +-- .../handler/ContractAgreementHandler.java | 3 +-- .../handler/ContractOfferHandler.java | 3 +-- .../handler/ContractRejectionHandler.java | 3 +-- .../handler/ContractRequestHandler.java | 3 +-- .../handler/DescriptionRequestHandler.java | 2 +- .../handler/EndpointDataReferenceHandler.java | 3 +-- .../ids/api/multipart/handler/Handler.java | 7 +++--- 9 files changed, 20 insertions(+), 32 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java index ec1dc9e5035..32f3a58e723 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java @@ -50,7 +50,6 @@ import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.malformedMessage; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageTypeNotSupported; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.notAuthenticated; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.notFound; @Consumes({MediaType.MULTIPART_FORM_DATA}) @Produces({MediaType.MULTIPART_FORM_DATA}) @@ -96,30 +95,30 @@ public MultipartController(@NotNull Monitor monitor, public Response request(@FormDataParam(HEADER) InputStream headerInputStream, @FormDataParam(PAYLOAD) String payload) { if (headerInputStream == null) { - return Response.ok(createResponse(malformedMessage(null, connectorId))).build(); + return Response.ok(buildMultipart(malformedMessage(null, connectorId))).build(); } Message header; try { header = objectMapper.readValue(headerInputStream, Message.class); } catch (IOException e) { - return Response.ok(createResponse(malformedMessage(null, connectorId))).build(); + return Response.ok(buildMultipart(malformedMessage(null, connectorId))).build(); } if (header == null) { - return Response.ok(createResponse(malformedMessage(null, connectorId))).build(); + return Response.ok(buildMultipart(malformedMessage(null, connectorId))).build(); } // Check if any required header field missing if (header.getId() == null || header.getIssuerConnector() == null || header.getSenderAgent() == null) { - return Response.ok(createResponse(malformedMessage(header, connectorId))).build(); + return Response.ok(buildMultipart(malformedMessage(header, connectorId))).build(); } // Check if DAT present var dynamicAttributeToken = header.getSecurityToken(); if (dynamicAttributeToken == null || dynamicAttributeToken.getTokenValue() == null) { monitor.warning("MultipartController: Token is missing in header"); - return Response.ok(createResponse(notAuthenticated(header, connectorId))).build(); + return Response.ok(buildMultipart(notAuthenticated(header, connectorId))).build(); } // Prepare DAT validation: IDS token validation requires issuerConnector @@ -135,7 +134,7 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, var verificationResult = identityService.verifyJwtToken(tokenRepresentation, idsWebhookAddress); if (verificationResult.failed()) { monitor.warning(format("MultipartController: Token validation failed %s", verificationResult.getFailure().getMessages())); - return Response.ok(createResponse(notAuthenticated(header, connectorId))).build(); + return Response.ok(buildMultipart(notAuthenticated(header, connectorId))).build(); } // Build the multipart request @@ -152,15 +151,11 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, .findFirst() .orElse(null); if (handler == null) { - return Response.ok(createResponse(messageTypeNotSupported(header, connectorId))).build(); + return Response.ok(buildMultipart(messageTypeNotSupported(header, connectorId))).build(); } var multipartResponse = handler.handleRequest(multipartRequest); - if (multipartResponse != null) { - return Response.ok(createResponse(multipartResponse)).build(); - } - - return Response.ok(createResponse(notFound(header, connectorId))).build(); + return Response.ok(buildMultipart(multipartResponse)).build(); } /** @@ -170,7 +165,7 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, * @param multipartResponse the multipart response. * @return a multipart body. */ - private FormDataMultiPart createResponse(MultipartResponse multipartResponse) { + private FormDataMultiPart buildMultipart(MultipartResponse multipartResponse) { addTokenToResponseHeader(multipartResponse.getHeader()); return createFormDataMultiPart(multipartResponse.getHeader(), multipartResponse.getPayload()); } @@ -182,7 +177,7 @@ private FormDataMultiPart createResponse(MultipartResponse multipartResponse) { * @param header the multipart response. * @return a multipart body. */ - private FormDataMultiPart createResponse(Message header) { + private FormDataMultiPart buildMultipart(Message header) { addTokenToResponseHeader(header); return createFormDataMultiPart(header, null); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index fa3362c3c7d..ac4c7faa82a 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -31,7 +31,6 @@ import org.eclipse.dataspaceconnector.spi.transfer.TransferProcessManager; import org.eclipse.dataspaceconnector.spi.types.domain.transfer.DataRequest; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.HashMap; @@ -79,7 +78,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } @Override - public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { + public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); var claimToken = multipartRequest.getClaimToken(); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java index 2c962fc8d02..c0daaae6745 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java @@ -25,7 +25,6 @@ import org.eclipse.dataspaceconnector.spi.monitor.Monitor; import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.Objects; @@ -66,7 +65,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } @Override - public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { + public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); var claimToken = multipartRequest.getClaimToken(); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java index 1a75fb4240f..e00ac5ae9cb 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java @@ -24,7 +24,6 @@ import org.eclipse.dataspaceconnector.spi.contract.negotiation.ProviderContractNegotiationManager; import org.eclipse.dataspaceconnector.spi.monitor.Monitor; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.Objects; @@ -65,7 +64,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } @Override - public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { + public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); var message = (ContractOfferMessage) multipartRequest.getHeader(); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java index efb6655eb5e..5e8d8adb2bc 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java @@ -21,7 +21,6 @@ import org.eclipse.dataspaceconnector.spi.contract.negotiation.ProviderContractNegotiationManager; import org.eclipse.dataspaceconnector.spi.monitor.Monitor; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Objects; @@ -58,7 +57,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } @Override - public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { + public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); var claimToken = multipartRequest.getClaimToken(); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java index 8c91a45e6a6..62132c07686 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java @@ -31,7 +31,6 @@ import org.eclipse.dataspaceconnector.spi.types.domain.contract.negotiation.ContractOfferRequest; import org.eclipse.dataspaceconnector.spi.types.domain.contract.offer.ContractOffer; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.Objects; @@ -76,7 +75,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } @Override - public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { + public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); var claimToken = multipartRequest.getClaimToken(); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java index 585891a63b3..db553b5f947 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java @@ -85,7 +85,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } @Override - public MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { + public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); var claimToken = multipartRequest.getClaimToken(); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java index c4ffa7039b2..32c4ee41c45 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java @@ -29,7 +29,6 @@ import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReference; import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReferenceMessage; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageProcessedNotification; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; @@ -73,7 +72,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { * - finally apply {@link EndpointDataReferenceReceiver} to the resulting EDR to dispatch it into the consumer environment. */ @Override - public @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { + public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { Objects.requireNonNull(multipartRequest); // Read and transform the endpoint data reference from the request payload diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/Handler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/Handler.java index 5ed487569ad..8ac7c1486f7 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/Handler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/Handler.java @@ -17,7 +17,6 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public interface Handler { @@ -32,8 +31,8 @@ public interface Handler { /** * Handles the given {@link MultipartRequest}. * - * @param multipartRequest from another connector - * @return {@link MultipartResponse} or null, if the request cannot be handled (e.g. when content missing) + * @param multipartRequest request received from another connector + * @return {@link MultipartResponse} */ - @Nullable MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest); + @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest); } From 0a0b08ff38b46dce44a772e61e4725ad256edd9b Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 19 Jul 2022 14:22:18 +0200 Subject: [PATCH 30/45] chore: change rejection reason in EDR handler --- .../api/multipart/handler/EndpointDataReferenceHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java index 32c4ee41c45..857a0a3d96c 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java @@ -30,6 +30,7 @@ import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReferenceMessage; import org.jetbrains.annotations.NotNull; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageProcessedNotification; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.internalRecipientError; @@ -80,7 +81,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { var transformationResult = transformerRegistry.transform(edr); if (transformationResult.failed()) { monitor.severe("EDR transformation failed: " + String.join(", ", transformationResult.getFailureMessages())); - return createMultipartResponse(internalRecipientError(multipartRequest.getHeader(), connectorId)); + return createMultipartResponse(badParameters(multipartRequest.getHeader(), connectorId)); } var transformedEdr = transformationResult.getContent(); From 39a9d1deec066ab4583a710822a992e0eb7b2cee Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 19 Jul 2022 14:46:04 +0200 Subject: [PATCH 31/45] chore: add required fields to test messages --- .../ids/api/multipart/handler/ContractOfferHandler.java | 4 ++-- .../AbstractMultipartControllerIntegrationTest.java | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java index e00ac5ae9cb..fd8671ae094 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java @@ -30,7 +30,7 @@ import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageTypeNotSupported; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.requestInProcess; /** * This class handles and processes incoming IDS {@link ContractOfferMessage}s. @@ -78,6 +78,6 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } // TODO similar implementation to ContractRequestHandler (only required if counter offers supported, not needed for M1) - return createMultipartResponse(messageTypeNotSupported(message, connectorId)); + return createMultipartResponse(requestInProcess(message, connectorId)); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/AbstractMultipartControllerIntegrationTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/AbstractMultipartControllerIntegrationTest.java index 273f26b1001..0c2765c34a8 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/AbstractMultipartControllerIntegrationTest.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/AbstractMultipartControllerIntegrationTest.java @@ -139,7 +139,8 @@ protected DescriptionRequestMessage getDescriptionRequestMessage() { protected DescriptionRequestMessage getDescriptionRequestMessage(IdsId idsId) { DescriptionRequestMessageBuilder builder = new DescriptionRequestMessageBuilder() ._securityToken_(getDynamicAttributeToken()) - ._issuerConnector_(URI.create("issuerConnector")); + ._issuerConnector_(URI.create("issuerConnector")) + ._senderAgent_(URI.create("senderAgent")); if (idsId != null) { builder._requestedElement_( @@ -152,7 +153,7 @@ protected ContractRequestMessage getContractRequestMessage() { var message = new ContractRequestMessageBuilder() ._correlationMessage_(URI.create("correlationId")) ._securityToken_(getDynamicAttributeToken()) - ._senderAgent_(URI.create("sender")) + ._senderAgent_(URI.create("senderAgent")) ._issuerConnector_(URI.create("issuerConnector")) .build(); message.setProperty(IDS_WEBHOOK_ADDRESS_PROPERTY, "http://someUrl"); @@ -164,6 +165,7 @@ protected ContractAgreementMessage getContractAgreementMessage() { ._correlationMessage_(URI.create("correlationId")) ._securityToken_(getDynamicAttributeToken()) ._issuerConnector_(URI.create("issuerConnector")) + ._senderAgent_(URI.create("senderAgent")) .build(); } @@ -173,13 +175,14 @@ protected ContractRejectionMessage getContractRejectionMessage() { ._transferContract_(URI.create("contractId")) ._securityToken_(getDynamicAttributeToken()) ._issuerConnector_(URI.create("issuerConnector")) + ._senderAgent_(URI.create("senderAgent")) .build(); } protected ContractOfferMessage getContractOfferMessage() { return new ContractOfferMessageBuilder() ._correlationMessage_(URI.create("correlationId")) - ._senderAgent_(URI.create("sender")) + ._senderAgent_(URI.create("senderAgent")) ._securityToken_(getDynamicAttributeToken()) ._issuerConnector_(URI.create("issuerConnector")) .build(); From 24b2045fa874968ab0d7ff5a1d624214ac911ba4 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 19 Jul 2022 14:55:44 +0200 Subject: [PATCH 32/45] test: update handler tests --- .../handler/ArtifactRequestHandlerTest.java | 20 ++-- .../EndpointDataReferenceHandlerTest.java | 8 +- .../NotificationMessageHandlerTest.java | 99 ------------------- 3 files changed, 17 insertions(+), 110 deletions(-) delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandlerTest.java diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandlerTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandlerTest.java index 603c85f73c5..1dfa8b92df3 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandlerTest.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandlerTest.java @@ -92,17 +92,17 @@ void handleRequestOkTest() throws JsonProcessingException { var artifactRequestId = UUID.randomUUID().toString(); var contractId = UUID.randomUUID().toString(); var destination = DataAddress.Builder.newInstance().keyName(UUID.randomUUID().toString()).type("test").build(); - var multipartRequest = createMultipartRequest(destination, artifactRequestId, assetId, contractId); - var header = (ArtifactRequestMessage) multipartRequest.getHeader(); var agreement = createContractAgreement(contractId, assetId); var claimToken = ClaimToken.Builder.newInstance().build(); + var multipartRequest = createMultipartRequest(destination, artifactRequestId, assetId, contractId, claimToken); + var header = (ArtifactRequestMessage) multipartRequest.getHeader(); var drCapture = ArgumentCaptor.forClass(DataRequest.class); when(transferProcessManager.initiateProviderRequest(drCapture.capture())).thenReturn(StatusResult.success("Transfer success")); when(contractNegotiationStore.findContractAgreement(contractId)).thenReturn(agreement); when(contractValidationService.validate(claimToken, agreement)).thenReturn(true); - handler.handleRequest(multipartRequest, claimToken); + handler.handleRequest(multipartRequest); verify(transferProcessManager).initiateProviderRequest(drCapture.capture()); @@ -122,16 +122,16 @@ void verifyIllegalArtifactIdRequestTest() throws JsonProcessingException { var artifactRequestId = UUID.randomUUID().toString(); var contractId = UUID.randomUUID().toString(); var destination = DataAddress.Builder.newInstance().keyName(UUID.randomUUID().toString()).type("test").build(); - var multipartRequest = createMultipartRequest(destination, artifactRequestId, artifactId, contractId); + var claimToken = ClaimToken.Builder.newInstance().build(); + var multipartRequest = createMultipartRequest(destination, artifactRequestId, artifactId, contractId, claimToken); // Create the contract using a different asset id var agreement = createContractAgreement(contractId, UUID.randomUUID().toString()); - var claimToken = ClaimToken.Builder.newInstance().build(); when(contractNegotiationStore.findContractAgreement(contractId)).thenReturn(agreement); when(contractValidationService.validate(claimToken, agreement)).thenReturn(true); - var response = handler.handleRequest(multipartRequest, claimToken); + var response = handler.handleRequest(multipartRequest); // Verify the request is rejected as the client sent a contract id with a different asset id verifyNoInteractions(transferProcessManager); @@ -140,7 +140,7 @@ void verifyIllegalArtifactIdRequestTest() throws JsonProcessingException { } - private MultipartRequest createMultipartRequest(DataAddress dataDestination, String artifactRequestId, String artifactId, String contractId) throws JsonProcessingException { + private MultipartRequest createMultipartRequest(DataAddress dataDestination, String artifactRequestId, String artifactId, String contractId, ClaimToken claimToken) throws JsonProcessingException { var message = new ArtifactRequestMessageBuilder(URI.create(artifactRequestId)) ._modelVersion_(IdsProtocol.INFORMATION_MODEL_VERSION) ._securityToken_(new DynamicAttributeTokenBuilder()._tokenValue_(UUID.randomUUID().toString()).build()) @@ -153,6 +153,10 @@ private MultipartRequest createMultipartRequest(DataAddress dataDestination, Str var payload = ArtifactRequestMessagePayload.Builder.newInstance() .dataDestination(dataDestination) .build(); - return MultipartRequest.Builder.newInstance().header(message).payload(new ObjectMapper().writeValueAsString(payload)).build(); + return MultipartRequest.Builder.newInstance() + .header(message) + .payload(new ObjectMapper().writeValueAsString(payload)) + .claimToken(claimToken) + .build(); } } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandlerTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandlerTest.java index 34966edefd0..dbaa61ced19 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandlerTest.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandlerTest.java @@ -72,6 +72,7 @@ void canHandle_supportedMessage_shouldReturnTrue() throws JsonProcessingExceptio void canHandle_messageNotSupported_shouldReturnFalse() { var request = MultipartRequest.Builder.newInstance() .header(new ParticipantCertificateRevokedMessageBuilder().build()) + .claimToken(createClaimToken()) .build(); assertThat(handler.canHandle(request)).isFalse(); } @@ -87,7 +88,7 @@ void handleRequest_success_shouldReturnMessageProcessedNotification() throws Jso when(transformerRegistry.transform(any())).thenReturn(Result.success(edrAfterTransformation)); when(receiverRegistry.receiveAll(edrAfterTransformation)).thenReturn(CompletableFuture.completedFuture(Result.success())); - var response = handler.handleRequest(request, createClaimToken()); + var response = handler.handleRequest(request); verify(transformerRegistry, times(1)).transform(edrCapture.capture()); @@ -111,7 +112,7 @@ void handleRequest_transformationFailure_shouldReturnRejectionMessage() throws J when(transformerRegistry.transform(any())).thenReturn(Result.failure(FAKER.lorem().sentence())); - var response = handler.handleRequest(request, createClaimToken()); + var response = handler.handleRequest(request); assertThat(response) .isNotNull() @@ -126,7 +127,7 @@ void handleRequest_receiveFailure_shouldReturnMessageProcessedNotification() thr when(transformerRegistry.transform(any())).thenReturn(Result.success(edr)); when(receiverRegistry.receiveAll(edr)).thenReturn(CompletableFuture.completedFuture(Result.failure(FAKER.lorem().sentence()))); - var response = handler.handleRequest(request, createClaimToken()); + var response = handler.handleRequest(request); assertThat(response) .isNotNull() @@ -147,6 +148,7 @@ private static MultipartRequest createMultipartRequest(EndpointDataReference pay return MultipartRequest.Builder.newInstance() .header(new ParticipantUpdateMessageBuilder().build()) .payload(MAPPER.writeValueAsString(payload)) + .claimToken(createClaimToken()) .build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandlerTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandlerTest.java deleted file mode 100644 index 765e01e2698..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/NotificationMessageHandlerTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2022 Amadeus - * - * 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: - * Amadeus - initial API and implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler; - -import de.fraunhofer.iais.eis.ArtifactRequestMessageBuilder; -import de.fraunhofer.iais.eis.Message; -import de.fraunhofer.iais.eis.MessageProcessedNotificationMessageBuilder; -import de.fraunhofer.iais.eis.ParticipantCertificateGrantedMessageBuilder; -import de.fraunhofer.iais.eis.ParticipantUpdateMessage; -import de.fraunhofer.iais.eis.ParticipantUpdateMessageBuilder; -import de.fraunhofer.iais.eis.RejectionMessage; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import java.util.UUID; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -class NotificationMessageHandlerTest { - - private Handler subHandler; - private NotificationMessageHandlerRegistry subHandlers; - private NotificationMessageHandler handler; - - @BeforeEach - public void setUp() { - subHandlers = new NotificationMessageHandlerRegistry(); - subHandler = Mockito.mock(Handler.class); - subHandlers.addHandler(ParticipantUpdateMessage.class, subHandler); - var connectorId = UUID.randomUUID().toString(); - handler = new NotificationMessageHandler(connectorId, subHandlers); - } - - @Test - void canHandle_noSubHandlerForMessage_shouldReturnFalse() { - var request = createMultipartRequest(new ArtifactRequestMessageBuilder().build()); - assertThat(handler.canHandle(request)).isFalse(); - } - - @Test - void canHandle_supportedMessage_shouldReturnTrue() { - var request = createMultipartRequest(new ParticipantUpdateMessageBuilder().build()); - assertThat(handler.canHandle(request)).isTrue(); - } - - @Test - void delegateToSubHandler_subHandlerNotFound_shouldReturnRejectionMessage() { - var request = createMultipartRequest(new ParticipantCertificateGrantedMessageBuilder().build()); - - var response = handler.handleRequest(request, createClaimToken()); - - assertThat(response) - .isNotNull() - .satisfies(r -> { - assertThat(r.getHeader()).isInstanceOf(RejectionMessage.class); - }); - } - - @Test - void delegateToSubHandler_shouldReturnResultFromSubHandler() { - var request = createMultipartRequest(new ParticipantUpdateMessageBuilder().build()); - var verificationResult = createClaimToken(); - var subHandlerResponse = MultipartResponse.Builder.newInstance().header(new MessageProcessedNotificationMessageBuilder().build()).build(); - when(subHandler.handleRequest(request, verificationResult)).thenReturn(subHandlerResponse); - - var response = handler.handleRequest(request, verificationResult); - - verify(subHandler, Mockito.times(1)).handleRequest(request, verificationResult); - assertThat(response) - .isNotNull() - .isEqualTo(subHandlerResponse); - } - - private static MultipartRequest createMultipartRequest(Message message) { - return MultipartRequest.Builder.newInstance().header(message).build(); - } - - private static ClaimToken createClaimToken() { - return ClaimToken.Builder.newInstance().build(); - } -} \ No newline at end of file From 96697d27af05f877eac70cb25b03d04dfd036b91 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Tue, 19 Jul 2022 15:48:32 +0200 Subject: [PATCH 33/45] test: replace tests for DescriptionRequestHandler --- .../handler/DescriptionRequestHandler.java | 2 +- .../DescriptionRequestHandlerTest.java | 276 ++++++++++++++++++ .../description/DescriptionHandlerTest.java | 115 -------- .../DescriptionRequestHandlerMocks.java | 59 ---- ...entationDescriptionRequestHandlerTest.java | 99 ------- ...ResourceDescriptionRequestHandlerTest.java | 109 ------- 6 files changed, 277 insertions(+), 383 deletions(-) create mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandlerTest.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionHandlerTest.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionRequestHandlerMocks.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/RepresentationDescriptionRequestHandlerTest.java delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ResourceDescriptionRequestHandlerTest.java diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java index db553b5f947..817d962865c 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java @@ -139,7 +139,7 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { } private Result getConnector(ClaimToken claimToken, Range range) { - return transformerRegistry.transform(connectorService.getConnector(claimToken, range), de.fraunhofer.iais.eis.Connector.class); + return transformerRegistry.transform(connectorService.getConnector(claimToken, range), Connector.class); } /** diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandlerTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandlerTest.java new file mode 100644 index 00000000000..44d0030cb3c --- /dev/null +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandlerTest.java @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2021 - 2022 Fraunhofer Institute for Software and Systems Engineering + * + * 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: + * Fraunhofer Institute for Software and Systems Engineering - initial API and implementation + * + */ + +package org.eclipse.dataspaceconnector.ids.api.multipart.handler; + +import java.net.URI; +import java.util.ArrayList; +import java.util.stream.Stream; + +import de.fraunhofer.iais.eis.Artifact; +import de.fraunhofer.iais.eis.ArtifactBuilder; +import de.fraunhofer.iais.eis.ArtifactRequestMessageBuilder; +import de.fraunhofer.iais.eis.BaseConnectorBuilder; +import de.fraunhofer.iais.eis.DescriptionRequestMessage; +import de.fraunhofer.iais.eis.DescriptionRequestMessageBuilder; +import de.fraunhofer.iais.eis.DescriptionRequestMessageImpl; +import de.fraunhofer.iais.eis.DescriptionResponseMessage; +import de.fraunhofer.iais.eis.DynamicAttributeTokenBuilder; +import de.fraunhofer.iais.eis.Representation; +import de.fraunhofer.iais.eis.RepresentationBuilder; +import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.iais.eis.ResourceBuilder; +import de.fraunhofer.iais.eis.ResourceCatalog; +import de.fraunhofer.iais.eis.ResourceCatalogBuilder; +import de.fraunhofer.iais.eis.TokenFormat; +import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; +import org.eclipse.dataspaceconnector.ids.spi.IdsId; +import org.eclipse.dataspaceconnector.ids.spi.IdsType; +import org.eclipse.dataspaceconnector.ids.spi.service.CatalogService; +import org.eclipse.dataspaceconnector.ids.spi.service.ConnectorService; +import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; +import org.eclipse.dataspaceconnector.ids.spi.types.Connector; +import org.eclipse.dataspaceconnector.policy.model.Policy; +import org.eclipse.dataspaceconnector.spi.asset.AssetIndex; +import org.eclipse.dataspaceconnector.spi.contract.offer.ContractOfferService; +import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; +import org.eclipse.dataspaceconnector.spi.message.Range; +import org.eclipse.dataspaceconnector.spi.monitor.Monitor; +import org.eclipse.dataspaceconnector.spi.result.Result; +import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; +import org.eclipse.dataspaceconnector.spi.types.domain.catalog.Catalog; +import org.eclipse.dataspaceconnector.spi.types.domain.contract.offer.ContractOffer; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; + +class DescriptionRequestHandlerTest { + + private static final String CONNECTOR_ID = "urn:connector:edc"; + + private final int rangeFrom = 0; + private final int rangeTo = 10; + + private DescriptionRequestHandler handler; + + private IdsTransformerRegistry transformerRegistry; + private AssetIndex assetIndex; + private CatalogService catalogService; + private ContractOfferService contractOfferService; + private ConnectorService connectorService; + + @BeforeEach + void init() { + transformerRegistry = mock(IdsTransformerRegistry.class); + assetIndex = mock(AssetIndex.class); + catalogService = mock(CatalogService.class); + contractOfferService = mock(ContractOfferService.class); + connectorService = mock(ConnectorService.class); + + handler = new DescriptionRequestHandler(mock(Monitor.class), CONNECTOR_ID, transformerRegistry, + assetIndex, catalogService, contractOfferService, connectorService); + } + + @Test + void canHandle_messageTypeSupported_returnTrue() { + var request = MultipartRequest.Builder.newInstance() + .header(new DescriptionRequestMessageBuilder().build()) + .claimToken(ClaimToken.Builder.newInstance().build()) + .build(); + + assertThat(handler.canHandle(request)).isTrue(); + } + + @Test + void canHandle_messageTypeNotSupported_returnFalse() { + var request = MultipartRequest.Builder.newInstance() + .header(new ArtifactRequestMessageBuilder().build()) + .claimToken(ClaimToken.Builder.newInstance().build()) + .build(); + + assertThat(handler.canHandle(request)).isFalse(); + } + + @Test + void handleRequest_connector_returnDescription() { + var connector = Connector.Builder.newInstance().build(); + var idsConnector = new BaseConnectorBuilder().build(); + var request = MultipartRequest.Builder.newInstance() + .header(descriptionRequestMessage(null)) + .claimToken(ClaimToken.Builder.newInstance().build()) + .build(); + + when(connectorService.getConnector(any(), any())).thenReturn(connector); + when(transformerRegistry.transform(connector, de.fraunhofer.iais.eis.Connector.class)).thenReturn(Result.success(idsConnector)); + + var response = handler.handleRequest(request); + + assertThat(response.getHeader()).isNotNull().isInstanceOf(DescriptionResponseMessage.class); + assertThat(response.getPayload()).isNotNull().isEqualTo(idsConnector); + + verify(connectorService, times(1)) + .getConnector(any(), argThat(range -> range.getFrom() == rangeFrom && range.getTo() == rangeTo)); + verifyNoMoreInteractions(connectorService); + verifyNoInteractions(catalogService, contractOfferService, assetIndex); + } + + @Test + void handleRequest_catalog_returnDescription() { + var catalog = Catalog.Builder.newInstance().id("1").contractOffers(new ArrayList<>()).build(); + var idsCatalog = new ResourceCatalogBuilder().build(); + var idsId = IdsId.Builder.newInstance() + .type(IdsType.CATALOG) + .value("1") + .build(); + var request = MultipartRequest.Builder.newInstance() + .header(descriptionRequestMessage(URI.create("urn:catalog:1"))) + .claimToken(ClaimToken.Builder.newInstance().build()) + .build(); + + when(catalogService.getDataCatalog(any(), any())).thenReturn(catalog); + when(transformerRegistry.transform(any(), eq(IdsId.class))).thenReturn(Result.success(idsId)); + when(transformerRegistry.transform(catalog, ResourceCatalog.class)).thenReturn(Result.success(idsCatalog)); + + var response = handler.handleRequest(request); + + assertThat(response.getHeader()).isNotNull().isInstanceOf(DescriptionResponseMessage.class); + assertThat(response.getPayload()).isNotNull().isEqualTo(idsCatalog); + + verify(catalogService, times(1)) + .getDataCatalog(any(), argThat(range -> range.getFrom() == rangeFrom && range.getTo() == rangeTo)); + verifyNoMoreInteractions(catalogService); + verifyNoInteractions(connectorService, contractOfferService, assetIndex); + } + + @Test + void handleRequest_resource_returnDescription() { + var assetId = "1"; + + var asset = Asset.Builder.newInstance().id(assetId).build(); + var idsResource = new ResourceBuilder().build(); + var idsId = IdsId.Builder.newInstance() + .type(IdsType.RESOURCE) + .value(assetId) + .build(); + var contractOffer = ContractOffer.Builder.newInstance() + .id("id") + .policy(Policy.Builder.newInstance().build()) + .build(); + var request = MultipartRequest.Builder.newInstance() + .header(descriptionRequestMessage(URI.create("urn:resource:" + assetId))) + .claimToken(ClaimToken.Builder.newInstance().build()) + .build(); + + when(assetIndex.findById(any())).thenReturn(asset); + when(contractOfferService.queryContractOffers(any(), any())).thenReturn(Stream.of(contractOffer)); + when(transformerRegistry.transform(any(), eq(IdsId.class))).thenReturn(Result.success(idsId)); + when(transformerRegistry.transform(any(), eq(Resource.class))).thenReturn(Result.success(idsResource)); + + var response = handler.handleRequest(request); + + assertThat(response.getHeader()).isNotNull().isInstanceOf(DescriptionResponseMessage.class); + assertThat(response.getPayload()).isNotNull().isEqualTo(idsResource); + + verify(assetIndex, times(1)).findById(assetId); + verifyNoMoreInteractions(assetIndex); + verify(contractOfferService, times(1)) + .queryContractOffers(any(), argThat(range -> range.getFrom() == rangeFrom && range.getTo() == rangeTo)); + verifyNoMoreInteractions(contractOfferService); + verifyNoMoreInteractions(connectorService, catalogService); + } + + @Test + void handleRequest_representation_returnDescription() { + var assetId = "1"; + + var asset = Asset.Builder.newInstance().id(assetId).build(); + var idsRepresentation = new RepresentationBuilder().build(); + var idsId = IdsId.Builder.newInstance() + .type(IdsType.REPRESENTATION) + .value(assetId) + .build(); + var request = MultipartRequest.Builder.newInstance() + .header(descriptionRequestMessage(URI.create("urn:representation:" + assetId))) + .claimToken(ClaimToken.Builder.newInstance().build()) + .build(); + + when(assetIndex.findById(any())).thenReturn(asset); + when(transformerRegistry.transform(any(), eq(IdsId.class))).thenReturn(Result.success(idsId)); + when(transformerRegistry.transform(asset, Representation.class)).thenReturn(Result.success(idsRepresentation)); + + var response = handler.handleRequest(request); + + assertThat(response.getHeader()).isNotNull().isInstanceOf(DescriptionResponseMessage.class); + assertThat(response.getPayload()).isNotNull().isEqualTo(idsRepresentation); + + verify(assetIndex, times(1)).findById(assetId); + verifyNoMoreInteractions(assetIndex); + verifyNoInteractions(connectorService, catalogService, contractOfferService); + } + + @Test + void handleRequest_artifact_returnDescription() { + var assetId = "1"; + + var asset = Asset.Builder.newInstance().id(assetId).build(); + var idsArtifact = new ArtifactBuilder().build(); + var idsId = IdsId.Builder.newInstance() + .type(IdsType.ARTIFACT) + .value(assetId) + .build(); + var request = MultipartRequest.Builder.newInstance() + .header(descriptionRequestMessage(URI.create("urn:artifact:" + assetId))) + .claimToken(ClaimToken.Builder.newInstance().build()) + .build(); + + when(assetIndex.findById(any())).thenReturn(asset); + when(transformerRegistry.transform(any(), eq(IdsId.class))).thenReturn(Result.success(idsId)); + when(transformerRegistry.transform(asset, Artifact.class)).thenReturn(Result.success(idsArtifact)); + + var response = handler.handleRequest(request); + + assertThat(response.getHeader()).isNotNull().isInstanceOf(DescriptionResponseMessage.class); + assertThat(response.getPayload()).isNotNull().isEqualTo(idsArtifact); + + verify(assetIndex, times(1)).findById(assetId); + verifyNoMoreInteractions(assetIndex); + verifyNoInteractions(connectorService, catalogService, contractOfferService); + } + + private DescriptionRequestMessage descriptionRequestMessage(URI requestedElement) { + var message = (DescriptionRequestMessageImpl) new DescriptionRequestMessageBuilder() + ._senderAgent_(URI.create("senderAgent")) + ._issuerConnector_(URI.create("issuerConnector")) + ._securityToken_(new DynamicAttributeTokenBuilder() + ._tokenFormat_(TokenFormat.JWT) + ._tokenValue_("token") + .build()) + ._requestedElement_(requestedElement) + .build(); + message.setProperty(Range.FROM, rangeFrom); + message.setProperty(Range.TO, rangeTo); + return message; + } + +} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionHandlerTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionHandlerTest.java deleted file mode 100644 index 3cfbf55d86f..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionHandlerTest.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; - -import de.fraunhofer.iais.eis.DescriptionRequestMessage; -import de.fraunhofer.iais.eis.Message; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.DescriptionHandler; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; -import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -class DescriptionHandlerTest { - - private static final String CONNECTOR_ID = "urn:connector:edc"; - - private DescriptionHandler descriptionHandler; - - private Monitor monitor; - private IdsTransformerRegistry transformerRegistry; - private ArtifactDescriptionRequestHandler artifactDescriptionRequestHandler; - private DataCatalogDescriptionRequestHandler dataCatalogDescriptionRequestHandler; - private RepresentationDescriptionRequestHandler representationDescriptionRequestHandler; - private ResourceDescriptionRequestHandler resourceDescriptionRequestHandler; - private ConnectorDescriptionRequestHandler connectorDescriptionRequestHandler; - - @BeforeEach - void setUp() { - monitor = mock(Monitor.class); - transformerRegistry = mock(IdsTransformerRegistry.class); - artifactDescriptionRequestHandler = mock(ArtifactDescriptionRequestHandler.class); - dataCatalogDescriptionRequestHandler = mock(DataCatalogDescriptionRequestHandler.class); - representationDescriptionRequestHandler = mock(RepresentationDescriptionRequestHandler.class); - resourceDescriptionRequestHandler = mock(ResourceDescriptionRequestHandler.class); - connectorDescriptionRequestHandler = mock(ConnectorDescriptionRequestHandler.class); - - descriptionHandler = new DescriptionHandler( - monitor, - CONNECTOR_ID, - transformerRegistry, - artifactDescriptionRequestHandler, - dataCatalogDescriptionRequestHandler, - representationDescriptionRequestHandler, - resourceDescriptionRequestHandler, - connectorDescriptionRequestHandler); - } - - @Test - void testCanHandleNullThrowsNullPointerException() { - assertThrows(NullPointerException.class, () -> { - descriptionHandler.canHandle(null); - }); - } - - @Test - void testCanHandleMultipartHeaderOfTypeDescriptionRequestMessageReturnsTrue() { - DescriptionRequestMessage message = mock(DescriptionRequestMessage.class); - - MultipartRequest multipartRequest = MultipartRequest.Builder.newInstance() - .header(message) - .build(); - - var result = descriptionHandler.canHandle(multipartRequest); - - assertThat(result).isTrue(); - } - - @Test - void testHandleRequestOfTypeDescriptionRequestMessage() { - DescriptionRequestMessage requestHeader = mock(DescriptionRequestMessage.class); - - Message responseHeader = mock(Message.class); - MultipartResponse response = MultipartResponse.Builder.newInstance() - .header(responseHeader) - .build(); - - when(requestHeader.getRequestedElement()).thenReturn(null); - - MultipartRequest multipartRequest = MultipartRequest.Builder.newInstance() - .header(requestHeader) - .build(); - var claimToken = ClaimToken.Builder.newInstance().build(); - - when(connectorDescriptionRequestHandler.handle(requestHeader, claimToken, multipartRequest.getPayload())).thenReturn(response); - - - var result = descriptionHandler.handleRequest(multipartRequest, claimToken); - - assertThat(result).isNotNull(); - assertThat(result).extracting(MultipartResponse::getHeader).isEqualTo(responseHeader); - verify(connectorDescriptionRequestHandler).handle(requestHeader, claimToken, multipartRequest.getPayload()); - } - -} \ No newline at end of file diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionRequestHandlerMocks.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionRequestHandlerMocks.java deleted file mode 100644 index 4681e924d60..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/DescriptionRequestHandlerMocks.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; - -import de.fraunhofer.iais.eis.DescriptionRequestMessage; -import org.eclipse.dataspaceconnector.ids.spi.IdsId; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; -import org.eclipse.dataspaceconnector.spi.asset.AssetIndex; -import org.eclipse.dataspaceconnector.spi.result.Result; -import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; - -import java.net.URI; -import java.net.URISyntaxException; - -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -final class DescriptionRequestHandlerMocks { - - public static AssetIndex mockAssetIndex() { - AssetIndex assetIndex = mock(AssetIndex.class); - Asset asset = Asset.Builder.newInstance().id("urn:asset:123456").build(); - when(assetIndex.findById(isA(String.class))).thenReturn(asset); - return assetIndex; - } - - public static IdsTransformerRegistry mockTransformerRegistry(IdsType type) throws URISyntaxException { - IdsTransformerRegistry transformerRegistry = mock(IdsTransformerRegistry.class); - when(transformerRegistry.transform(isA(IdsId.class), eq(URI.class))) - .thenReturn(Result.success(new URI("https://example.com"))); - when(transformerRegistry.transform(isA(URI.class), eq(IdsId.class))) - .thenReturn(Result.success(IdsId.Builder.newInstance().type(type).value("value").build())); - return transformerRegistry; - } - - public static DescriptionRequestMessage mockDescriptionRequestMessage(URI requestedElement) throws URISyntaxException { - DescriptionRequestMessage descriptionRequestMessage = mock(DescriptionRequestMessage.class); - when(descriptionRequestMessage.getId()).thenReturn(new URI("https://correlation-id.com/")); - when(descriptionRequestMessage.getSenderAgent()).thenReturn(new URI("https://sender-agent.com/")); - when(descriptionRequestMessage.getIssuerConnector()).thenReturn(new URI("https://issuer-connector.com/")); - when(descriptionRequestMessage.getRequestedElement()).thenReturn(requestedElement); - return descriptionRequestMessage; - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/RepresentationDescriptionRequestHandlerTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/RepresentationDescriptionRequestHandlerTest.java deleted file mode 100644 index 32971d3ca1e..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/RepresentationDescriptionRequestHandlerTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; - -import de.fraunhofer.iais.eis.DescriptionRequestMessage; -import de.fraunhofer.iais.eis.Representation; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; -import org.eclipse.dataspaceconnector.spi.asset.AssetIndex; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.result.Result; -import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.net.URI; -import java.net.URISyntaxException; - -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DescriptionRequestHandlerMocks.mockAssetIndex; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DescriptionRequestHandlerMocks.mockDescriptionRequestMessage; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DescriptionRequestHandlerMocks.mockTransformerRegistry; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -public class RepresentationDescriptionRequestHandlerTest { - - private static final String CONNECTOR_ID = "urn:connector:edc"; - - private RepresentationDescriptionRequestHandler representationDescriptionRequestHandler; - - private Monitor monitor; - private IdsTransformerRegistry transformerRegistry; - private DescriptionRequestMessage descriptionRequestMessage; - private AssetIndex assetIndex; - private Representation representation; - - @BeforeEach - public void setup() throws URISyntaxException { - monitor = mock(Monitor.class); - representation = mock(Representation.class); - when(representation.getId()).thenReturn(new URI("urn:representation:hello")); - - assetIndex = mockAssetIndex(); - when(assetIndex.findById(anyString())).thenReturn(Asset.Builder.newInstance().build()); - - transformerRegistry = mockTransformerRegistry(IdsType.REPRESENTATION); - when(transformerRegistry.transform(isA(Asset.class), eq(Representation.class))).thenReturn(Result.success(representation)); - - descriptionRequestMessage = mockDescriptionRequestMessage(representation.getId()); - - representationDescriptionRequestHandler = new RepresentationDescriptionRequestHandler(monitor, CONNECTOR_ID, assetIndex, transformerRegistry); - } - - @Test - public void testConstructorArgumentsNotNullable() { - assertThrows(NullPointerException.class, - () -> new RepresentationDescriptionRequestHandler(null, CONNECTOR_ID, assetIndex, transformerRegistry)); - assertThrows(NullPointerException.class, - () -> new RepresentationDescriptionRequestHandler(monitor, null, assetIndex, transformerRegistry)); - assertThrows(NullPointerException.class, - () -> new RepresentationDescriptionRequestHandler(monitor, CONNECTOR_ID, null, transformerRegistry)); - assertThrows(NullPointerException.class, - () -> new RepresentationDescriptionRequestHandler(monitor, CONNECTOR_ID, assetIndex, null)); - } - - @Test - public void testSimpleSuccessPath() { - var claimToken = ClaimToken.Builder.newInstance().build(); - - var result = representationDescriptionRequestHandler.handle(descriptionRequestMessage, claimToken, null); - - assertNotNull(result); - assertNotNull(result.getHeader()); - assertEquals(representation, result.getPayload()); - verify(representation).getId(); - verify(assetIndex).findById(anyString()); - verify(transformerRegistry).transform(isA(Asset.class), eq(Representation.class)); - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ResourceDescriptionRequestHandlerTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ResourceDescriptionRequestHandlerTest.java deleted file mode 100644 index 22809fb658a..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/description/ResourceDescriptionRequestHandlerTest.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2021 Daimler TSS GmbH - * - * 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: - * Daimler TSS GmbH - Initial API and Implementation - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler.description; - -import de.fraunhofer.iais.eis.DescriptionRequestMessage; -import de.fraunhofer.iais.eis.Resource; -import org.eclipse.dataspaceconnector.ids.spi.IdsType; -import org.eclipse.dataspaceconnector.ids.spi.transform.IdsTransformerRegistry; -import org.eclipse.dataspaceconnector.ids.spi.types.container.OfferedAsset; -import org.eclipse.dataspaceconnector.spi.asset.AssetIndex; -import org.eclipse.dataspaceconnector.spi.contract.offer.ContractOfferQuery; -import org.eclipse.dataspaceconnector.spi.contract.offer.ContractOfferService; -import org.eclipse.dataspaceconnector.spi.iam.ClaimToken; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.eclipse.dataspaceconnector.spi.result.Result; -import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.stream.Stream; - -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DescriptionRequestHandlerMocks.mockAssetIndex; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DescriptionRequestHandlerMocks.mockDescriptionRequestMessage; -import static org.eclipse.dataspaceconnector.ids.api.multipart.handler.description.DescriptionRequestHandlerMocks.mockTransformerRegistry; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -public class ResourceDescriptionRequestHandlerTest { - - private static final String CONNECTOR_ID = "urn:connector:edc"; - - private ResourceDescriptionRequestHandler resourceDescriptionRequestHandler; - - private Monitor monitor; - private IdsTransformerRegistry transformerRegistry; - private DescriptionRequestMessage descriptionRequestMessage; - private ContractOfferService contractOfferService; - private AssetIndex assetIndex; - private Resource resource; - - @BeforeEach - public void setup() throws URISyntaxException { - monitor = mock(Monitor.class); - resource = mock(Resource.class); - when(resource.getId()).thenReturn(new URI("urn:resource:hello")); - - contractOfferService = mock(ContractOfferService.class); - descriptionRequestMessage = mockDescriptionRequestMessage(resource.getId()); - assetIndex = mockAssetIndex(); - transformerRegistry = mockTransformerRegistry(IdsType.RESOURCE); - - resourceDescriptionRequestHandler = new ResourceDescriptionRequestHandler(monitor, CONNECTOR_ID, assetIndex, contractOfferService, transformerRegistry); - } - - @Test - public void testConstructorArgumentsNotNullable() { - assertThrows(NullPointerException.class, - () -> new ResourceDescriptionRequestHandler(null, CONNECTOR_ID, assetIndex, contractOfferService, transformerRegistry)); - assertThrows(NullPointerException.class, - () -> new ResourceDescriptionRequestHandler(monitor, null, assetIndex, contractOfferService, transformerRegistry)); - assertThrows(NullPointerException.class, - () -> new ResourceDescriptionRequestHandler(monitor, CONNECTOR_ID, null, contractOfferService, transformerRegistry)); - assertThrows(NullPointerException.class, - () -> new ResourceDescriptionRequestHandler(monitor, CONNECTOR_ID, assetIndex, null, transformerRegistry)); - assertThrows(NullPointerException.class, - () -> new ResourceDescriptionRequestHandler(monitor, CONNECTOR_ID, assetIndex, contractOfferService, null)); - } - - @Test - public void testSimpleSuccessPath() { - var claimToken = ClaimToken.Builder.newInstance().build(); - when(assetIndex.findById(anyString())).thenReturn(Asset.Builder.newInstance().build()); - var resourceResult = Result.success(resource); - when(transformerRegistry.transform(isA(OfferedAsset.class), eq(Resource.class))).thenReturn(resourceResult); - when(contractOfferService.queryContractOffers(isA(ContractOfferQuery.class), any())).thenReturn(Stream.empty()); - - var result = resourceDescriptionRequestHandler.handle(descriptionRequestMessage, claimToken, null); - - assertNotNull(result); - assertNotNull(result.getHeader()); - assertEquals(resource, result.getPayload()); - verify(resource).getId(); - verify(assetIndex).findById(anyString()); - verify(transformerRegistry).transform(isA(OfferedAsset.class), eq(Resource.class)); - verify(contractOfferService).queryContractOffers(isA(ContractOfferQuery.class), any()); - } -} From 2dbcbeab3f6dd50039d3c6f28f796c34faab7568 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 20 Jul 2022 08:45:03 +0200 Subject: [PATCH 34/45] refactor: rename RequestUtil --- .../ids/api/multipart/handler/DescriptionRequestHandler.java | 2 +- .../util/{MultipartRequestUtil.java => RequestUtil.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/{MultipartRequestUtil.java => RequestUtil.java} (97%) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java index 817d962865c..34350a37cc8 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java @@ -45,7 +45,7 @@ import static java.lang.String.format; import static java.util.stream.Collectors.toList; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.MultipartRequestUtil.getInt; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RequestUtil.getInt; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.descriptionResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartRequestUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/RequestUtil.java similarity index 97% rename from data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartRequestUtil.java rename to data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/RequestUtil.java index 15bc69e41fe..fc89a120475 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/MultipartRequestUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/RequestUtil.java @@ -19,7 +19,7 @@ import static java.util.Optional.ofNullable; -public class MultipartRequestUtil { +public class RequestUtil { /** * Extracts an arbitrary property from a {@link DescriptionRequestMessage} From fd287279f81a34f3178a9424470c48015a38d0fa Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 20 Jul 2022 08:57:07 +0200 Subject: [PATCH 35/45] chore: only store secret if TP initialized successfully --- .../ids/api/multipart/handler/ArtifactRequestHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index ac4c7faa82a..b821fac445d 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -163,7 +163,8 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { // Initiate a transfer process for the request var transferInitiateResult = transferProcessManager.initiateProviderRequest(dataRequest); - if (artifactRequestMessagePayload.getSecret() != null) { + // Store secret if process initiated successfully + if (transferInitiateResult.succeeded() && artifactRequestMessagePayload.getSecret() != null) { vault.storeSecret(dataDestination.getKeyName(), artifactRequestMessagePayload.getSecret()); } From 118d3f077736bc4394853eb904fe35f2f5fe50c2 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 20 Jul 2022 08:58:06 +0200 Subject: [PATCH 36/45] docs: update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02dddb7ef52..6a59dedcffb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ in the detailed section referring to by linking pull requests or issues. * Log correct type in contract-definition API (#1584) * Replace unmaintained test dependency `java-faker` with `datafaker` (#1709) * Change CredentialsVerifier contract (#1702) +* Return `RequestInProcessMessage` for IDS artifact requests (#1610) #### Removed From 833f521fd7c8321f425b747a6d10eb98248e8844 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 20 Jul 2022 09:48:54 +0200 Subject: [PATCH 37/45] test: update ResponseUtilTest --- .../ids/api/multipart/util/ResponseUtil.java | 15 +- .../api/multipart/util/ResponseUtilTest.java | 319 ++++++++++-------- 2 files changed, 179 insertions(+), 155 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtil.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtil.java index ecaf6f6c5d0..fb78ac77915 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtil.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtil.java @@ -19,11 +19,12 @@ import de.fraunhofer.iais.eis.DescriptionResponseMessage; import de.fraunhofer.iais.eis.DescriptionResponseMessageBuilder; import de.fraunhofer.iais.eis.Message; +import de.fraunhofer.iais.eis.MessageProcessedNotificationMessage; import de.fraunhofer.iais.eis.MessageProcessedNotificationMessageBuilder; -import de.fraunhofer.iais.eis.NotificationMessage; import de.fraunhofer.iais.eis.RejectionMessage; import de.fraunhofer.iais.eis.RejectionMessageBuilder; import de.fraunhofer.iais.eis.RejectionReason; +import de.fraunhofer.iais.eis.RequestInProcessMessage; import de.fraunhofer.iais.eis.RequestInProcessMessageBuilder; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; import org.eclipse.dataspaceconnector.ids.spi.IdsIdParser; @@ -78,8 +79,8 @@ public static MultipartResponse createMultipartResponse(@NotNull Message header, * @param connectorId the connector ID. * @return a MessageProcessedNotificationMessage. */ - public static NotificationMessage messageProcessedNotification(@NotNull Message correlationMessage, - @NotNull String connectorId) { + public static MessageProcessedNotificationMessage messageProcessedNotification(@NotNull Message correlationMessage, + @NotNull String connectorId) { var messageId = getMessageId(); var connectorIdUri = getConnectorUrn(connectorId); @@ -91,6 +92,7 @@ public static NotificationMessage messageProcessedNotification(@NotNull Message ._senderAgent_(connectorIdUri) ._correlationMessage_(correlationMessage.getId()) ._recipientConnector_(new ArrayList<>(Collections.singletonList(correlationMessage.getIssuerConnector()))) + ._recipientAgent_(new ArrayList<>(Collections.singletonList(correlationMessage.getSenderAgent()))) .build(); } @@ -101,8 +103,8 @@ public static NotificationMessage messageProcessedNotification(@NotNull Message * @param connectorId the connector ID. * @return a RequestInProcessMessage. */ - public static NotificationMessage requestInProcess(@NotNull Message correlationMessage, - @NotNull String connectorId) { + public static RequestInProcessMessage requestInProcess(@NotNull Message correlationMessage, + @NotNull String connectorId) { var messageId = getMessageId(); var connectorIdUri = getConnectorUrn(connectorId); @@ -114,6 +116,7 @@ public static NotificationMessage requestInProcess(@NotNull Message correlationM ._senderAgent_(connectorIdUri) ._correlationMessage_(correlationMessage.getId()) ._recipientConnector_(new ArrayList<>(Collections.singletonList(correlationMessage.getIssuerConnector()))) + ._recipientAgent_(new ArrayList<>(Collections.singletonList(correlationMessage.getSenderAgent()))) .build(); } @@ -136,8 +139,8 @@ public static DescriptionResponseMessage descriptionResponse(@NotNull Message co ._issuerConnector_(connectorIdUri) ._senderAgent_(connectorIdUri) ._correlationMessage_(correlationMessage.getId()) - ._recipientAgent_(new ArrayList<>(Collections.singletonList(correlationMessage.getSenderAgent()))) ._recipientConnector_(new ArrayList<>(Collections.singletonList(correlationMessage.getIssuerConnector()))) + ._recipientAgent_(new ArrayList<>(Collections.singletonList(correlationMessage.getSenderAgent()))) .build(); } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtilTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtilTest.java index 75dfa015978..4b0b6939171 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtilTest.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/util/ResponseUtilTest.java @@ -9,25 +9,28 @@ * * Contributors: * Daimler TSS GmbH - Initial API and Implementation + * Fraunhofer Institute for Software and Systems Engineering - refactoring * */ package org.eclipse.dataspaceconnector.ids.api.multipart.util; import de.fraunhofer.iais.eis.Message; +import de.fraunhofer.iais.eis.MessageProcessedNotificationMessage; import de.fraunhofer.iais.eis.RejectionMessage; import de.fraunhofer.iais.eis.RejectionReason; +import de.fraunhofer.iais.eis.RequestInProcessMessage; +import de.fraunhofer.iais.eis.ResponseMessageBuilder; import org.eclipse.dataspaceconnector.ids.transform.IdsProtocol; -import org.junit.jupiter.api.AfterEach; +import org.eclipse.dataspaceconnector.spi.response.ResponseStatus; +import org.eclipse.dataspaceconnector.spi.response.StatusResult; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.net.URI; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class ResponseUtilTest { @@ -48,37 +51,130 @@ void setUp() { when(correlationMessage.getIssuerConnector()).thenReturn(issuerConnector); } - @AfterEach - void tearDown() { - verify(correlationMessage, atLeastOnce()).getId(); - verify(correlationMessage, atLeastOnce()).getSenderAgent(); - verify(correlationMessage, atLeastOnce()).getIssuerConnector(); + @Test + void createMultipartResponse_onlyHeader() { + var header = new ResponseMessageBuilder().build(); + + var multipartResponse = ResponseUtil.createMultipartResponse(header); + + assertThat(multipartResponse).isNotNull(); + assertThat(multipartResponse.getHeader()).isNotNull().isEqualTo(header); + assertThat(multipartResponse.getPayload()).isNull(); } - + @Test - public void testNotFound() { - var rejectionMessage = ResponseUtil - .notFound(null, null); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_FOUND); - - // just correlationMessage, no connectorId - rejectionMessage = ResponseUtil - .notFound(correlationMessage, null); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_FOUND); - assertCorrelationMessagePropertiesMapped(rejectionMessage); - - // no correlationMessage, just connectorId - rejectionMessage = ResponseUtil - .notFound(null, connectorId); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_FOUND); - assertConnectorIdPropertiesMapped(rejectionMessage); + void createMultipartResponse_headerAndPayload() { + var header = new ResponseMessageBuilder().build(); + var payload = "payload"; + + var multipartResponse = ResponseUtil.createMultipartResponse(header, payload); + + assertThat(multipartResponse).isNotNull(); + assertThat(multipartResponse.getHeader()).isNotNull().isEqualTo(header); + assertThat(multipartResponse.getPayload()).isNotNull().isEqualTo(payload); + } + + @Test + void testMessageProcessedNotification() { + var message = ResponseUtil.messageProcessedNotification(correlationMessage, connectorId); + + assertBasePropertiesMapped(message, null); + assertCorrelationMessagePropertiesMapped(message); + assertConnectorIdPropertiesMapped(message); + } + + @Test + void testRequestInProcess() { + var message = ResponseUtil.requestInProcess(correlationMessage, connectorId); + + assertBasePropertiesMapped(message, null); + assertCorrelationMessagePropertiesMapped(message); + assertConnectorIdPropertiesMapped(message); + } + + @Test + void testDescriptionResponse() { + var message = ResponseUtil.descriptionResponse(correlationMessage, connectorId); + + assertBasePropertiesMapped(message, null); + assertCorrelationMessagePropertiesMapped(message); + assertConnectorIdPropertiesMapped(message); + } + + @Test + void testInProcessFromStatusResult_succeeded() { + var result = StatusResult.success(); + + var message = ResponseUtil.inProcessFromStatusResult(result, correlationMessage, connectorId); + + assertThat(message).isInstanceOf(RequestInProcessMessage.class); + assertBasePropertiesMapped(message, null); + assertCorrelationMessagePropertiesMapped(message); + assertConnectorIdPropertiesMapped(message); + } + + @Test + void testInProcessFromStatusResult_fatalError() { + var result = StatusResult.failure(ResponseStatus.FATAL_ERROR); + + var message = ResponseUtil.inProcessFromStatusResult(result, correlationMessage, connectorId); + + assertThat(message).isInstanceOf(RejectionMessage.class); + assertBasePropertiesMapped(message, RejectionReason.BAD_PARAMETERS); + assertCorrelationMessagePropertiesMapped(message); + assertConnectorIdPropertiesMapped(message); + } + + @Test + void testInProcessFromStatusResult_errorRetry() { + var result = StatusResult.failure(ResponseStatus.ERROR_RETRY); + + var message = ResponseUtil.inProcessFromStatusResult(result, correlationMessage, connectorId); + + assertThat(message).isInstanceOf(RejectionMessage.class); + assertBasePropertiesMapped(message, RejectionReason.INTERNAL_RECIPIENT_ERROR); + assertCorrelationMessagePropertiesMapped(message); + } + + @Test + void testProcessedFromStatusResult_succeeded() { + var result = StatusResult.success(); + + var message = ResponseUtil.processedFromStatusResult(result, correlationMessage, connectorId); + + assertThat(message).isInstanceOf(MessageProcessedNotificationMessage.class); + assertBasePropertiesMapped(message, null); + assertCorrelationMessagePropertiesMapped(message); + assertConnectorIdPropertiesMapped(message); + } + + @Test + void testProcessedFromStatusResult_fatalError() { + var result = StatusResult.failure(ResponseStatus.FATAL_ERROR); + + var message = ResponseUtil.processedFromStatusResult(result, correlationMessage, connectorId); + + assertThat(message).isInstanceOf(RejectionMessage.class); + assertBasePropertiesMapped(message, RejectionReason.BAD_PARAMETERS); + assertCorrelationMessagePropertiesMapped(message); + assertConnectorIdPropertiesMapped(message); + } + + @Test + void testProcessedFromStatusResult_errorRetry() { + var result = StatusResult.failure(ResponseStatus.ERROR_RETRY); + + var message = ResponseUtil.processedFromStatusResult(result, correlationMessage, connectorId); + + assertThat(message).isInstanceOf(RejectionMessage.class); + assertBasePropertiesMapped(message, RejectionReason.INTERNAL_RECIPIENT_ERROR); + assertCorrelationMessagePropertiesMapped(message); + assertConnectorIdPropertiesMapped(message); + } - // both correlationMessage and connectorId - rejectionMessage = ResponseUtil - .notFound(correlationMessage, connectorId); + @Test + void testNotFound() { + var rejectionMessage = ResponseUtil.notFound(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_FOUND); assertCorrelationMessagePropertiesMapped(rejectionMessage); @@ -86,26 +182,8 @@ public void testNotFound() { } @Test - public void testNotAuthenticated() { - var rejectionMessage = ResponseUtil - .notAuthenticated(null, null); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHENTICATED); - - rejectionMessage = ResponseUtil - .notAuthenticated(correlationMessage, null); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHENTICATED); - assertCorrelationMessagePropertiesMapped(rejectionMessage); - - rejectionMessage = ResponseUtil - .notAuthenticated(null, connectorId); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHENTICATED); - assertConnectorIdPropertiesMapped(rejectionMessage); - - rejectionMessage = ResponseUtil - .notAuthenticated(correlationMessage, connectorId); + void testNotAuthenticated() { + var rejectionMessage = ResponseUtil.notAuthenticated(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHENTICATED); assertConnectorIdPropertiesMapped(rejectionMessage); @@ -113,26 +191,8 @@ public void testNotAuthenticated() { } @Test - public void testNotAuthorized() { - var rejectionMessage = ResponseUtil - .notAuthorized(null, null); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHORIZED); - - rejectionMessage = ResponseUtil - .notAuthorized(correlationMessage, null); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHORIZED); - assertCorrelationMessagePropertiesMapped(rejectionMessage); - - rejectionMessage = ResponseUtil - .notAuthorized(null, connectorId); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHORIZED); - assertConnectorIdPropertiesMapped(rejectionMessage); - - rejectionMessage = ResponseUtil - .notAuthorized(correlationMessage, connectorId); + void testNotAuthorized() { + var rejectionMessage = ResponseUtil.notAuthorized(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.NOT_AUTHORIZED); assertCorrelationMessagePropertiesMapped(rejectionMessage); @@ -140,28 +200,13 @@ public void testNotAuthorized() { } @Test - public void testMalformedMessage() { - var rejectionMessage = ResponseUtil - .malformedMessage(null, null); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.MALFORMED_MESSAGE); - - rejectionMessage = ResponseUtil - .malformedMessage(correlationMessage, null); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.MALFORMED_MESSAGE); - assertCorrelationMessagePropertiesMapped(rejectionMessage); - - rejectionMessage = ResponseUtil - .malformedMessage(null, connectorId); - - + void testMalformedMessage() { + var rejectionMessage = ResponseUtil.malformedMessage(null, connectorId); + assertBasePropertiesMapped(rejectionMessage, RejectionReason.MALFORMED_MESSAGE); assertConnectorIdPropertiesMapped(rejectionMessage); - rejectionMessage = ResponseUtil - .malformedMessage(correlationMessage, connectorId); - + rejectionMessage = ResponseUtil.malformedMessage(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MALFORMED_MESSAGE); assertCorrelationMessagePropertiesMapped(rejectionMessage); @@ -169,87 +214,63 @@ public void testMalformedMessage() { } @Test - public void testMessageTypeNotSupported() { - var rejectionMessage = ResponseUtil - .messageTypeNotSupported(null, null); - - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED); - - rejectionMessage = ResponseUtil - .messageTypeNotSupported(correlationMessage, null); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED); - assertCorrelationMessagePropertiesMapped(rejectionMessage); - - rejectionMessage = ResponseUtil - .messageTypeNotSupported(null, connectorId); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED); - assertConnectorIdPropertiesMapped(rejectionMessage); - - rejectionMessage = ResponseUtil - .messageTypeNotSupported(correlationMessage, connectorId); + void testMessageTypeNotSupported() { + var rejectionMessage = ResponseUtil.messageTypeNotSupported(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.MESSAGE_TYPE_NOT_SUPPORTED); assertCorrelationMessagePropertiesMapped(rejectionMessage); assertConnectorIdPropertiesMapped(rejectionMessage); } - + @Test - public void testInternalRecipientError() { - var rejectionMessage = ResponseUtil - .internalRecipientError(null, null); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.INTERNAL_RECIPIENT_ERROR); - - rejectionMessage = ResponseUtil - .internalRecipientError(correlationMessage, null); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.INTERNAL_RECIPIENT_ERROR); + void testBadParameters() { + var rejectionMessage = ResponseUtil.badParameters(correlationMessage, connectorId); + + assertBasePropertiesMapped(rejectionMessage, RejectionReason.BAD_PARAMETERS); assertCorrelationMessagePropertiesMapped(rejectionMessage); - - rejectionMessage = ResponseUtil - .internalRecipientError(null, connectorId); - - assertBasePropertiesMapped(rejectionMessage, RejectionReason.INTERNAL_RECIPIENT_ERROR); assertConnectorIdPropertiesMapped(rejectionMessage); + } - rejectionMessage = ResponseUtil - .internalRecipientError(correlationMessage, connectorId); + @Test + void testInternalRecipientError() { + var rejectionMessage = ResponseUtil.internalRecipientError(correlationMessage, connectorId); assertBasePropertiesMapped(rejectionMessage, RejectionReason.INTERNAL_RECIPIENT_ERROR); assertCorrelationMessagePropertiesMapped(rejectionMessage); assertConnectorIdPropertiesMapped(rejectionMessage); } - private void assertBasePropertiesMapped(RejectionMessage rejectionMessage, RejectionReason rejectionReason) { - assertThat(rejectionMessage).isNotNull() - .extracting(RejectionMessage::getRejectionReason).isEqualTo(rejectionReason); - - assertThat(rejectionMessage.getContentVersion()).isEqualTo(IdsProtocol.INFORMATION_MODEL_VERSION); - assertThat(rejectionMessage.getModelVersion()).isEqualTo(IdsProtocol.INFORMATION_MODEL_VERSION); - assertThat(rejectionMessage.getIssued()).isNotNull(); + private void assertBasePropertiesMapped(Message message, RejectionReason rejectionReason) { + if (message instanceof RejectionMessage) { + assertThat((RejectionMessage) message) + .isNotNull() + .extracting(RejectionMessage::getRejectionReason) + .isEqualTo(rejectionReason); + } + + assertThat(message.getContentVersion()).isEqualTo(IdsProtocol.INFORMATION_MODEL_VERSION); + assertThat(message.getModelVersion()).isEqualTo(IdsProtocol.INFORMATION_MODEL_VERSION); + assertThat(message.getIssued()).isNotNull(); } - private void assertCorrelationMessagePropertiesMapped(RejectionMessage rejectionMessage) { - assertThat(rejectionMessage).isNotNull(); + private void assertCorrelationMessagePropertiesMapped(Message message) { + assertThat(message).isNotNull(); - assertThat(rejectionMessage.getCorrelationMessage()).isEqualTo(correlationMessageId); + assertThat(message.getCorrelationMessage()).isEqualTo(correlationMessageId); - assertThat(rejectionMessage.getRecipientAgent()).isNotNull(); - assertThat(rejectionMessage.getRecipientAgent()).hasSize(1); - assertThat(rejectionMessage.getRecipientAgent().contains(senderAgent)).isTrue(); + assertThat(message.getRecipientAgent()).isNotNull(); + assertThat(message.getRecipientAgent()).hasSize(1); + assertThat(message.getRecipientAgent().contains(senderAgent)).isTrue(); - assertThat(rejectionMessage.getRecipientConnector()).isNotNull(); - assertThat(rejectionMessage.getRecipientConnector()).hasSize(1); - assertThat(rejectionMessage.getRecipientConnector().contains(issuerConnector)).isTrue(); + assertThat(message.getRecipientConnector()).isNotNull(); + assertThat(message.getRecipientConnector()).hasSize(1); + assertThat(message.getRecipientConnector().contains(issuerConnector)).isTrue(); } - private void assertConnectorIdPropertiesMapped(RejectionMessage rejectionMessage) { - assertThat(rejectionMessage).isNotNull(); + private void assertConnectorIdPropertiesMapped(Message message) { + assertThat(message).isNotNull(); - assertThat(rejectionMessage.getIssuerConnector()).isEqualTo(connectorIdUri); - assertThat(rejectionMessage.getSenderAgent()).isEqualTo(connectorIdUri); + assertThat(message.getIssuerConnector()).isEqualTo(connectorIdUri); + assertThat(message.getSenderAgent()).isEqualTo(connectorIdUri); } } From 189ede4fc70cf8863e6c69ee4802aa9c788229c4 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 20 Jul 2022 11:13:30 +0200 Subject: [PATCH 38/45] chore: fix import order --- .../api/multipart/handler/DescriptionRequestHandler.java | 2 +- .../api/multipart/handler/EndpointDataReferenceHandler.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java index 34350a37cc8..a00eea5ed36 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java @@ -47,8 +47,8 @@ import static java.util.stream.Collectors.toList; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RequestUtil.getInt; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.descriptionResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.descriptionResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.notFound; public class DescriptionRequestHandler implements Handler { diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java index 857a0a3d96c..4ae905a9c34 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java @@ -15,8 +15,6 @@ package org.eclipse.dataspaceconnector.ids.api.multipart.handler; -import java.util.Objects; - import de.fraunhofer.iais.eis.ParticipantUpdateMessage; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; @@ -30,10 +28,12 @@ import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReferenceMessage; import org.jetbrains.annotations.NotNull; +import java.util.Objects; + import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageProcessedNotification; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.internalRecipientError; +import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.messageProcessedNotification; /** * Implementation of the {@link Handler} class for handling of {@link EndpointDataReferenceMessage}. From ec60cedb92a38032ec3e64592a0457f56bae8afd Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 20 Jul 2022 14:20:48 +0200 Subject: [PATCH 39/45] chore: fix import order --- .../multipart/handler/DescriptionRequestHandlerTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandlerTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandlerTest.java index 44d0030cb3c..668c2c9c5cd 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandlerTest.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandlerTest.java @@ -14,10 +14,6 @@ package org.eclipse.dataspaceconnector.ids.api.multipart.handler; -import java.net.URI; -import java.util.ArrayList; -import java.util.stream.Stream; - import de.fraunhofer.iais.eis.Artifact; import de.fraunhofer.iais.eis.ArtifactBuilder; import de.fraunhofer.iais.eis.ArtifactRequestMessageBuilder; @@ -54,6 +50,10 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.net.URI; +import java.util.ArrayList; +import java.util.stream.Stream; + import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.argThat; From 818269ec2cc56c03f313aa6eaef205614e9a05c2 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 20 Jul 2022 15:10:13 +0200 Subject: [PATCH 40/45] refactor: return FormDataMultiPart from MultipartController --- .../controller/MultipartController.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java index 32f3a58e723..af9ba67e1c1 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java @@ -26,7 +26,6 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.Response; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.Handler; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; @@ -92,33 +91,33 @@ public MultipartController(@NotNull Monitor monitor, * rejection message. */ @POST - public Response request(@FormDataParam(HEADER) InputStream headerInputStream, - @FormDataParam(PAYLOAD) String payload) { + public FormDataMultiPart request(@FormDataParam(HEADER) InputStream headerInputStream, + @FormDataParam(PAYLOAD) String payload) { if (headerInputStream == null) { - return Response.ok(buildMultipart(malformedMessage(null, connectorId))).build(); + return buildMultipart(malformedMessage(null, connectorId)); } Message header; try { header = objectMapper.readValue(headerInputStream, Message.class); } catch (IOException e) { - return Response.ok(buildMultipart(malformedMessage(null, connectorId))).build(); + return buildMultipart(malformedMessage(null, connectorId)); } if (header == null) { - return Response.ok(buildMultipart(malformedMessage(null, connectorId))).build(); + return buildMultipart(malformedMessage(null, connectorId)); } // Check if any required header field missing if (header.getId() == null || header.getIssuerConnector() == null || header.getSenderAgent() == null) { - return Response.ok(buildMultipart(malformedMessage(header, connectorId))).build(); + return buildMultipart(malformedMessage(header, connectorId)); } // Check if DAT present var dynamicAttributeToken = header.getSecurityToken(); if (dynamicAttributeToken == null || dynamicAttributeToken.getTokenValue() == null) { monitor.warning("MultipartController: Token is missing in header"); - return Response.ok(buildMultipart(notAuthenticated(header, connectorId))).build(); + return buildMultipart(notAuthenticated(header, connectorId)); } // Prepare DAT validation: IDS token validation requires issuerConnector @@ -134,7 +133,7 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, var verificationResult = identityService.verifyJwtToken(tokenRepresentation, idsWebhookAddress); if (verificationResult.failed()) { monitor.warning(format("MultipartController: Token validation failed %s", verificationResult.getFailure().getMessages())); - return Response.ok(buildMultipart(notAuthenticated(header, connectorId))).build(); + return buildMultipart(notAuthenticated(header, connectorId)); } // Build the multipart request @@ -151,11 +150,11 @@ public Response request(@FormDataParam(HEADER) InputStream headerInputStream, .findFirst() .orElse(null); if (handler == null) { - return Response.ok(buildMultipart(messageTypeNotSupported(header, connectorId))).build(); + return buildMultipart(messageTypeNotSupported(header, connectorId)); } var multipartResponse = handler.handleRequest(multipartRequest); - return Response.ok(buildMultipart(multipartResponse)).build(); + return buildMultipart(multipartResponse); } /** From cb3fe434928d70e14c1df2ed042be3dcbf282c6d Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 20 Jul 2022 15:14:50 +0200 Subject: [PATCH 41/45] refactor: return token from method in MultipartController --- .../api/multipart/controller/MultipartController.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java index af9ba67e1c1..8e71a9cf659 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import de.fraunhofer.iais.eis.DynamicAttributeToken; import de.fraunhofer.iais.eis.DynamicAttributeTokenBuilder; import de.fraunhofer.iais.eis.Message; import de.fraunhofer.iais.eis.TokenFormat; @@ -165,7 +166,7 @@ public FormDataMultiPart request(@FormDataParam(HEADER) InputStream headerInputS * @return a multipart body. */ private FormDataMultiPart buildMultipart(MultipartResponse multipartResponse) { - addTokenToResponseHeader(multipartResponse.getHeader()); + multipartResponse.getHeader().setSecurityToken(getToken(multipartResponse.getHeader())); return createFormDataMultiPart(multipartResponse.getHeader(), multipartResponse.getPayload()); } @@ -177,7 +178,7 @@ private FormDataMultiPart buildMultipart(MultipartResponse multipartResponse) { * @return a multipart body. */ private FormDataMultiPart buildMultipart(Message header) { - addTokenToResponseHeader(header); + header.setSecurityToken(getToken(header)); return createFormDataMultiPart(header, null); } @@ -202,11 +203,11 @@ private FormDataMultiPart createFormDataMultiPart(Message header, Object payload } /** - * Retrieves an identity token and adds it to the given message. + * Retrieves an identity token for the given message. * * @param header the message. */ - private void addTokenToResponseHeader(Message header) { + private DynamicAttributeToken getToken(Message header) { var tokenBuilder = new DynamicAttributeTokenBuilder() ._tokenFormat_(TokenFormat.JWT); @@ -222,7 +223,7 @@ private void addTokenToResponseHeader(Message header) { tokenBuilder._tokenValue_("invalid"); } - header.setSecurityToken(tokenBuilder.build()); + return tokenBuilder.build(); } private byte[] toJson(Object object) { From 48103c342003631ebd979dda26b12c8d991c523d Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 20 Jul 2022 15:20:46 +0200 Subject: [PATCH 42/45] chore: remove unused contract offer handler --- .../IdsMultipartApiServiceExtension.java | 2 - .../handler/ContractOfferHandler.java | 83 ------------------- ...actMultipartControllerIntegrationTest.java | 11 --- .../MultipartControllerIntegrationTest.java | 39 +-------- 4 files changed, 1 insertion(+), 134 deletions(-) delete mode 100644 data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java index 395831f4ebd..8df50689c22 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java @@ -21,7 +21,6 @@ import org.eclipse.dataspaceconnector.ids.api.multipart.controller.MultipartController; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.ArtifactRequestHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.ContractAgreementHandler; -import org.eclipse.dataspaceconnector.ids.api.multipart.handler.ContractOfferHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.ContractRejectionHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.ContractRequestHandler; import org.eclipse.dataspaceconnector.ids.api.multipart.handler.DescriptionRequestHandler; @@ -128,7 +127,6 @@ private void registerControllers(ServiceExtensionContext context) { handlers.add(new EndpointDataReferenceHandler(monitor, connectorId, endpointDataReferenceReceiverRegistry, endpointDataReferenceTransformerRegistry, context.getTypeManager())); handlers.add(new ContractRequestHandler(monitor, connectorId, objectMapper, providerNegotiationManager, transformerRegistry, assetIndex)); handlers.add(new ContractAgreementHandler(monitor, connectorId, objectMapper, consumerNegotiationManager, transformerRegistry)); - handlers.add(new ContractOfferHandler(monitor, connectorId, objectMapper, providerNegotiationManager, consumerNegotiationManager)); handlers.add(new ContractRejectionHandler(monitor, connectorId, providerNegotiationManager, consumerNegotiationManager)); // create & register controller diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java deleted file mode 100644 index fd8671ae094..00000000000 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractOfferHandler.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2021 - 2022 Fraunhofer Institute for Software and Systems Engineering, Daimler TSS GmbH - * - * 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: - * Fraunhofer Institute for Software and Systems Engineering - initial API and implementation, refactoring - * Daimler TSS GmbH - introduce factory to create RequestInProcessMessage - * - */ - -package org.eclipse.dataspaceconnector.ids.api.multipart.handler; - -import com.fasterxml.jackson.databind.ObjectMapper; -import de.fraunhofer.iais.eis.ContractOffer; -import de.fraunhofer.iais.eis.ContractOfferMessage; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartRequest; -import org.eclipse.dataspaceconnector.ids.api.multipart.message.MultipartResponse; -import org.eclipse.dataspaceconnector.spi.contract.negotiation.ConsumerContractNegotiationManager; -import org.eclipse.dataspaceconnector.spi.contract.negotiation.ProviderContractNegotiationManager; -import org.eclipse.dataspaceconnector.spi.monitor.Monitor; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.Objects; - -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; -import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.requestInProcess; - -/** - * This class handles and processes incoming IDS {@link ContractOfferMessage}s. - */ -public class ContractOfferHandler implements Handler { - - private final Monitor monitor; - private final ObjectMapper objectMapper; - private final String connectorId; - private final ProviderContractNegotiationManager providerNegotiationManager; - private final ConsumerContractNegotiationManager consumerNegotiationManager; - - public ContractOfferHandler( - @NotNull Monitor monitor, - @NotNull String connectorId, - @NotNull ObjectMapper objectMapper, - @NotNull ProviderContractNegotiationManager providerNegotiationManager, - @NotNull ConsumerContractNegotiationManager consumerNegotiationManager) { - this.monitor = Objects.requireNonNull(monitor); - this.connectorId = Objects.requireNonNull(connectorId); - this.objectMapper = Objects.requireNonNull(objectMapper); - this.providerNegotiationManager = Objects.requireNonNull(providerNegotiationManager); - this.consumerNegotiationManager = Objects.requireNonNull(consumerNegotiationManager); - } - - @Override - public boolean canHandle(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - - return multipartRequest.getHeader() instanceof ContractOfferMessage; - } - - @Override - public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - - var message = (ContractOfferMessage) multipartRequest.getHeader(); - - ContractOffer contractOffer = null; - try { - contractOffer = objectMapper.readValue(multipartRequest.getPayload(), ContractOffer.class); - } catch (IOException e) { - monitor.severe("ContractOfferHandler: Contract Offer is invalid", e); - return createMultipartResponse(badParameters(message, connectorId)); - } - - // TODO similar implementation to ContractRequestHandler (only required if counter offers supported, not needed for M1) - return createMultipartResponse(requestInProcess(message, connectorId)); - } -} diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/AbstractMultipartControllerIntegrationTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/AbstractMultipartControllerIntegrationTest.java index 0c2765c34a8..f0a4d215994 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/AbstractMultipartControllerIntegrationTest.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/AbstractMultipartControllerIntegrationTest.java @@ -20,8 +20,6 @@ import de.fraunhofer.iais.eis.Contract; import de.fraunhofer.iais.eis.ContractAgreementMessage; import de.fraunhofer.iais.eis.ContractAgreementMessageBuilder; -import de.fraunhofer.iais.eis.ContractOfferMessage; -import de.fraunhofer.iais.eis.ContractOfferMessageBuilder; import de.fraunhofer.iais.eis.ContractRejectionMessage; import de.fraunhofer.iais.eis.ContractRejectionMessageBuilder; import de.fraunhofer.iais.eis.ContractRequestMessage; @@ -179,15 +177,6 @@ protected ContractRejectionMessage getContractRejectionMessage() { .build(); } - protected ContractOfferMessage getContractOfferMessage() { - return new ContractOfferMessageBuilder() - ._correlationMessage_(URI.create("correlationId")) - ._senderAgent_(URI.create("senderAgent")) - ._securityToken_(getDynamicAttributeToken()) - ._issuerConnector_(URI.create("issuerConnector")) - .build(); - } - // create the multipart-form-data request having the given message in its "header" multipart payload protected Request createRequest(Message message) throws Exception { Objects.requireNonNull(message); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/MultipartControllerIntegrationTest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/MultipartControllerIntegrationTest.java index 7ccec1afb6e..82551ff3914 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/MultipartControllerIntegrationTest.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/test/java/org/eclipse/dataspaceconnector/ids/api/multipart/MultipartControllerIntegrationTest.java @@ -17,7 +17,6 @@ package org.eclipse.dataspaceconnector.ids.api.multipart; import de.fraunhofer.iais.eis.ContractAgreementBuilder; -import de.fraunhofer.iais.eis.ContractOfferBuilder; import de.fraunhofer.iais.eis.ContractRequestBuilder; import de.fraunhofer.iais.eis.PermissionBuilder; import net.javacrumbs.jsonunit.assertj.JsonAssertions; @@ -535,43 +534,7 @@ void testHandleContractRequest() throws Exception { jsonHeader.inPath("$.ids:issuerConnector").isString().isEqualTo("urn:connector:" + CONNECTOR_ID); jsonHeader.inPath("$.ids:senderAgent").isString().isEqualTo("urn:connector:" + CONNECTOR_ID); } - - @Test - void testHandleContractOffer() throws Exception { - // prepare - var request = createRequestWithPayload(getContractOfferMessage(), - new ContractOfferBuilder().build()); - - // invoke - var response = httpClient.newCall(request).execute(); - - // verify - assertThat(response).isNotNull().extracting(Response::code).isEqualTo(200); - - List content = extractNamedMultipartContent(response); - - assertThat(content) - .hasSize(1) - .extracting(NamedMultipartContent::getName) - .containsExactly("header"); - - var header = content.stream().filter(n -> "header".equalsIgnoreCase(n.getName())) - .map(NamedMultipartContent::getContent) - .findFirst() - .orElseThrow(); - - var jsonHeader = JsonAssertions.assertThatJson(new String(header, StandardCharsets.UTF_8)); - - jsonHeader.inPath("$.@type").isString().isEqualTo("ids:RequestInProcessMessage"); - jsonHeader.inPath("$.@id").isString().matches("urn:message:.*"); - jsonHeader.inPath("$.ids:modelVersion").isString().isEqualTo("4.2.7"); - jsonHeader.inPath("$.ids:issued").isString().satisfies(date -> { - assertThat(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(date)).isNotNull(); - }); - jsonHeader.inPath("$.ids:issuerConnector").isString().isEqualTo("urn:connector:" + CONNECTOR_ID); - jsonHeader.inPath("$.ids:senderAgent").isString().isEqualTo("urn:connector:" + CONNECTOR_ID); - } - + @Test void testHandleContractAgreement() throws Exception { // prepare From 95f36342b9ba10ee5397c58be7b1bdd43e6a69f2 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Wed, 20 Jul 2022 15:26:45 +0200 Subject: [PATCH 43/45] chore: remove superfluous requireNonNull checks --- .../IdsMultipartApiServiceExtension.java | 3 --- .../controller/MultipartController.java | 13 ++++++------ .../handler/ArtifactRequestHandler.java | 19 +++++++----------- .../handler/ContractAgreementHandler.java | 15 +++++--------- .../handler/ContractRejectionHandler.java | 14 ++++--------- .../handler/ContractRequestHandler.java | 17 ++++++---------- .../handler/DescriptionRequestHandler.java | 20 +++++++------------ .../handler/EndpointDataReferenceHandler.java | 6 ------ .../multipart/message/MultipartRequest.java | 2 +- .../multipart/message/MultipartResponse.java | 3 ++- 10 files changed, 38 insertions(+), 74 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java index 8df50689c22..c92d3b9ba4a 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java @@ -53,7 +53,6 @@ import org.jetbrains.annotations.NotNull; import java.util.LinkedList; -import java.util.Objects; /** * ServiceExtension providing IDS multipart related API controllers @@ -135,8 +134,6 @@ private void registerControllers(ServiceExtensionContext context) { } private String resolveConnectorId(@NotNull ServiceExtensionContext context) { - Objects.requireNonNull(context); - var value = context.getSetting(EDC_IDS_ID, DEFAULT_EDC_IDS_ID); try { // Hint: use stringified uri to keep uri path and query diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java index 8e71a9cf659..f8d6a0800bc 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/controller/MultipartController.java @@ -44,7 +44,6 @@ import java.io.InputStream; import java.util.HashMap; import java.util.List; -import java.util.Objects; import static java.lang.String.format; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.malformedMessage; @@ -74,12 +73,12 @@ public MultipartController(@NotNull Monitor monitor, @NotNull IdentityService identityService, @NotNull List multipartHandlers, @NotNull String idsWebhookAddress) { - this.monitor = Objects.requireNonNull(monitor); - this.connectorId = Objects.requireNonNull(connectorId); - this.objectMapper = Objects.requireNonNull(objectMapper); - this.multipartHandlers = Objects.requireNonNull(multipartHandlers); - this.identityService = Objects.requireNonNull(identityService); - this.idsWebhookAddress = Objects.requireNonNull(idsWebhookAddress); + this.monitor = monitor; + this.connectorId = connectorId; + this.objectMapper = objectMapper; + this.multipartHandlers = multipartHandlers; + this.identityService = identityService; + this.idsWebhookAddress = idsWebhookAddress; } /** diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index b821fac445d..773786f290c 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -35,7 +35,6 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; -import java.util.Objects; import java.util.Optional; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; @@ -61,26 +60,22 @@ public ArtifactRequestHandler( @NotNull ContractValidationService contractValidationService, @NotNull TransferProcessManager transferProcessManager, @NotNull Vault vault) { - this.monitor = Objects.requireNonNull(monitor); - this.connectorId = Objects.requireNonNull(connectorId); - this.objectMapper = Objects.requireNonNull(objectMapper); - this.contractNegotiationStore = Objects.requireNonNull(contractNegotiationStore); - this.contractValidationService = Objects.requireNonNull(contractValidationService); - this.transferProcessManager = Objects.requireNonNull(transferProcessManager); - this.vault = Objects.requireNonNull(vault); + this.monitor = monitor; + this.connectorId = connectorId; + this.objectMapper = objectMapper; + this.contractNegotiationStore = contractNegotiationStore; + this.contractValidationService = contractValidationService; + this.transferProcessManager = transferProcessManager; + this.vault = vault; } @Override public boolean canHandle(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - return multipartRequest.getHeader() instanceof ArtifactRequestMessage; } @Override public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - var claimToken = multipartRequest.getClaimToken(); var message = (ArtifactRequestMessage) multipartRequest.getHeader(); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java index c0daaae6745..2e879a4fad2 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractAgreementHandler.java @@ -27,7 +27,6 @@ import org.jetbrains.annotations.NotNull; import java.io.IOException; -import java.util.Objects; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; @@ -50,24 +49,20 @@ public ContractAgreementHandler( @NotNull ObjectMapper objectMapper, @NotNull ConsumerContractNegotiationManager negotiationManager, @NotNull IdsTransformerRegistry transformerRegistry) { - this.monitor = Objects.requireNonNull(monitor); - this.connectorId = Objects.requireNonNull(connectorId); - this.objectMapper = Objects.requireNonNull(objectMapper); - this.negotiationManager = Objects.requireNonNull(negotiationManager); - this.transformerRegistry = Objects.requireNonNull(transformerRegistry); + this.monitor = monitor; + this.connectorId = connectorId; + this.objectMapper = objectMapper; + this.negotiationManager = negotiationManager; + this.transformerRegistry = transformerRegistry; } @Override public boolean canHandle(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - return multipartRequest.getHeader() instanceof ContractAgreementMessage; } @Override public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - var claimToken = multipartRequest.getClaimToken(); var message = (ContractAgreementMessage) multipartRequest.getHeader(); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java index 5e8d8adb2bc..9599fd888e0 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRejectionHandler.java @@ -22,8 +22,6 @@ import org.eclipse.dataspaceconnector.spi.monitor.Monitor; import org.jetbrains.annotations.NotNull; -import java.util.Objects; - import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.processedFromStatusResult; @@ -43,23 +41,19 @@ public ContractRejectionHandler( @NotNull String connectorId, @NotNull ProviderContractNegotiationManager providerNegotiationManager, @NotNull ConsumerContractNegotiationManager consumerNegotiationManager) { - this.monitor = Objects.requireNonNull(monitor); - this.connectorId = Objects.requireNonNull(connectorId); - this.providerNegotiationManager = Objects.requireNonNull(providerNegotiationManager); - this.consumerNegotiationManager = Objects.requireNonNull(consumerNegotiationManager); + this.monitor = monitor; + this.connectorId = connectorId; + this.providerNegotiationManager = providerNegotiationManager; + this.consumerNegotiationManager = consumerNegotiationManager; } @Override public boolean canHandle(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - return multipartRequest.getHeader() instanceof ContractRejectionMessage; } @Override public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - var claimToken = multipartRequest.getClaimToken(); var message = (ContractRejectionMessage) multipartRequest.getHeader(); var correlationMessageId = message.getCorrelationMessage(); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java index 62132c07686..4732b0dcea7 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java @@ -33,7 +33,6 @@ import org.jetbrains.annotations.NotNull; import java.io.IOException; -import java.util.Objects; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; @@ -59,25 +58,21 @@ public ContractRequestHandler( @NotNull ProviderContractNegotiationManager negotiationManager, @NotNull IdsTransformerRegistry transformerRegistry, @NotNull AssetIndex assetIndex) { - this.monitor = Objects.requireNonNull(monitor); - this.connectorId = Objects.requireNonNull(connectorId); - this.objectMapper = Objects.requireNonNull(objectMapper); - this.negotiationManager = Objects.requireNonNull(negotiationManager); - this.transformerRegistry = Objects.requireNonNull(transformerRegistry); - this.assetIndex = Objects.requireNonNull(assetIndex); + this.monitor = monitor; + this.connectorId = connectorId; + this.objectMapper = objectMapper; + this.negotiationManager = negotiationManager; + this.transformerRegistry = transformerRegistry; + this.assetIndex = assetIndex; } @Override public boolean canHandle(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - return multipartRequest.getHeader() instanceof ContractRequestMessage; } @Override public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - var claimToken = multipartRequest.getClaimToken(); var message = (ContractRequestMessage) multipartRequest.getHeader(); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java index a00eea5ed36..2f80237bc8d 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/DescriptionRequestHandler.java @@ -41,8 +41,6 @@ import org.eclipse.dataspaceconnector.spi.types.domain.asset.Asset; import org.jetbrains.annotations.NotNull; -import java.util.Objects; - import static java.lang.String.format; import static java.util.stream.Collectors.toList; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.RequestUtil.getInt; @@ -68,26 +66,22 @@ public DescriptionRequestHandler( @NotNull CatalogService catalogService, @NotNull ContractOfferService contractOfferService, @NotNull ConnectorService connectorService) { - this.monitor = Objects.requireNonNull(monitor); - this.connectorId = Objects.requireNonNull(connectorId); - this.transformerRegistry = Objects.requireNonNull(transformerRegistry); - this.assetIndex = Objects.requireNonNull(assetIndex); - this.catalogService = Objects.requireNonNull(catalogService); - this.contractOfferService = Objects.requireNonNull(contractOfferService); - this.connectorService = Objects.requireNonNull(connectorService); + this.monitor = monitor; + this.connectorId = connectorId; + this.transformerRegistry = transformerRegistry; + this.assetIndex = assetIndex; + this.catalogService = catalogService; + this.contractOfferService = contractOfferService; + this.connectorService = connectorService; } @Override public boolean canHandle(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - return multipartRequest.getHeader() instanceof DescriptionRequestMessage; } @Override public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - var claimToken = multipartRequest.getClaimToken(); var message = (DescriptionRequestMessage) multipartRequest.getHeader(); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java index 4ae905a9c34..ed7be3ad074 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/EndpointDataReferenceHandler.java @@ -28,8 +28,6 @@ import org.eclipse.dataspaceconnector.spi.types.domain.edr.EndpointDataReferenceMessage; import org.jetbrains.annotations.NotNull; -import java.util.Objects; - import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.badParameters; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.createMultipartResponse; import static org.eclipse.dataspaceconnector.ids.api.multipart.util.ResponseUtil.internalRecipientError; @@ -61,8 +59,6 @@ public EndpointDataReferenceHandler(@NotNull Monitor monitor, @Override public boolean canHandle(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - return multipartRequest.getHeader() instanceof ParticipantUpdateMessage; } @@ -74,8 +70,6 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { */ @Override public @NotNull MultipartResponse handleRequest(@NotNull MultipartRequest multipartRequest) { - Objects.requireNonNull(multipartRequest); - // Read and transform the endpoint data reference from the request payload var edr = typeManager.readValue(multipartRequest.getPayload(), EndpointDataReference.class); var transformationResult = transformerRegistry.transform(edr); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartRequest.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartRequest.java index aa7b80c0e88..0ed6774ed5c 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartRequest.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartRequest.java @@ -32,7 +32,7 @@ public class MultipartRequest { private final ClaimToken claimToken; private MultipartRequest(@NotNull Message header, @Nullable String payload, ClaimToken claimToken) { - this.header = Objects.requireNonNull(header); + this.header = header; this.payload = payload; this.claimToken = claimToken; } diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartResponse.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartResponse.java index 8c523b3c0e5..8d7cfb1d55d 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartResponse.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/message/MultipartResponse.java @@ -29,7 +29,7 @@ public class MultipartResponse { private final Object payload; private MultipartResponse(@NotNull Message header, @Nullable Object payload) { - this.header = Objects.requireNonNull(header); + this.header = header; this.payload = payload; } @@ -66,6 +66,7 @@ public Builder payload(@Nullable Object payload) { } public MultipartResponse build() { + Objects.requireNonNull(header, "Multipart response header is null."); return new MultipartResponse(header, payload); } } From 7f4dfa7bf6784eb5b04cb94aaa035854b958062a Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Fri, 22 Jul 2022 09:21:25 +0200 Subject: [PATCH 44/45] refactor: inject monitor into IdsMultipartApiServiceExtension --- .../ids/api/multipart/IdsMultipartApiServiceExtension.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java index c92d3b9ba4a..4908e29fd37 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/IdsMultipartApiServiceExtension.java @@ -63,6 +63,7 @@ public final class IdsMultipartApiServiceExtension implements ServiceExtension { public static final String EDC_IDS_ID = "edc.ids.id"; public static final String DEFAULT_EDC_IDS_ID = "urn:connector:edc"; + @Inject private Monitor monitor; @Inject private WebService webService; @@ -107,8 +108,6 @@ public String name() { @Override public void initialize(ServiceExtensionContext context) { - monitor = context.getMonitor(); - registerControllers(context); } From d7cbdd58c79f6c6a7504500658985819797837c1 Mon Sep 17 00:00:00 2001 From: Ronja Quensel Date: Fri, 22 Jul 2022 09:22:24 +0200 Subject: [PATCH 45/45] chore: add TODOs for after project structure review --- .../ids/api/multipart/handler/ArtifactRequestHandler.java | 2 ++ .../ids/api/multipart/handler/ContractRequestHandler.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java index 773786f290c..08fc1cd2a4a 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ArtifactRequestHandler.java @@ -155,6 +155,8 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { .connectorAddress(idsWebhookAddress) .build(); + //TODO use TransferProcessService for initiation after project structure review + // Initiate a transfer process for the request var transferInitiateResult = transferProcessManager.initiateProviderRequest(dataRequest); diff --git a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java index 4732b0dcea7..0c2cd19d042 100644 --- a/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java +++ b/data-protocols/ids/ids-api-multipart-endpoint-v1/src/main/java/org/eclipse/dataspaceconnector/ids/api/multipart/handler/ContractRequestHandler.java @@ -136,6 +136,8 @@ public boolean canHandle(@NotNull MultipartRequest multipartRequest) { .correlationId(String.valueOf(message.getTransferContract())) .contractOffer(contractOffer) .build(); + + //TODO use ContractNegotiationService for initiation after project structure review var negotiationInitiateResult = negotiationManager.requested(claimToken, requestObj);