Skip to content

Commit 8f43ec8

Browse files
authored
refactor: introduced message classes for errors (#4540)
* refactor: introduced message classes for errors * pr suggestions
1 parent d2ebfcc commit 8f43ec8

File tree

38 files changed

+1336
-411
lines changed

38 files changed

+1336
-411
lines changed

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import jakarta.ws.rs.core.Response;
2929
import jakarta.ws.rs.core.UriInfo;
3030
import org.eclipse.edc.connector.controlplane.catalog.spi.Catalog;
31+
import org.eclipse.edc.connector.controlplane.catalog.spi.CatalogError;
3132
import org.eclipse.edc.connector.controlplane.catalog.spi.CatalogRequestMessage;
3233
import org.eclipse.edc.connector.controlplane.catalog.spi.Dataset;
3334
import org.eclipse.edc.connector.controlplane.services.spi.catalog.CatalogProtocolService;
@@ -42,7 +43,6 @@
4243
import static org.eclipse.edc.protocol.dsp.catalog.http.api.CatalogApiPaths.CATALOG_REQUEST;
4344
import static org.eclipse.edc.protocol.dsp.catalog.http.api.CatalogApiPaths.DATASET_REQUEST;
4445
import static org.eclipse.edc.protocol.dsp.http.spi.types.HttpMessageProtocol.DATASPACE_PROTOCOL_HTTP;
45-
import static org.eclipse.edc.protocol.dsp.spi.type.DspCatalogPropertyAndTypeNames.DSPACE_TYPE_CATALOG_ERROR;
4646
import static org.eclipse.edc.protocol.dsp.spi.type.DspCatalogPropertyAndTypeNames.DSPACE_TYPE_CATALOG_REQUEST_MESSAGE;
4747

4848
/**
@@ -81,12 +81,12 @@ public Response requestCatalog(JsonObject jsonObject, @HeaderParam(AUTHORIZATION
8181
.orElseThrow(f -> new BadRequestException(f.getFailureDetail()));
8282
}
8383

84-
var request = PostDspRequest.Builder.newInstance(CatalogRequestMessage.class, Catalog.class)
84+
var request = PostDspRequest.Builder.newInstance(CatalogRequestMessage.class, Catalog.class, CatalogError.class)
8585
.token(token)
8686
.expectedMessageType(DSPACE_TYPE_CATALOG_REQUEST_MESSAGE)
8787
.message(messageJson)
8888
.serviceCall(service::getCatalog)
89-
.errorType(DSPACE_TYPE_CATALOG_ERROR)
89+
.errorProvider(CatalogError.Builder::newInstance)
9090
.protocol(protocol)
9191
.build();
9292

@@ -97,11 +97,11 @@ public Response requestCatalog(JsonObject jsonObject, @HeaderParam(AUTHORIZATION
9797
@GET
9898
@Path(DATASET_REQUEST + "/{id}")
9999
public Response getDataset(@PathParam("id") String id, @HeaderParam(AUTHORIZATION) String token) {
100-
var request = GetDspRequest.Builder.newInstance(Dataset.class)
100+
var request = GetDspRequest.Builder.newInstance(Dataset.class, CatalogError.class)
101101
.token(token)
102102
.id(id)
103103
.serviceCall(service::getDataset)
104-
.errorType(DSPACE_TYPE_CATALOG_ERROR)
104+
.errorProvider(CatalogError.Builder::newInstance)
105105
.protocol(protocol)
106106
.build();
107107

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

+31-32
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,37 @@ class DspCatalogApiControllerTest extends RestControllerTestBase {
6464
private final DspRequestHandler dspRequestHandler = mock();
6565
private final ContinuationTokenManager continuationTokenManager = mock();
6666

67+
@Test
68+
void getDataset_shouldGetResource() {
69+
when(dspRequestHandler.getResource(any())).thenReturn(Response.ok().type(APPLICATION_JSON).build());
70+
71+
baseRequest()
72+
.get(DATASET_REQUEST + "/datasetId")
73+
.then()
74+
.statusCode(200)
75+
.contentType(JSON);
76+
77+
var captor = ArgumentCaptor.forClass(GetDspRequest.class);
78+
verify(dspRequestHandler).getResource(captor.capture());
79+
var request = captor.getValue();
80+
assertThat(request.getToken()).isEqualTo("auth");
81+
assertThat(request.getResultClass()).isEqualTo(Dataset.class);
82+
assertThat(request.getId()).isEqualTo("datasetId");
83+
}
84+
85+
@Override
86+
protected Object controller() {
87+
return new DspCatalogApiController(service, dspRequestHandler, continuationTokenManager);
88+
}
89+
90+
private RequestSpecification baseRequest() {
91+
return given()
92+
.baseUri("http://localhost:" + port)
93+
.basePath(BASE_PATH)
94+
.header(HttpHeaders.AUTHORIZATION, "auth")
95+
.when();
96+
}
97+
6798
@Nested
6899
class RequestCatalog {
69100

@@ -136,36 +167,4 @@ void shouldReturnBadRequest_whenContinuationTokenIsNotValid() {
136167
}
137168
}
138169

139-
@Test
140-
void getDataset_shouldGetResource() {
141-
when(dspRequestHandler.getResource(any())).thenReturn(Response.ok().type(APPLICATION_JSON).build());
142-
143-
baseRequest()
144-
.get(DATASET_REQUEST + "/datasetId")
145-
.then()
146-
.statusCode(200)
147-
.contentType(JSON);
148-
149-
var captor = ArgumentCaptor.forClass(GetDspRequest.class);
150-
verify(dspRequestHandler).getResource(captor.capture());
151-
var request = captor.getValue();
152-
assertThat(request.getToken()).isEqualTo("auth");
153-
assertThat(request.getResultClass()).isEqualTo(Dataset.class);
154-
assertThat(request.getId()).isEqualTo("datasetId");
155-
assertThat(request.getErrorType()).isNotNull();
156-
}
157-
158-
@Override
159-
protected Object controller() {
160-
return new DspCatalogApiController(service, dspRequestHandler, continuationTokenManager);
161-
}
162-
163-
private RequestSpecification baseRequest() {
164-
return given()
165-
.baseUri("http://localhost:" + port)
166-
.basePath(BASE_PATH)
167-
.header(HttpHeaders.AUTHORIZATION, "auth")
168-
.when();
169-
}
170-
171170
}

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

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import com.fasterxml.jackson.databind.ObjectMapper;
1818
import jakarta.json.Json;
19+
import org.eclipse.edc.protocol.dsp.catalog.transform.from.JsonObjectFromCatalogErrorTransformer;
1920
import org.eclipse.edc.protocol.dsp.catalog.transform.from.JsonObjectFromCatalogRequestMessageTransformer;
2021
import org.eclipse.edc.protocol.dsp.catalog.transform.from.JsonObjectFromCatalogTransformer;
2122
import org.eclipse.edc.protocol.dsp.catalog.transform.from.JsonObjectFromDataServiceTransformer;
@@ -77,5 +78,6 @@ private void registerTransformers(String version, ObjectMapper mapper) {
7778
dspApiTransformerRegistry.register(new JsonObjectFromDatasetTransformer(jsonFactory, mapper));
7879
dspApiTransformerRegistry.register(new JsonObjectFromDistributionTransformer(jsonFactory));
7980
dspApiTransformerRegistry.register(new JsonObjectFromDataServiceTransformer(jsonFactory));
81+
dspApiTransformerRegistry.register(new JsonObjectFromCatalogErrorTransformer(jsonFactory));
8082
}
8183
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Copyright (c) 2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation
12+
*
13+
*/
14+
15+
package org.eclipse.edc.protocol.dsp.catalog.transform.from;
16+
17+
import jakarta.json.JsonBuilderFactory;
18+
import jakarta.json.JsonObject;
19+
import org.eclipse.edc.connector.controlplane.catalog.spi.CatalogError;
20+
import org.eclipse.edc.jsonld.spi.transformer.AbstractJsonLdTransformer;
21+
import org.eclipse.edc.transform.spi.TransformerContext;
22+
import org.jetbrains.annotations.NotNull;
23+
import org.jetbrains.annotations.Nullable;
24+
25+
import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE;
26+
import static org.eclipse.edc.protocol.dsp.spi.type.DspCatalogPropertyAndTypeNames.DSPACE_TYPE_CATALOG_ERROR;
27+
import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CODE;
28+
import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_REASON;
29+
30+
/**
31+
* Transforms a {@link CatalogError} to a {@link JsonObject} in JSON-LD expanded form.
32+
*/
33+
public class JsonObjectFromCatalogErrorTransformer extends AbstractJsonLdTransformer<CatalogError, JsonObject> {
34+
35+
private final JsonBuilderFactory jsonFactory;
36+
37+
public JsonObjectFromCatalogErrorTransformer(JsonBuilderFactory jsonFactory) {
38+
super(CatalogError.class, JsonObject.class);
39+
this.jsonFactory = jsonFactory;
40+
}
41+
42+
@Override
43+
public @Nullable JsonObject transform(@NotNull CatalogError error, @NotNull TransformerContext context) {
44+
return jsonFactory.createObjectBuilder()
45+
.add(TYPE, DSPACE_TYPE_CATALOG_ERROR)
46+
.add(DSPACE_PROPERTY_CODE, error.getCode())
47+
.add(DSPACE_PROPERTY_REASON, jsonFactory.createArrayBuilder(error.getMessages()))
48+
.build();
49+
}
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright (c) 2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation
12+
*
13+
*/
14+
15+
package org.eclipse.edc.protocol.dsp.catalog.transform.from;
16+
17+
import jakarta.json.Json;
18+
import jakarta.json.JsonBuilderFactory;
19+
import org.eclipse.edc.connector.controlplane.catalog.spi.CatalogError;
20+
import org.eclipse.edc.transform.spi.TransformerContext;
21+
import org.junit.jupiter.api.BeforeEach;
22+
import org.junit.jupiter.api.Test;
23+
24+
import java.util.List;
25+
import java.util.Map;
26+
27+
import static org.assertj.core.api.Assertions.assertThat;
28+
import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE;
29+
import static org.eclipse.edc.protocol.dsp.spi.type.DspCatalogPropertyAndTypeNames.DSPACE_TYPE_CATALOG_ERROR;
30+
import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_CODE;
31+
import static org.eclipse.edc.protocol.dsp.spi.type.DspPropertyAndTypeNames.DSPACE_PROPERTY_REASON;
32+
import static org.mockito.Mockito.mock;
33+
34+
class JsonObjectFromCatalogErrorTransformerTest {
35+
36+
private final JsonBuilderFactory jsonFactory = Json.createBuilderFactory(Map.of());
37+
private final TransformerContext context = mock(TransformerContext.class);
38+
39+
private JsonObjectFromCatalogErrorTransformer transformer;
40+
41+
@BeforeEach
42+
void setUp() {
43+
transformer = new JsonObjectFromCatalogErrorTransformer(jsonFactory);
44+
}
45+
46+
@Test
47+
void transform_returnJsonObject() {
48+
49+
var error = CatalogError.Builder.newInstance()
50+
.code("code")
51+
.messages(List.of("message"))
52+
.build();
53+
54+
var result = transformer.transform(error, context);
55+
56+
assertThat(result).isNotNull();
57+
assertThat(result.getJsonString(TYPE).getString()).isEqualTo(DSPACE_TYPE_CATALOG_ERROR);
58+
assertThat(result.getString(DSPACE_PROPERTY_CODE)).isEqualTo("code");
59+
assertThat(result.getJsonArray(DSPACE_PROPERTY_REASON)).contains(Json.createValue("message"));
60+
}
61+
}

0 commit comments

Comments
 (0)