Skip to content

Commit 173d0f3

Browse files
fix: avoid exception DSP Request Action (#252)
* fix: avoid exception DSP Request Action * DEPENDENCIES
1 parent e733355 commit 173d0f3

File tree

6 files changed

+227
-74
lines changed

6 files changed

+227
-74
lines changed

DEPENDENCIES

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ maven/mavencentral/com.fasterxml.jackson.core/jackson-annotations/2.16.2, Apache
1111
maven/mavencentral/com.fasterxml.jackson.core/jackson-annotations/2.17.1, Apache-2.0, approved, #13672
1212
maven/mavencentral/com.fasterxml.jackson.core/jackson-annotations/2.17.2, Apache-2.0, approved, #13672
1313
maven/mavencentral/com.fasterxml.jackson.core/jackson-core/2.16.2, Apache-2.0 AND MIT, approved, #11602
14-
maven/mavencentral/com.fasterxml.jackson.core/jackson-core/2.17.2, , approved, #13665
14+
maven/mavencentral/com.fasterxml.jackson.core/jackson-core/2.17.2, Apache-2.0 AND MIT, approved, #13665
1515
maven/mavencentral/com.fasterxml.jackson.core/jackson-databind/2.16.2, Apache-2.0, approved, #11605
1616
maven/mavencentral/com.fasterxml.jackson.core/jackson-databind/2.17.1, Apache-2.0, approved, #13671
1717
maven/mavencentral/com.fasterxml.jackson.core/jackson-databind/2.17.2, Apache-2.0, approved, #13671
@@ -36,11 +36,12 @@ maven/mavencentral/com.google.crypto.tink/tink/1.15.0, Apache-2.0, approved, cle
3636
maven/mavencentral/com.google.errorprone/error_prone_annotations/2.22.0, Apache-2.0, approved, #10661
3737
maven/mavencentral/com.google.errorprone/error_prone_annotations/2.28.0, Apache-2.0, approved, #15107
3838
maven/mavencentral/com.google.guava/failureaccess/1.0.2, Apache-2.0, approved, CQ22654
39-
maven/mavencentral/com.google.guava/guava/33.3.0-jre, Apache-2.0 AND CC0-1.0 AND (Apache-2.0 AND CC-PDDC) AND (Apache-2.0 AND CC0-1.0), approved, #15952
39+
maven/mavencentral/com.google.guava/guava/33.3.1-jre, Apache-2.0 AND CC0-1.0 AND (Apache-2.0 AND CC-PDDC) AND (Apache-2.0 AND CC0-1.0), approved, #15952
4040
maven/mavencentral/com.google.guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava, Apache-2.0, approved, CQ22657
41+
maven/mavencentral/com.google.j2objc/j2objc-annotations/3.0.0, Apache-2.0, approved, #13676
4142
maven/mavencentral/com.google.protobuf/protobuf-java/3.25.3, BSD-3-Clause, approved, clearlydefined
4243
maven/mavencentral/com.nimbusds/nimbus-jose-jwt/9.41.1, Apache-2.0, approved, clearlydefined
43-
maven/mavencentral/com.puppycrawl.tools/checkstyle/10.18.1, LGPL-2.1-or-later AND (Apache-2.0 AND LGPL-2.1-or-later) AND Apache-2.0, approved, #16060
44+
maven/mavencentral/com.puppycrawl.tools/checkstyle/10.18.2, LGPL-2.1-or-later AND (Apache-2.0 AND LGPL-2.1-or-later) AND Apache-2.0, approved, #16060
4445
maven/mavencentral/com.squareup.okhttp3/okhttp-dnsoverhttps/4.12.0, Apache-2.0, approved, #11159
4546
maven/mavencentral/com.squareup.okhttp3/okhttp/4.12.0, Apache-2.0, approved, #15227
4647
maven/mavencentral/com.squareup.okhttp3/okhttp/4.9.3, Apache-2.0 AND MPL-2.0, approved, #3225
@@ -65,7 +66,7 @@ maven/mavencentral/io.rest-assured/rest-assured/5.5.0, Apache-2.0, approved, #15
6566
maven/mavencentral/io.rest-assured/xml-path/5.5.0, Apache-2.0, approved, clearlydefined
6667
maven/mavencentral/io.setl/rdf-urdna/1.1, Apache-2.0, approved, clearlydefined
6768
maven/mavencentral/io.swagger.core.v3/swagger-annotations-jakarta/2.2.22, Apache-2.0, approved, #5947
68-
maven/mavencentral/io.swagger.core.v3/swagger-annotations-jakarta/2.2.23, Apache-2.0, approved, #5947
69+
maven/mavencentral/io.swagger.core.v3/swagger-annotations-jakarta/2.2.24, Apache-2.0, approved, #5947
6970
maven/mavencentral/io.swagger.core.v3/swagger-annotations/2.2.22, Apache-2.0, approved, #11362
7071
maven/mavencentral/io.swagger.core.v3/swagger-core-jakarta/2.2.22, Apache-2.0, approved, #5929
7172
maven/mavencentral/io.swagger.core.v3/swagger-core/2.2.22, Apache-2.0, approved, #9265
@@ -92,12 +93,12 @@ maven/mavencentral/javax.servlet/javax.servlet-api/3.1.0, (CDDL-1.1 OR GPL-2.0-o
9293
maven/mavencentral/javax.ws.rs/javax.ws.rs-api/2.1, (CDDL-1.1 OR GPL-2.0 WITH Classpath-exception-2.0) AND Apache-2.0, approved, CQ18121
9394
maven/mavencentral/junit/junit/4.13.2, EPL-2.0, approved, CQ23636
9495
maven/mavencentral/net.bytebuddy/byte-buddy-agent/1.14.1, Apache-2.0, approved, #7164
95-
maven/mavencentral/net.bytebuddy/byte-buddy-agent/1.15.0, Apache-2.0, approved, #16009
96+
maven/mavencentral/net.bytebuddy/byte-buddy-agent/1.15.2, Apache-2.0, approved, #16009
9697
maven/mavencentral/net.bytebuddy/byte-buddy/1.14.1, Apache-2.0 AND BSD-3-Clause, approved, #7163
9798
maven/mavencentral/net.bytebuddy/byte-buddy/1.14.18, Apache-2.0 AND BSD-3-Clause, approved, #7163
98-
maven/mavencentral/net.bytebuddy/byte-buddy/1.15.0, Apache-2.0 AND BSD-3-Clause, approved, #16008
99+
maven/mavencentral/net.bytebuddy/byte-buddy/1.15.2, Apache-2.0 AND BSD-3-Clause, approved, #16008
99100
maven/mavencentral/net.java.dev.jna/jna/5.13.0, Apache-2.0 AND LGPL-2.1-or-later, approved, #15196
100-
maven/mavencentral/net.sf.saxon/Saxon-HE/12.5, MPL-2.0-no-copyleft-exception AND (LicenseRef-scancode-proprietary-license AND MPL-2.0-no-copyleft-exception) AND (MPL-2.0-no-copyleft-exception AND X11) AND (MIT AND MPL-2.0-no-copyleft-exception) AND (MPL-1.0 AND MPL-2.0-no-copyleft-exception) AND (Apache-2.0 AND MPL-2.0-no-copyleft-exception) AND MPL-1.0, restricted, #16061
101+
maven/mavencentral/net.sf.saxon/Saxon-HE/12.5, W3C-19980720 AND MPL-2.0 AND MPL-1.0, approved, #16061
101102
maven/mavencentral/org.antlr/antlr4-runtime/4.13.2, BSD-3-Clause, approved, #10767
102103
maven/mavencentral/org.apache.commons/commons-compress/1.24.0, Apache-2.0 AND BSD-3-Clause AND bzip2-1.0.6 AND LicenseRef-Public-Domain, approved, #10368
103104
maven/mavencentral/org.apache.commons/commons-lang3/3.11, Apache-2.0, approved, CQ22642
@@ -130,7 +131,7 @@ maven/mavencentral/org.bouncycastle/bcprov-jdk18on/1.78.1, MIT AND CC0-1.0, appr
130131
maven/mavencentral/org.bouncycastle/bcutil-jdk18on/1.78.1, MIT, approved, #14435
131132
maven/mavencentral/org.ccil.cowan.tagsoup/tagsoup/1.2.1, Apache-2.0, approved, clearlydefined
132133
maven/mavencentral/org.checkerframework/checker-qual/3.42.0, MIT, approved, clearlydefined
133-
maven/mavencentral/org.checkerframework/checker-qual/3.46.0, MIT, approved, clearlydefined
134+
maven/mavencentral/org.checkerframework/checker-qual/3.47.0, MIT, approved, clearlydefined
134135
maven/mavencentral/org.codehaus.plexus/plexus-classworlds/2.6.0, Apache-2.0 AND Plexus, approved, CQ22821
135136
maven/mavencentral/org.codehaus.plexus/plexus-component-annotations/2.1.0, Apache-2.0, approved, #809
136137
maven/mavencentral/org.codehaus.plexus/plexus-container-default/2.1.0, Apache-2.0, approved, clearlydefined
@@ -141,6 +142,7 @@ maven/mavencentral/org.eclipse.edc/api-observability/0.10.0-SNAPSHOT, Apache-2.0
141142
maven/mavencentral/org.eclipse.edc/asset-api/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
142143
maven/mavencentral/org.eclipse.edc/asset-spi/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
143144
maven/mavencentral/org.eclipse.edc/auth-spi/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
145+
maven/mavencentral/org.eclipse.edc/auth-tokenbased/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
144146
maven/mavencentral/org.eclipse.edc/autodoc-processor/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
145147
maven/mavencentral/org.eclipse.edc/boot-lib/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
146148
maven/mavencentral/org.eclipse.edc/boot-spi/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
@@ -197,6 +199,7 @@ maven/mavencentral/org.eclipse.edc/identity-trust-core/0.10.0-SNAPSHOT, Apache-2
197199
maven/mavencentral/org.eclipse.edc/identity-trust-issuers-configuration/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
198200
maven/mavencentral/org.eclipse.edc/identity-trust-service/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
199201
maven/mavencentral/org.eclipse.edc/identity-trust-spi/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
202+
maven/mavencentral/org.eclipse.edc/identity-trust-sts-accounts-api/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
200203
maven/mavencentral/org.eclipse.edc/identity-trust-sts-api/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
201204
maven/mavencentral/org.eclipse.edc/identity-trust-sts-client-configuration/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
202205
maven/mavencentral/org.eclipse.edc/identity-trust-sts-core/0.10.0-SNAPSHOT, Apache-2.0, approved, technology.edc
@@ -306,15 +309,18 @@ maven/mavencentral/org.jetbrains.kotlin/kotlin-stdlib-jdk8/1.9.10, Apache-2.0, a
306309
maven/mavencentral/org.jetbrains.kotlin/kotlin-stdlib/1.9.10, Apache-2.0, approved, #11827
307310
maven/mavencentral/org.jetbrains/annotations/13.0, Apache-2.0, approved, clearlydefined
308311
maven/mavencentral/org.jetbrains/annotations/17.0.0, Apache-2.0, approved, clearlydefined
309-
maven/mavencentral/org.jetbrains/annotations/24.1.0, Apache-2.0, approved, clearlydefined
312+
maven/mavencentral/org.jetbrains/annotations/25.0.0, , restricted, clearlydefined
310313
maven/mavencentral/org.junit.jupiter/junit-jupiter-api/5.11.0, EPL-2.0, approved, #15935
311-
maven/mavencentral/org.junit.jupiter/junit-jupiter-engine/5.11.0, EPL-2.0, approved, #15939
312-
maven/mavencentral/org.junit.jupiter/junit-jupiter-params/5.11.0, EPL-2.0, approved, #15940
314+
maven/mavencentral/org.junit.jupiter/junit-jupiter-api/5.11.1, EPL-2.0, approved, #15935
315+
maven/mavencentral/org.junit.jupiter/junit-jupiter-engine/5.11.1, EPL-2.0, approved, #15939
316+
maven/mavencentral/org.junit.jupiter/junit-jupiter-params/5.11.1, EPL-2.0, approved, #15940
313317
maven/mavencentral/org.junit.platform/junit-platform-commons/1.11.0, EPL-2.0, approved, #15936
314-
maven/mavencentral/org.junit.platform/junit-platform-engine/1.11.0, EPL-2.0, approved, #15932
318+
maven/mavencentral/org.junit.platform/junit-platform-commons/1.11.1, EPL-2.0, approved, #15936
319+
maven/mavencentral/org.junit.platform/junit-platform-engine/1.11.1, EPL-2.0, approved, #15932
315320
maven/mavencentral/org.junit/junit-bom/5.11.0, EPL-2.0, approved, #16062
321+
maven/mavencentral/org.junit/junit-bom/5.11.1, EPL-2.0, approved, #16062
316322
maven/mavencentral/org.jvnet.mimepull/mimepull/1.9.15, CDDL-1.1 OR GPL-2.0-only WITH Classpath-exception-2.0, approved, CQ21484
317-
maven/mavencentral/org.mockito/mockito-core/5.13.0, MIT, approved, clearlydefined
323+
maven/mavencentral/org.mockito/mockito-core/5.14.0, MIT AND (Apache-2.0 AND MIT) AND Apache-2.0, approved, #16375
318324
maven/mavencentral/org.mockito/mockito-core/5.2.0, MIT AND (Apache-2.0 AND MIT) AND Apache-2.0, approved, #7401
319325
maven/mavencentral/org.objenesis/objenesis/3.3, Apache-2.0, approved, clearlydefined
320326
maven/mavencentral/org.opentest4j/opentest4j/1.3.0, Apache-2.0, approved, #9713

core/federated-catalog-core/build.gradle.kts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,16 @@ dependencies {
3737
implementation(libs.edc.json.ld.lib)
3838
implementation(libs.edc.lib.store)
3939

40-
// required for integration test
41-
testImplementation(libs.edc.dsp.transform.catalog)
4240
testImplementation(libs.edc.junit)
4341
testImplementation(libs.edc.ext.http)
4442
testImplementation(libs.awaitility)
4543

4644
testImplementation(testFixtures(project(":spi:federated-catalog-spi")))
4745
testImplementation(testFixtures(project(":spi:crawler-spi")))
46+
47+
// required for integration test
48+
testFixturesImplementation(libs.edc.core.connector)
49+
testFixturesImplementation(libs.edc.dsp.transform.catalog)
50+
testFixturesImplementation(libs.edc.json.ld.lib)
51+
testFixturesImplementation(libs.edc.controlplane.transform)
4852
}

core/federated-catalog-core/src/main/java/org/eclipse/edc/catalog/cache/query/DspCatalogRequestAction.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,9 @@ private CompletableFuture<Catalog> expandCatalog(Catalog rootCatalog) {
9999
.map(ur -> (CatalogUpdateResponse) ur)
100100
.map(CatalogUpdateResponse::getCatalog);
101101

102-
var datasets = new ArrayList<>(partitions.get(Dataset.class));
102+
var datasets = ofNullable(partitions.get(Dataset.class))
103+
.map(ds -> new ArrayList<>(ds))
104+
.orElseGet(ArrayList::new);
103105
expandedSubCatalogs.forEach(datasets::add);
104106
return completedFuture(copy(rootCatalog, datasets).build());
105107

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
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.catalog.cache.query;
16+
17+
import com.fasterxml.jackson.core.JsonProcessingException;
18+
import com.fasterxml.jackson.databind.ObjectMapper;
19+
import jakarta.json.JsonObject;
20+
import org.eclipse.edc.catalog.spi.model.CatalogUpdateResponse;
21+
import org.eclipse.edc.connector.controlplane.catalog.spi.Catalog;
22+
import org.eclipse.edc.connector.controlplane.catalog.spi.CatalogRequestMessage;
23+
import org.eclipse.edc.crawler.spi.model.UpdateRequest;
24+
import org.eclipse.edc.jsonld.TitaniumJsonLd;
25+
import org.eclipse.edc.spi.message.RemoteMessageDispatcherRegistry;
26+
import org.eclipse.edc.spi.response.StatusResult;
27+
import org.eclipse.edc.transform.TypeTransformerRegistryImpl;
28+
import org.eclipse.edc.transform.spi.TypeTransformerRegistry;
29+
import org.junit.jupiter.api.BeforeEach;
30+
import org.junit.jupiter.api.Test;
31+
32+
import static java.util.concurrent.CompletableFuture.completedFuture;
33+
import static org.assertj.core.api.Assertions.assertThat;
34+
import static org.eclipse.edc.catalog.test.TestUtil.createCatalog;
35+
import static org.eclipse.edc.catalog.test.TestUtil.registerTransformers;
36+
import static org.eclipse.edc.jsonld.util.JacksonJsonLd.createObjectMapper;
37+
import static org.mockito.ArgumentMatchers.any;
38+
import static org.mockito.ArgumentMatchers.eq;
39+
import static org.mockito.Mockito.mock;
40+
import static org.mockito.Mockito.when;
41+
42+
class DspCatalogRequestActionTest {
43+
44+
private final RemoteMessageDispatcherRegistry dispatcherRegistry = mock();
45+
private final TypeTransformerRegistry typeTransformerRegistry = new TypeTransformerRegistryImpl();
46+
private final TitaniumJsonLd jsonLdService = new TitaniumJsonLd(mock());
47+
private final ObjectMapper objectMapper = createObjectMapper();
48+
private final DspCatalogRequestAction action = new DspCatalogRequestAction(dispatcherRegistry, mock(), objectMapper, typeTransformerRegistry, jsonLdService);
49+
50+
@BeforeEach
51+
void setup() {
52+
registerTransformers(typeTransformerRegistry);
53+
}
54+
55+
@Test
56+
void apply_withFlatCatalog() {
57+
var request = new UpdateRequest("test-node-id", "https://example.com/test-node-id");
58+
59+
var catalog = toBytes(createCatalog("test-catalog-id"));
60+
when(dispatcherRegistry.dispatch(eq(byte[].class), any(CatalogRequestMessage.class)))
61+
.thenReturn(completedFuture(catalog));
62+
63+
assertThat(action.apply(request)).isCompletedWithValueMatching(updateResponse -> {
64+
if (updateResponse instanceof CatalogUpdateResponse cr) {
65+
return cr.getCatalog() != null &&
66+
cr.getCatalog().getId().equals("test-catalog-id") &&
67+
cr.getSource().equals("https://example.com/test-node-id");
68+
}
69+
return false;
70+
});
71+
}
72+
73+
@Test
74+
void apply_withOnlyNestedCatalog() {
75+
var request = new UpdateRequest("test-node-id", "https://example.com/test-node-id");
76+
77+
var rootCatalog = createCatalog("root-catalog-id");
78+
rootCatalog.getDatasets().clear();
79+
var nestedCatalog = createCatalog("nested-catalog-id");
80+
rootCatalog.getDatasets().add(nestedCatalog);
81+
82+
when(dispatcherRegistry.dispatch(eq(byte[].class), any(CatalogRequestMessage.class)))
83+
.thenReturn(completedFuture(toBytes(rootCatalog)))
84+
.thenReturn(completedFuture(toBytes(nestedCatalog)));
85+
86+
assertThat(action.apply(request)).isCompletedWithValueMatching(updateResponse -> {
87+
if (updateResponse instanceof CatalogUpdateResponse cr) {
88+
return cr.getCatalog() != null &&
89+
cr.getCatalog().getId().equals("root-catalog-id") &&
90+
cr.getSource().equals("https://example.com/test-node-id") &&
91+
cr.getCatalog().getDatasets().stream().allMatch(dataset -> dataset.getId().equals("nested-catalog-id"));
92+
}
93+
return false;
94+
}, "Contains nested catalog datasets");
95+
}
96+
97+
@Test
98+
void apply_withRootDatasets_andNestedCatalog() {
99+
var request = new UpdateRequest("test-node-id", "https://example.com/test-node-id");
100+
101+
var rootCatalog = createCatalog("root-catalog-id");
102+
var nestedCatalog = createCatalog("nested-catalog-id");
103+
rootCatalog.getDatasets().add(nestedCatalog);
104+
105+
when(dispatcherRegistry.dispatch(eq(byte[].class), any(CatalogRequestMessage.class)))
106+
.thenReturn(completedFuture(toBytes(rootCatalog)))
107+
.thenReturn(completedFuture(toBytes(nestedCatalog)));
108+
109+
assertThat(action.apply(request)).isCompletedWithValueMatching(updateResponse -> {
110+
if (updateResponse instanceof CatalogUpdateResponse cr) {
111+
return cr.getCatalog() != null &&
112+
cr.getCatalog().getId().equals("root-catalog-id") &&
113+
cr.getSource().equals("https://example.com/test-node-id") &&
114+
cr.getCatalog().getDatasets().stream()
115+
.allMatch(dataset -> dataset.getId().equals("nested-catalog-id") ||
116+
dataset.getId().equals("root-catalog-id-dataset"));
117+
}
118+
return false;
119+
}, "Contains root catalog datasets plus nested catalog datasets");
120+
}
121+
122+
private StatusResult<byte[]> toBytes(Catalog catalog) {
123+
try {
124+
var jo = typeTransformerRegistry.transform(catalog, JsonObject.class).getContent();
125+
var expanded = jsonLdService.expand(jo).getContent();
126+
var expandedStr = objectMapper.writeValueAsString(expanded);
127+
return StatusResult.success(expandedStr.getBytes());
128+
} catch (JsonProcessingException e) {
129+
throw new RuntimeException(e);
130+
}
131+
}
132+
133+
}

0 commit comments

Comments
 (0)