Creates xml AAS component
* To Do: Adapt to allow multiple AAS
Change-Id: I20beeb2e663ff183ac2d2b129c771ee00e22e952
Signed-off-by: Ashfaqul Haque <ashfaqul.haque@iese.fraunhofer.de>
diff --git a/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/Dockerfile b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/Dockerfile
new file mode 100644
index 0000000..b0a2f86
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/Dockerfile
@@ -0,0 +1,14 @@
+# Add java runtime environment for execution
+FROM java:8-jdk-alpine
+
+# Copy built jar to image using the jar name specified in the pom.xml (JAR_FILE)
+ARG JAR_FILE
+COPY target/${JAR_FILE} /usr/share/basyxExecutable.jar
+COPY target/lib /usr/share/lib
+
+# Expose the appropriate port. In case of Tomcat, this is 8080.
+ARG PORT
+EXPOSE ${PORT}
+
+# Start the jar
+CMD java -jar "/usr/share/basyxExecutable.jar"
\ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/docker-compose.yml b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/docker-compose.yml
new file mode 100644
index 0000000..aca4d1b
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/docker-compose.yml
@@ -0,0 +1,31 @@
+version: '3'
+services:
+
+ registry:
+ image: ${BASYX_IMAGE_NAME}:${BASYX_IMAGE_TAG}
+ container_name: ${BASYX_CONTAINER_NAME}
+ ports:
+ - ${BASYX_HOST_PORT}:${BASYX_CONTAINER_PORT}
+# depends_on:
+# - postgres
+# volumes:
+# - .\WebContent\WEB-INF\config\directory\sqldirectory\directory.properties:/basys/directory.properties
+# links:
+# - postgres
+
+# postgres:
+# image: postgres:9.4
+# container_name: postgres
+# environment:
+# - POSTGRES_USER:'postgres'
+# - POSTGRES_PASSWORD:'admin'
+# - POSTGRES_DB=basyx-directory
+# volumes:
+# - ./WebContent/WEB-INF/config/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql
+# ports:
+# - 5433:5432
+# expose:
+# - 5432
+
+
+
\ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/pom.xml b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/pom.xml
new file mode 100644
index 0000000..41dff60
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/pom.xml
@@ -0,0 +1,95 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <!--
+ Simple Docker Component
+
+ Serves as a template for simple docker components that do not depend on other docker containers.
+ Do NOT use the included in-memory registry in a productive environment - the entries are not stored permanently
+ -->
+
+ <parent>
+ <groupId>org.eclipse.basyx</groupId>
+ <artifactId>basyx.components.docker</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>basyx.components.xmlAAS</artifactId>
+ <name>BaSyx XML Docker Component</name>
+
+ <properties>
+ <!--
+ basyx.components.executable is the executable class with the definition of the public void main(String[]).
+ It is needed when building the jar in the maven-jar-plugin (see basyx.components.docker/pom.xml)
+ -->
+ <basyx.components.executable>org.eclipse.basyx.components.executable.XMLExecutable</basyx.components.executable>
+ </properties>
+
+ <packaging>jar</packaging>
+
+ <!-- Define additional plugins that are not included by default -->
+ <!-- Plugin configuration is done in parent project(s) -->
+ <build>
+ <plugins>
+ <!-- Attach sources to jar file -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <!--
+ "Docker" profile - do not build & install docker images by default
+ Run "mvn install -Pdocker" in order to include docker
+ -->
+ <id>docker</id>
+ <build>
+ <plugins>
+ <!-- Read maven properties from file -->
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>properties-maven-plugin</artifactId>
+ </plugin>
+
+ <!-- Copy the dependencies necessary to run the jar -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ </plugin>
+
+ <!-- Build the docker image -->
+ <plugin>
+ <groupId>com.spotify</groupId>
+ <artifactId>dockerfile-maven-plugin</artifactId>
+ </plugin>
+
+ <!-- Create integration test environment -->
+ <plugin>
+ <groupId>com.dkanejs.maven.plugins</groupId>
+ <artifactId>docker-compose-maven-plugin</artifactId>
+ </plugin>
+
+ <!-- Run integration tests -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+ <dependencies>
+ <!-- Adds additional classes of the BaSys SDK for tests (for TestRegistryProvider) -->
+ <dependency>
+ <groupId>org.eclipse.basyx</groupId>
+ <artifactId>basyx.sdk</artifactId>
+ <classifier>tests</classifier>
+ </dependency>
+ </dependencies>
+</project>
\ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/java/org/eclipse/basyx/components/executable/XMLExecutable.java b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/java/org/eclipse/basyx/components/executable/XMLExecutable.java
new file mode 100644
index 0000000..9c75559
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/java/org/eclipse/basyx/components/executable/XMLExecutable.java
@@ -0,0 +1,57 @@
+package org.eclipse.basyx.components.executable;
+
+import java.io.IOException;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.eclipse.basyx.components.configuration.BaSyxContextConfiguration;
+import org.eclipse.basyx.components.servlets.XMLAASFactory;
+import org.eclipse.basyx.vab.protocol.http.server.AASHTTPServer;
+import org.eclipse.basyx.vab.protocol.http.server.BaSyxContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
+
+/**
+ * A XML registry servlet based on an InMemory Registry. The servlet therefore
+ * provides an implementation for the IAASRegistryService interface without a
+ * permanent storage capability. it imports AAS from given XML location provided
+ * in the context.properties and maps the AAS to servlet as well
+ *
+ * Do not use this registry in a productive environment - the entries are not
+ * persistent!
+ *
+ * @author haque
+ */
+public class XMLExecutable {
+
+ // Creates a Logger based on the current class
+ private static Logger logger = LoggerFactory.getLogger(XMLExecutable.class);
+
+ // The path the created servlet is mapped to
+ public static final String SERVLET_MAPPING = "/";
+
+ // The server with the servlet that will be created
+ private static AASHTTPServer server;
+
+ // Default constructor
+ private XMLExecutable() {
+ }
+
+ public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
+ logger.info("Starting BaSyx XML registry");
+
+ // Load configuration
+ BaSyxContextConfiguration config = new BaSyxContextConfiguration();
+ config.loadFromResource(BaSyxContextConfiguration.DEFAULT_CONFIG_PATH);
+
+ // Create a context suing the configuration
+ BaSyxContext context = XMLAASFactory.createContext(config);
+
+ // Create and start server
+ server = new AASHTTPServer(context);
+ logger.info("Starting server...");
+ server.start();
+ }
+
+}
\ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/java/org/eclipse/basyx/components/servlets/XMLAASFactory.java b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/java/org/eclipse/basyx/components/servlets/XMLAASFactory.java
new file mode 100644
index 0000000..4fb0281
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/java/org/eclipse/basyx/components/servlets/XMLAASFactory.java
@@ -0,0 +1,229 @@
+package org.eclipse.basyx.components.servlets;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+
+import javax.servlet.http.HttpServlet;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.eclipse.basyx.aas.factory.xml.XMLToMetamodelConverter;
+import org.eclipse.basyx.aas.metamodel.api.IAssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.api.parts.asset.IAsset;
+import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.map.descriptor.SubmodelDescriptor;
+import org.eclipse.basyx.aas.metamodel.map.parts.Asset;
+import org.eclipse.basyx.aas.restapi.AASModelProvider;
+import org.eclipse.basyx.aas.restapi.VABMultiSubmodelProvider;
+import org.eclipse.basyx.components.configuration.BaSyxContextConfiguration;
+import org.eclipse.basyx.submodel.metamodel.api.IElement;
+import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
+import org.eclipse.basyx.submodel.metamodel.api.parts.IConceptDescription;
+import org.eclipse.basyx.submodel.metamodel.map.SubModel;
+import org.eclipse.basyx.submodel.restapi.SubModelProvider;
+import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
+import org.eclipse.basyx.vab.protocol.http.server.BaSyxContext;
+import org.eclipse.basyx.vab.protocol.http.server.VABHTTPInterface;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
+
+/**
+ * It imports AAS from given XML location provided in the context.properties and
+ * maps the AAS to servlet. It also adds the submodels, assets and concept
+ * descriptors to the AAS.
+ *
+ *
+ * @author haque
+ */
+public class XMLAASFactory {
+ // Create a logger instance for current class
+ private static Logger logger = LoggerFactory.getLogger(XMLAASFactory.class);
+
+ /**
+ * Generates a Basyx Context
+ *
+ * @param config Configuration of the Basyx Context
+ * @return context
+ * @throws IOException
+ * @throws SAXException
+ * @throws ParserConfigurationException
+ */
+ public static BaSyxContext createContext(BaSyxContextConfiguration config)
+ throws ParserConfigurationException, SAXException, IOException {
+
+ // Create a Basyx Context from the config
+ BaSyxContext context = new BaSyxContext(config.getContextPath(), config.getDocBasePath(), config.getHostname(),
+ config.getPort());
+
+ // Converts the XML from location to Metamodel
+ XMLToMetamodelConverter converter = convertXMLToMetamodel(config.getProperty("xmlPath"));
+
+ String contextURL = getContextURL(config);
+ addAAS(converter, context, contextURL);
+ return context;
+ }
+
+ /**
+ * Converts XML to Metamodel from XML location
+ *
+ * @param xmlPath the location of the XML
+ * @return Converted Metamodel
+ * @throws IOException
+ * @throws SAXException
+ * @throws ParserConfigurationException
+ */
+ private static XMLToMetamodelConverter convertXMLToMetamodel(String xmlPath)
+ throws ParserConfigurationException, SAXException, IOException {
+ String xmlString = new String(Files.readAllBytes(Paths.get(xmlPath)));
+ return new XMLToMetamodelConverter(xmlString);
+ }
+
+ /**
+ * Adds Asset Administration Shells from the XML to context
+ *
+ * @param converter Converted Metamodel
+ * @param context Basyx Context
+ * @param contextURL URL of the context
+ * @throws IOException
+ * @throws SAXException
+ * @throws ParserConfigurationException
+ */
+ private static void addAAS(XMLToMetamodelConverter converter, BaSyxContext context, String contextURL)
+ throws ParserConfigurationException, SAXException, IOException {
+ // Parse the XML and get all AAS
+ List<IAssetAdministrationShell> AAShells = converter.parseAAS();
+
+ if (AAShells.size() <= 0) {
+ logger.debug("No AAS Found in the XML");
+ return;
+ }
+
+ // Take the first AAS from the XML
+ AssetAdministrationShell aas = (AssetAdministrationShell) AAShells.get(0);
+ AASModelProvider aasProvider = new AASModelProvider(aas);
+ VABMultiSubmodelProvider aasModelProvider = new VABMultiSubmodelProvider();
+ aasModelProvider.setAssetAdministrationShell(aasProvider);
+
+ // Add Submodels. Assets and Concept Descriptions to the AAS
+ addSubmodels(converter, aas, aasModelProvider, contextURL);
+ addAssets(converter, aas);
+ addConceptDescriptions(converter, aas);
+
+ // Create a servlet using the AAS
+ HttpServlet aasServlet = new VABHTTPInterface<IModelProvider>(aasModelProvider);
+
+ String subDomain = getSubDomain(aas);
+ context.addServletMapping(subDomain, aasServlet);
+
+ logger.info("AAS Server started at " + subDomain);
+ }
+
+ /**
+ * Adds Submodels from the XML to the given AAS
+ *
+ * @param converter converted Metamodel
+ * @param aas AAS with which the Submodels will be connected
+ * @param aasProvider
+ * @param contextURL URL of the context
+ */
+ private static void addSubmodels(XMLToMetamodelConverter converter, AssetAdministrationShell aas,
+ VABMultiSubmodelProvider aasProvider, String contextURL) {
+ // Parse the XML to get the submodels
+ List<ISubModel> subModels = converter.parseSubmodels();
+
+ if (subModels.size() <= 0) {
+ logger.debug("No Submodel found in the XML");
+ }
+
+ // Loops through all the submodels and add to AAS
+ for (ISubModel subModel : subModels) {
+ SubModelProvider subModelProvider = new SubModelProvider((SubModel) subModel);
+ String idString = subModel.getIdShort();
+
+ // Add the sub model to the AAS Provider
+ aasProvider.addSubmodel(idString, subModelProvider);
+
+ // Retrieve a submodel URL and connect it to the AAS
+ String submodelUrlString = getSubModelUrl(contextURL, aas.getIdShort(), idString);
+ aas.addSubModel(new SubmodelDescriptor(subModel, submodelUrlString));
+ }
+ }
+
+ /**
+ * Adds Assets from the XML to the given AAS
+ *
+ * @param converter converted Metamodel
+ * @param aas AAS with which the assets will be connected
+ * @throws IOException
+ * @throws SAXException
+ * @throws ParserConfigurationException
+ */
+ private static void addAssets(XMLToMetamodelConverter converter, AssetAdministrationShell aas)
+ throws ParserConfigurationException, SAXException, IOException {
+ // Parse the XML to get the assets
+ List<IAsset> assets = converter.parseAssets();
+
+ if (assets.size() <= 0) {
+ logger.debug("No Assets found in the XML");
+ }
+
+ // Loops through all the assets and add to AAS
+ for (IAsset asset : assets) {
+ aas.setAsset((Asset) asset);
+ }
+ }
+
+ /**
+ * Adds Concept Descriptions from the XML to the given AAS
+ *
+ * @param converter converted Metamodel
+ * @param aas AAS with which the concepts descriptions will be added
+ */
+ private static void addConceptDescriptions(XMLToMetamodelConverter converter, AssetAdministrationShell aas) {
+ // Parse the XML to get the concept descriptions
+ List<IConceptDescription> descriptions = converter.parseConceptDescriptions();
+
+ if (descriptions.size() <= 0) {
+ logger.debug("No Concept Descriptions found in the XML");
+ }
+
+ // Loops through all the concept descriptions and add to AAS
+ for (IConceptDescription description : descriptions) {
+ aas.addConceptDescription(description);
+ }
+ }
+
+ /**
+ * Generate a sub domain to access the Element
+ *
+ * @param element the Element to be accessed by the generated subdomain
+ * @return the subdomain
+ */
+ private static String getSubDomain(IElement element) {
+ return "/" + element.getIdShort() + "/*";
+ }
+
+ /**
+ * Generate submodel api url
+ *
+ * @param aasId Id of the AAS it is connected
+ * @param subModelId id of the submodel
+ *
+ * @return subModel URL
+ */
+ private static String getSubModelUrl(String contextURL, String aasId, String subModelId) {
+ return contextURL + "/" + aasId + "/aas/submodels/" + subModelId + "/submodel";
+ }
+
+ /**
+ * generates context URL
+ *
+ * @param config
+ * @return Context URL
+ */
+ private static String getContextURL(BaSyxContextConfiguration config) {
+ return "http://" + config.getHostname() + ":" + config.getPort() + config.getContextPath();
+ }
+}
\ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/resources/context.properties b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/resources/context.properties
new file mode 100644
index 0000000..a109291
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/resources/context.properties
@@ -0,0 +1,4 @@
+contextPath=/xmlAAS
+contextHostname=localhost
+contextPort=4000
+xmlPath=src/main/resources/xml/in.xml
\ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/resources/logback.xml b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/resources/logback.xml
new file mode 100644
index 0000000..86341d6
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/resources/logback.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<configuration>
+
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+
+ <!-- Example for a filter, which removes all entries not containing "[TEST]" in the message. -->
+
+ <!--<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
+ <evaluator>
+ <expression>return message.contains("[TEST]");</expression>
+ </evaluator>
+ <OnMismatch>DENY</OnMismatch>
+ <OnMatch>NEUTRAL</OnMatch>
+ </filter>-->
+
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
+ </encoder>
+ </appender>
+
+ <root level="INFO">
+ <appender-ref ref="STDOUT" />
+ </root>
+
+</configuration>
\ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/resources/xml/in.xml b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/resources/xml/in.xml
new file mode 100644
index 0000000..1f12966
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/main/resources/xml/in.xml
@@ -0,0 +1,562 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<aas:aasenv xmlns:aas="http://www.admin-shell.io/aas/2/0"
+ xmlns:IEC61360="http://www.admin-shell.io/IEC61360/2/0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.admin-shell.io/aas/2/0 AAS.xsd
+ http://www.admin-shell.io/IEC61360/2/0 IEC61360.xsd">
+ <aas:assetAdministrationShells>
+ <!-- This AAS is populated with all possible fields -->
+ <aas:assetAdministrationShell>
+ <aas:idShort>aas1</aas:idShort>
+ <aas:category>test_category</aas:category>
+ <aas:description>
+ <aas:langString lang="EN">aas_Description</aas:langString>
+ <aas:langString lang="DE">Beschreibung Verwaltungsschale</aas:langString>
+ </aas:description>
+ <aas:parent>
+ <!-- Parent is currently a String in the Schema. But it should be a Reference. -->
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="AssetAdministrationShell">aas_parent_id</aas:key>
+ </aas:keys>
+ </aas:parent>
+ <aas:identification idType="IRI">www.admin-shell.io/aas-sample/1/0</aas:identification>
+ <aas:administration>
+ <aas:version>1</aas:version>
+ <aas:revision>0</aas:revision>
+ </aas:administration>
+ <aas:embeddedDataSpecification>
+ <aas:dataSpecificationContent>
+ <aas:dataSpecificationIEC61360>
+ <IEC61360:preferredName>
+ <IEC61360:langString lang="DE">Drehzahl</IEC61360:langString>
+ <IEC61360:langString lang="EN">Rotation Speed</IEC61360:langString>
+ </IEC61360:preferredName>
+ <IEC61360:shortName>
+ <IEC61360:langString lang="DE">N</IEC61360:langString>
+ </IEC61360:shortName>
+ <IEC61360:unit>1/min</IEC61360:unit>
+ <IEC61360:unitId>
+ <IEC61360:keys>
+ <IEC61360:key idType="IRDI" local="false" type="GlobalReference">
+ 0173-1#05-AAA650#002
+ </IEC61360:key>
+ </IEC61360:keys>
+ </IEC61360:unitId>
+ <IEC61360:valueFormat>NR1..5</IEC61360:valueFormat>
+ </aas:dataSpecificationIEC61360>
+ </aas:dataSpecificationContent>
+ <aas:dataSpecification>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360</aas:key>
+ </aas:keys>
+ </aas:dataSpecification>
+ </aas:embeddedDataSpecification>
+ <aas:derivedFrom>
+ <aas:keys>
+ <aas:key type="ReferenceElement" local="false" idType="IRI">http://pk.festo.com/3s7plfdrs35</aas:key>
+ </aas:keys>
+ </aas:derivedFrom>
+ <aas:assetRef>
+ <aas:keys>
+ <aas:key type="Asset" local="false" idType="IRI">http://pk.festo.com/3s7plfdrs35</aas:key>
+ </aas:keys>
+ </aas:assetRef>
+ <aas:submodelRefs>
+ <aas:submodelRef>
+ <aas:keys>
+ <aas:key type="Submodel" local="true" idType="IRI">"http://www.zvei.de/demo/submodel/12345679"</aas:key>
+ </aas:keys>
+ </aas:submodelRef>
+ <aas:submodelRef>
+ <aas:keys>
+ <aas:key type="Submodel" local="true" idType="IRI">"http://www.zvei.de/demo/submodel/12345679_2"</aas:key>
+ </aas:keys>
+ </aas:submodelRef>
+ </aas:submodelRefs>
+ <aas:views>
+ <!-- This View is populated with all possible fields -->
+ <aas:view>
+ <aas:idShort>SampleView</aas:idShort>
+ <aas:category>test_categogy</aas:category>
+ <aas:description>
+ <aas:langString lang="EN">View_Description</aas:langString>
+ </aas:description>
+ <aas:parent>
+ <!-- Parent is currently a String in the Schema. But it should be a Reference. -->
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">view_parent_id</aas:key>
+ </aas:keys>
+ </aas:parent>
+ <aas:semanticId>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">view_semantic_id</aas:key>
+ </aas:keys>
+ </aas:semanticId>
+ <aas:embeddedDataSpecification>
+ <aas:dataSpecificationContent>
+ <aas:dataSpecificationIEC61360>
+ <IEC61360:preferredName>
+ <IEC61360:langString lang="DE">Drehzahl</IEC61360:langString>
+ <IEC61360:langString lang="EN">Rotation Speed</IEC61360:langString>
+ </IEC61360:preferredName>
+ <IEC61360:shortName>
+ <IEC61360:langString lang="DE">N</IEC61360:langString>
+ </IEC61360:shortName>
+ <IEC61360:unit>1/min</IEC61360:unit>
+ <IEC61360:unitId>
+ <IEC61360:keys>
+ <IEC61360:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</IEC61360:key>
+ </IEC61360:keys>
+ </IEC61360:unitId>
+ <IEC61360:valueFormat>NR1..5</IEC61360:valueFormat>
+ </aas:dataSpecificationIEC61360>
+ </aas:dataSpecificationContent>
+ <aas:dataSpecification>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360</aas:key>
+ </aas:keys>
+ </aas:dataSpecification>
+ </aas:embeddedDataSpecification>
+ <aas:containedElements>
+ <aas:containedElementRef>
+ <aas:keys>
+ <aas:key type="Submodel" local="true" idType="IRI">"http://www.zvei.de/demo/submodel/12345679"</aas:key>
+ <aas:key type="Property" local="true" idType="IdShort">rotationSpeed</aas:key>
+ </aas:keys>
+ </aas:containedElementRef>
+ </aas:containedElements>
+ </aas:view>
+ <!-- This is a View with only the minimal required information in it. To test for Nullpointers and such. -->
+ <aas:view>
+ <aas:idShort>EmptyView</aas:idShort>
+ <aas:containedElements></aas:containedElements>
+ </aas:view>
+ </aas:views>
+ <aas:conceptDictionaries>
+ <aas:conceptDictionary>
+ <aas:idShort>SampleDic</aas:idShort>
+ <aas:conceptDescriptionRefs>
+ <aas:conceptDescriptionRef>
+ <aas:keys>
+ <aas:key type="ConceptDescription" local="true" idType="IRDI">0173-1#02-BAA120#007</aas:key>
+ </aas:keys>
+ </aas:conceptDescriptionRef>
+ <aas:conceptDescriptionRef>
+ <aas:keys>
+ <aas:key type="ConceptDescription" local="true" idType="IRDI">0173-1#02-BAA120#007</aas:key>
+ </aas:keys>
+ </aas:conceptDescriptionRef>
+ </aas:conceptDescriptionRefs>
+ </aas:conceptDictionary>
+ </aas:conceptDictionaries>
+ </aas:assetAdministrationShell>
+
+ </aas:assetAdministrationShells>
+ <aas:assets>
+ <!-- This Asset is populated with all possible fields -->
+ <aas:asset>
+ <aas:idShort>asset1</aas:idShort>
+ <aas:category>asset1_categogy</aas:category>
+ <aas:description>
+ <aas:langString lang="EN">asset1_Description</aas:langString>
+ </aas:description>
+ <aas:parent>
+ <!-- Parent is currently a String in the Schema. But it should be a Reference. -->
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Asset">asset_parent_id</aas:key>
+ </aas:keys>
+ </aas:parent>
+ <aas:identification idType="IRI">http://pk.festo.com/3s7plfdrs35</aas:identification>
+ <aas:administration>
+ <aas:version>1</aas:version>
+ <aas:revision>0</aas:revision>
+ </aas:administration>
+ <aas:embeddedDataSpecification>
+ <aas:dataSpecificationContent>
+ <aas:dataSpecificationIEC61360>
+ <IEC61360:preferredName>
+ <IEC61360:langString lang="DE">Drehzahl</IEC61360:langString>
+ <IEC61360:langString lang="EN">Rotation Speed</IEC61360:langString>
+ </IEC61360:preferredName>
+ <IEC61360:shortName>
+ <IEC61360:langString lang="DE">N</IEC61360:langString>
+ </IEC61360:shortName>
+ <IEC61360:unit>1/min</IEC61360:unit>
+ <IEC61360:unitId>
+ <IEC61360:keys>
+ <IEC61360:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</IEC61360:key>
+ </IEC61360:keys>
+ </IEC61360:unitId>
+ <IEC61360:valueFormat>NR1..5</IEC61360:valueFormat>
+ </aas:dataSpecificationIEC61360>
+ </aas:dataSpecificationContent>
+ <aas:dataSpecification>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360</aas:key>
+ </aas:keys>
+ </aas:dataSpecification>
+ </aas:embeddedDataSpecification>
+ <aas:assetIdentificationModelRef>
+ <aas:keys>
+ <aas:key type="ConceptDescription" local="true" idType="IRI">www.festo.com/dic/08111234</aas:key>
+ </aas:keys>
+ </aas:assetIdentificationModelRef>
+ <aas:kind>Instance</aas:kind>
+ </aas:asset>
+ </aas:assets>
+ <aas:submodels>
+ <!-- This Submodel is populated with all possible fields -->
+ <aas:submodel>
+ <aas:idShort>submodel1</aas:idShort>
+ <aas:category>submodel1_categogy</aas:category>
+ <aas:description>
+ <aas:langString lang="EN">submode1_decription</aas:langString>
+ </aas:description>
+ <aas:parent>
+ <!-- Parent is currently a String in the Schema. But it should be a Reference. -->
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">submodel_parent_id</aas:key>
+ </aas:keys>
+ </aas:parent>
+ <aas:identification idType="IRI">http://www.zvei.de/demo/submodel/12345679</aas:identification>
+ <aas:administration>
+ <aas:version>1</aas:version>
+ <aas:revision>0</aas:revision>
+ </aas:administration>
+ <aas:kind>Instance</aas:kind>
+ <aas:semanticId>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:semanticId>
+ <aas:qualifier>
+ <aas:qualifiers>
+ <aas:formula>
+ <aas:dependsOnRefs>
+ <aas:reference>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">qualifier_reference</aas:key>
+ </aas:keys>
+ </aas:reference>
+ </aas:dependsOnRefs>
+ </aas:formula>
+ </aas:qualifiers>
+ <aas:qualifiers>
+ <aas:qualifier>
+ <aas:valueId>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:valueId>
+ <aas:value>qualifierValue</aas:value>
+ <aas:type>qualifierType</aas:type>
+ <aas:valueType>valueType</aas:valueType>
+ <aas:semanticId>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:semanticId>
+ </aas:qualifier>
+ </aas:qualifiers>
+ </aas:qualifier>
+ <aas:embeddedDataSpecification>
+ <aas:dataSpecificationContent>
+ <aas:dataSpecificationIEC61360>
+ <IEC61360:preferredName>
+ <IEC61360:langString lang="DE">Drehzahl</IEC61360:langString>
+ <IEC61360:langString lang="EN">Rotation Speed</IEC61360:langString>
+ </IEC61360:preferredName>
+ <IEC61360:shortName>
+ <IEC61360:langString lang="DE">N</IEC61360:langString>
+ </IEC61360:shortName>
+ <IEC61360:unit>1/min</IEC61360:unit>
+ <IEC61360:unitId>
+ <IEC61360:keys>
+ <IEC61360:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</IEC61360:key>
+ </IEC61360:keys>
+ </IEC61360:unitId>
+ <IEC61360:valueFormat>NR1..5</IEC61360:valueFormat>
+ </aas:dataSpecificationIEC61360>
+ </aas:dataSpecificationContent>
+ <aas:dataSpecification>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360</aas:key>
+ </aas:keys>
+ </aas:dataSpecification>
+ </aas:embeddedDataSpecification>
+ <aas:submodelElements>
+ <aas:submodelElement>
+ <aas:property>
+ <aas:idShort>rotationSpeed</aas:idShort>
+ <aas:category>VARIABLE</aas:category>
+ <aas:semanticId>
+ <aas:keys>
+ <aas:key idType="IRI" type="ConceptDescription" local="true">www.festo.com/dic/08111234</aas:key>
+ </aas:keys>
+ </aas:semanticId>
+ <aas:qualifier>
+ <aas:qualifiers>
+ <aas:qualifier>
+ <aas:valueId>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:valueId>
+ <aas:value>qualifierValue</aas:value>
+ <aas:type>qualifierType</aas:type>
+ <aas:valueType>valueType</aas:valueType>
+ <aas:semanticId>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:semanticId>
+ </aas:qualifier>
+ </aas:qualifiers>
+ </aas:qualifier>
+ <aas:value>2000</aas:value>
+ <aas:valueType>double</aas:valueType>
+ </aas:property>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:property>
+ <aas:idShort>emptyDouble</aas:idShort>
+ <aas:valueType>double</aas:valueType>
+ </aas:property>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:basicEvent>
+ <aas:idShort>basic_event_id</aas:idShort>
+ <aas:observed>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:observed>
+ </aas:basicEvent>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:entity>
+ <aas:idShort>entity_id</aas:idShort>
+ <aas:assetRef>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:assetRef>
+ <aas:statements>
+ <aas:submodelElement>
+ <aas:file>
+ <aas:idShort>file_ID</aas:idShort>
+ <aas:mimeType>file_mimetype</aas:mimeType>
+ <aas:value>file_value</aas:value>
+ </aas:file>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:range>
+ <aas:idShort>range_id</aas:idShort>
+ <aas:valueType>int</aas:valueType>
+ <aas:min>10</aas:min>
+ </aas:range>
+ </aas:submodelElement>
+ </aas:statements>
+ <aas:entityType>CoManagedEntity</aas:entityType>
+ </aas:entity>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:multiLanguageProperty>
+ <aas:idShort>multi_language_property_id</aas:idShort>
+ <aas:valueId>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</aas:key>
+ </aas:keys>
+ </aas:valueId>
+ <aas:value>
+ <aas:langString lang="DE">Eine Beschreibung auf deutsch</aas:langString>
+ <aas:langString lang="EN">A description in english</aas:langString>
+ </aas:value>
+ </aas:multiLanguageProperty>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:range>
+ <aas:idShort>range_id</aas:idShort>
+ <aas:valueType>int</aas:valueType>
+ <aas:min>1</aas:min>
+ <aas:max>10</aas:max>
+ </aas:range>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:file>
+ <aas:idShort>file_id</aas:idShort>
+ <aas:mimeType>file_mimetype</aas:mimeType>
+ <aas:value>file_value</aas:value>
+ </aas:file>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:blob>
+ <aas:idShort>blob_id</aas:idShort>
+ <aas:value>YmxvYit2YWx1ZQ==</aas:value>
+ <aas:mimeType>blob_mimetype</aas:mimeType>
+ </aas:blob>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:referenceElement>
+ <aas:idShort>reference_ELE_ID</aas:idShort>
+ <aas:value>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</aas:key>
+ </aas:keys>
+ </aas:value>
+ </aas:referenceElement>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:submodelElementCollection>
+ <aas:idShort>submodelElementCollection_ID</aas:idShort>
+ <aas:allowDuplicates>true</aas:allowDuplicates>
+ <aas:ordered>false</aas:ordered>
+ <aas:value>
+ <aas:submodelElement>
+ <aas:file>
+ <aas:idShort>file_ID</aas:idShort>
+ <aas:mimeType>file_mimetype</aas:mimeType>
+ <aas:value>file_value</aas:value>
+ </aas:file>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:blob>
+ <aas:idShort>blob_id</aas:idShort>
+ <aas:value>YmxvYit2YWx1ZQ==</aas:value>
+ <aas:mimeType>blob_mimetype</aas:mimeType>
+ </aas:blob>
+ </aas:submodelElement>
+ </aas:value>
+ </aas:submodelElementCollection>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:relationshipElement>
+ <aas:idShort>relationshipElement_ID</aas:idShort>
+ <aas:first>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#001</aas:key>
+ </aas:keys>
+ </aas:first>
+ <aas:second>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</aas:key>
+ </aas:keys>
+ </aas:second>
+ </aas:relationshipElement>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:operation>
+ <aas:idShort>operation_ID</aas:idShort>
+ <aas:inputVariable>
+ <!-- The schema only allows one opVar in inputVariable, one in outputVariable and one in inoutputVariable. The Metamodel allows 0..* in each -->
+ <!-- To be able to have multiple Vars they are surrounded by <aas:operationVariable>. This is also violating the Schema. -->
+ <aas:operationVariable>
+ <aas:value>
+ <aas:file>
+ <aas:idShort>file_ID</aas:idShort>
+ <aas:mimeType>file_mimetype</aas:mimeType>
+ <aas:value>file_value</aas:value>
+ </aas:file>
+ </aas:value>
+ </aas:operationVariable>
+ <aas:operationVariable>
+ <aas:value>
+ <aas:blob>
+ <aas:idShort>blob_ID</aas:idShort>
+ <aas:value>YmxvYit2YWx1ZQ==</aas:value>
+ <aas:mimeType>blob_mimetype</aas:mimeType>
+ </aas:blob>
+ </aas:value>
+ </aas:operationVariable>
+ </aas:inputVariable>
+ <aas:outputVariable>
+ <aas:operationVariable>
+ <aas:value>
+ <aas:referenceElement>
+ <aas:idShort>reference_ELE_ID</aas:idShort>
+ <aas:value>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</aas:key>
+ </aas:keys>
+ </aas:value>
+ </aas:referenceElement>
+ </aas:value>
+ </aas:operationVariable>
+ </aas:outputVariable>
+ <aas:inoutputVariable>
+ <aas:operationVariable>
+ <aas:value>
+ <aas:referenceElement>
+ <aas:idShort>reference_ELE_ID2</aas:idShort>
+ <aas:value>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#003</aas:key>
+ </aas:keys>
+ </aas:value>
+ </aas:referenceElement>
+ </aas:value>
+ </aas:operationVariable>
+ </aas:inoutputVariable>
+ </aas:operation>
+ </aas:submodelElement>
+ </aas:submodelElements>
+ </aas:submodel>
+
+ </aas:submodels>
+ <aas:conceptDescriptions>
+ <!-- This ConceptDescription is populated with all possible fields -->
+ <aas:conceptDescription>
+ <aas:idShort>conceptDescription1</aas:idShort>
+ <aas:category>cs_categogy</aas:category>
+ <aas:description>
+ <aas:langString lang="EN">conceptDescription_Description</aas:langString>
+ </aas:description>
+ <aas:parent>
+ <!-- Parent is currently a String in the Schema. But it should be a Reference. -->
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="ConceptDescription">cs_parent_id</aas:key>
+ </aas:keys>
+ </aas:parent>
+ <aas:identification idType="IRI">www.festo.com/dic/08111234</aas:identification>
+ <aas:administration>
+ <aas:version>1</aas:version>
+ <aas:revision>0</aas:revision>
+ </aas:administration>
+ <aas:embeddedDataSpecification>
+ <aas:dataSpecificationContent>
+ <aas:dataSpecificationIEC61360>
+ <IEC61360:preferredName>
+ <IEC61360:langString lang="DE">Drehzahl</IEC61360:langString>
+ <IEC61360:langString lang="EN">Rotation Speed</IEC61360:langString>
+ </IEC61360:preferredName>
+ <IEC61360:shortName>
+ <IEC61360:langString lang="DE">N</IEC61360:langString>
+ </IEC61360:shortName>
+ <IEC61360:unit>1/min</IEC61360:unit>
+ <IEC61360:unitId>
+ <IEC61360:keys>
+ <IEC61360:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</IEC61360:key>
+ </IEC61360:keys>
+ </IEC61360:unitId>
+ <IEC61360:valueFormat>NR1..5</IEC61360:valueFormat>
+ </aas:dataSpecificationIEC61360>
+ </aas:dataSpecificationContent>
+ <aas:dataSpecification>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360</aas:key>
+ </aas:keys>
+ </aas:dataSpecification>
+ </aas:embeddedDataSpecification>
+ <aas:isCaseOf>
+ <aas:keys>
+ <aas:key idType="IRI" type="ConceptDescription" local="true">www.festo.com/dic/08111234</aas:key>
+ <aas:key idType="IRI" type="ConceptDescription" local="true">www.festo.com/dic/08111234_2</aas:key>
+ </aas:keys>
+ </aas:isCaseOf>
+ </aas:conceptDescription>
+ <!-- This is a ConceptDescription with only the minimal required information in it. To test for Nullpointers and such. -->
+ <aas:conceptDescription>
+ <aas:idShort>conceptDescription2</aas:idShort>
+ <aas:identification idType="IRI">www.festo.com/dic/08111234</aas:identification>
+ </aas:conceptDescription>
+ </aas:conceptDescriptions>
+</aas:aasenv>
\ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/test/java/org/eclipse/basyx/regression/docker/ITInXMLAAS.java b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/test/java/org/eclipse/basyx/regression/docker/ITInXMLAAS.java
new file mode 100644
index 0000000..a695129
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/test/java/org/eclipse/basyx/regression/docker/ITInXMLAAS.java
@@ -0,0 +1,119 @@
+package org.eclipse.basyx.regression.docker;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Map;
+
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.aas.metamodel.api.parts.asset.IAsset;
+import org.eclipse.basyx.aas.metamodel.connected.ConnectedAssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.map.descriptor.AASDescriptor;
+import org.eclipse.basyx.aas.metamodel.map.descriptor.ModelUrn;
+import org.eclipse.basyx.aas.registration.api.IAASRegistryService;
+import org.eclipse.basyx.aas.registration.memory.InMemoryRegistry;
+import org.eclipse.basyx.components.configuration.BaSyxContextConfiguration;
+import org.eclipse.basyx.components.configuration.BaSyxDockerConfiguration;
+import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.vab.protocol.api.IConnectorProvider;
+import org.eclipse.basyx.vab.protocol.http.connector.HTTPConnectorProvider;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ITInXMLAAS {
+ private static Logger logger = LoggerFactory.getLogger(ITInXMLAAS.class);
+
+ private static String registryUrl;
+ private IAASRegistryService registry;
+
+ private String aasShortId = "aas1";
+ private IIdentifier aasId = new ModelUrn("urn:de.FHG:devices.es.iese:aas:1.0:1:registryAAS#001");
+ private String aasEndpoint = "http://localhost:4000/registry/aas1/aas";
+ private String submodelShortId = "submodel1";
+ private String assetId = "asset1";
+
+ @BeforeClass
+ public static void setUpClass() {
+ logger.info("Running integration test...");
+
+ logger.info("Loading servlet configuration");
+ // Load the servlet configuration inside of the docker configuration from properties file
+ BaSyxContextConfiguration contextConfig = new BaSyxContextConfiguration();
+ contextConfig.loadFromResource(BaSyxContextConfiguration.DEFAULT_CONFIG_PATH);
+
+ // Load the docker environment configuration from properties file
+ logger.info("Loading docker configuration");
+ BaSyxDockerConfiguration dockerConfig = new BaSyxDockerConfiguration();
+ dockerConfig.loadFromResource(BaSyxDockerConfiguration.DEFAULT_CONFIG_PATH);
+
+ // registryUrl = "http://localhost:4000/registry";
+ registryUrl = "http://localhost:" + dockerConfig.getHostPort() + contextConfig.getContextPath();
+ logger.info("Registry URL for integration test: " + registryUrl);
+ }
+
+ /**
+ * Before each test, a dummy registry is created and an AAS is added in the
+ * registry
+ */
+ @Before
+ public void setUp() {
+ try {
+ // Create a dummy registry to test integration of XML AAS
+ registry = new InMemoryRegistry();
+ AASDescriptor descriptor = new AASDescriptor(aasShortId, aasId, aasEndpoint);
+ registry.register(descriptor);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Remove registry entries after each test
+ */
+ @After
+ public void tearDown() {
+ }
+
+
+ @Test
+ public void testGetSingleAAS() throws Exception {
+ ConnectedAssetAdministrationShell connectedAssetAdministrationShell = getConnectedAssetAdministrationShell();
+ assertEquals(aasShortId, connectedAssetAdministrationShell.getIdShort());
+ }
+
+ @Test
+ public void testGetSingleSubmodel() throws Exception {
+ ConnectedAssetAdministrationShell connectedAssetAdministrationShell = getConnectedAssetAdministrationShell();
+ Map<String, ISubModel> submodels = connectedAssetAdministrationShell.getSubModels();
+ ISubModel subModel = submodels.get(submodelShortId);
+ assertEquals(submodelShortId, subModel.getIdShort());
+ }
+
+ @Test
+ public void testGetSingleAsset() throws Exception {
+ ConnectedAssetAdministrationShell connectedAssetAdministrationShell = getConnectedAssetAdministrationShell();
+ IAsset asset = connectedAssetAdministrationShell.getAsset();
+ assertEquals(asset.getIdShort(), assetId);
+ }
+
+ /**
+ * Get connected Asset Administration Shell from the registry
+ *
+ * @return connected AAS
+ * @throws Exception
+ */
+ private ConnectedAssetAdministrationShell getConnectedAssetAdministrationShell() throws Exception {
+ // Create a ConnectedAssetAdministrationShell using a
+ // ConnectedAssetAdministrationShellManager
+ IConnectorProvider connectorProvider = new HTTPConnectorProvider();
+ ConnectedAssetAdministrationShellManager manager = new ConnectedAssetAdministrationShellManager(registry,
+ connectorProvider);
+
+ // return the connected AAS
+ return manager.retrieveAAS(aasId);
+ }
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/test/resources/.env b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/test/resources/.env
new file mode 100644
index 0000000..226a4c9
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/test/resources/.env
@@ -0,0 +1,5 @@
+BASYX_HOST_PORT=8083
+BASYX_CONTAINER_PORT=4000
+BASYX_IMAGE_NAME=basys/aas-xml
+BASYX_CONTAINER_NAME=aas-xml
+BASYX_IMAGE_TAG=0.0.1-SNAPSHOT
\ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/test/resources/context.properties b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/test/resources/context.properties
new file mode 100644
index 0000000..3abc9d0
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/test/resources/context.properties
@@ -0,0 +1,4 @@
+contextPath=/xmlAAS
+contextHostname=localhost
+contextPort=4000
+xmlPath=src/test/resources/xml/in.xml
\ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/test/resources/xml/in.xml b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/test/resources/xml/in.xml
new file mode 100644
index 0000000..dee291f
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.xmlAAS/src/test/resources/xml/in.xml
@@ -0,0 +1,566 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<aas:aasenv xmlns:aas="http://www.admin-shell.io/aas/2/0"
+ xmlns:IEC61360="http://www.admin-shell.io/IEC61360/2/0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.admin-shell.io/aas/2/0 AAS.xsd
+ http://www.admin-shell.io/IEC61360/2/0 IEC61360.xsd">
+ <aas:assetAdministrationShells>
+ <!-- This AAS is populated with all possible fields -->
+ <aas:assetAdministrationShell>
+ <aas:idShort>aas1</aas:idShort>
+ <aas:category>test_category</aas:category>
+ <aas:description>
+ <aas:langString lang="EN">aas_Description</aas:langString>
+ <aas:langString lang="DE">Beschreibung Verwaltungsschale</aas:langString>
+ </aas:description>
+ <aas:parent>
+ <!-- Parent is currently a String in the Schema. But it should be a Reference. -->
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="AssetAdministrationShell">aas_parent_id</aas:key>
+ </aas:keys>
+ </aas:parent>
+ <aas:identification idType="IRI">www.admin-shell.io/aas-sample/1/0</aas:identification>
+ <aas:administration>
+ <aas:version>1</aas:version>
+ <aas:revision>0</aas:revision>
+ </aas:administration>
+ <aas:embeddedDataSpecification>
+ <aas:dataSpecificationContent>
+ <aas:dataSpecificationIEC61360>
+ <IEC61360:preferredName>
+ <IEC61360:langString lang="DE">Drehzahl</IEC61360:langString>
+ <IEC61360:langString lang="EN">Rotation Speed</IEC61360:langString>
+ </IEC61360:preferredName>
+ <IEC61360:shortName>
+ <IEC61360:langString lang="DE">N</IEC61360:langString>
+ </IEC61360:shortName>
+ <IEC61360:unit>1/min</IEC61360:unit>
+ <IEC61360:unitId>
+ <IEC61360:keys>
+ <IEC61360:key idType="IRDI" local="false" type="GlobalReference">
+ 0173-1#05-AAA650#002
+ </IEC61360:key>
+ </IEC61360:keys>
+ </IEC61360:unitId>
+ <IEC61360:valueFormat>NR1..5</IEC61360:valueFormat>
+ </aas:dataSpecificationIEC61360>
+ </aas:dataSpecificationContent>
+ <aas:dataSpecification>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360</aas:key>
+ </aas:keys>
+ </aas:dataSpecification>
+ </aas:embeddedDataSpecification>
+ <aas:derivedFrom>
+ <aas:keys>
+ <aas:key type="ReferenceElement" local="false" idType="IRI">http://pk.festo.com/3s7plfdrs35</aas:key>
+ </aas:keys>
+ </aas:derivedFrom>
+ <aas:assetRef>
+ <aas:keys>
+ <aas:key type="Asset" local="false" idType="IRI">http://pk.festo.com/3s7plfdrs35</aas:key>
+ </aas:keys>
+ </aas:assetRef>
+ <aas:submodelRefs>
+ <aas:submodelRef>
+ <aas:keys>
+ <aas:key type="Submodel" local="true" idType="IRI">"http://www.zvei.de/demo/submodel/12345679"</aas:key>
+ </aas:keys>
+ </aas:submodelRef>
+ <aas:submodelRef>
+ <aas:keys>
+ <aas:key type="Submodel" local="true" idType="IRI">"http://www.zvei.de/demo/submodel/12345679_2"</aas:key>
+ </aas:keys>
+ </aas:submodelRef>
+ </aas:submodelRefs>
+ <aas:views>
+ <!-- This View is populated with all possible fields -->
+ <aas:view>
+ <aas:idShort>SampleView</aas:idShort>
+ <aas:category>test_categogy</aas:category>
+ <aas:description>
+ <aas:langString lang="EN">View_Description</aas:langString>
+ </aas:description>
+ <aas:parent>
+ <!-- Parent is currently a String in the Schema. But it should be a Reference. -->
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">view_parent_id</aas:key>
+ </aas:keys>
+ </aas:parent>
+ <aas:semanticId>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">view_semantic_id</aas:key>
+ </aas:keys>
+ </aas:semanticId>
+ <aas:embeddedDataSpecification>
+ <aas:dataSpecificationContent>
+ <aas:dataSpecificationIEC61360>
+ <IEC61360:preferredName>
+ <IEC61360:langString lang="DE">Drehzahl</IEC61360:langString>
+ <IEC61360:langString lang="EN">Rotation Speed</IEC61360:langString>
+ </IEC61360:preferredName>
+ <IEC61360:shortName>
+ <IEC61360:langString lang="DE">N</IEC61360:langString>
+ </IEC61360:shortName>
+ <IEC61360:unit>1/min</IEC61360:unit>
+ <IEC61360:unitId>
+ <IEC61360:keys>
+ <IEC61360:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</IEC61360:key>
+ </IEC61360:keys>
+ </IEC61360:unitId>
+ <IEC61360:valueFormat>NR1..5</IEC61360:valueFormat>
+ </aas:dataSpecificationIEC61360>
+ </aas:dataSpecificationContent>
+ <aas:dataSpecification>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360</aas:key>
+ </aas:keys>
+ </aas:dataSpecification>
+ </aas:embeddedDataSpecification>
+ <aas:containedElements>
+ <aas:containedElementRef>
+ <aas:keys>
+ <aas:key type="Submodel" local="true" idType="IRI">"http://www.zvei.de/demo/submodel/12345679"</aas:key>
+ <aas:key type="Property" local="true" idType="IdShort">rotationSpeed</aas:key>
+ </aas:keys>
+ </aas:containedElementRef>
+ </aas:containedElements>
+ </aas:view>
+ <!-- This is a View with only the minimal required information in it. To test for Nullpointers and such. -->
+ <aas:view>
+ <aas:idShort>EmptyView</aas:idShort>
+ <aas:containedElements></aas:containedElements>
+ </aas:view>
+ </aas:views>
+ <aas:conceptDictionaries>
+ <aas:conceptDictionary>
+ <aas:idShort>SampleDic</aas:idShort>
+ <aas:conceptDescriptionRefs>
+ <aas:conceptDescriptionRef>
+ <aas:keys>
+ <aas:key type="ConceptDescription" local="true" idType="IRDI">0173-1#02-BAA120#007</aas:key>
+ </aas:keys>
+ </aas:conceptDescriptionRef>
+ <aas:conceptDescriptionRef>
+ <aas:keys>
+ <aas:key type="ConceptDescription" local="true" idType="IRDI">0173-1#02-BAA120#007</aas:key>
+ </aas:keys>
+ </aas:conceptDescriptionRef>
+ </aas:conceptDescriptionRefs>
+ </aas:conceptDictionary>
+ </aas:conceptDictionaries>
+ </aas:assetAdministrationShell>
+
+ </aas:assetAdministrationShells>
+ <aas:assets>
+ <!-- This Asset is populated with all possible fields -->
+ <aas:asset>
+ <aas:idShort>asset1</aas:idShort>
+ <aas:category>asset1_categogy</aas:category>
+ <aas:description>
+ <aas:langString lang="EN">asset1_Description</aas:langString>
+ </aas:description>
+ <aas:parent>
+ <!-- Parent is currently a String in the Schema. But it should be a Reference. -->
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Asset">asset_parent_id</aas:key>
+ </aas:keys>
+ </aas:parent>
+ <aas:identification idType="IRI">http://pk.festo.com/3s7plfdrs35</aas:identification>
+ <aas:administration>
+ <aas:version>1</aas:version>
+ <aas:revision>0</aas:revision>
+ </aas:administration>
+ <aas:embeddedDataSpecification>
+ <aas:dataSpecificationContent>
+ <aas:dataSpecificationIEC61360>
+ <IEC61360:preferredName>
+ <IEC61360:langString lang="DE">Drehzahl</IEC61360:langString>
+ <IEC61360:langString lang="EN">Rotation Speed</IEC61360:langString>
+ </IEC61360:preferredName>
+ <IEC61360:shortName>
+ <IEC61360:langString lang="DE">N</IEC61360:langString>
+ </IEC61360:shortName>
+ <IEC61360:unit>1/min</IEC61360:unit>
+ <IEC61360:unitId>
+ <IEC61360:keys>
+ <IEC61360:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</IEC61360:key>
+ </IEC61360:keys>
+ </IEC61360:unitId>
+ <IEC61360:valueFormat>NR1..5</IEC61360:valueFormat>
+ </aas:dataSpecificationIEC61360>
+ </aas:dataSpecificationContent>
+ <aas:dataSpecification>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360</aas:key>
+ </aas:keys>
+ </aas:dataSpecification>
+ </aas:embeddedDataSpecification>
+ <aas:assetIdentificationModelRef>
+ <aas:keys>
+ <aas:key type="ConceptDescription" local="true" idType="IRI">www.festo.com/dic/08111234</aas:key>
+ </aas:keys>
+ </aas:assetIdentificationModelRef>
+ <aas:kind>Instance</aas:kind>
+ </aas:asset>
+ <aas:asset>
+ <aas:idShort>emptyAsset</aas:idShort>
+ <aas:identification idType="IRI">http://pk.festo.com/q30j38dlajx</aas:identification>
+ </aas:asset>
+ </aas:assets>
+ <aas:submodels>
+ <!-- This Submodel is populated with all possible fields -->
+ <aas:submodel>
+ <aas:idShort>submodel1</aas:idShort>
+ <aas:category>submodel1_categogy</aas:category>
+ <aas:description>
+ <aas:langString lang="EN">submode1_decription</aas:langString>
+ </aas:description>
+ <aas:parent>
+ <!-- Parent is currently a String in the Schema. But it should be a Reference. -->
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">submodel_parent_id</aas:key>
+ </aas:keys>
+ </aas:parent>
+ <aas:identification idType="IRI">http://www.zvei.de/demo/submodel/12345679</aas:identification>
+ <aas:administration>
+ <aas:version>1</aas:version>
+ <aas:revision>0</aas:revision>
+ </aas:administration>
+ <aas:kind>Instance</aas:kind>
+ <aas:semanticId>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:semanticId>
+ <aas:qualifier>
+ <aas:qualifiers>
+ <aas:formula>
+ <aas:dependsOnRefs>
+ <aas:reference>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">qualifier_reference</aas:key>
+ </aas:keys>
+ </aas:reference>
+ </aas:dependsOnRefs>
+ </aas:formula>
+ </aas:qualifiers>
+ <aas:qualifiers>
+ <aas:qualifier>
+ <aas:valueId>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:valueId>
+ <aas:value>qualifierValue</aas:value>
+ <aas:type>qualifierType</aas:type>
+ <aas:valueType>valueType</aas:valueType>
+ <aas:semanticId>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:semanticId>
+ </aas:qualifier>
+ </aas:qualifiers>
+ </aas:qualifier>
+ <aas:embeddedDataSpecification>
+ <aas:dataSpecificationContent>
+ <aas:dataSpecificationIEC61360>
+ <IEC61360:preferredName>
+ <IEC61360:langString lang="DE">Drehzahl</IEC61360:langString>
+ <IEC61360:langString lang="EN">Rotation Speed</IEC61360:langString>
+ </IEC61360:preferredName>
+ <IEC61360:shortName>
+ <IEC61360:langString lang="DE">N</IEC61360:langString>
+ </IEC61360:shortName>
+ <IEC61360:unit>1/min</IEC61360:unit>
+ <IEC61360:unitId>
+ <IEC61360:keys>
+ <IEC61360:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</IEC61360:key>
+ </IEC61360:keys>
+ </IEC61360:unitId>
+ <IEC61360:valueFormat>NR1..5</IEC61360:valueFormat>
+ </aas:dataSpecificationIEC61360>
+ </aas:dataSpecificationContent>
+ <aas:dataSpecification>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360</aas:key>
+ </aas:keys>
+ </aas:dataSpecification>
+ </aas:embeddedDataSpecification>
+ <aas:submodelElements>
+ <aas:submodelElement>
+ <aas:property>
+ <aas:idShort>rotationSpeed</aas:idShort>
+ <aas:category>VARIABLE</aas:category>
+ <aas:semanticId>
+ <aas:keys>
+ <aas:key idType="IRI" type="ConceptDescription" local="true">www.festo.com/dic/08111234</aas:key>
+ </aas:keys>
+ </aas:semanticId>
+ <aas:qualifier>
+ <aas:qualifiers>
+ <aas:qualifier>
+ <aas:valueId>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:valueId>
+ <aas:value>qualifierValue</aas:value>
+ <aas:type>qualifierType</aas:type>
+ <aas:valueType>valueType</aas:valueType>
+ <aas:semanticId>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:semanticId>
+ </aas:qualifier>
+ </aas:qualifiers>
+ </aas:qualifier>
+ <aas:value>2000</aas:value>
+ <aas:valueType>double</aas:valueType>
+ </aas:property>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:property>
+ <aas:idShort>emptyDouble</aas:idShort>
+ <aas:valueType>double</aas:valueType>
+ </aas:property>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:basicEvent>
+ <aas:idShort>basic_event_id</aas:idShort>
+ <aas:observed>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:observed>
+ </aas:basicEvent>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:entity>
+ <aas:idShort>entity_id</aas:idShort>
+ <aas:assetRef>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="Submodel">http://www.zvei.de/demo/submodelDefinitions/87654346</aas:key>
+ </aas:keys>
+ </aas:assetRef>
+ <aas:statements>
+ <aas:submodelElement>
+ <aas:file>
+ <aas:idShort>file_ID</aas:idShort>
+ <aas:mimeType>file_mimetype</aas:mimeType>
+ <aas:value>file_value</aas:value>
+ </aas:file>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:range>
+ <aas:idShort>range_id</aas:idShort>
+ <aas:valueType>int</aas:valueType>
+ <aas:min>10</aas:min>
+ </aas:range>
+ </aas:submodelElement>
+ </aas:statements>
+ <aas:entityType>CoManagedEntity</aas:entityType>
+ </aas:entity>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:multiLanguageProperty>
+ <aas:idShort>multi_language_property_id</aas:idShort>
+ <aas:valueId>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</aas:key>
+ </aas:keys>
+ </aas:valueId>
+ <aas:value>
+ <aas:langString lang="DE">Eine Beschreibung auf deutsch</aas:langString>
+ <aas:langString lang="EN">A description in english</aas:langString>
+ </aas:value>
+ </aas:multiLanguageProperty>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:range>
+ <aas:idShort>range_id</aas:idShort>
+ <aas:valueType>int</aas:valueType>
+ <aas:min>1</aas:min>
+ <aas:max>10</aas:max>
+ </aas:range>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:file>
+ <aas:idShort>file_id</aas:idShort>
+ <aas:mimeType>file_mimetype</aas:mimeType>
+ <aas:value>file_value</aas:value>
+ </aas:file>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:blob>
+ <aas:idShort>blob_id</aas:idShort>
+ <aas:value>YmxvYit2YWx1ZQ==</aas:value>
+ <aas:mimeType>blob_mimetype</aas:mimeType>
+ </aas:blob>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:referenceElement>
+ <aas:idShort>reference_ELE_ID</aas:idShort>
+ <aas:value>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</aas:key>
+ </aas:keys>
+ </aas:value>
+ </aas:referenceElement>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:submodelElementCollection>
+ <aas:idShort>submodelElementCollection_ID</aas:idShort>
+ <aas:allowDuplicates>true</aas:allowDuplicates>
+ <aas:ordered>false</aas:ordered>
+ <aas:value>
+ <aas:submodelElement>
+ <aas:file>
+ <aas:idShort>file_ID</aas:idShort>
+ <aas:mimeType>file_mimetype</aas:mimeType>
+ <aas:value>file_value</aas:value>
+ </aas:file>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:blob>
+ <aas:idShort>blob_id</aas:idShort>
+ <aas:value>YmxvYit2YWx1ZQ==</aas:value>
+ <aas:mimeType>blob_mimetype</aas:mimeType>
+ </aas:blob>
+ </aas:submodelElement>
+ </aas:value>
+ </aas:submodelElementCollection>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:relationshipElement>
+ <aas:idShort>relationshipElement_ID</aas:idShort>
+ <aas:first>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#001</aas:key>
+ </aas:keys>
+ </aas:first>
+ <aas:second>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</aas:key>
+ </aas:keys>
+ </aas:second>
+ </aas:relationshipElement>
+ </aas:submodelElement>
+ <aas:submodelElement>
+ <aas:operation>
+ <aas:idShort>operation_ID</aas:idShort>
+ <aas:inputVariable>
+ <!-- The schema only allows one opVar in inputVariable, one in outputVariable and one in inoutputVariable. The Metamodel allows 0..* in each -->
+ <!-- To be able to have multiple Vars they are surrounded by <aas:operationVariable>. This is also violating the Schema. -->
+ <aas:operationVariable>
+ <aas:value>
+ <aas:file>
+ <aas:idShort>file_ID</aas:idShort>
+ <aas:mimeType>file_mimetype</aas:mimeType>
+ <aas:value>file_value</aas:value>
+ </aas:file>
+ </aas:value>
+ </aas:operationVariable>
+ <aas:operationVariable>
+ <aas:value>
+ <aas:blob>
+ <aas:idShort>blob_ID</aas:idShort>
+ <aas:value>YmxvYit2YWx1ZQ==</aas:value>
+ <aas:mimeType>blob_mimetype</aas:mimeType>
+ </aas:blob>
+ </aas:value>
+ </aas:operationVariable>
+ </aas:inputVariable>
+ <aas:outputVariable>
+ <aas:operationVariable>
+ <aas:value>
+ <aas:referenceElement>
+ <aas:idShort>reference_ELE_ID</aas:idShort>
+ <aas:value>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</aas:key>
+ </aas:keys>
+ </aas:value>
+ </aas:referenceElement>
+ </aas:value>
+ </aas:operationVariable>
+ </aas:outputVariable>
+ <aas:inoutputVariable>
+ <aas:operationVariable>
+ <aas:value>
+ <aas:referenceElement>
+ <aas:idShort>reference_ELE_ID2</aas:idShort>
+ <aas:value>
+ <aas:keys>
+ <aas:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#003</aas:key>
+ </aas:keys>
+ </aas:value>
+ </aas:referenceElement>
+ </aas:value>
+ </aas:operationVariable>
+ </aas:inoutputVariable>
+ </aas:operation>
+ </aas:submodelElement>
+ </aas:submodelElements>
+ </aas:submodel>
+
+ </aas:submodels>
+ <aas:conceptDescriptions>
+ <!-- This ConceptDescription is populated with all possible fields -->
+ <aas:conceptDescription>
+ <aas:idShort>conceptDescription1</aas:idShort>
+ <aas:category>cs_categogy</aas:category>
+ <aas:description>
+ <aas:langString lang="EN">conceptDescription_Description</aas:langString>
+ </aas:description>
+ <aas:parent>
+ <!-- Parent is currently a String in the Schema. But it should be a Reference. -->
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="ConceptDescription">cs_parent_id</aas:key>
+ </aas:keys>
+ </aas:parent>
+ <aas:identification idType="IRI">www.festo.com/dic/08111234</aas:identification>
+ <aas:administration>
+ <aas:version>1</aas:version>
+ <aas:revision>0</aas:revision>
+ </aas:administration>
+ <aas:embeddedDataSpecification>
+ <aas:dataSpecificationContent>
+ <aas:dataSpecificationIEC61360>
+ <IEC61360:preferredName>
+ <IEC61360:langString lang="DE">Drehzahl</IEC61360:langString>
+ <IEC61360:langString lang="EN">Rotation Speed</IEC61360:langString>
+ </IEC61360:preferredName>
+ <IEC61360:shortName>
+ <IEC61360:langString lang="DE">N</IEC61360:langString>
+ </IEC61360:shortName>
+ <IEC61360:unit>1/min</IEC61360:unit>
+ <IEC61360:unitId>
+ <IEC61360:keys>
+ <IEC61360:key local="false" type="GlobalReference" idType="IRDI">0173-1#05-AAA650#002</IEC61360:key>
+ </IEC61360:keys>
+ </IEC61360:unitId>
+ <IEC61360:valueFormat>NR1..5</IEC61360:valueFormat>
+ </aas:dataSpecificationIEC61360>
+ </aas:dataSpecificationContent>
+ <aas:dataSpecification>
+ <aas:keys>
+ <aas:key idType="IRI" local="false" type="GlobalReference">www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360</aas:key>
+ </aas:keys>
+ </aas:dataSpecification>
+ </aas:embeddedDataSpecification>
+ <aas:isCaseOf>
+ <aas:keys>
+ <aas:key idType="IRI" type="ConceptDescription" local="true">www.festo.com/dic/08111234</aas:key>
+ <aas:key idType="IRI" type="ConceptDescription" local="true">www.festo.com/dic/08111234_2</aas:key>
+ </aas:keys>
+ </aas:isCaseOf>
+ </aas:conceptDescription>
+ <!-- This is a ConceptDescription with only the minimal required information in it. To test for Nullpointers and such. -->
+ <aas:conceptDescription>
+ <aas:idShort>conceptDescription2</aas:idShort>
+ <aas:identification idType="IRI">www.festo.com/dic/08111234</aas:identification>
+ </aas:conceptDescription>
+ </aas:conceptDescriptions>
+</aas:aasenv>
\ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/pom.xml b/components/basys.components/basyx.components.docker/pom.xml
index 9151452..26f35fd 100644
--- a/components/basys.components/basyx.components.docker/pom.xml
+++ b/components/basys.components/basyx.components.docker/pom.xml
@@ -18,6 +18,7 @@
<modules>
<module>basyx.components.simple</module>
<module>basyx.components.sqlregistry</module>
+ <module>basyx.components.xmlAAS</module>
</modules>
<build>