diff --git a/README b/README index 9a501fae..849071ac 100644 --- a/README +++ b/README @@ -1,6 +1,6 @@ # Eclipse BaSyx Java Components [![Docker Pulls](https://img.shields.io/docker/pulls/eclipsebasyx/aas-server?style=plastic)](https://hub.docker.com/search?q=eclipsebasyx) [![BaSyx Logo](https://www.eclipse.org/basyx/img/basyxlogo.png)](https://www.eclipse.org/basyx/) - + [![AAS Server javadoc](https://javadoc.io/badge2/org.eclipse.basyx/basyx.components.AASServer/javadoc.svg)](https://javadoc.io/doc/org.eclipse.basyx/basyx.components.AASServer) AAS Server [![AAS Registry javadoc](https://javadoc.io/badge2/org.eclipse.basyx/basyx.components.registry/javadoc.svg)](https://javadoc.io/doc/org.eclipse.basyx/basyx.components.registry) AAS Registry diff --git a/basyx.aasrepository-backend-inmemory/pom.xml b/basyx.aasrepository-backend-inmemory/pom.xml index c8e80dec..5945ab50 100644 --- a/basyx.aasrepository-backend-inmemory/pom.xml +++ b/basyx.aasrepository-backend-inmemory/pom.xml @@ -37,6 +37,14 @@ tests test + + + org.eclipse.digitaltwin.basyx + basyx.aasservice-core + 2.0.0-SNAPSHOT + tests + test + org.eclipse.digitaltwin.basyx diff --git a/basyx.aasrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/InMemoryAasRepository.java b/basyx.aasrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/InMemoryAasRepository.java index eccf7026..dfd3e0c0 100644 --- a/basyx.aasrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/InMemoryAasRepository.java +++ b/basyx.aasrepository-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/InMemoryAasRepository.java @@ -30,6 +30,7 @@ import java.util.stream.Collectors; import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetInformation; import org.eclipse.digitaltwin.aas4j.v3.model.Reference; import org.eclipse.digitaltwin.basyx.aasservice.AasService; import org.eclipse.digitaltwin.basyx.aasservice.AasServiceFactory; @@ -121,4 +122,16 @@ public void removeSubmodelReference(String aasId, String submodelId) { aasServices.get(aasId).removeSubmodelReference(submodelId); } + @Override + public void setAssetInformation(String aasId, AssetInformation aasInfo) throws ElementDoesNotExistException { + throwIfAasDoesNotExist(aasId); + aasServices.get(aasId).getAAS().setAssetInformation(aasInfo); + } + + @Override + public AssetInformation getAssetInformation(String aasId) throws ElementDoesNotExistException{ + throwIfAasDoesNotExist(aasId); + return aasServices.get(aasId).getAAS().getAssetInformation(); + } + } diff --git a/basyx.aasrepository-backend-mongodb/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/MongoDBAasRepository.java b/basyx.aasrepository-backend-mongodb/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/MongoDBAasRepository.java index 9dd9a653..3d65ecdf 100644 --- a/basyx.aasrepository-backend-mongodb/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/MongoDBAasRepository.java +++ b/basyx.aasrepository-backend-mongodb/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/MongoDBAasRepository.java @@ -27,6 +27,7 @@ import java.util.List; import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetInformation; import org.eclipse.digitaltwin.aas4j.v3.model.Reference; import org.eclipse.digitaltwin.basyx.aasservice.backend.InMemoryAasService; import org.eclipse.digitaltwin.basyx.core.exceptions.CollidingIdentifierException; @@ -125,4 +126,18 @@ public void removeSubmodelReference(String aasId, String submodelId) { updateAas(aasId, service.getAAS()); } + + @Override + public void setAssetInformation(String aasId, AssetInformation aasInfo) throws ElementDoesNotExistException { + InMemoryAasService service = new InMemoryAasService(getAas(aasId)); + service.setAssetInformation(aasInfo); + + updateAas(aasId, service.getAAS()); + } + + @Override + public AssetInformation getAssetInformation(String aasId) throws ElementDoesNotExistException{ + return this.getAas(aasId).getAssetInformation(); + } + } diff --git a/basyx.aasrepository-core/pom.xml b/basyx.aasrepository-core/pom.xml index 5a96fba0..699f1dab 100644 --- a/basyx.aasrepository-core/pom.xml +++ b/basyx.aasrepository-core/pom.xml @@ -23,6 +23,14 @@ basyx.aasservice-core 2.0.0-SNAPSHOT + + + org.eclipse.digitaltwin.basyx + basyx.aasservice-core + 2.0.0-SNAPSHOT + tests + test + diff --git a/basyx.aasrepository-core/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/AasRepository.java b/basyx.aasrepository-core/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/AasRepository.java index 6116b3c0..75ad714f 100644 --- a/basyx.aasrepository-core/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/AasRepository.java +++ b/basyx.aasrepository-core/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/AasRepository.java @@ -28,6 +28,7 @@ import java.util.List; import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetInformation; import org.eclipse.digitaltwin.aas4j.v3.model.Reference; import org.eclipse.digitaltwin.basyx.core.exceptions.CollidingIdentifierException; import org.eclipse.digitaltwin.basyx.core.exceptions.ElementDoesNotExistException; @@ -100,6 +101,26 @@ public interface AasRepository { */ public void removeSubmodelReference(String aasId, String submodelId); + /** + * Sets the asset-information of a specific AAS + * + * @param aasId + * the id of the AAS + * + * @return the requested Asset-Information of the specified AAS + */ + public void setAssetInformation(String aasId, AssetInformation aasInfo) throws ElementDoesNotExistException; + + /** + * Retrieves the asset-information of a specific AAS + * + * @param aasId + * the id of the AAS + * + * @return the requested AAS + */ + public AssetInformation getAssetInformation(String aasId) throws ElementDoesNotExistException; + public default String getName() { return "aasRepository-default-name"; } diff --git a/basyx.aasrepository-core/src/test/java/org/eclipse/digitaltwin/basyx/aasrepository/AasRepositorySuite.java b/basyx.aasrepository-core/src/test/java/org/eclipse/digitaltwin/basyx/aasrepository/AasRepositorySuite.java index 01c7f0fc..ec7e48f8 100644 --- a/basyx.aasrepository-core/src/test/java/org/eclipse/digitaltwin/basyx/aasrepository/AasRepositorySuite.java +++ b/basyx.aasrepository-core/src/test/java/org/eclipse/digitaltwin/basyx/aasrepository/AasRepositorySuite.java @@ -35,9 +35,12 @@ import java.util.List; import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetInformation; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetKind; import org.eclipse.digitaltwin.aas4j.v3.model.KeyTypes; import org.eclipse.digitaltwin.aas4j.v3.model.Reference; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultAssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultAssetInformation; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultKey; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultReference; import org.eclipse.digitaltwin.basyx.core.exceptions.CollidingIdentifierException; @@ -56,6 +59,7 @@ public abstract class AasRepositorySuite { private static final String AAS_1_ID = "aas1/s"; private AssetAdministrationShell aas1; private AssetAdministrationShell aas2; + private AssetAdministrationShell aas3; private List preconfiguredShells = new ArrayList<>(); private static final String DUMMY_SUBMODEL_ID = "dummySubmodelId"; @@ -71,8 +75,9 @@ public void createAasRepoWithDummyAas() { aas1 = new DefaultAssetAdministrationShell.Builder().id(AAS_1_ID).submodels(createDummyReference(DUMMY_SUBMODEL_ID)) .build(); - aas2 = new DefaultAssetAdministrationShell.Builder().id("aas2") - .build(); + aas2 = new DefaultAssetAdministrationShell.Builder().id("aas2").build(); + AssetInformation assetInfo = createDummyAssetInformation(); + aas2.setAssetInformation(assetInfo); preconfiguredShells.add(aas1); preconfiguredShells.add(aas2); @@ -182,9 +187,36 @@ public void updateNonExistingAas() { aasRepo.updateAas("nonExisting", aas1); } + @Test + public void getAssetInformation() { + assertEquals(aas2.getAssetInformation(), aasRepo.getAssetInformation(aas2.getId())); + } + + @Test(expected = ElementDoesNotExistException.class) + public void getAssetInformationOfNonExistingAas() { + aasRepo.getAssetInformation("nonExisting"); + } + + @Test + public void setAssetInformation() { + AssetInformation assetInfo = createDummyAssetInformation(); + aasRepo.setAssetInformation(aas2.getId(), assetInfo); + assertEquals(assetInfo, aasRepo.getAssetInformation(aas2.getId())); + } + + @Test(expected = ElementDoesNotExistException.class) + public void setAssetInformationOfNonExistingAas() { + aasRepo.setAssetInformation("nonExisting", createDummyAssetInformation()); + } + public static Reference createDummyReference(String submodelId) { return new DefaultReference.Builder() .keys(new DefaultKey.Builder().type(KeyTypes.SUBMODEL).value(submodelId).build()).build(); } + private AssetInformation createDummyAssetInformation() { + return new DefaultAssetInformation.Builder().assetKind(AssetKind.INSTANCE).globalAssetId( + new DefaultReference.Builder().keys(new DefaultKey.Builder().value("assetIDTestKey").build()).build()) + .build(); + } } diff --git a/basyx.aasrepository-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/feature/mqtt/MqttAasRepository.java b/basyx.aasrepository-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/feature/mqtt/MqttAasRepository.java index 12582b5d..2039bce4 100644 --- a/basyx.aasrepository-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/feature/mqtt/MqttAasRepository.java +++ b/basyx.aasrepository-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/feature/mqtt/MqttAasRepository.java @@ -30,6 +30,7 @@ import org.eclipse.digitaltwin.aas4j.v3.dataformat.SerializationException; import org.eclipse.digitaltwin.aas4j.v3.dataformat.json.JsonSerializer; import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetInformation; import org.eclipse.digitaltwin.aas4j.v3.model.Reference; import org.eclipse.digitaltwin.basyx.aasrepository.AasRepository; import org.eclipse.digitaltwin.basyx.core.exceptions.CollidingIdentifierException; @@ -111,6 +112,16 @@ public void removeSubmodelReference(String aasId, String submodelId) { decorated.removeSubmodelReference(aasId, submodelId); } + @Override + public void setAssetInformation(String aasId, AssetInformation aasInfo) throws ElementDoesNotExistException { + decorated.setAssetInformation(aasId, aasInfo); + } + + @Override + public AssetInformation getAssetInformation(String aasId) throws ElementDoesNotExistException{ + return decorated.getAssetInformation(aasId); + } + private void aasCreated(AssetAdministrationShell shell, String repoId) { sendMqttMessage(topicFactory.createCreateAASTopic(repoId), serializePayload(shell)); } @@ -159,4 +170,5 @@ private MqttMessage createMqttMessage(String payload) { return new MqttMessage(payload.getBytes()); } } + } diff --git a/basyx.aasrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/http/AasRepositoryApiHTTPController.java b/basyx.aasrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/http/AasRepositoryApiHTTPController.java index 5b39d9f4..9aadcc95 100644 --- a/basyx.aasrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/http/AasRepositoryApiHTTPController.java +++ b/basyx.aasrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/http/AasRepositoryApiHTTPController.java @@ -29,10 +29,10 @@ import java.util.ArrayList; import java.util.List; -import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetInformation; import org.eclipse.digitaltwin.aas4j.v3.model.Reference; import org.eclipse.digitaltwin.basyx.aasrepository.AasRepository; import org.eclipse.digitaltwin.basyx.http.Base64UrlEncodedIdentifier; @@ -59,15 +59,12 @@ public class AasRepositoryApiHTTPController implements AasRepositoryHTTPApi { private static final Logger log = LoggerFactory.getLogger(AasRepositoryApiHTTPController.class); private final ObjectMapper objectMapper; - - private final HttpServletRequest request; private final AasRepository aasRepository; @Autowired - public AasRepositoryApiHTTPController(ObjectMapper objectMapper, HttpServletRequest request, AasRepository aasRepository) { + public AasRepositoryApiHTTPController(ObjectMapper objectMapper, AasRepository aasRepository) { this.objectMapper = objectMapper; - this.request = request; this.aasRepository = aasRepository; } @@ -140,4 +137,19 @@ public ResponseEntity> getAllAssetAdministrationS @Parameter(in = ParameterIn.QUERY, description = "The Asset Administration Shell’s IdShort", schema = @Schema()) @Valid @RequestParam(value = "idShort", required = false) String idShort) { return new ResponseEntity>(new ArrayList<>(aasRepository.getAllAas()), HttpStatus.OK); } + + @Override + public ResponseEntity postAssetInformationByAasId( + @Parameter(in = ParameterIn.PATH, description = "The Asset Administration Shell’s unique id (BASE64-URL-encoded)", required = true, schema = @Schema()) @PathVariable("aasIdentifier") Base64UrlEncodedIdentifier aasIdentifier, + @Parameter(in = ParameterIn.DEFAULT, description = "Asset Information object", required = true, schema = @Schema()) @Valid @RequestBody AssetInformation body) { + aasRepository.setAssetInformation(aasIdentifier.getIdentifier(), body); + return new ResponseEntity(HttpStatus.OK); + } + + @Override + public ResponseEntity getAssetInformationByAasId( + @Parameter(in = ParameterIn.PATH, description = "The Asset Administration Shell’s unique id (BASE64-URL-encoded)", required = true, schema = @Schema()) @PathVariable("aasIdentifier") Base64UrlEncodedIdentifier aasIdentifier) { + return new ResponseEntity(aasRepository.getAssetInformation(aasIdentifier.getIdentifier()), HttpStatus.OK); + } + } diff --git a/basyx.aasrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/http/AasRepositoryHTTPApi.java b/basyx.aasrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/http/AasRepositoryHTTPApi.java index 229b0c8b..76f1b6cb 100644 --- a/basyx.aasrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/http/AasRepositoryHTTPApi.java +++ b/basyx.aasrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/http/AasRepositoryHTTPApi.java @@ -36,6 +36,7 @@ import javax.validation.Valid; import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetInformation; import org.eclipse.digitaltwin.aas4j.v3.model.Reference; import org.eclipse.digitaltwin.basyx.http.Base64UrlEncodedIdentifier; import org.springframework.http.ResponseEntity; @@ -121,4 +122,20 @@ ResponseEntity postSubmodelReference( ResponseEntity putAssetAdministrationShellById( @Parameter(in = ParameterIn.PATH, description = "The Asset Administration Shell’s unique id (BASE64-URL-encoded)", required = true, schema = @Schema()) @PathVariable("aasIdentifier") Base64UrlEncodedIdentifier aasIdentifier, @Parameter(in = ParameterIn.DEFAULT, description = "Asset Administration Shell object", required = true, schema = @Schema()) @Valid @RequestBody AssetAdministrationShell body); + + @Operation(summary = "Updates the Asset Information of an existing Asset Administration Shell", description = "", tags = { "Asset Administration Shell Repository" }) + @ApiResponses(value = { @ApiResponse(responseCode = "204", description = "Asset Information updated successfully") }) + @RequestMapping(value = "/shells/{aasIdentifier}/asset-information", consumes = { "application/json" }, method = RequestMethod.POST) + ResponseEntity postAssetInformationByAasId( + @Parameter(in = ParameterIn.PATH, description = "The Asset Administration Shell’s unique id (BASE64-URL-encoded)", required = true, schema = @Schema()) @PathVariable("aasIdentifier") Base64UrlEncodedIdentifier aasIdentifier, + @Parameter(in = ParameterIn.DEFAULT, description = "Asset Information object", required = true, schema = @Schema()) @Valid @RequestBody AssetInformation body); + + @Operation(summary = "Returns the Asset Information of a specific Asset Administration Shell", description = "", tags = { "Asset Administration Shell Repository" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Requested Asset Information of Asset Administration Shell", content = @Content(mediaType = "application/json", schema = @Schema(implementation = AssetInformation.class))) }) + @RequestMapping(value = "/shells/{aasIdentifier}/asset-information", produces = { + "application/json" }, method = RequestMethod.GET) + ResponseEntity getAssetInformationByAasId( + @Parameter(in = ParameterIn.PATH, description = "The Asset Administration Shell’s unique id (BASE64-URL-encoded)", required = true, schema = @Schema()) @PathVariable("aasIdentifier") Base64UrlEncodedIdentifier aasIdentifier); + + } diff --git a/basyx.aasrepository-http/src/test/java/org/eclipse/digitaltwin/basyx/aasrepository/http/TestAasRepositoryHTTP.java b/basyx.aasrepository-http/src/test/java/org/eclipse/digitaltwin/basyx/aasrepository/http/TestAasRepositoryHTTP.java index 5d32bbe1..30d56a32 100644 --- a/basyx.aasrepository-http/src/test/java/org/eclipse/digitaltwin/basyx/aasrepository/http/TestAasRepositoryHTTP.java +++ b/basyx.aasrepository-http/src/test/java/org/eclipse/digitaltwin/basyx/aasrepository/http/TestAasRepositoryHTTP.java @@ -184,7 +184,58 @@ public void removeNonExistingSubmodelReference() throws FileNotFoundException, I createDummyAasOnServer(); String url = getSpecificSubmodelReferenceUrl(); CloseableHttpResponse deleteResponse = BaSyxHttpTestUtils.executeDeleteOnURL(url); - assertEquals(404, deleteResponse.getCode()); + assertEquals(HttpStatus.NOT_FOUND.value(), deleteResponse.getCode()); + } + + @Test + public void getAssetInformationByIdentifier() throws FileNotFoundException, IOException, ParseException { + createDummyAasOnServer(); + String url = getSpecificAssetInformationAccessURL(dummyAasId); + CloseableHttpResponse response = BaSyxHttpTestUtils.executeGetOnURL(url); + + String expected = BaSyxHttpTestUtils.readJSONStringFromFile("classpath:assetInfoSimple.json"); + + BaSyxHttpTestUtils.assertSameJSONContent(expected, BaSyxHttpTestUtils.getResponseAsString(response)); + } + + + @Test + public void getNonExistingAssetInformationByIdentifier() throws FileNotFoundException, IOException, ParseException { + String url = getSpecificAasAccessURL("nonExisting") + "/asset-information"; + CloseableHttpResponse response = BaSyxHttpTestUtils.executeGetOnURL(url); + + assertEquals(HttpStatus.NOT_FOUND.value(), response.getCode()); + } + + @Test + public void postAssetInformationByIdentifier() throws FileNotFoundException, IOException, ParseException { + createDummyAasOnServer(); + + String json = BaSyxHttpTestUtils.readJSONStringFromFile("classpath:exampleAssetInfo.json"); + + BaSyxHttpTestUtils.executePostOnServer(getSpecificAssetInformationAccessURL(dummyAasId), json); + + CloseableHttpResponse response = BaSyxHttpTestUtils + .executeGetOnURL(getSpecificAssetInformationAccessURL(dummyAasId)); + + BaSyxHttpTestUtils.assertSameJSONContent(json, BaSyxHttpTestUtils.getResponseAsString(response)); + } + + @Test + public void postAssetInformationToNonExistingAasByIdentifier() + throws FileNotFoundException, IOException, ParseException { + + String json = BaSyxHttpTestUtils.readJSONStringFromFile("classpath:exampleAssetInfo.json"); + + CloseableHttpResponse response = BaSyxHttpTestUtils + .executeGetOnURL(getSpecificAssetInformationAccessURL("nonExisting")); + + assertEquals(HttpStatus.NOT_FOUND.value(), response.getCode()); + } + + + private String getSpecificAssetInformationAccessURL(String aasID) { + return getSpecificAasAccessURL(aasID) + "/asset-information"; } @Test diff --git a/basyx.aasrepository-http/src/test/resources/assetInfoSimple.json b/basyx.aasrepository-http/src/test/resources/assetInfoSimple.json new file mode 100644 index 00000000..4c87dc28 --- /dev/null +++ b/basyx.aasrepository-http/src/test/resources/assetInfoSimple.json @@ -0,0 +1,40 @@ +{ + "assetKind":"Instance", + "globalAssetId":{ + "keys":[ + { + "type":"AssetAdministrationShell", + "value":"http://customer.com/assets/KHBVZJSQKIY" + } + ], + "type":"GlobalReference" + }, + "specificAssetIds":[ + { + "name":"EquipmentID", + "value":"538fd1b3-f99f-4a52-9c75-72e9fa921270", + "externalSubjectId":{ + "keys":[ + { + "type":"GlobalReference", + "value":"http://customer.com/Systems/ERP/012" + } + ], + "type":"GlobalReference" + } + }, + { + "name":"DeviceID", + "value":"QjYgPggjwkiHk4RrQiYSLg==", + "externalSubjectId":{ + "keys":[ + { + "type":"GlobalReference", + "value":"http://customer.com/Systems/IoT/1" + } + ], + "type":"GlobalReference" + } + } + ] +} \ No newline at end of file diff --git a/basyx.aasrepository-http/src/test/resources/exampleAssetInfo.json b/basyx.aasrepository-http/src/test/resources/exampleAssetInfo.json new file mode 100644 index 00000000..958d6c60 --- /dev/null +++ b/basyx.aasrepository-http/src/test/resources/exampleAssetInfo.json @@ -0,0 +1,27 @@ +{ + "assetKind":"Instance", + "globalAssetId":{ + "keys":[ + { + "type":"AssetAdministrationShell", + "value":"http://customer.com/assets/KHBVZJSQKIY" + } + ], + "type":"GlobalReference" + }, + "specificAssetIds":[ + { + "name":"EquipmentID", + "value":"007", + "externalSubjectId":{ + "keys":[ + { + "type":"GlobalReference", + "value":"http://customer.com/Systems/ERP/007" + } + ], + "type":"GlobalReference" + } + } + ] +} \ No newline at end of file diff --git a/basyx.aasservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasservice/backend/InMemoryAasService.java b/basyx.aasservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasservice/backend/InMemoryAasService.java index b1a1003b..370bf6de 100644 --- a/basyx.aasservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasservice/backend/InMemoryAasService.java +++ b/basyx.aasservice-backend-inmemory/src/main/java/org/eclipse/digitaltwin/basyx/aasservice/backend/InMemoryAasService.java @@ -27,6 +27,7 @@ import java.util.List; import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetInformation; import org.eclipse.digitaltwin.aas4j.v3.model.Key; import org.eclipse.digitaltwin.aas4j.v3.model.KeyTypes; import org.eclipse.digitaltwin.aas4j.v3.model.Reference; @@ -73,6 +74,16 @@ public void removeSubmodelReference(String submodelId) { aas.getSubmodels().remove(specificSubmodelReference); } + @Override + public void setAssetInformation(AssetInformation aasInfo) { + aas.setAssetInformation(aasInfo); + } + + @Override + public AssetInformation getAssetInformation() { + return aas.getAssetInformation(); + } + private Reference getSubmodelReferenceById(String submodelId) { List submodelReferences = aas.getSubmodels(); @@ -84,4 +95,5 @@ private Reference getSubmodelReferenceById(String submodelId) { return specificSubmodelReference; } + } diff --git a/basyx.aasservice-core/src/main/java/org/eclipse/digitaltwin/basyx/aasservice/AasService.java b/basyx.aasservice-core/src/main/java/org/eclipse/digitaltwin/basyx/aasservice/AasService.java index 7c344b44..4857b7d5 100644 --- a/basyx.aasservice-core/src/main/java/org/eclipse/digitaltwin/basyx/aasservice/AasService.java +++ b/basyx.aasservice-core/src/main/java/org/eclipse/digitaltwin/basyx/aasservice/AasService.java @@ -27,6 +27,7 @@ import java.util.List; import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetInformation; import org.eclipse.digitaltwin.aas4j.v3.model.Reference; /** @@ -60,4 +61,16 @@ public interface AasService { * Removes a Submodel Reference */ public void removeSubmodelReference(String submodelId); + + /** + * Sets the asset-information of the AAS contained in the server + */ + public void setAssetInformation(AssetInformation aasInfo); + + /** + * Retrieves the asset-information of the AAS contained in the server + * + * @return the Asset-Information of the AAS + */ + public AssetInformation getAssetInformation(); } diff --git a/basyx.aasservice-core/src/test/java/org/eclipse/digitaltwin/basyx/aasservice/AasServiceSuite.java b/basyx.aasservice-core/src/test/java/org/eclipse/digitaltwin/basyx/aasservice/AasServiceSuite.java index 4810dd7a..2e3d6624 100644 --- a/basyx.aasservice-core/src/test/java/org/eclipse/digitaltwin/basyx/aasservice/AasServiceSuite.java +++ b/basyx.aasservice-core/src/test/java/org/eclipse/digitaltwin/basyx/aasservice/AasServiceSuite.java @@ -32,8 +32,11 @@ import java.util.List; import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetInformation; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetKind; import org.eclipse.digitaltwin.aas4j.v3.model.Reference; import org.eclipse.digitaltwin.aas4j.v3.model.Submodel; +import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultAssetInformation; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultKey; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultReference; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultSubmodel; @@ -62,7 +65,7 @@ public void initSuite() { } @Test - public void aasRetrieval() { + public void getAas() { assertEquals(aas, aasService.getAAS()); } @@ -76,7 +79,7 @@ public void getSubmodelReference() { @Test public void addSubmodelReference() { - Submodel submodel = createNewSubmodel(); + Submodel submodel = createDummySubmodel(); aasService.addSubmodelReference(submodel.getSemanticId()); @@ -101,11 +104,31 @@ public void removeNonExistingSubmodelReference() { aasService.removeSubmodelReference("doesNotMatter"); } + @Test + public void getAssetInformation() { + assertEquals(aas.getAssetInformation(), aasService.getAssetInformation()); + } + + @Test + public void setAssetInformation() { + AssetInformation assetInfo = createDummyAssetInformation(); + aasService.setAssetInformation(assetInfo); + assertEquals(assetInfo, aasService.getAssetInformation()); + } + + private AssetInformation createDummyAssetInformation() { + AssetInformation assetInfo = new DefaultAssetInformation.Builder().assetKind(AssetKind.INSTANCE) + .globalAssetId( + new DefaultReference.Builder().keys(new DefaultKey.Builder().value("assetIDTestKey").build()).build()) + .build(); + return assetInfo; + } + private Reference getFirstSubmodelReference(List submodelReferences) { return submodelReferences.get(0); } - private DefaultSubmodel createNewSubmodel() { + private DefaultSubmodel createDummySubmodel() { return new DefaultSubmodel.Builder() .semanticId( new DefaultReference.Builder().keys(new DefaultKey.Builder().value("testKey").build()).build()) diff --git a/basyx.aasservice-core/src/test/java/org/eclipse/digitaltwin/basyx/aasservice/DummyAssetAdministrationShell.java b/basyx.aasservice-core/src/test/java/org/eclipse/digitaltwin/basyx/aasservice/DummyAssetAdministrationShell.java index 7760cbb5..25791163 100644 --- a/basyx.aasservice-core/src/test/java/org/eclipse/digitaltwin/basyx/aasservice/DummyAssetAdministrationShell.java +++ b/basyx.aasservice-core/src/test/java/org/eclipse/digitaltwin/basyx/aasservice/DummyAssetAdministrationShell.java @@ -4,9 +4,11 @@ import java.util.List; import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetKind; import org.eclipse.digitaltwin.aas4j.v3.model.KeyTypes; import org.eclipse.digitaltwin.aas4j.v3.model.Reference; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultAssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultAssetInformation; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultKey; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultReference; @@ -22,7 +24,10 @@ public class DummyAssetAdministrationShell { public static Reference submodelReference = buildDummyReference(); public static AssetAdministrationShell getDummyShell() { - return new DefaultAssetAdministrationShell.Builder().id("arbitrary").build(); + return new DefaultAssetAdministrationShell.Builder().id("arbitrary") + .assetInformation(new DefaultAssetInformation.Builder().assetKind(AssetKind.INSTANCE) + .globalAssetId(buildDummyReference()).build()) + .build(); } /**