From 47b07d0862de8b1b2e509b6aaac501b8be5a362a Mon Sep 17 00:00:00 2001 From: Enrico Risa Date: Fri, 17 May 2024 18:21:14 +0200 Subject: [PATCH] fix: action as @id if it's not refined (#4193) --- .../from/JsonObjectFromPolicyTransformer.java | 17 ++++++----- .../to/JsonObjectToActionTransformer.java | 4 +++ .../JsonObjectFromPolicyTransformerTest.java | 5 ++-- .../to/JsonObjectToActionTransformerTest.java | 28 ++++++++++++++++++- .../edc/jsonld/spi/PropertyAndTypeNames.java | 1 + .../PolicyDefinitionApiEndToEndTest.java | 2 +- 6 files changed, 45 insertions(+), 12 deletions(-) diff --git a/core/control-plane/control-plane-transform/src/main/java/org/eclipse/edc/connector/controlplane/transform/odrl/from/JsonObjectFromPolicyTransformer.java b/core/control-plane/control-plane-transform/src/main/java/org/eclipse/edc/connector/controlplane/transform/odrl/from/JsonObjectFromPolicyTransformer.java index 884c38855ff..89876145bfb 100644 --- a/core/control-plane/control-plane-transform/src/main/java/org/eclipse/edc/connector/controlplane/transform/odrl/from/JsonObjectFromPolicyTransformer.java +++ b/core/control-plane/control-plane-transform/src/main/java/org/eclipse/edc/connector/controlplane/transform/odrl/from/JsonObjectFromPolicyTransformer.java @@ -48,7 +48,6 @@ import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.VALUE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ACTION_ATTRIBUTE; -import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ACTION_TYPE_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_AND_CONSTRAINT_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ASSIGNEE_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ASSIGNER_ATTRIBUTE; @@ -248,12 +247,16 @@ private JsonObject visitAction(@Nullable Action action) { if (action == null) { return actionBuilder.build(); } - actionBuilder.add(ODRL_ACTION_TYPE_ATTRIBUTE, action.getType()); - if (action.getIncludedIn() != null) { - actionBuilder.add(ODRL_INCLUDED_IN_ATTRIBUTE, action.getIncludedIn()); - } - if (action.getConstraint() != null) { - actionBuilder.add(ODRL_REFINEMENT_ATTRIBUTE, action.getConstraint().accept(this)); + if (action.getIncludedIn() != null || action.getConstraint() != null) { + actionBuilder.add(ODRL_ACTION_ATTRIBUTE, jsonFactory.createObjectBuilder().add(ID, action.getType())); + if (action.getIncludedIn() != null) { + actionBuilder.add(ODRL_INCLUDED_IN_ATTRIBUTE, action.getIncludedIn()); + } + if (action.getConstraint() != null) { + actionBuilder.add(ODRL_REFINEMENT_ATTRIBUTE, action.getConstraint().accept(this)); + } + } else { + actionBuilder.add(ID, action.getType()); } return actionBuilder.build(); } diff --git a/core/control-plane/control-plane-transform/src/main/java/org/eclipse/edc/connector/controlplane/transform/odrl/to/JsonObjectToActionTransformer.java b/core/control-plane/control-plane-transform/src/main/java/org/eclipse/edc/connector/controlplane/transform/odrl/to/JsonObjectToActionTransformer.java index bad1438660d..142d978a583 100644 --- a/core/control-plane/control-plane-transform/src/main/java/org/eclipse/edc/connector/controlplane/transform/odrl/to/JsonObjectToActionTransformer.java +++ b/core/control-plane/control-plane-transform/src/main/java/org/eclipse/edc/connector/controlplane/transform/odrl/to/JsonObjectToActionTransformer.java @@ -25,6 +25,7 @@ import java.util.Optional; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ACTION_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ACTION_TYPE_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_INCLUDED_IN_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_REFINEMENT_ATTRIBUTE; @@ -48,8 +49,11 @@ public JsonObjectToActionTransformer() { } private void transformProperties(String key, JsonValue value, Action.Builder builder, TransformerContext context) { + // we read the type for backward compatibility if (ODRL_ACTION_TYPE_ATTRIBUTE.equals(key)) { transformString(value, builder::type, context); + } else if (ODRL_ACTION_ATTRIBUTE.equals(key)) { + transformString(value, builder::type, context); } else if (ODRL_INCLUDED_IN_ATTRIBUTE.equals(key)) { transformString(value, builder::includedIn, context); } else if (ODRL_REFINEMENT_ATTRIBUTE.equals(key)) { diff --git a/core/control-plane/control-plane-transform/src/test/java/org/eclipse/edc/connector/controlplane/transform/odrl/from/JsonObjectFromPolicyTransformerTest.java b/core/control-plane/control-plane-transform/src/test/java/org/eclipse/edc/connector/controlplane/transform/odrl/from/JsonObjectFromPolicyTransformerTest.java index 37903dc2db0..0d4f174ec48 100644 --- a/core/control-plane/control-plane-transform/src/test/java/org/eclipse/edc/connector/controlplane/transform/odrl/from/JsonObjectFromPolicyTransformerTest.java +++ b/core/control-plane/control-plane-transform/src/test/java/org/eclipse/edc/connector/controlplane/transform/odrl/from/JsonObjectFromPolicyTransformerTest.java @@ -51,7 +51,6 @@ import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.VALUE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ACTION_ATTRIBUTE; -import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ACTION_TYPE_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_AND_CONSTRAINT_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ASSIGNEE_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_ASSIGNER_ATTRIBUTE; @@ -176,7 +175,7 @@ void transform_actionWithAllAttributes_returnJsonObject() { assertThat(permissionJson.getJsonObject(ODRL_ACTION_ATTRIBUTE)).isNotNull(); var actionJson = permissionJson.getJsonObject(ODRL_ACTION_ATTRIBUTE); - assertThat(actionJson.getJsonString(ODRL_ACTION_TYPE_ATTRIBUTE).getString()).isEqualTo(action.getType()); + assertThat(actionJson.getJsonObject(ODRL_ACTION_ATTRIBUTE).getString(ID)).isEqualTo(action.getType()); assertThat(actionJson.getJsonString(ODRL_INCLUDED_IN_ATTRIBUTE).getString()).isEqualTo(action.getIncludedIn()); assertThat(actionJson.getJsonObject(ODRL_REFINEMENT_ATTRIBUTE)).isNotNull(); @@ -262,7 +261,7 @@ void transform_prohibitionWithConstraint_returnJsonObject() { assertThat(prohibitionJson.getJsonArray(ODRL_REMEDY_ATTRIBUTE)).hasSize(1).first() .extracting(JsonValue::asJsonObject).satisfies(remedyJson -> { - assertThat(remedyJson.getJsonObject(ODRL_ACTION_ATTRIBUTE).getString(ODRL_ACTION_TYPE_ATTRIBUTE)) + assertThat(remedyJson.getJsonObject(ODRL_ACTION_ATTRIBUTE).getString(ID)) .isEqualTo("remedyAction"); }); diff --git a/core/control-plane/control-plane-transform/src/test/java/org/eclipse/edc/connector/controlplane/transform/odrl/to/JsonObjectToActionTransformerTest.java b/core/control-plane/control-plane-transform/src/test/java/org/eclipse/edc/connector/controlplane/transform/odrl/to/JsonObjectToActionTransformerTest.java index 6836e133204..0894197c169 100644 --- a/core/control-plane/control-plane-transform/src/test/java/org/eclipse/edc/connector/controlplane/transform/odrl/to/JsonObjectToActionTransformerTest.java +++ b/core/control-plane/control-plane-transform/src/test/java/org/eclipse/edc/connector/controlplane/transform/odrl/to/JsonObjectToActionTransformerTest.java @@ -105,7 +105,7 @@ void transform_onlyId_returnAction() { } @Test - void transform_allAttributes_returnAction() { + void transform_allAttributesWithType_returnAction() { var constraint = AtomicConstraint.Builder.newInstance() .leftExpression(new LiteralExpression("left")) .operator(Operator.EQ) @@ -130,6 +130,32 @@ void transform_allAttributes_returnAction() { verify(context, times(1)).transform(any(JsonObject.class), eq(Constraint.class)); } + @Test + void transform_allAttributes_returnAction() { + var constraint = AtomicConstraint.Builder.newInstance() + .leftExpression(new LiteralExpression("left")) + .operator(Operator.EQ) + .rightExpression(new LiteralExpression("right")) + .build(); + when(context.transform(any(JsonObject.class), eq(Constraint.class))).thenReturn(constraint); + + var action = jsonFactory.createObjectBuilder() + .add(ODRL_ACTION_ATTRIBUTE, "use") + .add(ODRL_INCLUDED_IN_ATTRIBUTE, "includedIn") + .add(ODRL_REFINEMENT_ATTRIBUTE, jsonFactory.createObjectBuilder().build()) + .build(); + + var result = transformer.transform(TestInput.getExpanded(action), context); + + assertThat(result).isNotNull(); + assertThat(result.getType()).isEqualTo("use"); + assertThat(result.getIncludedIn()).isEqualTo("includedIn"); + assertThat(result.getConstraint()).isEqualTo(constraint); + + verify(context, never()).reportProblem(anyString()); + verify(context, times(1)).transform(any(JsonObject.class), eq(Constraint.class)); + } + @Test void transform_requiredAttributesMissing_reportProblem() { var action = jsonFactory.createObjectBuilder().build(); diff --git a/spi/common/json-ld-spi/src/main/java/org/eclipse/edc/jsonld/spi/PropertyAndTypeNames.java b/spi/common/json-ld-spi/src/main/java/org/eclipse/edc/jsonld/spi/PropertyAndTypeNames.java index e9a67629c45..2e01357627a 100644 --- a/spi/common/json-ld-spi/src/main/java/org/eclipse/edc/jsonld/spi/PropertyAndTypeNames.java +++ b/spi/common/json-ld-spi/src/main/java/org/eclipse/edc/jsonld/spi/PropertyAndTypeNames.java @@ -61,6 +61,7 @@ public interface PropertyAndTypeNames { String ODRL_PROHIBITION_ATTRIBUTE = ODRL_SCHEMA + "prohibition"; String ODRL_OBLIGATION_ATTRIBUTE = ODRL_SCHEMA + "obligation"; String ODRL_ACTION_ATTRIBUTE = ODRL_SCHEMA + "action"; + @Deprecated(since = "0.7.0") String ODRL_ACTION_TYPE_ATTRIBUTE = ODRL_SCHEMA + "type"; String ODRL_CONSEQUENCE_ATTRIBUTE = ODRL_SCHEMA + "consequence"; String ODRL_REMEDY_ATTRIBUTE = ODRL_SCHEMA + "remedy"; diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PolicyDefinitionApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PolicyDefinitionApiEndToEndTest.java index e20fc51db44..cc9651897c6 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PolicyDefinitionApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/PolicyDefinitionApiEndToEndTest.java @@ -113,7 +113,7 @@ void shouldStorePolicyDefinition() { .body(CONTEXT, hasEntry(EDC_PREFIX, EDC_NAMESPACE)) .body(CONTEXT, hasEntry(ODRL_PREFIX, ODRL_SCHEMA)) .body("policy.'odrl:permission'.'odrl:constraint'.'odrl:operator'.@id", is("odrl:eq")) - .body("policy.'odrl:prohibition'.'odrl:remedy'.'odrl:action'.'odrl:type'", is(ODRL_SCHEMA + "anonymize")) + .body("policy.'odrl:prohibition'.'odrl:remedy'.'odrl:action'.@id", is("odrl:anonymize")) .body("policy.'odrl:obligation'.'odrl:consequence'.size()", is(2)); }