Skip to content

Commit

Permalink
feat(Edr API): associates contractNegotiationId EdrEntry (#847)
Browse files Browse the repository at this point in the history
* feat(Edr API): associates contractNegotiationId if present to the EndpointDataReferenceEntry and make it filtrable

* chore: update dependencies file

* pr remarks
  • Loading branch information
wolf4ood committed Oct 25, 2023
1 parent 6ffe4eb commit d4a69a2
Show file tree
Hide file tree
Showing 21 changed files with 247 additions and 60 deletions.
52 changes: 26 additions & 26 deletions DEPENDENCIES
Original file line number Diff line number Diff line change
Expand Up @@ -452,52 +452,52 @@ maven/mavencentral/org.testcontainers/vault/1.19.1, MIT, approved, #10852
maven/mavencentral/org.yaml/snakeyaml/2.0, Apache-2.0 AND (Apache-2.0 OR BSD-3-Clause OR EPL-1.0 OR GPL-2.0-or-later OR LGPL-2.1-or-later), approved, #7275
maven/mavencentral/org.yaml/snakeyaml/2.2, Apache-2.0 AND (Apache-2.0 OR BSD-3-Clause OR EPL-1.0 OR GPL-2.0-or-later OR LGPL-2.1-or-later), approved, #10232
maven/mavencentral/software.amazon.awssdk/annotations/2.20.146, Apache-2.0, approved, #8598
maven/mavencentral/software.amazon.awssdk/annotations/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/annotations/2.21.5, Apache-2.0, approved, #11137
maven/mavencentral/software.amazon.awssdk/apache-client/2.20.146, Apache-2.0, approved, #8609
maven/mavencentral/software.amazon.awssdk/apache-client/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/apache-client/2.21.5, Apache-2.0, approved, #11133
maven/mavencentral/software.amazon.awssdk/arns/2.20.146, Apache-2.0, approved, #8616
maven/mavencentral/software.amazon.awssdk/arns/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/arns/2.21.5, Apache-2.0, approved, #11143
maven/mavencentral/software.amazon.awssdk/auth/2.20.146, Apache-2.0, approved, #8602
maven/mavencentral/software.amazon.awssdk/auth/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/auth/2.21.5, Apache-2.0, approved, #11139
maven/mavencentral/software.amazon.awssdk/aws-core/2.20.146, Apache-2.0, approved, #8612
maven/mavencentral/software.amazon.awssdk/aws-core/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/aws-core/2.21.5, Apache-2.0, approved, #11126
maven/mavencentral/software.amazon.awssdk/aws-query-protocol/2.20.146, Apache-2.0, approved, #8629
maven/mavencentral/software.amazon.awssdk/aws-query-protocol/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/aws-query-protocol/2.21.5, Apache-2.0, approved, #11123
maven/mavencentral/software.amazon.awssdk/aws-xml-protocol/2.20.146, Apache-2.0, approved, #8624
maven/mavencentral/software.amazon.awssdk/aws-xml-protocol/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/checksums-spi/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/checksums/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/aws-xml-protocol/2.21.5, Apache-2.0, approved, #11124
maven/mavencentral/software.amazon.awssdk/checksums-spi/2.21.5, Apache-2.0, approved, #11131
maven/mavencentral/software.amazon.awssdk/checksums/2.21.5, Apache-2.0, approved, #11134
maven/mavencentral/software.amazon.awssdk/crt-core/2.20.146, Apache-2.0, approved, #8627
maven/mavencentral/software.amazon.awssdk/crt-core/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/crt-core/2.21.5, Apache-2.0, approved, #11130
maven/mavencentral/software.amazon.awssdk/endpoints-spi/2.20.146, Apache-2.0, approved, #8604
maven/mavencentral/software.amazon.awssdk/endpoints-spi/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/http-auth-aws/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/http-auth-spi/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/http-auth/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/endpoints-spi/2.21.5, Apache-2.0, approved, #11118
maven/mavencentral/software.amazon.awssdk/http-auth-aws/2.21.5, Apache-2.0, approved, #11145
maven/mavencentral/software.amazon.awssdk/http-auth-spi/2.21.5, Apache-2.0, approved, #11128
maven/mavencentral/software.amazon.awssdk/http-auth/2.21.5, Apache-2.0, approved, #11120
maven/mavencentral/software.amazon.awssdk/http-client-spi/2.20.146, Apache-2.0, approved, #8608
maven/mavencentral/software.amazon.awssdk/http-client-spi/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/http-client-spi/2.21.5, Apache-2.0, approved, #11132
maven/mavencentral/software.amazon.awssdk/iam/2.20.146, Apache-2.0, approved, #9271
maven/mavencentral/software.amazon.awssdk/identity-spi/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/identity-spi/2.21.5, Apache-2.0, approved, #11129
maven/mavencentral/software.amazon.awssdk/json-utils/2.20.146, Apache-2.0, approved, #8614
maven/mavencentral/software.amazon.awssdk/json-utils/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/json-utils/2.21.5, Apache-2.0, approved, #11119
maven/mavencentral/software.amazon.awssdk/metrics-spi/2.20.146, Apache-2.0, approved, #8636
maven/mavencentral/software.amazon.awssdk/metrics-spi/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/metrics-spi/2.21.5, Apache-2.0, approved, #11144
maven/mavencentral/software.amazon.awssdk/netty-nio-client/2.20.146, Apache-2.0, approved, #8613
maven/mavencentral/software.amazon.awssdk/netty-nio-client/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/netty-nio-client/2.21.5, Apache-2.0, approved, #11140
maven/mavencentral/software.amazon.awssdk/profiles/2.20.146, Apache-2.0, approved, #8600
maven/mavencentral/software.amazon.awssdk/profiles/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/profiles/2.21.5, Apache-2.0, approved, #11148
maven/mavencentral/software.amazon.awssdk/protocol-core/2.20.146, Apache-2.0, approved, #8635
maven/mavencentral/software.amazon.awssdk/protocol-core/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/protocol-core/2.21.5, Apache-2.0, approved, #11141
maven/mavencentral/software.amazon.awssdk/regions/2.20.146, Apache-2.0, approved, #8632
maven/mavencentral/software.amazon.awssdk/regions/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/regions/2.21.5, Apache-2.0, approved, #11142
maven/mavencentral/software.amazon.awssdk/s3-transfer-manager/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/s3/2.20.146, Apache-2.0, approved, #8623
maven/mavencentral/software.amazon.awssdk/s3/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/s3/2.21.5, Apache-2.0, approved, #11135
maven/mavencentral/software.amazon.awssdk/sdk-core/2.20.146, Apache-2.0, approved, #8611
maven/mavencentral/software.amazon.awssdk/sdk-core/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/sdk-core/2.21.5, Apache-2.0, approved, #11121
maven/mavencentral/software.amazon.awssdk/sts/2.20.146, Apache-2.0, approved, #9269
maven/mavencentral/software.amazon.awssdk/third-party-jackson-core/2.20.146, Apache-2.0, approved, #8622
maven/mavencentral/software.amazon.awssdk/third-party-jackson-core/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/third-party-jackson-core/2.21.5, Apache-2.0, approved, #11127
maven/mavencentral/software.amazon.awssdk/utils/2.20.146, Apache-2.0, approved, #8625
maven/mavencentral/software.amazon.awssdk/utils/2.21.5, , restricted, clearlydefined
maven/mavencentral/software.amazon.awssdk/utils/2.21.5, Apache-2.0, approved, #11136
maven/mavencentral/software.amazon.eventstream/eventstream/1.0.1, Apache-2.0, approved, clearlydefined
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@
*/
public class EdrCacheEntryPredicateConverter implements CriterionToPredicateConverter {

public static final String ASSET_ID = "assetId";
public static final String AGREEMENT_ID = "agreementId";
public static final String PROVIDER_ID = "providerId";
public static final String CONTRACT_NEGOTIATION_ID = "contractNegotiationId";
public static final String STATE = "state";

@Override
public <T> Predicate<T> convert(Criterion criterion) {
var operator = criterion.getOperator().toLowerCase();
Expand All @@ -40,10 +46,25 @@ public <T> Predicate<T> convert(Criterion criterion) {
case "=" -> equalPredicate(criterion);
case "in" -> inPredicate(criterion);
case "like" -> likePredicate(criterion);
default -> throw new IllegalArgumentException(format("Operator [%s] is not supported by this converter!", criterion.getOperator()));
default ->
throw new IllegalArgumentException(format("Operator [%s] is not supported by this converter!", criterion.getOperator()));
};
}

protected Object property(String key, Object object) {
if (object instanceof EndpointDataReferenceEntry entry) {
return switch (key) {
case ASSET_ID -> entry.getAssetId();
case AGREEMENT_ID -> entry.getAgreementId();
case PROVIDER_ID -> entry.getProviderId();
case CONTRACT_NEGOTIATION_ID -> entry.getContractNegotiationId();
case STATE -> entry.getState();
default -> null;
};
}
throw new IllegalArgumentException("Can only handle objects of type " + EndpointDataReferenceEntry.class.getSimpleName() + " but received an " + object.getClass().getSimpleName());
}

@NotNull
private <T> Predicate<T> equalPredicate(Criterion criterion) {
return t -> {
Expand Down Expand Up @@ -117,17 +138,4 @@ private <T> Predicate<T> likePredicate(Criterion criterion) {
return false;
};
}

protected Object property(String key, Object object) {
if (object instanceof EndpointDataReferenceEntry entry) {
return switch (key) {
case "assetId" -> entry.getAssetId();
case "agreementId" -> entry.getAgreementId();
case "providerId" -> entry.getProviderId();
case "state" -> entry.getState();
default -> null;
};
}
throw new IllegalArgumentException("Can only handle objects of type " + EndpointDataReferenceEntry.class.getSimpleName() + " but received an " + object.getClass().getSimpleName());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public interface EdrApi {
@ApiResponse(responseCode = "400", description = "Request was malformed",
content = @Content(array = @ArraySchema(schema = @Schema(implementation = ApiErrorDetail.class)))) }
)
JsonArray queryEdrs(String assetId, String agreementId, String providerId);
JsonArray queryEdrs(String assetId, String agreementId, String contractNegotiationId, String providerId);

@Operation(description = "Gets an EDR with the given transfer process ID",
responses = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
import static org.eclipse.tractusx.edc.api.edr.dto.NegotiateEdrRequestDto.EDR_REQUEST_DTO_TYPE;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.AGREEMENT_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.ASSET_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.CONTRACT_NEGOTIATION_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.PROVIDER_ID;

@Consumes({ MediaType.APPLICATION_JSON })
Expand Down Expand Up @@ -89,11 +90,14 @@ public JsonObject initiateEdrNegotiation(JsonObject requestObject) {

@GET
@Override
public JsonArray queryEdrs(@QueryParam("assetId") String assetId, @QueryParam("agreementId") String agreementId, @QueryParam("providerId") String providerId) {
if (assetId == null && agreementId == null) {
throw new InvalidRequestException("At least one of this query parameter is required [assetId,agreementId]");
public JsonArray queryEdrs(@QueryParam("assetId") String assetId,
@QueryParam("agreementId") String agreementId,
@QueryParam("contractNegotiationId") String contractNegotiationId,
@QueryParam("providerId") String providerId) {
if (assetId == null && agreementId == null && contractNegotiationId == null) {
throw new InvalidRequestException("At least one of this query parameter is required [assetId, agreementId, contractNegotiationId]");
}
return edrService.findBy(querySpec(assetId, agreementId, providerId))
return edrService.findBy(querySpec(assetId, agreementId, contractNegotiationId, providerId))
.orElseThrow(exceptionMapper(EndpointDataReferenceEntry.class))
.stream()
.map(edrCached -> transformerRegistry.transform(edrCached, JsonObject.class))
Expand Down Expand Up @@ -124,14 +128,17 @@ private void logIfError(Result<?> result) {
result.onFailure(f -> monitor.warning(f.getFailureDetail()));
}

private QuerySpec querySpec(String assetId, String agreementId, String providerId) {
private QuerySpec querySpec(String assetId, String agreementId, String contractNegotiationId, String providerId) {
var queryBuilder = QuerySpec.Builder.newInstance();
if (assetId != null) {
queryBuilder.filter(fieldFilter(ASSET_ID, assetId));
}
if (agreementId != null) {
queryBuilder.filter(fieldFilter(AGREEMENT_ID, agreementId));
}
if (contractNegotiationId != null) {
queryBuilder.filter(fieldFilter(CONTRACT_NEGOTIATION_ID, contractNegotiationId));
}
if (providerId != null) {
queryBuilder.filter(fieldFilter(PROVIDER_ID, providerId));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_AGREEMENT_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_ASSET_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_CONTRACT_NEGOTIATION_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_EXPIRATION_DATE;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_PROVIDER_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_STATE;
Expand All @@ -40,15 +41,24 @@ public JsonObjectFromEndpointDataReferenceEntryTransformer() {

@Override
public @Nullable JsonObject transform(@NotNull EndpointDataReferenceEntry dto, @NotNull TransformerContext context) {
return Json.createObjectBuilder()

var builder = Json.createObjectBuilder()
.add(TYPE, EDR_ENTRY_TYPE)
.add(EDR_ENTRY_AGREEMENT_ID, dto.getAgreementId())
.add(EDR_ENTRY_TRANSFER_PROCESS_ID, dto.getTransferProcessId())
.add(EDR_ENTRY_ASSET_ID, dto.getAssetId())
.add(EDR_ENTRY_PROVIDER_ID, dto.getProviderId())
.add(EDR_ENTRY_STATE, dto.getEdrState())
.add(EDR_ENTRY_EXPIRATION_DATE, dto.getExpirationTimestamp())
.build();
.add(EDR_ENTRY_EXPIRATION_DATE, dto.getExpirationTimestamp());

if (dto.getProviderId() != null) {
builder.add(EDR_ENTRY_PROVIDER_ID, dto.getProviderId());
}

if (dto.getContractNegotiationId() != null) {
builder.add(EDR_ENTRY_CONTRACT_NEGOTIATION_ID, dto.getContractNegotiationId());
}

return builder.build();
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,10 @@
import static org.eclipse.tractusx.edc.edr.spi.CoreConstants.TX_NAMESPACE;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.AGREEMENT_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.ASSET_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.CONTRACT_NEGOTIATION_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_AGREEMENT_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_ASSET_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_CONTRACT_NEGOTIATION_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_PROVIDER_ID;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_STATE;
import static org.eclipse.tractusx.edc.edr.spi.types.EndpointDataReferenceEntry.EDR_ENTRY_TRANSFER_PROCESS_ID;
Expand Down Expand Up @@ -269,6 +271,53 @@ void queryEdrs_shouldReturnCachedEntries_whenAgreementIdIsProvided() {
.body("[0].'edc:providerId'", is(entry.getProviderId()));
}

@Test
void queryEdrs_shouldReturnCachedEntries_whenContractNegotiationIdIsProvided() {
var assetId = "assetId";
var transferProcessId = "transferProcessId";
var agreementId = "agreementId";
var providerId = "providerId";
var contractNegotiationId = "contractNegotiationId";

var entry = EndpointDataReferenceEntry.Builder.newInstance()
.transferProcessId(transferProcessId)
.agreementId(agreementId)
.assetId(assetId)
.providerId(providerId)
.contractNegotiationId(contractNegotiationId)
.build();


var response = Json.createObjectBuilder()
.add(TYPE, EDR_ENTRY_TYPE)
.add(EDR_ENTRY_ASSET_ID, entry.getAssetId())
.add(EDR_ENTRY_TRANSFER_PROCESS_ID, entry.getTransferProcessId())
.add(EDR_ENTRY_AGREEMENT_ID, entry.getAgreementId())
.add(EDR_ENTRY_CONTRACT_NEGOTIATION_ID, entry.getContractNegotiationId())
.add(EDR_ENTRY_PROVIDER_ID, entry.getProviderId())
.build();

var filter = QuerySpec.Builder.newInstance()
.filter(fieldFilter(CONTRACT_NEGOTIATION_ID, contractNegotiationId))
.filter(fieldFilter(PROVIDER_ID, entry.getProviderId()))
.build();

when(edrService.findBy(eq(filter))).thenReturn(ServiceResult.success(List.of(entry)));
when(transformerRegistry.transform(any(EndpointDataReferenceEntry.class), eq(JsonObject.class))).thenReturn(Result.success(response));

baseRequest()
.contentType(MediaType.APPLICATION_JSON)
.get(EDR_PATH + format("?=contractNegotiationId=%s&providerId=%s", entry.getContractNegotiationId(), entry.getProviderId()))
.then()
.log().all(true)
.statusCode(200)
.body("[0].'edc:transferProcessId'", is(entry.getTransferProcessId()))
.body("[0].'edc:agreementId'", is(entry.getAgreementId()))
.body("[0].'edc:contractNegotiationId'", is(entry.getContractNegotiationId()))
.body("[0].'edc:assetId'", is(entry.getAssetId()))
.body("[0].'edc:providerId'", is(entry.getProviderId()));
}

@Test
void deleteEdr() {
var transferProcessId = "id";
Expand Down

0 comments on commit d4a69a2

Please sign in to comment.