Skip to content

Commit f449c33

Browse files
authored
refactor: supports multi protocols dsp-http (#4514)
refactor: supports multi protocols in DspRequest and DspHttpRemoteMessageDispatcherImpl
1 parent 8f5bff2 commit f449c33

File tree

50 files changed

+807
-133
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+807
-133
lines changed

data-protocols/dsp/dsp-catalog/dsp-catalog-http-api/src/main/java/org/eclipse/edc/protocol/dsp/catalog/http/api/DspCatalogApiExtension.java

+18-5
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
import org.eclipse.edc.protocol.dsp.catalog.http.api.decorator.Base64continuationTokenSerDes;
2525
import org.eclipse.edc.protocol.dsp.catalog.http.api.decorator.ContinuationTokenManagerImpl;
2626
import org.eclipse.edc.protocol.dsp.catalog.http.api.validation.CatalogRequestMessageValidator;
27+
import org.eclipse.edc.protocol.dsp.http.spi.message.ContinuationTokenManager;
2728
import org.eclipse.edc.protocol.dsp.http.spi.message.DspRequestHandler;
2829
import org.eclipse.edc.runtime.metamodel.annotation.Extension;
2930
import org.eclipse.edc.runtime.metamodel.annotation.Inject;
31+
import org.eclipse.edc.spi.monitor.Monitor;
3032
import org.eclipse.edc.spi.protocol.ProtocolWebhook;
3133
import org.eclipse.edc.spi.query.CriterionOperatorRegistry;
3234
import org.eclipse.edc.spi.system.ServiceExtension;
@@ -37,6 +39,9 @@
3739
import org.eclipse.edc.web.spi.configuration.ApiContext;
3840

3941
import static org.eclipse.edc.protocol.dsp.spi.type.DspCatalogPropertyAndTypeNames.DSPACE_TYPE_CATALOG_REQUEST_MESSAGE;
42+
import static org.eclipse.edc.protocol.dsp.spi.type.DspConstants.DSP_TRANSFORMER_CONTEXT_V_08;
43+
import static org.eclipse.edc.protocol.dsp.spi.type.DspConstants.DSP_TRANSFORMER_CONTEXT_V_2024_1;
44+
import static org.eclipse.edc.protocol.dsp.spi.version.DspVersions.V_08;
4045
import static org.eclipse.edc.protocol.dsp.spi.version.DspVersions.V_2024_1;
4146

4247
/**
@@ -64,7 +69,10 @@ public class DspCatalogApiExtension implements ServiceExtension {
6469
@Inject
6570
private ProtocolVersionRegistry versionRegistry;
6671
@Inject
67-
private TypeTransformerRegistry typeTransformerRegistry;
72+
private TypeTransformerRegistry transformerRegistry;
73+
@Inject
74+
private Monitor monitor;
75+
6876
@Inject
6977
private JsonLd jsonLd;
7078

@@ -77,16 +85,21 @@ public String name() {
7785
public void initialize(ServiceExtensionContext context) {
7886
validatorRegistry.register(DSPACE_TYPE_CATALOG_REQUEST_MESSAGE, CatalogRequestMessageValidator.instance(criterionOperatorRegistry));
7987

80-
var continuationTokenSerDes = new Base64continuationTokenSerDes(typeTransformerRegistry.forContext("dsp-api"), jsonLd);
81-
var catalogPaginationResponseDecoratorFactory = new ContinuationTokenManagerImpl(continuationTokenSerDes, context.getMonitor());
82-
webService.registerResource(ApiContext.PROTOCOL, new DspCatalogApiController(service, dspRequestHandler, catalogPaginationResponseDecoratorFactory));
83-
webService.registerResource(ApiContext.PROTOCOL, new DspCatalogApiController20241(service, dspRequestHandler, catalogPaginationResponseDecoratorFactory));
88+
89+
webService.registerResource(ApiContext.PROTOCOL, new DspCatalogApiController(service, dspRequestHandler, continuationTokenManager(monitor, DSP_TRANSFORMER_CONTEXT_V_08)));
90+
webService.registerResource(ApiContext.PROTOCOL, new DspCatalogApiController20241(service, dspRequestHandler, continuationTokenManager(monitor, DSP_TRANSFORMER_CONTEXT_V_2024_1)));
8491

8592
dataServiceRegistry.register(DataService.Builder.newInstance()
8693
.endpointDescription("dspace:connector")
8794
.endpointUrl(protocolWebhook.url())
8895
.build());
8996

9097
versionRegistry.register(V_2024_1);
98+
versionRegistry.register(V_08);
99+
}
100+
101+
private ContinuationTokenManager continuationTokenManager(Monitor monitor, String version) {
102+
var continuationTokenSerDes = new Base64continuationTokenSerDes(transformerRegistry.forContext(version), jsonLd);
103+
return new ContinuationTokenManagerImpl(continuationTokenSerDes, monitor);
91104
}
92105
}

data-protocols/dsp/dsp-catalog/dsp-catalog-http-api/src/main/java/org/eclipse/edc/protocol/dsp/catalog/http/api/controller/DspCatalogApiController.java

+9
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import static org.eclipse.edc.protocol.dsp.catalog.http.api.CatalogApiPaths.BASE_PATH;
4242
import static org.eclipse.edc.protocol.dsp.catalog.http.api.CatalogApiPaths.CATALOG_REQUEST;
4343
import static org.eclipse.edc.protocol.dsp.catalog.http.api.CatalogApiPaths.DATASET_REQUEST;
44+
import static org.eclipse.edc.protocol.dsp.http.spi.types.HttpMessageProtocol.DATASPACE_PROTOCOL_HTTP;
4445
import static org.eclipse.edc.protocol.dsp.spi.type.DspCatalogPropertyAndTypeNames.DSPACE_TYPE_CATALOG_ERROR;
4546
import static org.eclipse.edc.protocol.dsp.spi.type.DspCatalogPropertyAndTypeNames.DSPACE_TYPE_CATALOG_REQUEST_MESSAGE;
4647

@@ -55,11 +56,17 @@ public class DspCatalogApiController {
5556
private final CatalogProtocolService service;
5657
private final DspRequestHandler dspRequestHandler;
5758
private final ContinuationTokenManager continuationTokenManager;
59+
private final String protocol;
5860

5961
public DspCatalogApiController(CatalogProtocolService service, DspRequestHandler dspRequestHandler, ContinuationTokenManager continuationTokenManager) {
62+
this(service, dspRequestHandler, continuationTokenManager, DATASPACE_PROTOCOL_HTTP);
63+
}
64+
65+
public DspCatalogApiController(CatalogProtocolService service, DspRequestHandler dspRequestHandler, ContinuationTokenManager continuationTokenManager, String protocol) {
6066
this.service = service;
6167
this.dspRequestHandler = dspRequestHandler;
6268
this.continuationTokenManager = continuationTokenManager;
69+
this.protocol = protocol;
6370
}
6471

6572
@POST
@@ -80,6 +87,7 @@ public Response requestCatalog(JsonObject jsonObject, @HeaderParam(AUTHORIZATION
8087
.message(messageJson)
8188
.serviceCall(service::getCatalog)
8289
.errorType(DSPACE_TYPE_CATALOG_ERROR)
90+
.protocol(protocol)
8391
.build();
8492

8593
var responseDecorator = continuationTokenManager.createResponseDecorator(uriInfo.getAbsolutePath().toString());
@@ -94,6 +102,7 @@ public Response getDataset(@PathParam("id") String id, @HeaderParam(AUTHORIZATIO
94102
.id(id)
95103
.serviceCall(service::getDataset)
96104
.errorType(DSPACE_TYPE_CATALOG_ERROR)
105+
.protocol(protocol)
97106
.build();
98107

99108
return dspRequestHandler.getResource(request);

data-protocols/dsp/dsp-catalog/dsp-catalog-http-api/src/main/java/org/eclipse/edc/protocol/dsp/catalog/http/api/controller/DspCatalogApiController20241.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,22 @@
2020
import org.eclipse.edc.connector.controlplane.services.spi.catalog.CatalogProtocolService;
2121
import org.eclipse.edc.protocol.dsp.http.spi.message.ContinuationTokenManager;
2222
import org.eclipse.edc.protocol.dsp.http.spi.message.DspRequestHandler;
23-
import org.eclipse.edc.protocol.dsp.spi.version.DspVersions;
2423

2524
import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;
2625
import static org.eclipse.edc.protocol.dsp.catalog.http.api.CatalogApiPaths.BASE_PATH;
26+
import static org.eclipse.edc.protocol.dsp.http.spi.types.HttpMessageProtocol.DATASPACE_PROTOCOL_HTTP_V_2024_1;
27+
import static org.eclipse.edc.protocol.dsp.spi.version.DspVersions.V_2024_1_PATH;
2728

2829
/**
2930
* Versioned Catalog endpoint, same as {@link DspCatalogApiController} but exposed on the /2024/1 path
3031
*/
3132
@Consumes({ APPLICATION_JSON })
3233
@Produces({ APPLICATION_JSON })
33-
@Path(DspVersions.V_2024_1_PATH + BASE_PATH)
34+
@Path(V_2024_1_PATH + BASE_PATH)
3435
public class DspCatalogApiController20241 extends DspCatalogApiController {
3536

3637
public DspCatalogApiController20241(CatalogProtocolService service, DspRequestHandler dspRequestHandler,
3738
ContinuationTokenManager responseDecorator) {
38-
super(service, dspRequestHandler, responseDecorator);
39+
super(service, dspRequestHandler, responseDecorator, DATASPACE_PROTOCOL_HTTP_V_2024_1);
3940
}
4041
}

data-protocols/dsp/dsp-catalog/dsp-catalog-http-api/src/test/java/org/eclipse/edc/protocol/dsp/catalog/http/api/DspCatalogApiExtensionTest.java

+11-3
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,39 @@
1414

1515
package org.eclipse.edc.protocol.dsp.catalog.http.api;
1616

17-
import org.eclipse.edc.connector.controlplane.services.spi.protocol.ProtocolVersion;
1817
import org.eclipse.edc.connector.controlplane.services.spi.protocol.ProtocolVersionRegistry;
1918
import org.eclipse.edc.junit.extensions.DependencyInjectionExtension;
19+
import org.eclipse.edc.protocol.dsp.spi.transform.DspProtocolTypeTransformerRegistry;
20+
import org.eclipse.edc.spi.result.Result;
2021
import org.eclipse.edc.spi.system.ServiceExtensionContext;
2122
import org.eclipse.edc.validator.spi.JsonObjectValidatorRegistry;
2223
import org.junit.jupiter.api.BeforeEach;
2324
import org.junit.jupiter.api.Test;
2425
import org.junit.jupiter.api.extension.ExtendWith;
2526

2627
import static org.eclipse.edc.protocol.dsp.spi.type.DspCatalogPropertyAndTypeNames.DSPACE_TYPE_CATALOG_REQUEST_MESSAGE;
28+
import static org.eclipse.edc.protocol.dsp.spi.version.DspVersions.V_08;
29+
import static org.eclipse.edc.protocol.dsp.spi.version.DspVersions.V_2024_1;
2730
import static org.mockito.ArgumentMatchers.any;
2831
import static org.mockito.ArgumentMatchers.eq;
29-
import static org.mockito.ArgumentMatchers.isA;
3032
import static org.mockito.Mockito.mock;
3133
import static org.mockito.Mockito.verify;
34+
import static org.mockito.Mockito.when;
3235

3336
@ExtendWith(DependencyInjectionExtension.class)
3437
class DspCatalogApiExtensionTest {
3538

3639
private final JsonObjectValidatorRegistry validatorRegistry = mock();
3740
private final ProtocolVersionRegistry versionRegistry = mock();
41+
private final DspProtocolTypeTransformerRegistry dspTransformerRegistry = mock();
3842

3943
@BeforeEach
4044
void setUp(ServiceExtensionContext context) {
4145
context.registerService(JsonObjectValidatorRegistry.class, validatorRegistry);
4246
context.registerService(ProtocolVersionRegistry.class, versionRegistry);
47+
context.registerService(DspProtocolTypeTransformerRegistry.class, dspTransformerRegistry);
48+
49+
when(dspTransformerRegistry.forProtocol(any())).thenReturn(Result.success(mock()));
4350
}
4451

4552
@Test
@@ -53,6 +60,7 @@ void shouldRegisterMessageValidator(DspCatalogApiExtension extension, ServiceExt
5360
void shouldRegisterDspVersion(DspCatalogApiExtension extension, ServiceExtensionContext context) {
5461
extension.initialize(context);
5562

56-
verify(versionRegistry).register(isA(ProtocolVersion.class));
63+
verify(versionRegistry).register(V_08);
64+
verify(versionRegistry).register(V_2024_1);
5765
}
5866
}

data-protocols/dsp/dsp-catalog/dsp-catalog-http-dispatcher/src/main/java/org/eclipse/edc/protocol/dsp/catalog/http/dispatcher/DspCatalogHttpDispatcherExtension.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.eclipse.edc.protocol.dsp.catalog.http.dispatcher.delegate.ByteArrayBodyExtractor;
2020
import org.eclipse.edc.protocol.dsp.http.dispatcher.GetDspHttpRequestFactory;
2121
import org.eclipse.edc.protocol.dsp.http.dispatcher.PostDspHttpRequestFactory;
22+
import org.eclipse.edc.protocol.dsp.http.spi.DspProtocolParser;
2223
import org.eclipse.edc.protocol.dsp.http.spi.dispatcher.DspHttpRemoteMessageDispatcher;
2324
import org.eclipse.edc.protocol.dsp.http.spi.serialization.JsonLdRemoteMessageSerializer;
2425
import org.eclipse.edc.runtime.metamodel.annotation.Extension;
@@ -43,6 +44,8 @@ public class DspCatalogHttpDispatcherExtension implements ServiceExtension {
4344
private DspHttpRemoteMessageDispatcher messageDispatcher;
4445
@Inject
4546
private JsonLdRemoteMessageSerializer remoteMessageSerializer;
47+
@Inject
48+
private DspProtocolParser dspProtocolParser;
4649

4750
@Override
4851
public String name() {
@@ -55,12 +58,12 @@ public void initialize(ServiceExtensionContext context) {
5558

5659
messageDispatcher.registerMessage(
5760
CatalogRequestMessage.class,
58-
new PostDspHttpRequestFactory<>(remoteMessageSerializer, m -> BASE_PATH + CATALOG_REQUEST),
61+
new PostDspHttpRequestFactory<>(remoteMessageSerializer, dspProtocolParser, m -> BASE_PATH + CATALOG_REQUEST),
5962
byteArrayBodyExtractor
6063
);
6164
messageDispatcher.registerMessage(
6265
DatasetRequestMessage.class,
63-
new GetDspHttpRequestFactory<>(m -> BASE_PATH + DATASET_REQUEST + "/" + m.getDatasetId()),
66+
new GetDspHttpRequestFactory<>(dspProtocolParser, m -> BASE_PATH + DATASET_REQUEST + "/" + m.getDatasetId()),
6467
byteArrayBodyExtractor
6568
);
6669
}

data-protocols/dsp/dsp-catalog/dsp-catalog-http-dispatcher/src/main/java/org/eclipse/edc/protocol/dsp/catalog/http/dispatcher/delegate/ByteArrayBodyExtractor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
*/
2626
public class ByteArrayBodyExtractor implements DspHttpResponseBodyExtractor<byte[]> {
2727
@Override
28-
public byte[] extractBody(ResponseBody responseBody) {
28+
public byte[] extractBody(ResponseBody responseBody, String protocol) {
2929
try {
3030
if (responseBody == null) {
3131
return null;

data-protocols/dsp/dsp-catalog/dsp-catalog-http-dispatcher/src/test/java/org/eclipse/edc/protocol/dsp/catalog/http/dispatcher/delegate/ByteArrayBodyExtractorTest.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ void shouldReturnBodyAsBytes() throws IOException {
3535
var bytes = "test".getBytes();
3636
when(responseBody.bytes()).thenReturn(bytes);
3737

38-
var result = extractor.extractBody(responseBody);
38+
var result = extractor.extractBody(responseBody, "protocol");
3939

4040
assertThat(result).isEqualTo(bytes);
4141
}
4242

4343
@Test
4444
void shouldReturnNull_whenBodyIsNull() {
45-
var result = extractor.extractBody(null);
45+
var result = extractor.extractBody(null, "protocol");
4646

4747
assertThat(result).isNull();
4848
}
@@ -52,7 +52,7 @@ void shouldThrowException_whenCannotExtractBytes() throws IOException {
5252
var responseBody = mock(ResponseBody.class);
5353
when(responseBody.bytes()).thenThrow(new IOException());
5454

55-
assertThatThrownBy(() -> extractor.extractBody(responseBody)).isInstanceOf(EdcException.class);
55+
assertThatThrownBy(() -> extractor.extractBody(responseBody, "protocol")).isInstanceOf(EdcException.class);
5656
}
5757

5858
}

data-protocols/dsp/dsp-catalog/dsp-catalog-transform/src/main/java/org/eclipse/edc/protocol/dsp/catalog/transform/DspCatalogTransformExtension.java

+12-3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
package org.eclipse.edc.protocol.dsp.catalog.transform;
1616

17+
import com.fasterxml.jackson.databind.ObjectMapper;
1718
import jakarta.json.Json;
1819
import org.eclipse.edc.protocol.dsp.catalog.transform.from.JsonObjectFromCatalogRequestMessageTransformer;
1920
import org.eclipse.edc.protocol.dsp.catalog.transform.from.JsonObjectFromCatalogTransformer;
@@ -31,6 +32,8 @@
3132

3233
import java.util.Map;
3334

35+
import static org.eclipse.edc.protocol.dsp.spi.type.DspConstants.DSP_TRANSFORMER_CONTEXT_V_08;
36+
import static org.eclipse.edc.protocol.dsp.spi.type.DspConstants.DSP_TRANSFORMER_CONTEXT_V_2024_1;
3437
import static org.eclipse.edc.spi.constants.CoreConstants.JSON_LD;
3538

3639
/**
@@ -57,10 +60,16 @@ public String name() {
5760

5861
@Override
5962
public void initialize(ServiceExtensionContext context) {
60-
var jsonFactory = Json.createBuilderFactory(Map.of());
6163
var mapper = typeManager.getMapper(JSON_LD);
6264

63-
var dspApiTransformerRegistry = registry.forContext("dsp-api");
65+
registerTransformers(DSP_TRANSFORMER_CONTEXT_V_08, mapper);
66+
registerTransformers(DSP_TRANSFORMER_CONTEXT_V_2024_1, mapper);
67+
}
68+
69+
private void registerTransformers(String version, ObjectMapper mapper) {
70+
var jsonFactory = Json.createBuilderFactory(Map.of());
71+
72+
var dspApiTransformerRegistry = registry.forContext(version);
6473
dspApiTransformerRegistry.register(new JsonObjectFromCatalogRequestMessageTransformer(jsonFactory));
6574
dspApiTransformerRegistry.register(new JsonObjectToCatalogRequestMessageTransformer());
6675

@@ -69,4 +78,4 @@ public void initialize(ServiceExtensionContext context) {
6978
dspApiTransformerRegistry.register(new JsonObjectFromDistributionTransformer(jsonFactory));
7079
dspApiTransformerRegistry.register(new JsonObjectFromDataServiceTransformer(jsonFactory));
7180
}
72-
}
81+
}

data-protocols/dsp/dsp-http-api-configuration/src/main/java/org/eclipse/edc/protocol/dsp/http/api/configuration/DspApiConfigurationExtension.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
package org.eclipse.edc.protocol.dsp.http.api.configuration;
1616

17+
import com.fasterxml.jackson.databind.ObjectMapper;
1718
import jakarta.json.Json;
1819
import org.eclipse.edc.connector.controlplane.transform.edc.from.JsonObjectFromAssetTransformer;
1920
import org.eclipse.edc.connector.controlplane.transform.edc.to.JsonObjectToAssetTransformer;
@@ -62,6 +63,8 @@
6263
import static org.eclipse.edc.policy.model.OdrlNamespace.ODRL_PREFIX;
6364
import static org.eclipse.edc.policy.model.OdrlNamespace.ODRL_SCHEMA;
6465
import static org.eclipse.edc.protocol.dsp.spi.type.DspConstants.DSP_SCOPE;
66+
import static org.eclipse.edc.protocol.dsp.spi.type.DspConstants.DSP_TRANSFORMER_CONTEXT_V_08;
67+
import static org.eclipse.edc.protocol.dsp.spi.type.DspConstants.DSP_TRANSFORMER_CONTEXT_V_2024_1;
6568
import static org.eclipse.edc.spi.constants.CoreConstants.EDC_NAMESPACE;
6669
import static org.eclipse.edc.spi.constants.CoreConstants.EDC_PREFIX;
6770
import static org.eclipse.edc.spi.constants.CoreConstants.JSON_LD;
@@ -132,17 +135,18 @@ public void initialize(ServiceExtensionContext context) {
132135
webService.registerResource(ApiContext.PROTOCOL, new ObjectMapperProvider(jsonLdMapper));
133136
webService.registerResource(ApiContext.PROTOCOL, new JerseyJsonLdInterceptor(jsonLd, jsonLdMapper, DSP_SCOPE));
134137

135-
registerTransformers();
136-
}
137-
138-
private void registerTransformers() {
139138
var mapper = typeManager.getMapper(JSON_LD);
140139
mapper.registerSubtypes(AtomicConstraint.class, LiteralExpression.class);
141140

141+
registerTransformers(DSP_TRANSFORMER_CONTEXT_V_08, mapper);
142+
registerTransformers(DSP_TRANSFORMER_CONTEXT_V_2024_1, mapper);
143+
}
144+
145+
private void registerTransformers(String version, ObjectMapper mapper) {
142146
var jsonBuilderFactory = Json.createBuilderFactory(Map.of());
143147

144148
// EDC model to JSON-LD transformers
145-
var dspApiTransformerRegistry = transformerRegistry.forContext("dsp-api");
149+
var dspApiTransformerRegistry = transformerRegistry.forContext(version);
146150
dspApiTransformerRegistry.register(new JsonObjectFromPolicyTransformer(jsonBuilderFactory, participantIdMapper));
147151
dspApiTransformerRegistry.register(new JsonObjectFromAssetTransformer(jsonBuilderFactory, mapper));
148152
dspApiTransformerRegistry.register(new JsonObjectFromDataAddressDspaceTransformer(jsonBuilderFactory, mapper));

0 commit comments

Comments
 (0)