Skip to content

Commit df0f984

Browse files
committed
replace providerUrl with counterPartyAddress in CatalogRequest
1 parent d980a44 commit df0f984

File tree

13 files changed

+143
-43
lines changed

13 files changed

+143
-43
lines changed

extensions/control-plane/api/management-api/catalog-api/src/main/java/org/eclipse/edc/connector/api/management/catalog/CatalogApi.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,19 @@ public interface CatalogApi {
5858
@Schema(name = "CatalogRequest", example = CatalogRequestSchema.CATALOG_REQUEST_EXAMPLE)
5959
record CatalogRequestSchema(
6060
@Schema(name = TYPE, example = CATALOG_REQUEST_TYPE)
61+
String type,
62+
@Deprecated(since = "0.2.0")
63+
@Schema(deprecated = true, description = "please use counterPartyAddress instead")
6164
String providerUrl,
65+
String counterPartyAddress,
6266
String protocol,
6367
ApiCoreSchema.QuerySpecSchema querySpec) {
6468

6569
public static final String CATALOG_REQUEST_EXAMPLE = """
6670
{
6771
"@context": { "edc": "https://w3id.org/edc/v0.0.1/ns/" },
6872
"@type": "CatalogRequest",
69-
"providerUrl": "http://provider-address",
73+
"counterPartyAddress": "http://provider-address",
7074
"protocol": "dataspace-protocol-http",
7175
"querySpec": {
7276
"offset": 0,
@@ -82,7 +86,8 @@ record CatalogRequestSchema(
8286
@Schema(name = "DatasetRequest", example = DatasetRequestSchema.DATASET_REQUEST_EXAMPLE)
8387
record DatasetRequestSchema(
8488
@Schema(name = TYPE, example = CATALOG_REQUEST_TYPE)
85-
String providerUrl,
89+
String type,
90+
String counterPartyAddress,
8691
String protocol,
8792
ApiCoreSchema.QuerySpecSchema querySpec) {
8893

extensions/control-plane/api/management-api/catalog-api/src/main/java/org/eclipse/edc/connector/api/management/catalog/CatalogApiController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public void requestCatalog(JsonObject requestBody, @Suspended AsyncResponse resp
6161
var request = transformerRegistry.transform(requestBody, CatalogRequest.class)
6262
.orElseThrow(InvalidRequestException::new);
6363

64-
service.requestCatalog(request.getProviderUrl(), request.getProtocol(), request.getQuerySpec())
64+
service.requestCatalog(request.getCounterPartyAddress(), request.getProtocol(), request.getQuerySpec())
6565
.whenComplete((result, throwable) -> {
6666
try {
6767
response.resume(toResponse(result, throwable));

extensions/control-plane/api/management-api/catalog-api/src/main/java/org/eclipse/edc/connector/api/management/catalog/CatalogApiExtension.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public String name() {
5757

5858
@Override
5959
public void initialize(ServiceExtensionContext context) {
60-
transformerRegistry.register(new JsonObjectToCatalogRequestTransformer());
60+
transformerRegistry.register(new JsonObjectToCatalogRequestTransformer(context.getMonitor()));
6161
transformerRegistry.register(new JsonObjectToDatasetRequestTransformer());
6262

6363
webService.registerResource(config.getContextAlias(), new CatalogApiController(service, transformerRegistry, validatorRegistry));

extensions/control-plane/api/management-api/catalog-api/src/main/java/org/eclipse/edc/connector/api/management/catalog/transform/JsonObjectToCatalogRequestTransformer.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,45 @@
1717
import jakarta.json.JsonObject;
1818
import org.eclipse.edc.catalog.spi.CatalogRequest;
1919
import org.eclipse.edc.jsonld.spi.transformer.AbstractJsonLdTransformer;
20+
import org.eclipse.edc.spi.monitor.Monitor;
2021
import org.eclipse.edc.spi.query.QuerySpec;
2122
import org.eclipse.edc.transform.spi.TransformerContext;
2223
import org.jetbrains.annotations.NotNull;
2324
import org.jetbrains.annotations.Nullable;
2425

26+
import java.util.Optional;
27+
28+
import static java.lang.String.format;
29+
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_COUNTER_PARTY_ADDRESS;
2530
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_PROTOCOL;
2631
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_PROVIDER_URL;
2732
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_QUERY_SPEC;
33+
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_TYPE;
2834

2935
public class JsonObjectToCatalogRequestTransformer extends AbstractJsonLdTransformer<JsonObject, CatalogRequest> {
3036

31-
public JsonObjectToCatalogRequestTransformer() {
37+
private final Monitor monitor;
38+
39+
public JsonObjectToCatalogRequestTransformer(Monitor monitor) {
3240
super(JsonObject.class, CatalogRequest.class);
41+
this.monitor = monitor;
3342
}
3443

3544
@Override
3645
public @Nullable CatalogRequest transform(@NotNull JsonObject object, @NotNull TransformerContext context) {
37-
var builder = CatalogRequest.Builder.newInstance();
38-
39-
visitProperties(object, key -> switch (key) {
40-
case CATALOG_REQUEST_PROTOCOL -> v -> builder.protocol(transformString(v, context));
41-
case CATALOG_REQUEST_PROVIDER_URL -> v -> builder.providerUrl(transformString(v, context));
42-
case CATALOG_REQUEST_QUERY_SPEC -> v -> builder.querySpec(transformObject(v, QuerySpec.class, context));
43-
default -> doNothing();
44-
});
45-
46-
return builder.build();
46+
var counterPartyAddress = Optional.of(object)
47+
.map(it -> it.get(CATALOG_REQUEST_COUNTER_PARTY_ADDRESS))
48+
.orElseGet(() -> {
49+
monitor.warning(format("The attribute %s has been deprecated in type %s, please use %s",
50+
CATALOG_REQUEST_PROVIDER_URL, CATALOG_REQUEST_TYPE, CATALOG_REQUEST_COUNTER_PARTY_ADDRESS));
51+
return object.get(CATALOG_REQUEST_PROVIDER_URL);
52+
});
53+
54+
return CatalogRequest.Builder.newInstance()
55+
.protocol(transformString(object.get(CATALOG_REQUEST_PROTOCOL), context))
56+
.querySpec(transformObject(object.get(CATALOG_REQUEST_QUERY_SPEC), QuerySpec.class, context))
57+
.counterPartyAddress(transformString(counterPartyAddress, context))
58+
.build();
4759
}
4860

4961
}

extensions/control-plane/api/management-api/catalog-api/src/main/java/org/eclipse/edc/connector/api/management/catalog/validation/CatalogRequestValidator.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@
1616

1717
import jakarta.json.JsonObject;
1818
import org.eclipse.edc.api.validation.QuerySpecValidator;
19+
import org.eclipse.edc.validator.jsonobject.JsonLdPath;
1920
import org.eclipse.edc.validator.jsonobject.JsonObjectValidator;
2021
import org.eclipse.edc.validator.jsonobject.validators.MandatoryValue;
22+
import org.eclipse.edc.validator.spi.ValidationResult;
2123
import org.eclipse.edc.validator.spi.Validator;
2224

25+
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_COUNTER_PARTY_ADDRESS;
2326
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_PROTOCOL;
2427
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_PROVIDER_URL;
2528
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_QUERY_SPEC;
@@ -28,9 +31,27 @@ public class CatalogRequestValidator {
2831

2932
public static Validator<JsonObject> instance() {
3033
return JsonObjectValidator.newValidator()
31-
.verify(CATALOG_REQUEST_PROVIDER_URL, MandatoryValue::new)
34+
.verify(MandatoryCounterPartyAddressOrProviderUrl::new)
3235
.verify(CATALOG_REQUEST_PROTOCOL, MandatoryValue::new)
3336
.verifyObject(CATALOG_REQUEST_QUERY_SPEC, QuerySpecValidator::instance)
3437
.build();
3538
}
39+
40+
private record MandatoryCounterPartyAddressOrProviderUrl(JsonLdPath path) implements Validator<JsonObject> {
41+
42+
@Override
43+
public ValidationResult validate(JsonObject input) {
44+
var counterPartyAddress = new MandatoryValue(path.append(CATALOG_REQUEST_COUNTER_PARTY_ADDRESS));
45+
var providerUrl = new MandatoryValue(path.append(CATALOG_REQUEST_PROVIDER_URL));
46+
47+
var validateCounterParty = counterPartyAddress.validate(input);
48+
var validateProviderUrl = providerUrl.validate(input);
49+
50+
if (validateCounterParty.succeeded() || validateProviderUrl.succeeded()) {
51+
return ValidationResult.success();
52+
} else {
53+
return validateCounterParty;
54+
}
55+
}
56+
}
3657
}

extensions/control-plane/api/management-api/catalog-api/src/test/java/org/eclipse/edc/connector/api/management/catalog/CatalogApiControllerTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ protected Object controller() {
5959

6060
@Test
6161
void requestCatalog() {
62-
var request = CatalogRequest.Builder.newInstance().providerUrl("http://url").build();
62+
var request = CatalogRequest.Builder.newInstance().counterPartyAddress("http://url").build();
6363
when(validatorRegistry.validate(any(), any())).thenReturn(ValidationResult.success());
6464
when(transformerRegistry.transform(any(), eq(CatalogRequest.class))).thenReturn(Result.success(request));
6565
when(service.requestCatalog(any(), any(), any())).thenReturn(completedFuture(StatusResult.success("{}".getBytes())));
@@ -110,7 +110,7 @@ void requestCatalog_shouldReturnBadRequest_whenTransformFails() {
110110

111111
@Test
112112
void requestCatalog_shouldReturnBadGateway_whenServiceFails() {
113-
var request = CatalogRequest.Builder.newInstance().providerUrl("http://url").build();
113+
var request = CatalogRequest.Builder.newInstance().counterPartyAddress("http://url").build();
114114
when(validatorRegistry.validate(any(), any())).thenReturn(ValidationResult.success());
115115
when(transformerRegistry.transform(any(), eq(CatalogRequest.class))).thenReturn(Result.success(request));
116116
when(service.requestCatalog(any(), any(), any())).thenReturn(completedFuture(StatusResult.failure(FATAL_ERROR, "error")));
@@ -128,7 +128,7 @@ void requestCatalog_shouldReturnBadGateway_whenServiceFails() {
128128

129129
@Test
130130
void requestCatalog_shouldReturnBadGateway_whenServiceThrowsException() {
131-
var request = CatalogRequest.Builder.newInstance().providerUrl("http://url").build();
131+
var request = CatalogRequest.Builder.newInstance().counterPartyAddress("http://url").build();
132132
when(validatorRegistry.validate(any(), any())).thenReturn(ValidationResult.success());
133133
when(transformerRegistry.transform(any(), eq(CatalogRequest.class))).thenReturn(Result.success(request));
134134
when(service.requestCatalog(any(), any(), any())).thenReturn(failedFuture(new EdcException("error")));

extensions/control-plane/api/management-api/catalog-api/src/test/java/org/eclipse/edc/connector/api/management/catalog/CatalogApiTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_POLICY_ATTRIBUTE;
4646
import static org.eclipse.edc.junit.assertions.AbstractResultAssert.assertThat;
4747
import static org.eclipse.edc.junit.extensions.TestServiceExtensionContext.testServiceExtensionContext;
48+
import static org.mockito.Mockito.mock;
4849

4950
class CatalogApiTest {
5051

@@ -54,7 +55,7 @@ class CatalogApiTest {
5455

5556
@BeforeEach
5657
void setUp() {
57-
transformer.register(new JsonObjectToCatalogRequestTransformer());
58+
transformer.register(new JsonObjectToCatalogRequestTransformer(mock()));
5859
transformer.register(new JsonObjectToDatasetRequestTransformer());
5960
transformer.register(new JsonObjectToQuerySpecTransformer());
6061
}
@@ -73,7 +74,7 @@ void catalogRequestExample() throws JsonProcessingException {
7374
.satisfies(transformResult -> assertThat(transformResult).isSucceeded()
7475
.satisfies(transformed -> {
7576
assertThat(transformed.getProtocol()).isNotBlank();
76-
assertThat(transformed.getProviderUrl()).isNotBlank();
77+
assertThat(transformed.getCounterPartyAddress()).isNotBlank();
7778
assertThat(transformed.getQuerySpec()).isNotNull();
7879
}));
7980
}

extensions/control-plane/api/management-api/catalog-api/src/test/java/org/eclipse/edc/connector/api/management/catalog/transform/JsonObjectToCatalogRequestTransformerTest.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,30 @@
1717
import jakarta.json.Json;
1818
import jakarta.json.JsonObject;
1919
import org.eclipse.edc.catalog.spi.CatalogRequest;
20+
import org.eclipse.edc.spi.monitor.Monitor;
2021
import org.eclipse.edc.spi.query.QuerySpec;
2122
import org.eclipse.edc.transform.spi.TransformerContext;
2223
import org.junit.jupiter.api.Test;
2324

2425
import static org.assertj.core.api.Assertions.assertThat;
26+
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_COUNTER_PARTY_ADDRESS;
2527
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_PROTOCOL;
2628
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_PROVIDER_URL;
2729
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_QUERY_SPEC;
2830
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_TYPE;
2931
import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE;
3032
import static org.mockito.ArgumentMatchers.any;
33+
import static org.mockito.ArgumentMatchers.anyString;
3134
import static org.mockito.ArgumentMatchers.eq;
3235
import static org.mockito.Mockito.mock;
3336
import static org.mockito.Mockito.verify;
3437
import static org.mockito.Mockito.when;
3538

3639
class JsonObjectToCatalogRequestTransformerTest {
3740

38-
private final JsonObjectToCatalogRequestTransformer transformer = new JsonObjectToCatalogRequestTransformer();
39-
private final TransformerContext context = mock(TransformerContext.class);
41+
private final TransformerContext context = mock();
42+
private final Monitor monitor = mock();
43+
private final JsonObjectToCatalogRequestTransformer transformer = new JsonObjectToCatalogRequestTransformer(monitor);
4044

4145
@Test
4246
void types() {
@@ -46,6 +50,27 @@ void types() {
4650

4751
@Test
4852
void transform() {
53+
var querySpec = QuerySpec.Builder.newInstance().build();
54+
var querySpecJson = Json.createObjectBuilder().build();
55+
when(context.transform(any(), eq(QuerySpec.class))).thenReturn(querySpec);
56+
var json = Json.createObjectBuilder()
57+
.add(TYPE, CATALOG_REQUEST_TYPE)
58+
.add(CATALOG_REQUEST_PROTOCOL, "protocol")
59+
.add(CATALOG_REQUEST_COUNTER_PARTY_ADDRESS, "http://provider/url")
60+
.add(CATALOG_REQUEST_QUERY_SPEC, querySpecJson)
61+
.build();
62+
63+
var result = transformer.transform(json, context);
64+
65+
assertThat(result).isNotNull();
66+
assertThat(result.getProtocol()).isEqualTo("protocol");
67+
assertThat(result.getCounterPartyAddress()).isEqualTo("http://provider/url");
68+
assertThat(result.getQuerySpec()).isEqualTo(querySpec);
69+
verify(context).transform(querySpecJson, QuerySpec.class);
70+
}
71+
72+
@Test
73+
void transform_shouldUseProviderId_whenCounterPartyAddressIsMissing() {
4974
var querySpec = QuerySpec.Builder.newInstance().build();
5075
var querySpecJson = Json.createObjectBuilder().build();
5176
when(context.transform(any(), eq(QuerySpec.class))).thenReturn(querySpec);
@@ -60,9 +85,10 @@ void transform() {
6085

6186
assertThat(result).isNotNull();
6287
assertThat(result.getProtocol()).isEqualTo("protocol");
63-
assertThat(result.getProviderUrl()).isEqualTo("http://provider/url");
88+
assertThat(result.getCounterPartyAddress()).isEqualTo("http://provider/url");
6489
assertThat(result.getQuerySpec()).isEqualTo(querySpec);
6590
verify(context).transform(querySpecJson, QuerySpec.class);
91+
verify(monitor).warning(anyString());
6692
}
6793

6894
}

extensions/control-plane/api/management-api/catalog-api/src/test/java/org/eclipse/edc/connector/api/management/catalog/validation/CatalogRequestValidatorTest.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import static jakarta.json.Json.createObjectBuilder;
2727
import static org.assertj.core.api.Assertions.assertThat;
2828
import static org.assertj.core.api.InstanceOfAssertFactories.list;
29+
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_COUNTER_PARTY_ADDRESS;
2930
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_PROTOCOL;
3031
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_PROVIDER_URL;
3132
import static org.eclipse.edc.catalog.spi.CatalogRequest.CATALOG_REQUEST_QUERY_SPEC;
@@ -39,6 +40,18 @@ class CatalogRequestValidatorTest {
3940

4041
@Test
4142
void shouldSucceed_whenInputIsValid() {
43+
var input = Json.createObjectBuilder()
44+
.add(CATALOG_REQUEST_COUNTER_PARTY_ADDRESS, value("http://any"))
45+
.add(CATALOG_REQUEST_PROTOCOL, value("protocol"))
46+
.build();
47+
48+
var result = validator.validate(input);
49+
50+
assertThat(result).isSucceeded();
51+
}
52+
53+
@Test
54+
void shouldSucceed_whenDeprecatedProviderUrlIsUsed() {
4255
var input = Json.createObjectBuilder()
4356
.add(CATALOG_REQUEST_PROVIDER_URL, value("http://any"))
4457
.add(CATALOG_REQUEST_PROTOCOL, value("protocol"))
@@ -57,14 +70,14 @@ void shouldFail_whenMandatoryFieldsAreMissing() {
5770

5871
assertThat(result).isFailed().extracting(ValidationFailure::getViolations).asInstanceOf(list(Violation.class))
5972
.hasSize(2)
60-
.anySatisfy(v -> assertThat(v.path()).isEqualTo(CATALOG_REQUEST_PROVIDER_URL))
73+
.anySatisfy(v -> assertThat(v.path()).isEqualTo(CATALOG_REQUEST_COUNTER_PARTY_ADDRESS))
6174
.anySatisfy(v -> assertThat(v.path()).isEqualTo(CATALOG_REQUEST_PROTOCOL));
6275
}
6376

6477
@Test
6578
void shouldFail_whenOptionalQuerySpecIsInvalid() {
6679
var input = Json.createObjectBuilder()
67-
.add(CATALOG_REQUEST_PROVIDER_URL, value("http://any"))
80+
.add(CATALOG_REQUEST_COUNTER_PARTY_ADDRESS, value("http://any"))
6881
.add(CATALOG_REQUEST_PROTOCOL, value("protocol"))
6982
.add(CATALOG_REQUEST_QUERY_SPEC, createArrayBuilder().add(createObjectBuilder()
7083
.add(EDC_QUERY_SPEC_SORT_FIELD, value(" "))))

spi/common/catalog-spi/src/main/java/org/eclipse/edc/catalog/spi/CatalogRequest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,20 @@ public class CatalogRequest {
2525

2626
public static final String CATALOG_REQUEST_TYPE = EDC_NAMESPACE + "CatalogRequest";
2727
public static final String CATALOG_REQUEST_PROTOCOL = EDC_NAMESPACE + "protocol";
28+
public static final String CATALOG_REQUEST_COUNTER_PARTY_ADDRESS = EDC_NAMESPACE + "counterPartyAddress";
29+
@Deprecated(since = "0.2.0")
2830
public static final String CATALOG_REQUEST_PROVIDER_URL = EDC_NAMESPACE + "providerUrl";
2931
public static final String CATALOG_REQUEST_QUERY_SPEC = EDC_NAMESPACE + "querySpec";
3032

3133
private QuerySpec querySpec;
32-
private String providerUrl;
34+
private String counterPartyAddress;
3335
private String protocol;
3436

3537
private CatalogRequest() {
3638
}
3739

38-
public String getProviderUrl() {
39-
return providerUrl;
40+
public String getCounterPartyAddress() {
41+
return counterPartyAddress;
4042
}
4143

4244
public QuerySpec getQuerySpec() {
@@ -65,8 +67,8 @@ public Builder querySpec(QuerySpec querySpec) {
6567
return this;
6668
}
6769

68-
public Builder providerUrl(String providerUrl) {
69-
instance.providerUrl = providerUrl;
70+
public Builder counterPartyAddress(String counterPartyAddress) {
71+
instance.counterPartyAddress = counterPartyAddress;
7072
return this;
7173
}
7274

@@ -76,7 +78,6 @@ public Builder protocol(String protocol) {
7678
}
7779

7880
public CatalogRequest build() {
79-
requireNonNull(instance.providerUrl, "providerUrl");
8081
return instance;
8182
}
8283
}

0 commit comments

Comments
 (0)