diff --git a/basyx.aasenvironment/basyx.aasenvironment-http/src/main/java/org/eclipse/digitaltwin/basyx/aasenvironment/http/AasEnvironmentApiHTTPController.java b/basyx.aasenvironment/basyx.aasenvironment-http/src/main/java/org/eclipse/digitaltwin/basyx/aasenvironment/http/AasEnvironmentApiHTTPController.java index 118ef4960..094f81674 100644 --- a/basyx.aasenvironment/basyx.aasenvironment-http/src/main/java/org/eclipse/digitaltwin/basyx/aasenvironment/http/AasEnvironmentApiHTTPController.java +++ b/basyx.aasenvironment/basyx.aasenvironment-http/src/main/java/org/eclipse/digitaltwin/basyx/aasenvironment/http/AasEnvironmentApiHTTPController.java @@ -26,12 +26,15 @@ package org.eclipse.digitaltwin.basyx.aasenvironment.http; import java.io.IOException; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; import java.util.ArrayList; import java.util.List; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.eclipse.digitaltwin.aas4j.v3.dataformat.core.DeserializationException; import org.eclipse.digitaltwin.aas4j.v3.dataformat.core.SerializationException; +import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultAdministrativeInformation; import org.eclipse.digitaltwin.basyx.aasenvironment.AasEnvironment; import org.eclipse.digitaltwin.basyx.aasenvironment.environmentloader.CompleteEnvironment; import org.eclipse.digitaltwin.basyx.aasenvironment.environmentloader.CompleteEnvironment.EnvironmentType; @@ -110,8 +113,28 @@ public ResponseEntity uploadEnvironment( if (envType == null) envType = EnvironmentType.AASX; - aasEnvironment.loadEnvironment(CompleteEnvironment.fromInputStream(envFile.getInputStream(), envType), - ignoreDuplicates); + + CompleteEnvironment completeEnv = CompleteEnvironment.fromInputStream(envFile.getInputStream(), envType); + + OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC).truncatedTo(java.time.temporal.ChronoUnit.SECONDS); + OffsetDateTime epoch = OffsetDateTime.parse("1970-01-01T00:00:00Z"); + + completeEnv.getEnvironment().getAssetAdministrationShells().forEach(shell -> { + if (shell.getAdministration() == null) { + shell.setAdministration(new DefaultAdministrativeInformation()); + } + + if (shell.getAdministration().getCreatedAt() == null) { + shell.getAdministration().setCreatedAt(epoch); + } + if (shell.getAdministration().getUpdatedAt() == null) { + shell.getAdministration().setUpdatedAt(now); + } + }); + + // 3. Load the modified environment into the repositories + aasEnvironment.loadEnvironment(completeEnv, ignoreDuplicates); + return new ResponseEntity<>(true, HttpStatus.OK); } diff --git a/basyx.aasregistry/open-api/patch-base-extensions.yaml b/basyx.aasregistry/open-api/patch-base-extensions.yaml index 3cbb2d151..67954e663 100644 --- a/basyx.aasregistry/open-api/patch-base-extensions.yaml +++ b/basyx.aasregistry/open-api/patch-base-extensions.yaml @@ -90,6 +90,14 @@ - op: add path: /components/schemas/AdministrativeInformation/allOf/1/properties/revision/pattern value: "^(0|[1-9][0-9]{0,3})$" +- op: add + path: /components/schemas/AdministrativeInformation/allOf/1/properties/createdAt + value: + type: string +- op: add + path: /components/schemas/AdministrativeInformation/allOf/1/properties/updatedAt + value: + type: string - op: replace path: /components/schemas/AdministrativeInformation/allOf/1/properties/templateId/pattern value: "^([\\x09\\x0a\\x0d\\x20-\\ud7ff\\ue000-\\ufffd]|\\ud800[\\udc00-\\udfff]|[\\ud801-\\udbfe][\\udc00-\\udfff]|\\udbff[\\udc00-\\udfff])*$" diff --git a/basyx.submodelregistry/open-api/patch-base-extensions.yaml b/basyx.submodelregistry/open-api/patch-base-extensions.yaml index 0d3b37a53..9ba5d47f7 100644 --- a/basyx.submodelregistry/open-api/patch-base-extensions.yaml +++ b/basyx.submodelregistry/open-api/patch-base-extensions.yaml @@ -95,6 +95,14 @@ - op: add path: /components/schemas/AdministrativeInformation/allOf/1/properties/revision/pattern value: "^(0|[1-9][0-9]{0,3})$" +- op: add + path: /components/schemas/AdministrativeInformation/allOf/1/properties/createdAt + value: + type: string +- op: add + path: /components/schemas/AdministrativeInformation/allOf/1/properties/updatedAt + value: + type: string - op: replace path: /components/schemas/AdministrativeInformation/allOf/1/properties/templateId/pattern value: "^([\\x09\\x0a\\x0d\\x20-\\ud7ff\\ue000-\\ufffd]|\\ud800[\\udc00-\\udfff]|[\\ud801-\\udbfe][\\udc00-\\udfff]|\\udbff[\\udc00-\\udfff])*$" diff --git a/pom.xml b/pom.xml index 22cf37170..fc76300a2 100644 --- a/pom.xml +++ b/pom.xml @@ -69,8 +69,7 @@ linux/amd64, linux/arm64, linux/arm/v7 8081 8081 - 2.0.1 - 5.1.0 + 2.1.0-SNAPSHOT 5.1.0 3.2.0