From c421a264f83d6520c2428ffe15e95a88934dfbd2 Mon Sep 17 00:00:00 2001 From: Pooja Patel Date: Tue, 2 Jul 2024 10:36:58 +0200 Subject: [PATCH 1/3] IRS-739_add_value_for_submodel_url_for_IRS_version_4.5.2 fix(edc-client): Add property "submodel-postfix" to be prefixed for submodel call for IRS version 4.5.2 --- CHANGELOG.md | 5 +++++ charts/irs-helm/templates/configmap-spring-app-config.yaml | 1 + charts/irs-helm/values.yaml | 3 ++- irs-api/src/main/resources/application.yml | 1 + .../java/org/eclipse/tractusx/irs/WiremockSupport.java | 3 ++- .../eclipse/tractusx/irs/edc/client/EdcConfiguration.java | 2 ++ .../eclipse/tractusx/irs/edc/client/EdcSubmodelFacade.java | 6 +++++- .../tractusx/irs/edc/client/EdcSubmodelFacadeTest.java | 7 +++++++ .../tractusx/irs/edc/client/SubmodelRetryerTest.java | 2 +- .../tractusx/irs/registryclient/DefaultConfiguration.java | 4 ++-- .../irs/registryclient/DefaultConfigurationTest.java | 5 +++-- 11 files changed, 31 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f491124b0..2b5d02b696 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Fixed submodel request path by introducing configuration property `irs-edc-client.submodel.submodel-suffix` which will + be appended to the href URL. + ## [4.5.2] - 2024-02-22 ## Changed - Updated IRS OpenAPI version to 4.5.2 diff --git a/charts/irs-helm/templates/configmap-spring-app-config.yaml b/charts/irs-helm/templates/configmap-spring-app-config.yaml index c5811fc1a7..dd6ced39f8 100644 --- a/charts/irs-helm/templates/configmap-spring-app-config.yaml +++ b/charts/irs-helm/templates/configmap-spring-app-config.yaml @@ -118,6 +118,7 @@ data: submodel: request-ttl: {{ tpl .Values.edc.submodel.request.ttl . | default "PT10M" | quote }} urn-prefix: {{ tpl (.Values.edc.submodel.urnprefix | default "/urn") . | quote }} + submodel-suffix: {{ tpl (.Values.edc.submodel.suffix | default "/$value") . | quote }} catalog: acceptedPolicies: diff --git a/charts/irs-helm/values.yaml b/charts/irs-helm/values.yaml index a62c3cff2e..92d3c108b1 100644 --- a/charts/irs-helm/values.yaml +++ b/charts/irs-helm/values.yaml @@ -116,7 +116,7 @@ management: dependencies: enabled: false # Flag to determine if external service healthcheck endpoints should be checked urls: {} # Map of services with corresponding healthcheck endpoint url's. Example: - # service_name: http://service_name_host.com/health + # service_name: http://service_name_host.com/health digitalTwinRegistry: type: decentral # The type of DTR. This can be either "central" or "decentral". If "decentral", descriptorEndpoint, shellLookupEndpoint and oAuthClientId is not required. @@ -192,6 +192,7 @@ edc: request: ttl: PT10M # Requests to dataplane will time out after this duration (see https://en.wikipedia.org/wiki/ISO_8601#Durations) urnprefix: /urn + suffix: /$value catalog: # IRS will only negotiate contracts for offers with a policy as defined in the allowedNames list. # If a requested asset does not provide one of these policies, a tombstone will be created and this node will not be processed. diff --git a/irs-api/src/main/resources/application.yml b/irs-api/src/main/resources/application.yml index cfa958d815..3c499f72f6 100644 --- a/irs-api/src/main/resources/application.yml +++ b/irs-api/src/main/resources/application.yml @@ -157,6 +157,7 @@ irs-edc-client: submodel: request-ttl: ${EDC_SUBMODEL_REQUEST_TTL:PT10M} # How long to wait for an async EDC submodel retrieval to finish, ISO 8601 Duration urn-prefix: ${EDC_SUBMODEL_URN_PREFIX:/urn} # A prefix used to identify URNs correctly in the submodel endpoint address + submodel-suffix: "/$value" timeout: read: PT90S # HTTP read timeout for the submodel client connect: PT90S # HTTP connect timeout for the submodel client diff --git a/irs-api/src/test/java/org/eclipse/tractusx/irs/WiremockSupport.java b/irs-api/src/test/java/org/eclipse/tractusx/irs/WiremockSupport.java index 9698272e7c..b5b8739e35 100644 --- a/irs-api/src/test/java/org/eclipse/tractusx/irs/WiremockSupport.java +++ b/irs-api/src/test/java/org/eclipse/tractusx/irs/WiremockSupport.java @@ -51,6 +51,7 @@ import org.eclipse.tractusx.irs.testing.wiremock.SubmodelFacadeWiremockSupport; public class WiremockSupport { + public static final String SUBMODEL_SUFFIX = "/\\$value"; public static EndpointDataReference createEndpointDataReference(final String contractAgreementId) { final EDRAuthCode edrAuthCode = EDRAuthCode.builder() .cid(contractAgreementId) @@ -113,7 +114,7 @@ static void verifyNegotiationCalls(final int times) { } static void successfulDataRequests(final String assetId, final String fileName) { - stubFor(get(urlPathMatching(DtrWiremockSupport.DATAPLANE_PUBLIC_PATH + "/" + assetId)).willReturn( + stubFor(get(urlPathMatching(DtrWiremockSupport.DATAPLANE_PUBLIC_PATH + "/" + assetId+ SUBMODEL_SUFFIX)).willReturn( responseWithStatus(200).withBodyFile(fileName))); } diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/EdcConfiguration.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/EdcConfiguration.java index c4951cc1a9..bd804a691b 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/EdcConfiguration.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/EdcConfiguration.java @@ -92,6 +92,8 @@ public static class SubmodelConfig { private Duration requestTtl; private String urnPrefix; + + private String submodelSuffix; } diff --git a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/EdcSubmodelFacade.java b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/EdcSubmodelFacade.java index 0b5e0558f5..2f75c11218 100644 --- a/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/EdcSubmodelFacade.java +++ b/irs-edc-client/src/main/java/org/eclipse/tractusx/irs/edc/client/EdcSubmodelFacade.java @@ -44,11 +44,15 @@ public class EdcSubmodelFacade { private final EdcSubmodelClient client; + private final EdcConfiguration config; + @SuppressWarnings("PMD.PreserveStackTrace") public SubmodelDescriptor getSubmodelPayload(final String connectorEndpoint, final String submodelDataplaneUrl, final String assetId) throws EdcClientException { try { - return client.getSubmodelPayload(connectorEndpoint, submodelDataplaneUrl, assetId).get(); + final String fullSubmodelDataplaneUrl = submodelDataplaneUrl + config.getSubmodel().getSubmodelSuffix(); + log.debug("Requesting Submodel for URL: '{}'", fullSubmodelDataplaneUrl); + return client.getSubmodelPayload(connectorEndpoint, fullSubmodelDataplaneUrl, assetId).get(); } catch (InterruptedException e) { log.debug("InterruptedException occurred.", e); Thread.currentThread().interrupt(); diff --git a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/EdcSubmodelFacadeTest.java b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/EdcSubmodelFacadeTest.java index 5b384f1ccc..408d4eaac2 100644 --- a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/EdcSubmodelFacadeTest.java +++ b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/EdcSubmodelFacadeTest.java @@ -37,6 +37,7 @@ import org.eclipse.tractusx.irs.edc.client.exceptions.EdcClientException; import org.eclipse.tractusx.irs.edc.client.model.SubmodelDescriptor; import org.eclipse.tractusx.irs.edc.client.model.notification.EdcNotificationResponse; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -58,6 +59,12 @@ class EdcSubmodelFacadeTest { @Mock private EdcSubmodelClient client; + private final EdcConfiguration config = new EdcConfiguration(); + + @BeforeEach + public void beforeEach() { + this.testee = new EdcSubmodelFacade(client, config); + } @Nested @DisplayName("getSubmodelRawPayload") class GetSubmodelRawPayloadTests { diff --git a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/SubmodelRetryerTest.java b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/SubmodelRetryerTest.java index 7758811e42..cf5e0c548e 100644 --- a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/SubmodelRetryerTest.java +++ b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/SubmodelRetryerTest.java @@ -84,7 +84,7 @@ void setUp() { final EdcSubmodelClient client = new EdcSubmodelClientImpl(config, negotiationService, dataPlaneClient, endpointDataReferenceStorage, pollingService, retryRegistry, catalogFacade, endpointDataReferenceCacheService); - testee = new EdcSubmodelFacade(client); + testee = new EdcSubmodelFacade(client,config); } @Test diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java index 613c12db3c..f89ea91a29 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java @@ -126,8 +126,8 @@ public EndpointDataForConnectorsService endpointDataForConnectorsService(final E } @Bean - public EdcSubmodelFacade edcSubmodelFacade(final EdcSubmodelClient client) { - return new EdcSubmodelFacade(client); + public EdcSubmodelFacade edcSubmodelFacade(final EdcSubmodelClient client,final EdcConfiguration config) { + return new EdcSubmodelFacade(client,config); } @Bean diff --git a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/DefaultConfigurationTest.java b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/DefaultConfigurationTest.java index 4a3b67fd5f..939e21cba4 100644 --- a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/DefaultConfigurationTest.java +++ b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/DefaultConfigurationTest.java @@ -35,6 +35,7 @@ import java.util.concurrent.ExecutionException; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; +import org.eclipse.tractusx.irs.edc.client.EdcConfiguration; import org.eclipse.tractusx.irs.edc.client.EdcSubmodelClient; import org.eclipse.tractusx.irs.edc.client.EdcSubmodelFacade; import org.eclipse.tractusx.irs.edc.client.exceptions.EdcClientException; @@ -43,7 +44,7 @@ import org.springframework.web.client.RestTemplate; class DefaultConfigurationTest { - + private final EdcConfiguration edcConfiguration = new EdcConfiguration(); private final DefaultConfiguration testee = new DefaultConfiguration(); private final String descriptorTemplate = "descriptor/{aasIdentifier}"; private final String shellLookupTemplate = "shell?{assetIds}"; @@ -70,7 +71,7 @@ void decentralDigitalTwinRegistryService() { @Test void edcSubmodelFacade() { final EdcSubmodelClient facadeMock = mock(EdcSubmodelClient.class); - final EdcSubmodelFacade edcSubmodelFacade = testee.edcSubmodelFacade(facadeMock); + final EdcSubmodelFacade edcSubmodelFacade = testee.edcSubmodelFacade(facadeMock,edcConfiguration); assertThat(edcSubmodelFacade).isNotNull(); } From 40d7d259c3c88c3f36012025cdacfeab6071f958 Mon Sep 17 00:00:00 2001 From: Pooja Patel Date: Thu, 4 Jul 2024 15:34:20 +0200 Subject: [PATCH 2/3] IRS-739_add_value_for_submodel_url_for_IRS_version_4.5.2 Added whitespace --- charts/irs-helm/values.yaml | 2 +- .../eclipse/tractusx/irs/edc/client/SubmodelRetryerTest.java | 2 +- .../tractusx/irs/registryclient/DefaultConfiguration.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/charts/irs-helm/values.yaml b/charts/irs-helm/values.yaml index 92d3c108b1..7f040d7a1a 100644 --- a/charts/irs-helm/values.yaml +++ b/charts/irs-helm/values.yaml @@ -116,7 +116,7 @@ management: dependencies: enabled: false # Flag to determine if external service healthcheck endpoints should be checked urls: {} # Map of services with corresponding healthcheck endpoint url's. Example: - # service_name: http://service_name_host.com/health + # service_name: http://service_name_host.com/health digitalTwinRegistry: type: decentral # The type of DTR. This can be either "central" or "decentral". If "decentral", descriptorEndpoint, shellLookupEndpoint and oAuthClientId is not required. diff --git a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/SubmodelRetryerTest.java b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/SubmodelRetryerTest.java index cf5e0c548e..b553fe513d 100644 --- a/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/SubmodelRetryerTest.java +++ b/irs-edc-client/src/test/java/org/eclipse/tractusx/irs/edc/client/SubmodelRetryerTest.java @@ -84,7 +84,7 @@ void setUp() { final EdcSubmodelClient client = new EdcSubmodelClientImpl(config, negotiationService, dataPlaneClient, endpointDataReferenceStorage, pollingService, retryRegistry, catalogFacade, endpointDataReferenceCacheService); - testee = new EdcSubmodelFacade(client,config); + testee = new EdcSubmodelFacade(client, config); } @Test diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java index f89ea91a29..df6be188b2 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java @@ -126,8 +126,8 @@ public EndpointDataForConnectorsService endpointDataForConnectorsService(final E } @Bean - public EdcSubmodelFacade edcSubmodelFacade(final EdcSubmodelClient client,final EdcConfiguration config) { - return new EdcSubmodelFacade(client,config); + public EdcSubmodelFacade edcSubmodelFacade(final EdcSubmodelClient client, final EdcConfiguration config) { + return new EdcSubmodelFacade(client, config); } @Bean From 6ab37804c552955317d689aa0b7560f74b171cde Mon Sep 17 00:00:00 2001 From: Pooja Patel Date: Fri, 5 Jul 2024 09:19:07 +0200 Subject: [PATCH 3/3] IRS-739_add_value_for_submodel_url_for_IRS_version_4.5.2 feat(impl):[#522] change json schema lib --- CHANGELOG.md | 1 + irs-api/pom.xml | 12 ++--- .../validation/JsonValidatorService.java | 43 ++++++----------- .../validation/JsonValidatorServiceTest.java | 3 +- .../__files/assemblyPartRelationship.json | 47 ++++--------------- pom.xml | 2 +- 6 files changed, 31 insertions(+), 77 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b5d02b696..478d6685c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed submodel request path by introducing configuration property `irs-edc-client.submodel.submodel-suffix` which will be appended to the href URL. +- Fixed validation of json-schemas - IRS is creating tombstone instead collecting Submodel payload, when it not passes validation of schema #522 ## [4.5.2] - 2024-02-22 ## Changed diff --git a/irs-api/pom.xml b/irs-api/pom.xml index 523462d8de..a158a167cc 100644 --- a/irs-api/pom.xml +++ b/irs-api/pom.xml @@ -147,15 +147,9 @@ ${irs-registry-client.version} - net.jimblackler - jsonschemafriend - ${jsonschemafriend.version} - - - org.jsoup - jsoup - - + com.networknt + json-schema-validator + ${json-schema-validator.version} diff --git a/irs-api/src/main/java/org/eclipse/tractusx/irs/services/validation/JsonValidatorService.java b/irs-api/src/main/java/org/eclipse/tractusx/irs/services/validation/JsonValidatorService.java index 9d95eefe23..2ad1033485 100644 --- a/irs-api/src/main/java/org/eclipse/tractusx/irs/services/validation/JsonValidatorService.java +++ b/irs-api/src/main/java/org/eclipse/tractusx/irs/services/validation/JsonValidatorService.java @@ -23,16 +23,17 @@ ********************************************************************************/ package org.eclipse.tractusx.irs.services.validation; -import java.util.ArrayList; import java.util.List; +import java.util.Set; +import com.networknt.schema.InputFormat; +import com.networknt.schema.JsonSchema; +import com.networknt.schema.JsonSchemaException; +import com.networknt.schema.JsonSchemaFactory; +import com.networknt.schema.SpecVersion; +import com.networknt.schema.ValidationMessage; import lombok.extern.slf4j.Slf4j; -import net.jimblackler.jsonschemafriend.GenerationException; -import net.jimblackler.jsonschemafriend.Schema; -import net.jimblackler.jsonschemafriend.SchemaStore; -import net.jimblackler.jsonschemafriend.Validator; import org.eclipse.tractusx.irs.data.JsonParseException; -import org.eclipse.tractusx.irs.util.JsonUtil; import org.springframework.stereotype.Service; /** @@ -41,17 +42,7 @@ @Service @Slf4j public class JsonValidatorService { - private final SchemaStore schemaStore = new SchemaStore(); - private final JsonUtil parser; - - /** - * Creates a new validation service - * - * @param parser the parser to use for the JSON - */ - public JsonValidatorService(final JsonUtil parser) { - this.parser = parser; - } + private final JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V4); /** * Validate the payload against the schema. @@ -61,17 +52,13 @@ public JsonValidatorService(final JsonUtil parser) { * @return the validation result, containing the validation errors if applicable */ public ValidationResult validate(final String jsonSchema, final String jsonPayload) throws InvalidSchemaException { - log.debug("Trying to validate JSON ({}) with schema ({})", jsonPayload, jsonSchema); + log.trace("Trying to validate JSON ({}) with schema ({})", jsonPayload, jsonSchema); - final Schema schema = loadSchema(jsonSchema); + final JsonSchema schemaFromString = loadSchema(jsonSchema); - final Validator validator = new Validator(); try { - final Object payload = parser.fromString(jsonPayload, Object.class); - - final List errors = new ArrayList<>(); - validator.validate(schema, payload, validationError -> errors.add(validationError.getMessage())); - return createValidationResult(errors); + final Set errors = schemaFromString.validate(jsonPayload, InputFormat.JSON); + return createValidationResult(errors.stream().map(ValidationMessage::getMessage).toList()); } catch (final IllegalStateException | JsonParseException e) { log.warn("Unable to validate JSON payload ({})", jsonPayload, e); @@ -92,10 +79,10 @@ private ValidationResult createValidationResult(final List errors) { } } - private Schema loadSchema(final String jsonSchema) throws InvalidSchemaException { + private JsonSchema loadSchema(final String jsonSchema) throws InvalidSchemaException { try { - return schemaStore.loadSchemaJson(jsonSchema); - } catch (final GenerationException e) { + return factory.getSchema(jsonSchema); + } catch (final JsonSchemaException e) { throw new InvalidSchemaException("Cannot load JSON schema for validation", e); } } diff --git a/irs-api/src/test/java/org/eclipse/tractusx/irs/services/validation/JsonValidatorServiceTest.java b/irs-api/src/test/java/org/eclipse/tractusx/irs/services/validation/JsonValidatorServiceTest.java index 9da9182d96..dadcbcb7a7 100644 --- a/irs-api/src/test/java/org/eclipse/tractusx/irs/services/validation/JsonValidatorServiceTest.java +++ b/irs-api/src/test/java/org/eclipse/tractusx/irs/services/validation/JsonValidatorServiceTest.java @@ -33,12 +33,11 @@ import java.nio.file.Path; import java.util.Objects; -import org.eclipse.tractusx.irs.util.JsonUtil; import org.junit.jupiter.api.Test; class JsonValidatorServiceTest { - private final JsonValidatorService testee = new JsonValidatorService(new JsonUtil()); + private final JsonValidatorService testee = new JsonValidatorService(); @Test void shouldValidateAssemblyPartRelationship() throws Exception { diff --git a/irs-api/src/test/resources/__files/assemblyPartRelationship.json b/irs-api/src/test/resources/__files/assemblyPartRelationship.json index d2f8ccf472..26455e853d 100644 --- a/irs-api/src/test/resources/__files/assemblyPartRelationship.json +++ b/irs-api/src/test/resources/__files/assemblyPartRelationship.json @@ -4,10 +4,7 @@ { "quantity": { "quantityNumber": 0.11, - "measurementUnit": { - "datatypeURI": "urn:bamm:io.openmanufacturing:meta-model:1.0.0#kilogram", - "lexicalValue": "kilogram" - } + "measurementUnit": "unit:kilogram" }, "lifecycleContext": "AsBuilt", "createdOn": "2022-02-03T14:48:54.709Z", @@ -17,10 +14,7 @@ { "quantity": { "quantityNumber": 0.1204, - "measurementUnit": { - "datatypeURI": "urn:bamm:io.openmanufacturing:meta-model:1.0.0#kilogram", - "lexicalValue": "kilogram" - } + "measurementUnit": "unit:kilogram" }, "lifecycleContext": "AsBuilt", "createdOn": "2022-02-03T14:48:54.709Z", @@ -30,10 +24,7 @@ { "quantity": { "quantityNumber": 1, - "measurementUnit": { - "datatypeURI": "urn:bamm:io.openmanufacturing:meta-model:1.0.0#piece", - "lexicalValue": "piece" - } + "measurementUnit": "unit:piece" }, "lifecycleContext": "AsBuilt", "createdOn": "2022-02-03T14:48:54.709Z", @@ -43,10 +34,7 @@ { "quantity": { "quantityNumber": 1, - "measurementUnit": { - "datatypeURI": "urn:bamm:io.openmanufacturing:meta-model:1.0.0#piece", - "lexicalValue": "piece" - } + "measurementUnit": "unit:piece" }, "lifecycleContext": "AsBuilt", "createdOn": "2022-02-03T14:48:54.709Z", @@ -56,10 +44,7 @@ { "quantity": { "quantityNumber": 1, - "measurementUnit": { - "datatypeURI": "urn:bamm:io.openmanufacturing:meta-model:1.0.0#piece", - "lexicalValue": "piece" - } + "measurementUnit": "unit:piece" }, "lifecycleContext": "AsBuilt", "createdOn": "2022-02-03T14:48:54.709Z", @@ -79,7 +64,7 @@ { "quantity": { "quantityNumber": 1, - "measurementUnit": null + "measurementUnit": "unit:piece" }, "lifecycleContext": "AsBuilt", "createdOn": "2022-02-03T14:48:54.709Z", @@ -89,10 +74,7 @@ { "quantity": { "quantityNumber": 1, - "measurementUnit": { - "datatypeURI": "urn:bamm:io.openmanufacturing:meta-model:1.0.0#piece", - "lexicalValue": "piece" - } + "measurementUnit": "unit:piece" }, "lifecycleContext": "AsBuilt", "createdOn": "2022-02-03T14:48:54.709Z", @@ -102,10 +84,7 @@ { "quantity": { "quantityNumber": 1, - "measurementUnit": { - "datatypeURI": "urn:bamm:io.openmanufacturing:meta-model:1.0.0#piece", - "lexicalValue": "piece" - } + "measurementUnit": "unit:piece" }, "lifecycleContext": "AsBuilt", "createdOn": "2022-02-03T14:48:54.709Z", @@ -115,10 +94,7 @@ { "quantity": { "quantityNumber": 1, - "measurementUnit": { - "datatypeURI": "urn:bamm:io.openmanufacturing:meta-model:1.0.0#piece", - "lexicalValue": "piece" - } + "measurementUnit": "unit:piece" }, "lifecycleContext": "AsBuilt", "createdOn": "2022-02-03T14:48:54.709Z", @@ -128,10 +104,7 @@ { "quantity": { "quantityNumber": 1, - "measurementUnit": { - "datatypeURI": "urn:bamm:io.openmanufacturing:meta-model:1.0.0#piece", - "lexicalValue": "piece" - } + "measurementUnit": "unit:piece" }, "lifecycleContext": "AsBuilt", "createdOn": "2022-02-03T14:48:54.709Z", diff --git a/pom.xml b/pom.xml index 7439141ff7..61c49f0221 100644 --- a/pom.xml +++ b/pom.xml @@ -96,7 +96,7 @@ 1.76 3.3.1 1.16.1 - 0.12.0 + 1.4.0 2.14.0 3.12.0 4.10.0