Skip to content

Commit

Permalink
fix: Only return Datasets with valid Offers (#1066)
Browse files Browse the repository at this point in the history
  • Loading branch information
efiege authored Oct 17, 2024
1 parent 83e2012 commit e7f8a57
Show file tree
Hide file tree
Showing 8 changed files with 253 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ please see [changelog_updates.md](docs/dev/changelog_updates.md).

#### Minor Changes

- Only return `Datasets` with valid `Offers` ([#1065](https://github.com/sovity/edc-ce/issues/1065))

#### Patch Changes

- Refactoring: Config as Java Code ([#1051](https://github.com/sovity/edc-ce/pull/1051))
Expand Down
29 changes: 29 additions & 0 deletions extensions/dataset-bugfix/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/********************************************************************************
* Copyright (c) 2024 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* SPDX-License-Identifier: Apache-2.0
********************************************************************************/

plugins {
`java-library`
}

dependencies {
api(libs.edc.coreSpi)
api(libs.edc.jsonLdSpi)
api(libs.edc.webSpi)
api(libs.edc.dspApiConfiguration)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* Copyright (c) 2024 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* SPDX-License-Identifier: Apache-2.0
*/

package org.eclipse.tractusx.edc.dataset.fix;

import jakarta.json.JsonObject;
import jakarta.ws.rs.NotFoundException;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerResponseContext;
import jakarta.ws.rs.container.ContainerResponseFilter;
import org.eclipse.edc.protocol.dsp.api.configuration.DspApiConfiguration;
import org.eclipse.edc.runtime.metamodel.annotation.Inject;
import org.eclipse.edc.spi.system.ServiceExtension;
import org.eclipse.edc.spi.system.ServiceExtensionContext;
import org.eclipse.edc.web.spi.WebService;

import static jakarta.ws.rs.HttpMethod.GET;
import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE;
import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.DCAT_DATASET_TYPE;
import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_POLICY_ATTRIBUTE;

public class DatasetFixExtension implements ServiceExtension {


@Inject
private DspApiConfiguration apiConfiguration;

@Inject
private WebService webService;

@Override
public void initialize(ServiceExtensionContext context) {
webService.registerResource(apiConfiguration.getContextAlias(), new DatasetFilter());
}

private static class DatasetFilter implements ContainerResponseFilter {

private static final String GET_DATASETS_PATH = "catalog/datasets/";

@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
if (requestContext.getUriInfo().getPath().contains(GET_DATASETS_PATH) && requestContext.getMethod().equals(GET)) {
if (responseContext.getEntity() instanceof JsonObject jsonObject) {
if (jsonObject.getString(TYPE).equals(DCAT_DATASET_TYPE) &&
jsonObject.containsKey(ODRL_POLICY_ATTRIBUTE) &&
jsonObject.getJsonArray(ODRL_POLICY_ATTRIBUTE).isEmpty()
) {
throw new NotFoundException();
}
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#################################################################################
# Copyright (c) 2024 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
#
# This program and the accompanying materials are made available under the
# terms of the Apache License, Version 2.0 which is available at
# https://www.apache.org/licenses/LICENSE-2.0.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# SPDX-License-Identifier: Apache-2.0
#################################################################################

org.eclipse.tractusx.edc.dataset.fix.DatasetFixExtension
1 change: 1 addition & 0 deletions extensions/sovity-edc-extensions-package/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ dependencies {
api(project(":extensions:edc-ui-config"))
api(project(":extensions:last-commit-info"))
api(project(":extensions:wrapper:wrapper"))
api(project(":extensions:dataset-bugfix"))
}

group = libs.versions.sovityEdcExtensionGroup.get()
Expand Down
1 change: 1 addition & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ edc-transferSpi = { module = "org.eclipse.edc:transfer-spi", version.ref = "edc"
edc-transformCore = { module = "org.eclipse.edc:transform-core", version.ref = "edc" }
edc-transformSpi = { module = "org.eclipse.edc:transform-spi", version.ref = "edc" }
edc-vaultFilesystem = { module = "org.eclipse.edc:vault-filesystem", version.ref = "edc" }
edc-webSpi = { module = "org.eclipse.edc:web-spi", version.ref = "edc" }

findbugs-jsr305 = { module = "com.google.code.findbugs:jsr305", version.ref = "findbugs" }

Expand Down
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ rootProject.name = "sovity-ce-edc"
include(":config")
include(":extensions:contract-termination")
include(":extensions:database-direct-access")
include(":extensions:dataset-bugfix")
include(":extensions:edc-ui-config")
include(":extensions:last-commit-info")
include(":extensions:mds-logginghouse-binder")
Expand Down
129 changes: 129 additions & 0 deletions tests/src/test/java/de/sovity/edc/e2e/DatasetTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
/*
* Copyright (c) 2023 sovity GmbH
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0
*
* SPDX-License-Identifier: Apache-2.0
*
* Contributors:
* sovity GmbH - init
*
*/

package de.sovity.edc.e2e;

import de.sovity.edc.extension.e2e.connector.ConnectorRemote;
import de.sovity.edc.extension.e2e.connector.config.ConnectorConfig;
import de.sovity.edc.extension.e2e.extension.Consumer;
import de.sovity.edc.extension.e2e.extension.E2eTestExtension;
import de.sovity.edc.extension.e2e.extension.Provider;
import io.restassured.response.Response;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import java.util.Map;
import java.util.UUID;

import static de.sovity.edc.extension.e2e.extension.Helpers.defaultE2eTestExtension;
import static io.restassured.http.ContentType.JSON;
import static jakarta.json.Json.createObjectBuilder;
import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.CONTEXT;
import static org.eclipse.edc.spi.CoreConstants.EDC_NAMESPACE;
import static org.eclipse.edc.spi.CoreConstants.EDC_PREFIX;
import static org.hamcrest.Matchers.equalTo;

class DatasetTest {

@RegisterExtension
private static E2eTestExtension e2eTestExtension = defaultE2eTestExtension();

@Test
void canRetrieveOfferedDataset(
@Consumer ConnectorRemote consumerConnector,
@Provider ConnectorConfig providerConfig,
@Provider ConnectorRemote providerConnector) {
// arrange
var assetId = UUID.randomUUID().toString();
providerConnector.createDataOffer(assetId, "http://example.com");

// act & assert
prepareDatasetApiCall(
consumerConnector,
providerConfig.getProtocolApiUrl(),
assetId)
.then()
.statusCode(200)
.body("'edc:description'", equalTo("description"));
}

@Test
void canNotRetrieveNotOfferedDataset(
@Consumer ConnectorRemote consumerConnector,
@Provider ConnectorConfig providerConfig,
@Provider ConnectorRemote providerConnector) {
// arrange
Map<String, Object> dataSource = Map.of(
EDC_NAMESPACE + "type", "HttpData",
EDC_NAMESPACE + "baseUrl", "http://localhost");
var assetId = UUID.randomUUID().toString();
providerConnector.createAsset(assetId, dataSource);

// act & assert
prepareDatasetApiCall(
consumerConnector,
providerConfig.getProtocolApiUrl(),
assetId)
.then()
.statusCode(502);
}

@Test
void canNotRetrieveNotOfferedDatasetIfValidOfferAvailable(
@Consumer ConnectorRemote consumerConnector,
@Provider ConnectorConfig providerConfig,
@Provider ConnectorRemote providerConnector) {
// arrange
Map<String, Object> dataSource = Map.of(
EDC_NAMESPACE + "type", "HttpData",
EDC_NAMESPACE + "baseUrl", "http://localhost");
var notOfferedAssetId = UUID.randomUUID().toString();
var offeredAssetId = UUID.randomUUID().toString();
providerConnector.createAsset(notOfferedAssetId, dataSource);
providerConnector.createDataOffer(offeredAssetId, "http://localhost");

// act & assert
prepareDatasetApiCall(
consumerConnector,
providerConfig.getProtocolApiUrl(),
notOfferedAssetId)
.then()
.statusCode(502);

prepareDatasetApiCall(
consumerConnector,
providerConfig.getProtocolApiUrl(),
offeredAssetId)
.then()
.statusCode(200)
.body("'edc:description'", equalTo("description"));
}

private static Response prepareDatasetApiCall(
ConnectorRemote consumerConnector,
String providerProtocolUrl,
String assetId) {
var requestBody = createObjectBuilder()
.add(CONTEXT, createObjectBuilder().add(EDC_PREFIX, EDC_NAMESPACE))
.add(EDC_NAMESPACE + "counterPartyAddress", providerProtocolUrl)
.add(EDC_NAMESPACE + "protocol", "dataspace-protocol-http")
.add("@id", assetId)
.build();
return consumerConnector.prepareManagementApiCall()
.contentType(JSON)
.body(requestBody)
.when()
.post("/v2/catalog/dataset/request");
}
}

0 comments on commit e7f8a57

Please sign in to comment.