diff --git a/basyx.submodelrepository/basyx.submodelrepository-backend/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/backend/CrudSubmodelRepository.java b/basyx.submodelrepository/basyx.submodelrepository-backend/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/backend/CrudSubmodelRepository.java index 5f6f91ed8..9cba64c59 100644 --- a/basyx.submodelrepository/basyx.submodelrepository-backend/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/backend/CrudSubmodelRepository.java +++ b/basyx.submodelrepository/basyx.submodelrepository-backend/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/backend/CrudSubmodelRepository.java @@ -197,21 +197,23 @@ public void setSubmodelElementValue(String submodelId, String smeIdShort, Submod } @Override - public void createSubmodelElement(String submodelId, SubmodelElement smElement) { + public SubmodelElement createSubmodelElement(String submodelId, SubmodelElement smElement) { SubmodelService submodelService = getSubmodelServiceOrThrow(submodelId); - submodelService.createSubmodelElement(smElement); + SubmodelElement createdSME = submodelService.createSubmodelElement(smElement); updateSubmodel(submodelId, submodelService.getSubmodel()); + return createdSME; } @Override - public void createSubmodelElement(String submodelId, String idShortPath, SubmodelElement smElement) throws ElementDoesNotExistException { + public SubmodelElement createSubmodelElement(String submodelId, String idShortPath, SubmodelElement smElement) throws ElementDoesNotExistException { SubmodelService submodelService = getSubmodelServiceOrThrow(submodelId); - submodelService.createSubmodelElement(idShortPath, smElement); + SubmodelElement createdSME = submodelService.createSubmodelElement(idShortPath, smElement); updateSubmodel(submodelId, submodelService.getSubmodel()); + return createdSME; } @Override diff --git a/basyx.submodelrepository/basyx.submodelrepository-client/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/client/ConnectedSubmodelRepository.java b/basyx.submodelrepository/basyx.submodelrepository-client/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/client/ConnectedSubmodelRepository.java index 376eaf2e7..2d4b909dc 100644 --- a/basyx.submodelrepository/basyx.submodelrepository-client/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/client/ConnectedSubmodelRepository.java +++ b/basyx.submodelrepository/basyx.submodelrepository-client/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/client/ConnectedSubmodelRepository.java @@ -196,13 +196,13 @@ public void setSubmodelElementValue(String submodelId, String smeIdShort, Submod } @Override - public void createSubmodelElement(String submodelId, SubmodelElement smElement) { - getConnectedSubmodelService(submodelId).createSubmodelElement(smElement); + public SubmodelElement createSubmodelElement(String submodelId, SubmodelElement smElement) { + return getConnectedSubmodelService(submodelId).createSubmodelElement(smElement); } @Override - public void createSubmodelElement(String submodelId, String idShortPath, SubmodelElement smElement) throws ElementDoesNotExistException { - getConnectedSubmodelService(submodelId).createSubmodelElement(idShortPath, smElement); + public SubmodelElement createSubmodelElement(String submodelId, String idShortPath, SubmodelElement smElement) throws ElementDoesNotExistException { + return getConnectedSubmodelService(submodelId).createSubmodelElement(idShortPath, smElement); } @Override diff --git a/basyx.submodelrepository/basyx.submodelrepository-core/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/SubmodelRepository.java b/basyx.submodelrepository/basyx.submodelrepository-core/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/SubmodelRepository.java index 0a5df3ec7..2314db4ea 100644 --- a/basyx.submodelrepository/basyx.submodelrepository-core/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/SubmodelRepository.java +++ b/basyx.submodelrepository/basyx.submodelrepository-core/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/SubmodelRepository.java @@ -164,7 +164,7 @@ public interface SubmodelRepository { * @param smElement * the SubmodelElement */ - public void createSubmodelElement(String submodelId, SubmodelElement smElement); + public SubmodelElement createSubmodelElement(String submodelId, SubmodelElement smElement); /** * Creates a nested SubmodelElement @@ -176,7 +176,7 @@ public interface SubmodelRepository { * @param smElement * the SubmodelElement */ - public void createSubmodelElement(String submodelId, String idShortPath, SubmodelElement smElement) throws ElementDoesNotExistException; + public SubmodelElement createSubmodelElement(String submodelId, String idShortPath, SubmodelElement smElement) throws ElementDoesNotExistException; /** * Deletes a SubmodelElement diff --git a/basyx.submodelrepository/basyx.submodelrepository-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/core/SubmodelRepositorySubmodelServiceWrapper.java b/basyx.submodelrepository/basyx.submodelrepository-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/core/SubmodelRepositorySubmodelServiceWrapper.java index 4716e9e8c..8adc2e87d 100644 --- a/basyx.submodelrepository/basyx.submodelrepository-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/core/SubmodelRepositorySubmodelServiceWrapper.java +++ b/basyx.submodelrepository/basyx.submodelrepository-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/core/SubmodelRepositorySubmodelServiceWrapper.java @@ -86,14 +86,14 @@ public void setSubmodelElementValue(String idShortPath, SubmodelElementValue val } @Override - public void createSubmodelElement(SubmodelElement submodelElement) { - repoApi.createSubmodelElement(submodelId, submodelElement); + public SubmodelElement createSubmodelElement(SubmodelElement submodelElement) { + return repoApi.createSubmodelElement(submodelId, submodelElement); } @Override - public void createSubmodelElement(String idShortPath, SubmodelElement submodelElement) + public SubmodelElement createSubmodelElement(String idShortPath, SubmodelElement submodelElement) throws ElementDoesNotExistException { - repoApi.createSubmodelElement(submodelId, idShortPath, submodelElement); + return repoApi.createSubmodelElement(submodelId, idShortPath, submodelElement); } diff --git a/basyx.submodelrepository/basyx.submodelrepository-feature-authorization/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/authorization/AuthorizedSubmodelRepository.java b/basyx.submodelrepository/basyx.submodelrepository-feature-authorization/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/authorization/AuthorizedSubmodelRepository.java index 37a068043..d81169707 100644 --- a/basyx.submodelrepository/basyx.submodelrepository-feature-authorization/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/authorization/AuthorizedSubmodelRepository.java +++ b/basyx.submodelrepository/basyx.submodelrepository-feature-authorization/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/authorization/AuthorizedSubmodelRepository.java @@ -205,21 +205,21 @@ public void setSubmodelElementValue(String submodelId, String smeIdShortPath, Su } @Override - public void createSubmodelElement(String submodelId, SubmodelElement smElement) { + public SubmodelElement createSubmodelElement(String submodelId, SubmodelElement smElement) { boolean isAuthorized = permissionResolver.hasPermission(Action.UPDATE, new SubmodelTargetInformation(getIdAsList(submodelId), getIdAsList(ALL_ALLOWED_WILDCARD))); throwExceptionIfInsufficientPermission(isAuthorized); - decorated.createSubmodelElement(submodelId, smElement); + return decorated.createSubmodelElement(submodelId, smElement); } @Override - public void createSubmodelElement(String submodelId, String idShortPath, SubmodelElement smElement) throws ElementDoesNotExistException { + public SubmodelElement createSubmodelElement(String submodelId, String idShortPath, SubmodelElement smElement) throws ElementDoesNotExistException { boolean isAuthorized = permissionResolver.hasPermission(Action.UPDATE, new SubmodelTargetInformation(getIdAsList(submodelId), getIdAsList(idShortPath))); throwExceptionIfInsufficientPermission(isAuthorized); - decorated.createSubmodelElement(submodelId, idShortPath, smElement); + return decorated.createSubmodelElement(submodelId, idShortPath, smElement); } @Override diff --git a/basyx.submodelrepository/basyx.submodelrepository-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/mqtt/MqttSubmodelRepository.java b/basyx.submodelrepository/basyx.submodelrepository-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/mqtt/MqttSubmodelRepository.java index 9b4e661be..5870e8fd1 100644 --- a/basyx.submodelrepository/basyx.submodelrepository-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/mqtt/MqttSubmodelRepository.java +++ b/basyx.submodelrepository/basyx.submodelrepository-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/mqtt/MqttSubmodelRepository.java @@ -125,17 +125,17 @@ public void setSubmodelElementValue(String submodelId, String idShortPath, Submo } @Override - public void createSubmodelElement(String submodelId, SubmodelElement smElement) { - decorated.createSubmodelElement(submodelId, smElement); - SubmodelElement submodelElement = decorated.getSubmodelElement(submodelId, smElement.getIdShort()); + public SubmodelElement createSubmodelElement(String submodelId, SubmodelElement smElement) { + SubmodelElement submodelElement = decorated.createSubmodelElement(submodelId, smElement); submodelElementCreated(submodelElement, getName(), submodelId, smElement.getIdShort()); + return submodelElement; } @Override - public void createSubmodelElement(String submodelId, String idShortPath, SubmodelElement smElement) throws ElementDoesNotExistException { - decorated.createSubmodelElement(submodelId, idShortPath, smElement); - SubmodelElement submodelElement = decorated.getSubmodelElement(submodelId, idShortPath); + public SubmodelElement createSubmodelElement(String submodelId, String idShortPath, SubmodelElement smElement) throws ElementDoesNotExistException { + SubmodelElement submodelElement = decorated.createSubmodelElement(submodelId, smElement); submodelElementCreated(submodelElement, getName(), submodelId, idShortPath); + return submodelElement; } @Override diff --git a/basyx.submodelrepository/basyx.submodelrepository-feature-mqtt/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/mqtt/TestMqttSubmodelObserver.java b/basyx.submodelrepository/basyx.submodelrepository-feature-mqtt/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/mqtt/TestMqttSubmodelObserver.java index 2afc466d0..17927f990 100644 --- a/basyx.submodelrepository/basyx.submodelrepository-feature-mqtt/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/mqtt/TestMqttSubmodelObserver.java +++ b/basyx.submodelrepository/basyx.submodelrepository-feature-mqtt/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/mqtt/TestMqttSubmodelObserver.java @@ -10,10 +10,10 @@ * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: - * + * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -86,13 +86,13 @@ public class TestMqttSubmodelObserver { private static MqttSubmodelRepositoryTopicFactory topicFactory = new MqttSubmodelRepositoryTopicFactory(new Base64URLEncoder()); private static SubmodelRepository submodelRepository; - + private static JsonDeserializer deserializer = new JsonDeserializer(); private static final String FILE_SUBMODEL_ELEMENT_NAME = "testFile.txt"; private static final String FILE_SUBMODEL_ELEMENT_CONTENT = "This is a text file."; private static String SAVED_FILE_PATH = ""; - + @BeforeClass public static void setUpClass() throws MqttException, IOException { mqttBroker = startBroker(); @@ -145,8 +145,9 @@ public void createSubmodelElementEvent() throws DeserializationException { Submodel submodel = createSubmodelDummy("createSubmodelForElementEventId"); submodelRepository.createSubmodel(submodel); SubmodelElement submodelElement = createSubmodelElementDummy("createSubmodelElementEventId"); - submodelRepository.createSubmodelElement(submodel.getId(), submodelElement); + SubmodelElement responseSubmodelElement = submodelRepository.createSubmodelElement(submodel.getId(), submodelElement); + assertEquals(submodelElement, responseSubmodelElement); assertEquals(topicFactory.createCreateSubmodelElementTopic(submodelRepository.getName(), submodel.getId(), submodelElement.getIdShort()), listener.lastTopic); assertEquals(submodelElement, deserializeSubmodelElementPayload(listener.lastPayload)); } @@ -155,8 +156,9 @@ public void createSubmodelElementEvent() throws DeserializationException { public void updateSubmodelElementEvent() throws DeserializationException { Submodel submodel = createSubmodelDummyWithSubmodelElement("updateSubmodelForElementEventId", "updateSubmodelElementEventId"); submodelRepository.createSubmodel(submodel); + SubmodelElement submodelElement = submodel.getSubmodelElements().get(0); - + SubmodelElementValue value = new PropertyValue("updatedValue"); submodelRepository.setSubmodelElementValue(submodel.getId(), submodelElement.getIdShort(), value); @@ -168,9 +170,9 @@ public void updateSubmodelElementEvent() throws DeserializationException { public void deleteSubmodelElementEvent() throws DeserializationException { Submodel submodel = createSubmodelDummyWithSubmodelElement("deleteSubmodelForElementEventId", "deleteSubmodelElementEventId"); submodelRepository.createSubmodel(submodel); - + SubmodelElement submodelElement = submodel.getSubmodelElements().get(0); - + submodelRepository.deleteSubmodelElement(submodel.getId(), submodelElement.getIdShort()); assertEquals(topicFactory.createDeleteSubmodelElementTopic(submodelRepository.getName(), submodel.getId(), submodelElement.getIdShort()), listener.lastTopic); @@ -184,8 +186,9 @@ public void createSubmodelElementWithoutValueEvent() throws DeserializationExcep SubmodelElement submodelElement = createSubmodelElementDummy("noValueSubmodelElementEventId"); List qualifierList = createNoValueQualifierList(); submodelElement.setQualifiers(qualifierList); - submodelRepository.createSubmodelElement(submodel.getId(), submodelElement); + SubmodelElement responseSubmodelElement = submodelRepository.createSubmodelElement(submodel.getId(), submodelElement); + assertEquals(submodelElement, responseSubmodelElement); assertEquals(topicFactory.createCreateSubmodelElementTopic(submodelRepository.getName(), submodel.getId(), submodelElement.getIdShort()), listener.lastTopic); assertNotEquals(submodelElement, deserializeSubmodelElementPayload(listener.lastPayload)); @@ -198,46 +201,46 @@ public void createSubmodelElementWithoutValueEvent() throws DeserializationExcep public void patchSubmodelElementsEvent() throws DeserializationException, JsonMappingException, JsonProcessingException { Submodel submodel = createSubmodelDummyWithSubmodelElements("patchSubmodelForElementEventId"); submodelRepository.createSubmodel(submodel); - + List submodelElements = submodel.getSubmodelElements(); - + for (int i = 0; i < submodelElements.size(); i++) { SubmodelElement submodelElement = submodelElements.get(i); submodelElement.setIdShort("patchedSubmodelElementId_" + i); } submodelRepository.patchSubmodelElements(submodel.getId(), submodelElements); - + assertEquals(topicFactory.createPatchSubmodelElementsTopic(submodelRepository.getName(), submodel.getId()), listener.lastTopic); assertEquals(submodelElements, deserializeSubmodelElementsListPayload(listener.lastPayload)); } - + @Test public void setFileValueEvent() throws DeserializationException, IOException { Submodel submodel = createSubmodelDummyWithFileSubmodelElement("setSubmodelFileValueEventId", "setFileValueSubmodelElementEventId"); submodelRepository.createSubmodel(submodel); - - File submodelElement = (File) submodel.getSubmodelElements().get(0); - + + File submodelElement = (File) submodel.getSubmodelElements().get(0); + submodelRepository.setFileValue(submodel.getId(), submodelElement.getIdShort(), FILE_SUBMODEL_ELEMENT_NAME, getInputStreamOfDummyFile(FILE_SUBMODEL_ELEMENT_CONTENT)); - + assertEquals(topicFactory.createUpdateFileValueTopic(submodelRepository.getName(), submodel.getId(), submodelElement.getIdShort()), listener.lastTopic); assertEquals(submodelElement, deserializeSubmodelElementPayload(listener.lastPayload)); } - + @Test public void deleteFileValueEvent() throws DeserializationException, IOException { Submodel submodel = createSubmodelDummyWithFileSubmodelElement("deleteSubmodelFileValueEventId", "deleteFileValueSubmodelElementEventId"); submodelRepository.createSubmodel(submodel); - + File submodelElement = (File) submodel.getSubmodelElements().get(0); - + submodelRepository.deleteFileValue(submodel.getId(), submodelElement.getIdShort()); assertEquals(topicFactory.createDeleteFileValueTopic(submodelRepository.getName(), submodel.getId(), submodelElement.getIdShort()), listener.lastTopic); assertEquals(submodelElement, deserializeSubmodelElementPayload(listener.lastPayload)); } - + private List createNoValueQualifierList() { Qualifier emptyValueQualifier = new DefaultQualifier.Builder().type(SubmodelElementSerializer.EMPTYVALUEUPDATE_TYPE).value("true").build(); return Arrays.asList(emptyValueQualifier); @@ -250,66 +253,66 @@ private Submodel deserializeSubmodelPayload(String payload) throws Deserializati private SubmodelElement deserializeSubmodelElementPayload(String payload) throws DeserializationException { return new JsonDeserializer().read(payload, SubmodelElement.class); } - - private List deserializeSubmodelElementsListPayload(String payload) throws DeserializationException, JsonMappingException, JsonProcessingException { + + private List deserializeSubmodelElementsListPayload(String payload) throws DeserializationException, JsonMappingException, JsonProcessingException { return deserializer.readList(payload, SubmodelElement.class); } private Submodel createSubmodelDummy(String submodelId) { return new DefaultSubmodel.Builder().id(submodelId).build(); } - + private Submodel createSubmodelDummyWithSubmodelElement(String submodelId, String submodelElementId) { List submodelElements = new ArrayList<>(); - + submodelElements.add(createSubmodelElementDummy(submodelElementId)); - + return new DefaultSubmodel.Builder().id(submodelId).submodelElements(submodelElements).build(); } - + private Submodel createSubmodelDummyWithFileSubmodelElement(String submodelId, String submodelElementId) { List submodelElements = new ArrayList<>(); - + submodelElements.add(createFileSubmodelElement(submodelElementId)); - + return new DefaultSubmodel.Builder().id(submodelId).submodelElements(submodelElements).build(); } - + private Submodel createSubmodelDummyWithSubmodelElements(String submodelId) { List submodelElements = createSubmodelElementsListDummy(2); - + return new DefaultSubmodel.Builder().id(submodelId).submodelElements(submodelElements).build(); } private SubmodelElement createSubmodelElementDummy(String submodelElementId) { Property defaultProp = new DefaultProperty.Builder().idShort(submodelElementId).value("defaultValue").build(); - + return new DefaultProperty.Builder().idShort(submodelElementId).value("defaultValue").build(); } - + public File createFileSubmodelElement(String submodelElementId) { return new DefaultFile.Builder().idShort(submodelElementId).value(SAVED_FILE_PATH).contentType("text/plain").build(); } - + private static InputStream getInputStreamOfDummyFile(String fileContent) throws FileNotFoundException, IOException { return new ByteArrayInputStream(fileContent.getBytes()); } - + private List createSubmodelElementsListDummy(int count) { List submodelElements = new ArrayList(); - + for (int i = 0; i < count; i++) { submodelElements.add(createSubmodelElementDummy("submodelElementId_" + i)); } - + return submodelElements; } private static SubmodelRepository createMqttSubmodelRepository(MqttClient client) throws FileHandlingException, FileNotFoundException, IOException { FileRepository fileRepository = new InMemoryFileRepository(); - + SAVED_FILE_PATH = fileRepository.save(new FileMetadata(FILE_SUBMODEL_ELEMENT_NAME, "", getInputStreamOfDummyFile(FILE_SUBMODEL_ELEMENT_CONTENT))); - + SubmodelRepositoryFactory repoFactory = new SimpleSubmodelRepositoryFactory(new SubmodelInMemoryBackendProvider(), new InMemorySubmodelServiceFactory(fileRepository)); return new MqttSubmodelRepositoryFactory(repoFactory, client, new MqttSubmodelRepositoryTopicFactory(new Base64URLEncoder())).create(); diff --git a/basyx.submodelrepository/basyx.submodelrepository-feature-operation-delegation/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/operation/delegation/OperationDelegationSubmodelRepository.java b/basyx.submodelrepository/basyx.submodelrepository-feature-operation-delegation/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/operation/delegation/OperationDelegationSubmodelRepository.java index 457fa6c19..a672c4b1c 100644 --- a/basyx.submodelrepository/basyx.submodelrepository-feature-operation-delegation/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/operation/delegation/OperationDelegationSubmodelRepository.java +++ b/basyx.submodelrepository/basyx.submodelrepository-feature-operation-delegation/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/operation/delegation/OperationDelegationSubmodelRepository.java @@ -117,13 +117,13 @@ public void setSubmodelElementValue(String submodelId, String smeIdShort, Submod } @Override - public void createSubmodelElement(String submodelId, SubmodelElement smElement) { - decorated.createSubmodelElement(submodelId, smElement); + public SubmodelElement createSubmodelElement(String submodelId, SubmodelElement smElement) { + return decorated.createSubmodelElement(submodelId, smElement); } @Override - public void createSubmodelElement(String submodelId, String idShortPath, SubmodelElement smElement) throws ElementDoesNotExistException { - decorated.createSubmodelElement(submodelId, idShortPath, smElement); + public SubmodelElement createSubmodelElement(String submodelId, String idShortPath, SubmodelElement smElement) throws ElementDoesNotExistException { + return decorated.createSubmodelElement(submodelId, idShortPath, smElement); } @Override diff --git a/basyx.submodelrepository/basyx.submodelrepository-feature-registry-integration/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/registry/integration/RegistryIntegrationSubmodelRepository.java b/basyx.submodelrepository/basyx.submodelrepository-feature-registry-integration/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/registry/integration/RegistryIntegrationSubmodelRepository.java index ead8f6708..5d630d3cd 100644 --- a/basyx.submodelrepository/basyx.submodelrepository-feature-registry-integration/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/registry/integration/RegistryIntegrationSubmodelRepository.java +++ b/basyx.submodelrepository/basyx.submodelrepository-feature-registry-integration/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/registry/integration/RegistryIntegrationSubmodelRepository.java @@ -134,13 +134,13 @@ public void setSubmodelElementValue(String submodelId, String idShortPath, Submo } @Override - public void createSubmodelElement(String submodelId, SubmodelElement submodelElement) { - decorated.createSubmodelElement(submodelId, submodelElement); + public SubmodelElement createSubmodelElement(String submodelId, SubmodelElement submodelElement) { + return decorated.createSubmodelElement(submodelId, submodelElement); } @Override - public void createSubmodelElement(String submodelId, String idShortPath, SubmodelElement submodelElement) throws ElementDoesNotExistException { - decorated.createSubmodelElement(submodelId, idShortPath, submodelElement); + public SubmodelElement createSubmodelElement(String submodelId, String idShortPath, SubmodelElement submodelElement) throws ElementDoesNotExistException { + return decorated.createSubmodelElement(submodelId, idShortPath, submodelElement); } @Override diff --git a/basyx.submodelrepository/basyx.submodelrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/http/SubmodelRepositoryApiHTTPController.java b/basyx.submodelrepository/basyx.submodelrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/http/SubmodelRepositoryApiHTTPController.java index 5a910a9ea..f3a495a90 100644 --- a/basyx.submodelrepository/basyx.submodelrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/http/SubmodelRepositoryApiHTTPController.java +++ b/basyx.submodelrepository/basyx.submodelrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/http/SubmodelRepositoryApiHTTPController.java @@ -177,14 +177,14 @@ public ResponseEntity getSubmodelElementByPathSubmodelRepo(Base @Override public ResponseEntity postSubmodelElementByPathSubmodelRepo(Base64UrlEncodedIdentifier submodelIdentifier, String idShortPath, @Valid SubmodelElement body, @Valid String level, @Valid String extent) { - repository.createSubmodelElement(submodelIdentifier.getIdentifier(), idShortPath, body); - return new ResponseEntity(HttpStatus.CREATED); + SubmodelElement createdSME = repository.createSubmodelElement(submodelIdentifier.getIdentifier(), idShortPath, body); + return new ResponseEntity(createdSME, HttpStatus.CREATED); } @Override public ResponseEntity postSubmodelElementSubmodelRepo(Base64UrlEncodedIdentifier submodelIdentifier, @Valid SubmodelElement body) { - repository.createSubmodelElement(submodelIdentifier.getIdentifier(), body); - return new ResponseEntity(HttpStatus.CREATED); + SubmodelElement createdSME = repository.createSubmodelElement(submodelIdentifier.getIdentifier(), body); + return new ResponseEntity(createdSME, HttpStatus.CREATED); } @Override diff --git a/basyx.submodelservice/basyx.submodelservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/InMemorySubmodelService.java b/basyx.submodelservice/basyx.submodelservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/InMemorySubmodelService.java index 3c37f673f..56cd2fbf2 100644 --- a/basyx.submodelservice/basyx.submodelservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/InMemorySubmodelService.java +++ b/basyx.submodelservice/basyx.submodelservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/InMemorySubmodelService.java @@ -1,6 +1,6 @@ /******************************************************************************* * Copyright (C) 2023 the Eclipse BaSyx Authors - * + * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including @@ -8,10 +8,10 @@ * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: - * + * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -19,7 +19,7 @@ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * + * * SPDX-License-Identifier: MIT ******************************************************************************/ @@ -33,6 +33,7 @@ import java.util.TreeMap; import java.util.stream.Collectors; +import org.eclipse.digitaltwin.aas4j.v3.model.Entity; import org.eclipse.digitaltwin.aas4j.v3.model.File; import org.eclipse.digitaltwin.aas4j.v3.model.OperationVariable; import org.eclipse.digitaltwin.aas4j.v3.model.Submodel; @@ -61,9 +62,9 @@ /** * Implements the SubmodelService as in-memory variant - * + * * @author schnicke, danish, mateusmolina - * + * */ public class InMemorySubmodelService implements SubmodelService { @@ -77,7 +78,7 @@ public class InMemorySubmodelService implements SubmodelService { /** * Creates the InMemory SubmodelService containing the passed Submodel - * + * * @param submodel */ public InMemorySubmodelService(Submodel submodel, FileRepository fileRepository) { @@ -127,12 +128,14 @@ public void setSubmodelElementValue(String idShort, SubmodelElementValue value) } @Override - public void createSubmodelElement(SubmodelElement submodelElement) throws CollidingIdentifierException { + public SubmodelElement createSubmodelElement(SubmodelElement submodelElement) throws CollidingIdentifierException { synchronized (submodelLock) { List smElements = submodel.getSubmodelElements(); throwIfSubmodelElementExists(submodelElement.getIdShort()); smElements.add(submodelElement); } + + return submodelElement; } private void throwIfSubmodelElementExists(String submodelElementId) { @@ -145,25 +148,27 @@ private void throwIfSubmodelElementExists(String submodelElementId) { } @Override - public void createSubmodelElement(String idShortPath, SubmodelElement submodelElement) throws ElementDoesNotExistException, CollidingIdentifierException { + public SubmodelElement createSubmodelElement(String idShortPath, SubmodelElement submodelElement) throws ElementDoesNotExistException, CollidingIdentifierException { synchronized (submodelLock) { throwIfSubmodelElementExists(getFullIdShortPath(idShortPath, submodelElement.getIdShort())); - + SubmodelElement parentSme = parser.getSubmodelElementFromIdShortPath(idShortPath); if (parentSme instanceof SubmodelElementList) { SubmodelElementList list = (SubmodelElementList) parentSme; List submodelElements = list.getValue(); submodelElements.add(submodelElement); - list.setValue(submodelElements); - return; - } - if (parentSme instanceof SubmodelElementCollection) { + } else if (parentSme instanceof SubmodelElementCollection) { SubmodelElementCollection collection = (SubmodelElementCollection) parentSme; List submodelElements = collection.getValue(); submodelElements.add(submodelElement); - collection.setValue(submodelElements); + } else if (parentSme instanceof Entity) { + Entity entity = (Entity) parentSme; + List submodelElements = entity.getStatements(); + submodelElements.add(submodelElement); } } + + return submodelElement; } @Override @@ -194,24 +199,30 @@ public void deleteSubmodelElement(String idShortPath) throws ElementDoesNotExist } private void deleteNestedSubmodelElement(String idShortPath) { - SubmodelElement sm = parser.getSubmodelElementFromIdShortPath(idShortPath); + SubmodelElement sme = parser.getSubmodelElementFromIdShortPath(idShortPath); if (helper.isDirectParentASubmodelElementList(idShortPath)) { - deleteNestedSubmodelElementFromList(idShortPath, sm); + deleteNestedSubmodelElementFromList(idShortPath, sme); } else { - deleteNestedSubmodelElementFromCollection(idShortPath, sm); + deleteNestedSubmodelElementFromCollectionOrEntity(idShortPath, sme); } } - private void deleteNestedSubmodelElementFromList(String idShortPath, SubmodelElement sm) { + private void deleteNestedSubmodelElementFromList(String idShortPath, SubmodelElement sme) { String collectionId = helper.extractDirectParentSubmodelElementListIdShort(idShortPath); SubmodelElementList list = (SubmodelElementList) parser.getSubmodelElementFromIdShortPath(collectionId); - list.getValue().remove(sm); + list.getValue().remove(sme); } - private void deleteNestedSubmodelElementFromCollection(String idShortPath, SubmodelElement sm) { + private void deleteNestedSubmodelElementFromCollectionOrEntity(String idShortPath, SubmodelElement sme) { String collectionId = helper.extractDirectParentSubmodelElementCollectionIdShort(idShortPath); - SubmodelElementCollection collection = (SubmodelElementCollection) parser.getSubmodelElementFromIdShortPath(collectionId); - collection.getValue().remove(sm); + SubmodelElement parent = parser.getSubmodelElementFromIdShortPath(collectionId); + if (parent instanceof SubmodelElementCollection) { + SubmodelElementCollection collection = (SubmodelElementCollection) parent; + collection.getValue().remove(sme); + } else if (parent instanceof Entity) { + Entity entity = (Entity) parent; + entity.getStatements().remove(sme); + } } private void deleteFlatSubmodelElement(String idShortPath) throws ElementDoesNotExistException { diff --git a/basyx.submodelservice/basyx.submodelservice-backend-mongodb/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/MongoDBSubmodelService.java b/basyx.submodelservice/basyx.submodelservice-backend-mongodb/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/MongoDBSubmodelService.java index 182add728..6dce92cf5 100644 --- a/basyx.submodelservice/basyx.submodelservice-backend-mongodb/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/MongoDBSubmodelService.java +++ b/basyx.submodelservice/basyx.submodelservice-backend-mongodb/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/MongoDBSubmodelService.java @@ -103,19 +103,21 @@ public void setSubmodelElementValue(String idShortPath, SubmodelElementValue val } @Override - public void createSubmodelElement(SubmodelElement submodelElement) { + public SubmodelElement createSubmodelElement(SubmodelElement submodelElement) { InMemorySubmodelService inMemorySubmodelService = getInMemorySubmodelService(); - inMemorySubmodelService.createSubmodelElement(submodelElement); + SubmodelElement createdSME = inMemorySubmodelService.createSubmodelElement(submodelElement); Submodel submodel = inMemorySubmodelService.getSubmodel(); crudRepository.save(submodel); + return createdSME; } @Override - public void createSubmodelElement(String idShortPath, SubmodelElement submodelElement) throws ElementDoesNotExistException { + public SubmodelElement createSubmodelElement(String idShortPath, SubmodelElement submodelElement) throws ElementDoesNotExistException { InMemorySubmodelService inMemorySubmodelService = getInMemorySubmodelService(); - inMemorySubmodelService.createSubmodelElement(idShortPath, submodelElement); + SubmodelElement createdSME = inMemorySubmodelService.createSubmodelElement(idShortPath, submodelElement); Submodel submodel = inMemorySubmodelService.getSubmodel(); crudRepository.save(submodel); + return createdSME; } diff --git a/basyx.submodelservice/basyx.submodelservice-client/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/client/ConnectedSubmodelService.java b/basyx.submodelservice/basyx.submodelservice-client/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/client/ConnectedSubmodelService.java index 78556c15c..16441611c 100644 --- a/basyx.submodelservice/basyx.submodelservice-client/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/client/ConnectedSubmodelService.java +++ b/basyx.submodelservice/basyx.submodelservice-client/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/client/ConnectedSubmodelService.java @@ -113,14 +113,14 @@ public void setSubmodelElementValue(String idShortPath, SubmodelElementValue val } @Override - public void createSubmodelElement(SubmodelElement submodelElement) { - serviceApi.postSubmodelElement(submodelElement); + public SubmodelElement createSubmodelElement(SubmodelElement submodelElement) { + return serviceApi.postSubmodelElement(submodelElement); } @Override - public void createSubmodelElement(String idShortPath, SubmodelElement submodelElement) throws ElementDoesNotExistException { + public SubmodelElement createSubmodelElement(String idShortPath, SubmodelElement submodelElement) throws ElementDoesNotExistException { try { - serviceApi.postSubmodelElementByPath(idShortPath, submodelElement); + return serviceApi.postSubmodelElementByPath(idShortPath, submodelElement); } catch (ApiException e) { throw mapExceptionSubmodelElementAccess(idShortPath, e); } diff --git a/basyx.submodelservice/basyx.submodelservice-core/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/SubmodelService.java b/basyx.submodelservice/basyx.submodelservice-core/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/SubmodelService.java index 90381c531..bb372047c 100644 --- a/basyx.submodelservice/basyx.submodelservice-core/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/SubmodelService.java +++ b/basyx.submodelservice/basyx.submodelservice-core/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/SubmodelService.java @@ -92,7 +92,7 @@ public interface SubmodelService { * Creates a Submodel Element * */ - public void createSubmodelElement(SubmodelElement submodelElement); + public SubmodelElement createSubmodelElement(SubmodelElement submodelElement); /** * Create a nested submodel element @@ -101,16 +101,18 @@ public interface SubmodelService { * the SubmodelElement IdShortPath * @param submodelElement * the submodel element to be created + * @return the SubmodelElement * @throws ElementDoesNotExistException * If the submodel element defined in the path does not exist */ - public void createSubmodelElement(String idShortPath, SubmodelElement submodelElement) throws ElementDoesNotExistException; + public SubmodelElement createSubmodelElement(String idShortPath, SubmodelElement submodelElement) throws ElementDoesNotExistException; /** * Updates a submodel element * * @param idShortPath * @param submodelElement + * @return the SubmodelElement * @throws ElementDoesNotExistException * If the submodel element defined in the path does not exist */ diff --git a/basyx.submodelservice/basyx.submodelservice-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/SubmodelServiceHelper.java b/basyx.submodelservice/basyx.submodelservice-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/SubmodelServiceHelper.java index 7fe1161e4..304552c57 100644 --- a/basyx.submodelservice/basyx.submodelservice-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/SubmodelServiceHelper.java +++ b/basyx.submodelservice/basyx.submodelservice-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/SubmodelServiceHelper.java @@ -358,6 +358,14 @@ public static Property createDummyProperty(String idShort, String value, DataTyp .build(); } + public static SubmodelElement createDummySME(String idShort, String value, DataTypeDefXsd dataType) { + return new DefaultProperty.Builder().idShort(idShort) + .category("cat1") + .value(value) + .valueType(dataType) + .build(); + } + public static File createDummyFile(String idShort, String contentType, String value) { return new DefaultFile.Builder().idShort(idShort) .category("file") diff --git a/basyx.submodelservice/basyx.submodelservice-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/SubmodelServiceSuite.java b/basyx.submodelservice/basyx.submodelservice-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/SubmodelServiceSuite.java index 94820e893..8a2d9c878 100644 --- a/basyx.submodelservice/basyx.submodelservice-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/SubmodelServiceSuite.java +++ b/basyx.submodelservice/basyx.submodelservice-core/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/SubmodelServiceSuite.java @@ -718,6 +718,10 @@ private DefaultEntity createDummyEntityWithStatement(SubmodelElement submodelEle private DefaultProperty createDummyProperty(String idShort) { return new DefaultProperty.Builder().idShort(idShort).category("cat1").value("123").valueType(DataTypeDefXsd.INTEGER).build(); } + + private SubmodelElement createDummySME(String idShort) { + return new DefaultProperty.Builder().idShort(idShort).value("123").build(); + } private InputStream getInputStreamOfDummyFile(String fileContent) throws FileNotFoundException, IOException { return new ByteArrayInputStream(fileContent.getBytes()); diff --git a/basyx.submodelservice/basyx.submodelservice-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/feature/mqtt/MqttSubmodelService.java b/basyx.submodelservice/basyx.submodelservice-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/feature/mqtt/MqttSubmodelService.java index 3d8beed4c..c9a7cab84 100644 --- a/basyx.submodelservice/basyx.submodelservice-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/feature/mqtt/MqttSubmodelService.java +++ b/basyx.submodelservice/basyx.submodelservice-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/feature/mqtt/MqttSubmodelService.java @@ -93,19 +93,18 @@ public void setSubmodelElementValue(String idShortPath, SubmodelElementValue val } @Override - public void createSubmodelElement(SubmodelElement submodelElement) { - decorated.createSubmodelElement(submodelElement); - SubmodelElement smElement = decorated.getSubmodelElement(submodelElement.getIdShort()); - submodelElementCreated(submodelElement, smElement.getIdShort()); + public SubmodelElement createSubmodelElement(SubmodelElement submodelElement) { + SubmodelElement createdSME = decorated.createSubmodelElement(submodelElement); + submodelElementCreated(submodelElement, createdSME.getIdShort()); + return createdSME; } @Override - public void createSubmodelElement(String idShortPath, SubmodelElement submodelElement) throws ElementDoesNotExistException { - - decorated.createSubmodelElement(idShortPath, submodelElement); + public SubmodelElement createSubmodelElement(String idShortPath, SubmodelElement submodelElement) throws ElementDoesNotExistException { - SubmodelElement smElement = decorated.getSubmodelElement(submodelElement.getIdShort()); - submodelElementCreated(smElement, idShortPath); + SubmodelElement createdSME = decorated.createSubmodelElement(idShortPath, submodelElement); + submodelElementCreated(createdSME, idShortPath); + return createdSME; } @Override diff --git a/basyx.submodelservice/basyx.submodelservice-feature-mqtt/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/mqtt/TestMqttSubmodelObserver.java b/basyx.submodelservice/basyx.submodelservice-feature-mqtt/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/mqtt/TestMqttSubmodelObserver.java index 75eab2b75..1e6293dca 100644 --- a/basyx.submodelservice/basyx.submodelservice-feature-mqtt/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/mqtt/TestMqttSubmodelObserver.java +++ b/basyx.submodelservice/basyx.submodelservice-feature-mqtt/src/test/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/mqtt/TestMqttSubmodelObserver.java @@ -97,34 +97,37 @@ public static void tearDownClass() { public void createSubmodelElementEvent() throws DeserializationException { SubmodelElement submodelElement = createSubmodelElementDummy("createSubmodelElementEventId"); - submodelService.createSubmodelElement(submodelElement); + SubmodelElement responseSubmodelElement = submodelService.createSubmodelElement(submodelElement); assertEquals(topicFactory.createCreateSubmodelElementTopic(submodelElement.getIdShort()), listener.lastTopic); assertEquals(submodelElement, deserializeSubmodelElementPayload(listener.lastPayload)); + assertEquals(submodelElement, responseSubmodelElement); } @Test public void updateSubmodelElementEvent() throws DeserializationException { SubmodelElement submodelElement = createSubmodelElementDummy("updateSubmodelElementEventId"); - submodelService.createSubmodelElement(submodelElement); + SubmodelElement responseSubmodelElement = submodelService.createSubmodelElement(submodelElement); SubmodelElementValue value = new PropertyValue("updatedValue"); submodelService.setSubmodelElementValue(submodelElement.getIdShort(), value); assertEquals(topicFactory.createUpdateSubmodelElementTopic(submodelElement.getIdShort()), listener.lastTopic); assertEquals(submodelElement, deserializeSubmodelElementPayload(listener.lastPayload)); + assertEquals(submodelElement, responseSubmodelElement); } @Test public void deleteSubmodelElementEvent() throws DeserializationException { SubmodelElement submodelElement = createSubmodelElementDummy("deleteSubmodelElementEventId"); - submodelService.createSubmodelElement(submodelElement); + SubmodelElement responseSubmodelElement = submodelService.createSubmodelElement(submodelElement); submodelService.deleteSubmodelElement(submodelElement.getIdShort()); assertEquals(topicFactory.createDeleteSubmodelElementTopic(submodelElement.getIdShort()), listener.lastTopic); assertEquals(submodelElement, deserializeSubmodelElementPayload(listener.lastPayload)); + assertEquals(submodelElement, responseSubmodelElement); } @Test @@ -133,13 +136,14 @@ public void createSubmodelElementWithoutValueEvent() throws DeserializationExcep SubmodelElement submodelElement = createSubmodelElementDummy("noValueSubmodelElementEventId"); List qualifierList = createNoValueQualifierList(); submodelElement.setQualifiers(qualifierList); - submodelService.createSubmodelElement(submodelElement); + SubmodelElement responseSubmodelElement = submodelService.createSubmodelElement(submodelElement); assertEquals(topicFactory.createCreateSubmodelElementTopic(submodelElement.getIdShort()), listener.lastTopic); assertNotEquals(submodelElement, deserializeSubmodelElementPayload(listener.lastPayload)); ((Property) submodelElement).setValue(null); assertEquals(submodelElement, deserializeSubmodelElementPayload(listener.lastPayload)); + assertEquals(submodelElement, responseSubmodelElement); } private List createNoValueQualifierList() { diff --git a/basyx.submodelservice/basyx.submodelservice-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/http/SubmodelServiceHTTPApiController.java b/basyx.submodelservice/basyx.submodelservice-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/http/SubmodelServiceHTTPApiController.java index e95df7c9d..0ee1efc64 100644 --- a/basyx.submodelservice/basyx.submodelservice-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/http/SubmodelServiceHTTPApiController.java +++ b/basyx.submodelservice/basyx.submodelservice-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelservice/http/SubmodelServiceHTTPApiController.java @@ -196,16 +196,16 @@ public ResponseEntity patchSubmodelElementByPathValueOnly( public ResponseEntity postSubmodelElement(@Parameter(in = ParameterIn.DEFAULT, description = "Requested submodel element", required = true, schema = @Schema()) @Valid @RequestBody SubmodelElement body, @Parameter(in = ParameterIn.QUERY, description = "Determines the structural depth of the respective resource content", schema = @Schema(allowableValues = { "deep", "core" }, defaultValue = "deep")) @Valid @RequestParam(value = "level", required = false, defaultValue = "deep") String level) { - service.createSubmodelElement(body); - return new ResponseEntity(HttpStatus.CREATED); + SubmodelElement createdSME = service.createSubmodelElement(body); + return new ResponseEntity(createdSME, HttpStatus.CREATED); } @Override public ResponseEntity postSubmodelElementByPath( @Parameter(in = ParameterIn.PATH, description = "IdShort path to the submodel element (dot-separated)", required = true, schema = @Schema()) @PathVariable("idShortPath") String idShortPath, @Parameter(in = ParameterIn.DEFAULT, description = "Requested submodel element", required = true, schema = @Schema()) @Valid @RequestBody SubmodelElement body) { - service.createSubmodelElement(idShortPath, body); - return new ResponseEntity(HttpStatus.CREATED); + SubmodelElement createdSME = service.createSubmodelElement(idShortPath, body); + return new ResponseEntity(createdSME, HttpStatus.CREATED); } @Override