Skip to content

Commit b2b3b38

Browse files
committed
Added support for samples and service datasets. Improve provider tests.
1 parent 4bd698c commit b2b3b38

6 files changed

Lines changed: 256 additions & 7 deletions

File tree

providers/provider/src/main/java/org/eclipse/edc/heleade/provider/extension/content/based/api/asset/AssetJsonObjectToCbmJsonObjectTransformer.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828

2929
import static org.eclipse.edc.connector.controlplane.asset.spi.domain.Asset.EDC_ASSET_TYPE;
3030
import static org.eclipse.edc.connector.controlplane.asset.spi.domain.Asset.PROPERTY_ID;
31+
import static org.eclipse.edc.heleade.commons.content.based.catalog.CbmConstants.CBM_IS_SAMPLE_OF;
32+
import static org.eclipse.edc.heleade.commons.content.based.catalog.CbmConstants.CBM_SAMPLE_TYPE;
3133
import static org.eclipse.edc.heleade.commons.content.based.catalog.CbmConstants.CBM_SCHEMA;
3234
import static org.eclipse.edc.jsonld.spi.Namespaces.DCAT_SCHEMA;
3335
import static org.eclipse.edc.jsonld.spi.Namespaces.DCT_SCHEMA;
@@ -89,8 +91,7 @@ public static JsonObject transformAssetToCbmJsonObject(String id, JsonObject jso
8991

9092
// Start building the Asset object
9193
var datasetBuilder = Json.createObjectBuilder()
92-
.add("@id", id)
93-
.add("@type", DCAT_DATASET_TYPE);
94+
.add("@id", id);
9495

9596
// Create already the distribution builder
9697
JsonArrayBuilder distributionArrayBuilder = Json.createArrayBuilder();
@@ -102,7 +103,14 @@ public static JsonObject transformAssetToCbmJsonObject(String id, JsonObject jso
102103
}
103104

104105
JsonObject properties = jsonObject.getJsonObject(EDC_NAMESPACE + "properties");
106+
// check if it is a sample
107+
if (properties != null && properties.containsKey(CBM_IS_SAMPLE_OF)) {
108+
datasetBuilder.add("@type", CBM_SAMPLE_TYPE);
109+
} else {
110+
datasetBuilder.add("@type", DCAT_DATASET_TYPE);
111+
}
105112

113+
// add the properties
106114
properties.forEach((key, value) -> {
107115
if (!isForbiddenProperty(key)) {
108116
datasetBuilder.add(key, value);
@@ -122,9 +130,11 @@ public static JsonObject transformAssetToCbmJsonObject(String id, JsonObject jso
122130
distributionBuilder.add(DCT_SCHEMA + "format", format.build());
123131

124132
// get url
125-
var baseUrl = dataAddress.getString(EDC_NAMESPACE + "baseUrl");
126-
if (baseUrl != null && !baseUrl.isEmpty()) {
127-
distributionBuilder.add(DCAT_SCHEMA + "accessURL", baseUrl);
133+
if (dataAddress.containsKey(EDC_NAMESPACE + "baseUrl")) {
134+
var baseUrl = dataAddress.getString(EDC_NAMESPACE + "baseUrl");
135+
if (baseUrl != null && !baseUrl.isEmpty()) {
136+
distributionBuilder.add(DCAT_SCHEMA + "accessURL", baseUrl);
137+
}
128138
}
129139

130140
dataAddress.forEach((key, value) -> {

providers/provider/src/test/java/org/eclipse/edc/heleade/provider/extension/validation/AssetJsonTransformerTest.java

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,23 @@ public class AssetJsonTransformerTest {
4444
private static final JsonLd JSON_LD_EDC = new JsonLdExtension().createJsonLdService(TestServiceExtensionContext.testServiceExtensionContext());
4545
private static final String ASSET_SCHEMA_PATH = "providers/provider/src/main/resources/asset-schema-cbm.json";
4646
private static final String DATASET_SCHEMA_PATH = "providers/provider/src/main/resources/dataset-schema-cbm.json";
47+
private static final String SAMPLE_SCHEMA_PATH = "providers/provider/src/main/resources/sample-schema-cbm.json";
4748
private static final String RESOURCES_PATH = "providers/provider/";
4849
private static final String MINIMAL_ASSET_PATH = RESOURCES_PATH + "src/test/resources/minimal-edc-asset.json";
4950
private static final String MINIMAL_CBM_PATH = RESOURCES_PATH + "src/test/resources/minimal-cbm-dataset.json";
5051
private static final String MINIMAL_ID = "datasetMandatory";
5152
private static final String FULL_ASSET_PATH = RESOURCES_PATH + "src/test/resources/full-edc-asset.json";
5253
private static final String FULL_CBM_PATH = RESOURCES_PATH + "src/test/resources/full-cbm-dataset.json";
5354
private static final String FULL_ID = "datasetFull";
55+
private static final String SAMPLE_ASSET_PATH = RESOURCES_PATH + "src/test/resources/sample-edc-asset.json";
56+
private static final String SAMPLE_CBM_PATH = RESOURCES_PATH + "src/test/resources/sample-cbm-dataset.json";
57+
private static final String SAMPLE_ID = "assetIdSample";
58+
private static final String SERVICE_ASSET_PATH = RESOURCES_PATH + "src/test/resources/service-edc-asset.json";
59+
private static final String SERVICE_CBM_PATH = RESOURCES_PATH + "src/test/resources/service-cbm-dataset.json";
60+
private static final String SERVICE_ID = "assetIdService";
5461
private static Validator<JsonObject> assetValidator;
5562
private static Validator<JsonObject> datasetValidator;
63+
private static Validator<JsonObject> sampleValidator;
5664

5765
@BeforeAll
5866
static void beforeAll() {
@@ -64,6 +72,9 @@ static void beforeAll() {
6472

6573
JsonSchema schemaDataset = getJsonSchema(getFileContentFromRelativePath(DATASET_SCHEMA_PATH));
6674
datasetValidator = new DatasetJsonSchemaValidator().getValidator(schemaDataset, JSON_LD_EDC);
75+
76+
JsonSchema schemaSample = getJsonSchema(getFileContentFromRelativePath(SAMPLE_SCHEMA_PATH));
77+
sampleValidator = new DatasetJsonSchemaValidator().getValidator(schemaSample, JSON_LD_EDC);
6778
}
6879

6980
@Test
@@ -89,7 +100,42 @@ void transformFullCbmToAsset() {
89100
JsonObject cbmJsonObject = Json.createReader(new StringReader(fullCbmString)).readObject();
90101

91102
JsonObject cbmExpandedJsonObject = JSON_LD_EMPTY.expand(cbmJsonObject).getContent();
92-
JsonObject assetTransformedJsonObject = CbmJsonObjectToAssetJsonObjectTransformer.transformCbmToAssetJsonObject(MINIMAL_ID, cbmExpandedJsonObject);
103+
JsonObject assetTransformedJsonObject = CbmJsonObjectToAssetJsonObjectTransformer.transformCbmToAssetJsonObject(FULL_ID, cbmExpandedJsonObject);
104+
Assertions.assertNotNull(assetTransformedJsonObject);
105+
106+
JsonObject assetTransformedCompactedJsonObject = JSON_LD_EMPTY.compact(assetTransformedJsonObject).getContent();
107+
String assetJsonTransformedString = assetTransformedCompactedJsonObject.toString();
108+
Assertions.assertNotNull(assetJsonTransformedString);
109+
110+
var result = assetValidator.validate(assetTransformedJsonObject);
111+
assertThat(result).isSucceeded();
112+
}
113+
114+
@Test
115+
void transformSampleCbmToAsset() {
116+
String sampleCbmString = getFileContentFromRelativePath(SAMPLE_CBM_PATH);
117+
JsonObject cbmJsonObject = Json.createReader(new StringReader(sampleCbmString)).readObject();
118+
119+
JsonObject cbmExpandedJsonObject = JSON_LD_EMPTY.expand(cbmJsonObject).getContent();
120+
JsonObject assetTransformedJsonObject = CbmJsonObjectToAssetJsonObjectTransformer.transformCbmToAssetJsonObject(SAMPLE_ID, cbmExpandedJsonObject);
121+
Assertions.assertNotNull(assetTransformedJsonObject);
122+
123+
JsonObject assetTransformedCompactedJsonObject = JSON_LD_EMPTY.compact(assetTransformedJsonObject).getContent();
124+
String assetJsonTransformedString = assetTransformedCompactedJsonObject.toString();
125+
Assertions.assertNotNull(assetJsonTransformedString);
126+
127+
var result = assetValidator.validate(assetTransformedJsonObject);
128+
assertThat(result).isSucceeded();
129+
}
130+
131+
132+
@Test
133+
void transformServiceCbmToAsset() {
134+
String serviceCbmString = getFileContentFromRelativePath(SERVICE_CBM_PATH);
135+
JsonObject cbmJsonObject = Json.createReader(new StringReader(serviceCbmString)).readObject();
136+
137+
JsonObject cbmExpandedJsonObject = JSON_LD_EMPTY.expand(cbmJsonObject).getContent();
138+
JsonObject assetTransformedJsonObject = CbmJsonObjectToAssetJsonObjectTransformer.transformCbmToAssetJsonObject(SERVICE_ID, cbmExpandedJsonObject);
93139
Assertions.assertNotNull(assetTransformedJsonObject);
94140

95141
JsonObject assetTransformedCompactedJsonObject = JSON_LD_EMPTY.compact(assetTransformedJsonObject).getContent();
@@ -127,7 +173,45 @@ void transformFullAssetToCbm() {
127173
JsonObject assetExpandedJsonObject = JSON_LD_EMPTY.expand(assetJsonObject).getContent();
128174

129175
JsonObject assetCompactedJsonObject = JSON_LD_EMPTY.compact(assetExpandedJsonObject).getContent();
130-
JsonObject cbmTransformedJsonObject = AssetJsonObjectToCbmJsonObjectTransformer.transformAssetToCbmJsonObject(MINIMAL_ID, assetCompactedJsonObject);
176+
JsonObject cbmTransformedJsonObject = AssetJsonObjectToCbmJsonObjectTransformer.transformAssetToCbmJsonObject(FULL_ID, assetCompactedJsonObject);
177+
Assertions.assertNotNull(cbmTransformedJsonObject);
178+
179+
String cbmJsonTransformedString = cbmTransformedJsonObject.toString();
180+
Assertions.assertNotNull(cbmJsonTransformedString);
181+
182+
JsonObject cbmTransformedCompactedJsonObject = JSON_LD_EDC.compact(cbmTransformedJsonObject).getContent();
183+
var result = datasetValidator.validate(cbmTransformedCompactedJsonObject);
184+
assertThat(result).isSucceeded();
185+
}
186+
187+
@Test
188+
void transformSampleAssetToCbm() {
189+
String sampleAssetString = getFileContentFromRelativePath(SAMPLE_ASSET_PATH);
190+
191+
JsonObject assetJsonObject = Json.createReader(new StringReader(sampleAssetString)).readObject();
192+
JsonObject assetExpandedJsonObject = JSON_LD_EMPTY.expand(assetJsonObject).getContent();
193+
194+
JsonObject assetCompactedJsonObject = JSON_LD_EMPTY.compact(assetExpandedJsonObject).getContent();
195+
JsonObject cbmTransformedJsonObject = AssetJsonObjectToCbmJsonObjectTransformer.transformAssetToCbmJsonObject(SAMPLE_ID, assetCompactedJsonObject);
196+
Assertions.assertNotNull(cbmTransformedJsonObject);
197+
198+
String cbmJsonTransformedString = cbmTransformedJsonObject.toString();
199+
Assertions.assertNotNull(cbmJsonTransformedString);
200+
201+
JsonObject cbmTransformedCompactedJsonObject = JSON_LD_EDC.compact(cbmTransformedJsonObject).getContent();
202+
var result = sampleValidator.validate(cbmTransformedCompactedJsonObject);
203+
assertThat(result).isSucceeded();
204+
}
205+
206+
@Test
207+
void transformServicessetToCbm() {
208+
String serviceAssetString = getFileContentFromRelativePath(SERVICE_ASSET_PATH);
209+
210+
JsonObject assetJsonObject = Json.createReader(new StringReader(serviceAssetString)).readObject();
211+
JsonObject assetExpandedJsonObject = JSON_LD_EMPTY.expand(assetJsonObject).getContent();
212+
213+
JsonObject assetCompactedJsonObject = JSON_LD_EMPTY.compact(assetExpandedJsonObject).getContent();
214+
JsonObject cbmTransformedJsonObject = AssetJsonObjectToCbmJsonObjectTransformer.transformAssetToCbmJsonObject(SERVICE_ID, assetCompactedJsonObject);
131215
Assertions.assertNotNull(cbmTransformedJsonObject);
132216

133217
String cbmJsonTransformedString = cbmTransformedJsonObject.toString();
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"@id": "assetIdSample",
3+
"@type": "cbm:Sample",
4+
"dcat:distribution": [
5+
{
6+
"@type": "dcat:Distribution",
7+
"dct:format": {
8+
"@id": "HttpData"
9+
},
10+
"dcat:accessURL": "https://jsonplaceholder.typicode.com/users",
11+
"proxyPath": "true",
12+
"cbm:hasDataDictionary": {
13+
"@type": "cbm:DataDictionary",
14+
"cbm:hasField": [
15+
{
16+
"@type": "cbm:Field",
17+
"schema:name": "username",
18+
"dct:title": "User Name",
19+
"cbm:datatype": "string",
20+
"dct:description": "Name of the user",
21+
"cbm:sampleValue": "bret"
22+
},
23+
{
24+
"@type": "cbm:Field",
25+
"schema:name": "id",
26+
"dct:title": "User Identifier",
27+
"cbm:datatype": "integer",
28+
"dct:description": "Id of the user",
29+
"cbm:sampleValue": "1"
30+
}
31+
]
32+
}
33+
}
34+
],
35+
"cbm:isSampleOf": "assetId",
36+
"dct:title": "test sample asset",
37+
"dct:description": "test description",
38+
"dct:issued": "2025-10-22T13:04:33+00:00",
39+
"dct:modified": "2025-10-22T13:04:33+00:00",
40+
"contenttype": "application/json",
41+
"schema:algorithm": "clustering",
42+
"dct:accessRights": "http://publications.europa.eu/resource/authority/access-right/PUBLIC",
43+
"dct:license": "https://opendatacommons.org/licenses/odbl/1.0/",
44+
"dct:type": "Dataset",
45+
"@context": {
46+
"schema": "https://schema.org/",
47+
"cbm": "https://w3id.org/cbm/v0.0.1/ns/",
48+
"dcat": "http://www.w3.org/ns/dcat#",
49+
"dct": "http://purl.org/dc/terms/",
50+
"odrl": "http://www.w3.org/ns/odrl/2/",
51+
"dspace": "https://w3id.org/dspace/v0.8/",
52+
"@vocab": "https://w3id.org/edc/v0.0.1/ns/",
53+
"edc": "https://w3id.org/edc/v0.0.1/ns/"
54+
}
55+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
"@id": "assetIdSample",
3+
"@type": "Asset",
4+
"properties": {
5+
"dct:license": "https://opendatacommons.org/licenses/odbl/1.0/",
6+
"cbm:isSampleOf": "assetId",
7+
"dct:issued": "2025-10-22T13:04:33+00:00",
8+
"dct:type": "Dataset",
9+
"dct:modified": "2025-10-22T13:04:33+00:00",
10+
"cbm:hasDataDictionary": {
11+
"@type": "cbm:DataDictionary",
12+
"cbm:hasField": [
13+
{
14+
"@type": "cbm:Field",
15+
"schema:name": "username",
16+
"dct:title": "User Name",
17+
"cbm:datatype": "string",
18+
"dct:description": "Name of the user",
19+
"cbm:sampleValue": "bret"
20+
},
21+
{
22+
"@type": "cbm:Field",
23+
"schema:name": "id",
24+
"dct:title": "User Identifier",
25+
"cbm:datatype": "integer",
26+
"dct:description": "Id of the user",
27+
"cbm:sampleValue": "1"
28+
}
29+
]
30+
},
31+
"dct:title": "test sample asset",
32+
"dct:accessRights": "http://publications.europa.eu/resource/authority/access-right/PUBLIC",
33+
"dct:description": "test description",
34+
"id": "assetIdSample",
35+
"contenttype": "application/json",
36+
"schema:algorithm": "clustering"
37+
},
38+
"dataAddress": {
39+
"@type": "DataAddress",
40+
"proxyPath": "true",
41+
"type": "HttpData",
42+
"baseUrl": "https://jsonplaceholder.typicode.com/users"
43+
},
44+
"@context": {
45+
"schema": "https://schema.org/",
46+
"cbm": "https://w3id.org/cbm/v0.0.1/ns/",
47+
"dct": "http://purl.org/dc/terms/",
48+
"dcat": "http://www.w3.org/ns/dcat#",
49+
"@vocab": "https://w3id.org/edc/v0.0.1/ns/",
50+
"edc": "https://w3id.org/edc/v0.0.1/ns/",
51+
"odrl": "http://www.w3.org/ns/odrl/2/"
52+
}
53+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"@id": "assetIdService",
3+
"@type": "dcat:Dataset",
4+
"dct:type": "Service",
5+
"dcat:distribution": [{
6+
"@type": "dcat:Distribution",
7+
"dct:format": {
8+
"@id": "ServiceData"
9+
}
10+
}],
11+
"dct:title": "Service CBM",
12+
"dct:description": "this is a service created through the CBM endpoint",
13+
"dcat:keyword": ["CBM", "SERVICE"],
14+
"contenttype": "application/json",
15+
"dct:issued": "2025-10-22T13:04:33+00:00",
16+
"dct:modified": "2025-10-22T13:04:33+00:00",
17+
"dct:accessRights": "http://publications.europa.eu/resource/authority/access-right/PUBLIC",
18+
"dct:license": "https://opendatacommons.org/licenses/odbl/1.0/",
19+
"@context": {
20+
"dcat": "http://www.w3.org/ns/dcat#",
21+
"dct": "http://purl.org/dc/terms/",
22+
"@vocab": "https://w3id.org/edc/v0.0.1/ns/"
23+
}
24+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"@context": {
3+
"@vocab": "https://w3id.org/edc/v0.0.1/ns/",
4+
"dcat": "http://www.w3.org/ns/dcat#",
5+
"dct": "http://purl.org/dc/terms/"
6+
7+
},
8+
"@id": "assetIdService",
9+
"@type": "Asset",
10+
"properties": {
11+
"contenttype": "application/json",
12+
"dct:type": "Service",
13+
"dct:title": "test name",
14+
"dct:description": "test description",
15+
"dct:issued": "2025-10-22T12:04:33+00:00",
16+
"dct:modified": "2025-10-22T13:04:33+00:00",
17+
"dct:accessRights": "http://publications.europa.eu/resource/authority/access-right/PUBLIC",
18+
"dct:license": "https://creativecommons.org/licenses/by/4.0/"
19+
},
20+
"dataAddress":[ {
21+
"type": "ServiceData"
22+
}]
23+
}

0 commit comments

Comments
 (0)