Skip to content

Commit

Permalink
feat: implement Policy Definition validator (#3189)
Browse files Browse the repository at this point in the history
  • Loading branch information
ndr-brt committed Jun 20, 2023
1 parent 596aded commit 4434a84
Show file tree
Hide file tree
Showing 21 changed files with 286 additions and 142 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ dependencies {
implementation(project(":core:common:util"))
implementation(project(":extensions:common:api:api-core"))
implementation(project(":extensions:common:api:management-api-configuration"))
implementation(project(":core:common:validator-core"))

implementation(libs.jakarta.rsApi)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,16 @@
import org.eclipse.edc.spi.query.QuerySpec;
import org.eclipse.edc.spi.result.Result;
import org.eclipse.edc.transform.spi.TypeTransformerRegistry;
import org.eclipse.edc.validator.spi.JsonObjectValidatorRegistry;
import org.eclipse.edc.web.spi.exception.InvalidRequestException;
import org.eclipse.edc.web.spi.exception.ObjectNotFoundException;
import org.eclipse.edc.web.spi.exception.ValidationFailureException;

import static jakarta.json.stream.JsonCollectors.toJsonArray;
import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;
import static java.lang.String.format;
import static java.util.Optional.ofNullable;
import static org.eclipse.edc.api.model.QuerySpecDto.EDC_QUERY_SPEC_TYPE;
import static org.eclipse.edc.connector.api.management.policy.model.PolicyDefinitionRequestDto.EDC_POLICY_DEFINITION_TYPE;
import static org.eclipse.edc.web.spi.exception.ServiceResultHandler.exceptionMapper;

@Consumes(APPLICATION_JSON)
Expand All @@ -54,22 +57,30 @@ public class PolicyDefinitionApiController implements PolicyDefinitionApi {
private final Monitor monitor;
private final TypeTransformerRegistry transformerRegistry;
private final PolicyDefinitionService service;
private final JsonObjectValidatorRegistry validatorRegistry;

public PolicyDefinitionApiController(Monitor monitor, TypeTransformerRegistry transformerRegistry, PolicyDefinitionService service) {
public PolicyDefinitionApiController(Monitor monitor, TypeTransformerRegistry transformerRegistry,
PolicyDefinitionService service, JsonObjectValidatorRegistry validatorRegistry) {
this.monitor = monitor;
this.transformerRegistry = transformerRegistry;
this.service = service;
this.validatorRegistry = validatorRegistry;
}

@POST
@Path("request")
@Override
public JsonArray queryPolicyDefinitions(JsonObject querySpecDto) {
var querySpec = ofNullable(querySpecDto)
.map(json -> transformerRegistry.transform(json, QuerySpecDto.class)
.compose(dto -> transformerRegistry.transform(dto, QuerySpec.class)))
.orElse(Result.success(QuerySpec.Builder.newInstance().build()))
.orElseThrow(InvalidRequestException::new);
QuerySpec querySpec;
if (querySpecDto == null) {
querySpec = QuerySpec.Builder.newInstance().build();
} else {
validatorRegistry.validate(EDC_QUERY_SPEC_TYPE, querySpecDto).orElseThrow(ValidationFailureException::new);

querySpec = transformerRegistry.transform(querySpecDto, QuerySpecDto.class)
.compose(dto -> transformerRegistry.transform(dto, QuerySpec.class))
.orElseThrow(InvalidRequestException::new);
}

try (var stream = service.query(querySpec).orElseThrow(exceptionMapper(PolicyDefinition.class))) {
return stream
Expand Down Expand Up @@ -98,6 +109,8 @@ public JsonObject getPolicyDefinition(@PathParam("id") String id) {
@POST
@Override
public JsonObject createPolicyDefinition(JsonObject request) {
validatorRegistry.validate(EDC_POLICY_DEFINITION_TYPE, request).orElseThrow(ValidationFailureException::new);

var definition = transformerRegistry.transform(request, PolicyDefinitionRequestDto.class)
.compose(dto -> transformerRegistry.transform(dto, PolicyDefinition.class))
.orElseThrow(InvalidRequestException::new);
Expand Down Expand Up @@ -128,6 +141,8 @@ public void deletePolicyDefinition(@PathParam("id") String id) {
@Path("{id}")
@Override
public void updatePolicyDefinition(@PathParam("id") String id, JsonObject input) {
validatorRegistry.validate(EDC_POLICY_DEFINITION_TYPE, input).orElseThrow(ValidationFailureException::new);

var policyDefinition = transformerRegistry.transform(input, PolicyDefinitionUpdateDto.class)
.map(dto -> PolicyDefinitionUpdateWrapperDto.Builder.newInstance()
.policyId(id)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,25 @@
import org.eclipse.edc.connector.api.management.policy.transform.PolicyDefinitionRequestDtoToPolicyDefinitionTransformer;
import org.eclipse.edc.connector.api.management.policy.transform.PolicyDefinitionToPolicyDefinitionResponseDtoTransformer;
import org.eclipse.edc.connector.api.management.policy.transform.PolicyDefinitionUpdateWrapperDtoToPolicyDefinitionTransformer;
import org.eclipse.edc.connector.api.management.policy.validation.PolicyDefinitionRequestDtoValidator;
import org.eclipse.edc.connector.spi.policydefinition.PolicyDefinitionService;
import org.eclipse.edc.runtime.metamodel.annotation.Extension;
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.transform.spi.TypeTransformerRegistry;
import org.eclipse.edc.validator.spi.JsonObjectValidatorRegistry;
import org.eclipse.edc.web.spi.WebService;

import java.util.Map;

import static org.eclipse.edc.connector.api.management.policy.model.PolicyDefinitionRequestDto.EDC_POLICY_DEFINITION_TYPE;


@Extension(value = PolicyDefinitionApiExtension.NAME)
public class PolicyDefinitionApiExtension implements ServiceExtension {

public static final String NAME = "Management API: Policy";
public static final String NAME = "Management API: Policy Definition";

@Inject
private TypeTransformerRegistry transformerRegistry;
Expand All @@ -50,6 +54,9 @@ public class PolicyDefinitionApiExtension implements ServiceExtension {
@Inject
private PolicyDefinitionService service;

@Inject
private JsonObjectValidatorRegistry validatorRegistry;

@Override
public String name() {
return NAME;
Expand All @@ -65,7 +72,9 @@ public void initialize(ServiceExtensionContext context) {
transformerRegistry.register(new JsonObjectToPolicyDefinitionUpdateDtoTransformer());
transformerRegistry.register(new JsonObjectFromPolicyDefinitionResponseDtoTransformer(jsonBuilderFactory));

validatorRegistry.register(EDC_POLICY_DEFINITION_TYPE, PolicyDefinitionRequestDtoValidator.instance());

var monitor = context.getMonitor();
webService.registerResource(configuration.getContextAlias(), new PolicyDefinitionApiController(monitor, transformerRegistry, service));
webService.registerResource(configuration.getContextAlias(), new PolicyDefinitionApiController(monitor, transformerRegistry, service, validatorRegistry));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,10 @@

package org.eclipse.edc.connector.api.management.policy.model;

import jakarta.validation.constraints.NotNull;
import org.eclipse.edc.policy.model.Policy;

public abstract class PolicyDefinitionDto {

@NotNull
protected Policy policy;

protected abstract static class Builder<A extends PolicyDefinitionDto, B extends Builder<A, B>> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,13 @@
import java.util.Objects;

import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID;
import static org.eclipse.edc.spi.CoreConstants.EDC_NAMESPACE;

@JsonDeserialize(builder = PolicyDefinitionRequestDto.Builder.class)
public class PolicyDefinitionRequestDto extends PolicyDefinitionDto {

public static final String EDC_POLICY_DEFINITION_TYPE = EDC_NAMESPACE + "PolicyDefinition";
public static final String EDC_POLICY_DEFINITION_POLICY = EDC_NAMESPACE + "policy";
@JsonProperty(value = ID)
private String id;

Expand Down Expand Up @@ -54,7 +57,7 @@ public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
}
PolicyDefinitionRequestDto that = (PolicyDefinitionRequestDto) o;
var that = (PolicyDefinitionRequestDto) o;
return Objects.equals(id, that.id) && policy.equals(that.policy);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import jakarta.validation.constraints.NotNull;
import org.eclipse.edc.api.model.BaseResponseDto;
import org.eclipse.edc.policy.model.Policy;

Expand All @@ -26,7 +25,6 @@
@JsonDeserialize(builder = PolicyDefinitionResponseDto.Builder.class)
public class PolicyDefinitionResponseDto extends BaseResponseDto {

@NotNull
private Policy policy;

private PolicyDefinitionResponseDto() {
Expand All @@ -53,7 +51,7 @@ public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
}
PolicyDefinitionResponseDto that = (PolicyDefinitionResponseDto) o;
var that = (PolicyDefinitionResponseDto) o;
return Objects.equals(id, that.id) && policy.equals(that.policy);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,17 @@

import jakarta.json.JsonBuilderFactory;
import jakarta.json.JsonObject;
import org.eclipse.edc.connector.api.management.policy.model.PolicyDefinitionRequestDto;
import org.eclipse.edc.connector.api.management.policy.model.PolicyDefinitionResponseDto;
import org.eclipse.edc.jsonld.spi.PropertyAndTypeNames;
import org.eclipse.edc.jsonld.spi.transformer.AbstractJsonLdTransformer;
import org.eclipse.edc.transform.spi.TransformerContext;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import static org.eclipse.edc.connector.api.management.policy.model.PolicyDefinitionRequestDto.EDC_POLICY_DEFINITION_POLICY;
import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID;
import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE;
import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.EDC_CREATED_AT;
import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.EDC_POLICY_DEFINITION_POLICY;

public class JsonObjectFromPolicyDefinitionResponseDtoTransformer extends AbstractJsonLdTransformer<PolicyDefinitionResponseDto, JsonObject> {

Expand All @@ -41,7 +41,7 @@ public JsonObjectFromPolicyDefinitionResponseDtoTransformer(JsonBuilderFactory j
public @Nullable JsonObject transform(@NotNull PolicyDefinitionResponseDto input, @NotNull TransformerContext context) {
var objectBuilder = jsonFactory.createObjectBuilder();
objectBuilder.add(ID, input.getId());
objectBuilder.add(TYPE, PropertyAndTypeNames.EDC_POLICY_DEFINITION_TYPE);
objectBuilder.add(TYPE, PolicyDefinitionRequestDto.EDC_POLICY_DEFINITION_TYPE);

objectBuilder.add(EDC_CREATED_AT, input.getCreatedAt());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.EDC_POLICY_DEFINITION_POLICY;
import static org.eclipse.edc.connector.api.management.policy.model.PolicyDefinitionRequestDto.EDC_POLICY_DEFINITION_POLICY;

public class JsonObjectToPolicyDefinitionRequestDtoTransformer extends AbstractJsonLdTransformer<JsonObject, PolicyDefinitionRequestDto> {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.EDC_POLICY_DEFINITION_POLICY;
import static org.eclipse.edc.connector.api.management.policy.model.PolicyDefinitionRequestDto.EDC_POLICY_DEFINITION_POLICY;

public class JsonObjectToPolicyDefinitionUpdateDtoTransformer extends AbstractJsonLdTransformer<JsonObject, PolicyDefinitionUpdateDto> {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
*
* 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:
* Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation
*
*/

package org.eclipse.edc.connector.api.management.policy.validation;

import jakarta.json.JsonObject;
import org.eclipse.edc.validator.jsonobject.JsonObjectValidator;
import org.eclipse.edc.validator.jsonobject.validators.MandatoryObject;
import org.eclipse.edc.validator.jsonobject.validators.OptionalIdNotBlank;
import org.eclipse.edc.validator.spi.Validator;

import static org.eclipse.edc.connector.api.management.policy.model.PolicyDefinitionRequestDto.EDC_POLICY_DEFINITION_POLICY;

public class PolicyDefinitionRequestDtoValidator {
public static Validator<JsonObject> instance() {
return JsonObjectValidator.newValidator()
.verifyId(OptionalIdNotBlank::new)
.verify(EDC_POLICY_DEFINITION_POLICY, MandatoryObject::new)
.build();
}
}
Loading

0 comments on commit 4434a84

Please sign in to comment.