Skip to content

Commit 352d42b

Browse files
committed
fixed dataAddress not appearing in the FC datasets
1 parent 1462405 commit 352d42b

2 files changed

Lines changed: 134 additions & 11 deletions

File tree

BaseDS-EDC.postman_collection.json

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,7 +1208,7 @@
12081208
}
12091209
],
12101210
"request": {
1211-
"method": "POST",
1211+
"method": "PUT",
12121212
"header": [],
12131213
"body": {
12141214
"mode": "raw",
@@ -1323,7 +1323,7 @@
13231323
"header": [],
13241324
"body": {
13251325
"mode": "raw",
1326-
"raw": "{\n \"@context\": {\n \"@vocab\": \"https://w3id.org/edc/v0.0.1/ns/\"\n },\n \"@type\": \"QuerySpec\",\n \"offset\": 0,\n \"limit\": 57,\n \"filterExpression\": [ ]\n \n}",
1326+
"raw": "{\n \"@context\": {\n \"@vocab\": \"https://w3id.org/edc/v0.0.1/ns/\"\n },\n \"@type\": \"QuerySpec\",\n \"offset\": 0,\n \"limit\": 57,\n \"filterExpression\": [ ],\n \"sortField\": \"http://purl.org/dc/terms/title\",\n \"sortOrder\": \"ASC\"\n \n}",
13271327
"options": {
13281328
"raw": {
13291329
"language": "json"
@@ -1369,7 +1369,7 @@
13691369
"header": [],
13701370
"body": {
13711371
"mode": "raw",
1372-
"raw": "{\n \"@context\": {\n \"@vocab\": \"https://w3id.org/edc/v0.0.1/ns/\"\n },\n \"@type\": \"QuerySpec\",\n \"offset\": 0,\n \"limit\": 57,\n \"filterExpression\": [ ]\n \n}",
1372+
"raw": "{\n \"@context\": {\n \"@vocab\": \"https://w3id.org/edc/v0.0.1/ns/\"\n },\n \"@type\": \"QuerySpec\",\n \"offset\": 0,\n \"limit\": 10,\n \"sortField\": \"http://purl.org/dc/terms/title\",\n \"sortOrder\": \"ASC\"\n}",
13731373
"options": {
13741374
"raw": {
13751375
"language": "json"
@@ -1412,7 +1412,7 @@
14121412
"header": [],
14131413
"body": {
14141414
"mode": "raw",
1415-
"raw": "{\n \"@context\": {\n \"@vocab\": \"https://w3id.org/edc/v0.0.1/ns/\"\n },\n \"@type\": \"QuerySpec\",\n \"offset\": 0,\n \"limit\": 57,\n \"filterExpression\": [ ]\n \n}",
1415+
"raw": "{\n \"@context\": {\n \"@vocab\": \"https://w3id.org/edc/v0.0.1/ns/\"\n },\n \"@type\": \"QuerySpec\"\n}",
14161416
"options": {
14171417
"raw": {
14181418
"language": "json"
@@ -1718,6 +1718,65 @@
17181718
},
17191719
"response": []
17201720
},
1721+
{
1722+
"name": "Create Contract Definition Copy",
1723+
"request": {
1724+
"method": "POST",
1725+
"header": [],
1726+
"body": {
1727+
"mode": "raw",
1728+
"raw": "{\n \"@context\": {\n \"@vocab\": \"https://w3id.org/edc/v0.0.1/ns/\"\n },\n \"@id\": \"1b\",\n \"accessPolicyId\": \"always-true\",\n \"contractPolicyId\": \"always-true\",\n \"assetsSelector\": []\n}\n",
1729+
"options": {
1730+
"raw": {
1731+
"language": "json"
1732+
}
1733+
}
1734+
},
1735+
"url": {
1736+
"raw": "{{HOST_URL}}:{{PROVIDER_MANAGEMENT_PORT}}/management/v3/contractdefinitions",
1737+
"host": [
1738+
"{{HOST_URL}}"
1739+
],
1740+
"port": "{{PROVIDER_MANAGEMENT_PORT}}",
1741+
"path": [
1742+
"management",
1743+
"v3",
1744+
"contractdefinitions"
1745+
]
1746+
}
1747+
},
1748+
"response": []
1749+
},
1750+
{
1751+
"name": "List Contract Definitions",
1752+
"request": {
1753+
"method": "POST",
1754+
"header": [],
1755+
"body": {
1756+
"mode": "raw",
1757+
"raw": "{\n \"@context\": {\n \"@vocab\": \"https://w3id.org/edc/v0.0.1/ns/\"\n },\n \"@type\": \"QuerySpec\",\n \"offset\": 0,\n \"limit\": 10,\n \"filterExpression\": []\n}",
1758+
"options": {
1759+
"raw": {
1760+
"language": "json"
1761+
}
1762+
}
1763+
},
1764+
"url": {
1765+
"raw": "{{HOST_URL}}:{{PROVIDER_MANAGEMENT_PORT}}/management/v3/contractdefinitions/request",
1766+
"host": [
1767+
"{{HOST_URL}}"
1768+
],
1769+
"port": "{{PROVIDER_MANAGEMENT_PORT}}",
1770+
"path": [
1771+
"management",
1772+
"v3",
1773+
"contractdefinitions",
1774+
"request"
1775+
]
1776+
}
1777+
},
1778+
"response": []
1779+
},
17211780
{
17221781
"name": "Get Contract Definition",
17231782
"protocolProfileBehavior": {

federated-catalog/src/main/java/org/eclipse/edc/heleade/federated/catalog/extension/content/based/JsonObjectToDatasetContentBasedTransformer.java

Lines changed: 71 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,50 +15,114 @@
1515
package org.eclipse.edc.heleade.federated.catalog.extension.content.based;
1616

1717
import jakarta.json.Json;
18+
import jakarta.json.JsonArray;
1819
import jakarta.json.JsonObject;
1920
import org.eclipse.edc.catalog.transform.JsonObjectToDatasetTransformer;
21+
import org.eclipse.edc.connector.controlplane.catalog.spi.DataService;
2022
import org.eclipse.edc.connector.controlplane.catalog.spi.Dataset;
21-
import org.eclipse.edc.heleade.commons.content.based.catalog.CbmConstants;
23+
import org.eclipse.edc.connector.controlplane.catalog.spi.Distribution;
2224
import org.eclipse.edc.transform.spi.TransformerContext;
2325
import org.jetbrains.annotations.NotNull;
2426
import org.jetbrains.annotations.Nullable;
2527

28+
import java.util.ArrayList;
29+
import java.util.List;
30+
31+
import static org.eclipse.edc.heleade.commons.content.based.catalog.CbmConstants.CBM_HAS_DATA_DICTIONARY;
32+
import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCAT_ACCESS_SERVICE_ATTRIBUTE;
33+
import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCAT_DISTRIBUTION_ATTRIBUTE;
34+
import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCAT_ENDPOINT_DESCRIPTION_ATTRIBUTE;
35+
import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCAT_ENDPOINT_URL_ATTRIBUTE;
36+
import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCT_FORMAT_ATTRIBUTE;
37+
2638
/**
2739
* Transformer class for converting a JSON object into a Dataset with additional content-based
2840
* adjustments specific to federated catalog implementations.
2941
*
3042
* Features:
3143
* - Extends {@code JsonObjectToDatasetTransformer} to inherit base transformation functionality.
3244
* - Relocates data dictionary information from distribution arrays to the root dataset object when present.
45+
* - Fixes issues with default transformer including the data access URL in the result
3346
*/
3447
public class JsonObjectToDatasetContentBasedTransformer extends JsonObjectToDatasetTransformer {
3548

3649
@Override
3750
public @Nullable Dataset transform(@NotNull JsonObject object, @NotNull TransformerContext context) {
3851
var modifiedObject = moveDataDictionaryToDataset(object);
39-
var dataset = super.transform(modifiedObject, context);
40-
return dataset;
52+
Dataset dataset = super.transform(modifiedObject, context);
53+
Dataset fixedDataset = fixDataset(dataset, modifiedObject);
54+
return fixedDataset;
4155
}
4256

4357
private JsonObject moveDataDictionaryToDataset(JsonObject object) {
4458
// Get a distribution array if it exists
45-
var distributions = object.getJsonArray(CbmConstants.DISTRIBUTION_TAG);
59+
var distributions = object.getJsonArray(DCAT_DISTRIBUTION_ATTRIBUTE);
4660
if (distributions == null || distributions.isEmpty()) {
4761
return object;
4862
}
4963

5064
// Find first distribution with data dictionary
5165
for (var i = 0; i < distributions.size(); i++) {
5266
var distribution = distributions.getJsonObject(i);
53-
if (distribution.containsKey(CbmConstants.CBM_HAS_DATA_DICTIONARY)) {
67+
if (distribution.containsKey(CBM_HAS_DATA_DICTIONARY)) {
5468
// Create a new object with data dictionary at root
5569
return Json.createObjectBuilder(object)
56-
.add(CbmConstants.CBM_HAS_DATA_DICTIONARY,
57-
distribution.get(CbmConstants.CBM_HAS_DATA_DICTIONARY))
70+
.add(CBM_HAS_DATA_DICTIONARY,
71+
distribution.get(CBM_HAS_DATA_DICTIONARY))
5872
.build();
5973
}
6074
}
6175

6276
return object;
6377
}
78+
79+
private List<Distribution> getDistributions(JsonObject object) {
80+
81+
// Get a distribution array if it exists
82+
var distributions = object.getJsonArray(DCAT_DISTRIBUTION_ATTRIBUTE);
83+
if (distributions == null || distributions.isEmpty()) {
84+
return List.of();
85+
}
86+
87+
// Fix distributions
88+
ArrayList<Distribution> distributionsList = new ArrayList<>();
89+
90+
for (var i = 0; i < distributions.size(); i++) {
91+
var distributionBuilder = Distribution.Builder.newInstance();
92+
var distribution = distributions.getJsonObject(i);
93+
distributionBuilder.format(distribution.getJsonArray(DCT_FORMAT_ATTRIBUTE).getJsonObject(0).getString("@id"));
94+
if (distribution.containsKey(DCAT_ACCESS_SERVICE_ATTRIBUTE)) {
95+
var accessServiceValue = distribution.getJsonArray(DCAT_ACCESS_SERVICE_ATTRIBUTE).get(0);
96+
if (accessServiceValue instanceof JsonObject) {
97+
var dataServiceBuilder = DataService.Builder.newInstance();
98+
JsonObject accessService = (JsonObject) accessServiceValue;
99+
dataServiceBuilder.id(accessService.getString("@id"));
100+
var endpointDescription = accessService.get(DCAT_ENDPOINT_DESCRIPTION_ATTRIBUTE);
101+
var endpointUrl = accessService.get(DCAT_ENDPOINT_URL_ATTRIBUTE);
102+
if (endpointDescription instanceof JsonArray) {
103+
String endpointDescriptionString = ((JsonArray) endpointDescription).getJsonObject(0).getString("@value");
104+
dataServiceBuilder.endpointDescription(endpointDescriptionString);
105+
}
106+
if (endpointUrl instanceof JsonArray) {
107+
String endpointUrlString = ((JsonArray) endpointUrl).getJsonObject(0).getString("@value");
108+
dataServiceBuilder.endpointUrl(endpointUrlString);
109+
}
110+
distributionBuilder.dataService(dataServiceBuilder.build());
111+
}
112+
}
113+
distributionsList.add(distributionBuilder.build());
114+
}
115+
116+
return distributionsList;
117+
}
118+
119+
private Dataset fixDataset(Dataset dataset, JsonObject jsonDataset) {
120+
var fixedDistributions = getDistributions(jsonDataset);
121+
var fixedDatasetBuilder = Dataset.Builder.newInstance();
122+
fixedDatasetBuilder.id(dataset.getId());
123+
fixedDatasetBuilder.properties(dataset.getProperties());
124+
fixedDatasetBuilder.offers(dataset.getOffers());
125+
fixedDatasetBuilder.distributions(fixedDistributions);
126+
return fixedDatasetBuilder.build();
127+
}
64128
}

0 commit comments

Comments
 (0)