Added basys.examples project
diff --git a/examples/basys.examples/.classpath b/examples/basys.examples/.classpath
new file mode 100644
index 0000000..3bf06c0
--- /dev/null
+++ b/examples/basys.examples/.classpath
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" output="target/classes" path="src">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="src" path="examples"/>
+ <classpathentry kind="src" path="servlets"/>
+ <classpathentry kind="src" path="directory"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v9.0">
+ <attributes>
+ <attribute name="owner.project.facets" value="jst.web"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+ <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/examples/basys.examples/.gitignore b/examples/basys.examples/.gitignore
new file mode 100644
index 0000000..76daa49
--- /dev/null
+++ b/examples/basys.examples/.gitignore
@@ -0,0 +1,2 @@
+/build/
+/target/
diff --git a/examples/basys.examples/.project b/examples/basys.examples/.project
new file mode 100644
index 0000000..9532331
--- /dev/null
+++ b/examples/basys.examples/.project
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>basys.examples</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.validation.validationbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.m2e.core.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.m2e.core.maven2Nature</nature>
+ <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+ <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/basys.examples/.settings/.jsdtscope b/examples/basys.examples/.settings/.jsdtscope
new file mode 100644
index 0000000..5cee5ac
--- /dev/null
+++ b/examples/basys.examples/.settings/.jsdtscope
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry excluding="**/bower_components/*|**/node_modules/*|**/*.min.js" kind="src" path="WebContent"/>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
+ <attributes>
+ <attribute name="hide" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
+ <classpathentry kind="output" path=""/>
+</classpath>
diff --git a/examples/basys.examples/.settings/org.eclipse.jdt.core.prefs b/examples/basys.examples/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1ab2bb5
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/examples/basys.examples/.settings/org.eclipse.m2e.core.prefs b/examples/basys.examples/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/examples/basys.examples/.settings/org.eclipse.wst.common.component b/examples/basys.examples/.settings/org.eclipse.wst.common.component
new file mode 100644
index 0000000..8757062
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
+ <wb-module deploy-name="basys.examples-0.0.1-SNAPSHOT">
+ <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
+ <wb-resource deploy-path="/" source-path="/WebContent" tag="defaultRootSource"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/examples"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/servlets"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/directory"/>
+ <dependent-module archiveName="basys.sdk-0.0.1-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/basys.sdk/basys.sdk">
+ <dependency-type>uses</dependency-type>
+ </dependent-module>
+ <property name="context-root" value="basys.examples"/>
+ <property name="java-output-path" value="/basys.examples/build/classes"/>
+ </wb-module>
+</project-modules>
diff --git a/examples/basys.examples/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml b/examples/basys.examples/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
new file mode 100644
index 0000000..b01fdb7
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
@@ -0,0 +1,7 @@
+<root>
+ <facet id="jst.jaxrs">
+ <node name="libprov">
+ <attribute name="provider-id" value="jaxrs-no-op-library-provider"/>
+ </node>
+ </facet>
+</root>
diff --git a/examples/basys.examples/.settings/org.eclipse.wst.common.project.facet.core.xml b/examples/basys.examples/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..87691af
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <runtime name="Apache Tomcat v9.0"/>
+ <fixed facet="wst.jsdt.web"/>
+ <fixed facet="jst.web"/>
+ <fixed facet="java"/>
+ <installed facet="java" version="1.8"/>
+ <installed facet="jst.web" version="3.1"/>
+ <installed facet="wst.jsdt.web" version="1.0"/>
+ <installed facet="jst.jaxrs" version="2.0"/>
+</faceted-project>
diff --git a/examples/basys.examples/.settings/org.eclipse.wst.jsdt.ui.superType.container b/examples/basys.examples/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000..3bd5d0a
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/examples/basys.examples/.settings/org.eclipse.wst.jsdt.ui.superType.name b/examples/basys.examples/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100644
index 0000000..05bd71b
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/examples/basys.examples/.settings/org.eclipse.wst.validation.prefs b/examples/basys.examples/.settings/org.eclipse.wst.validation.prefs
new file mode 100644
index 0000000..6f1cba6
--- /dev/null
+++ b/examples/basys.examples/.settings/org.eclipse.wst.validation.prefs
@@ -0,0 +1,2 @@
+disabled=06target
+eclipse.preferences.version=1
diff --git a/examples/basys.examples/WebContent/META-INF/MANIFEST.MF b/examples/basys.examples/WebContent/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5e94951
--- /dev/null
+++ b/examples/basys.examples/WebContent/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/examples/basys.examples/WebContent/WEB-INF/config/aasServer/aasServer.properties b/examples/basys.examples/WebContent/WEB-INF/config/aasServer/aasServer.properties
new file mode 100644
index 0000000..82fd539
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/config/aasServer/aasServer.properties
@@ -0,0 +1,26 @@
+# ##############################################################
+# Configuration sub model provider configuration file
+# ##############################################################
+
+
+
+# ##############################################################
+# Sub model provider configuration
+
+# Name of provided sub model
+basyx.submodelID = aasRepository
+
+
+
+# ##############################################################
+# Sub model meta data
+
+# Sub model version
+administration/version = 1.0
+
+
+
+# ##############################################################
+# Exported configuration
+
+
diff --git a/examples/basys.examples/WebContent/WEB-INF/lib/components/.gitignore b/examples/basys.examples/WebContent/WEB-INF/lib/components/.gitignore
new file mode 100644
index 0000000..97546d7
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/lib/components/.gitignore
@@ -0,0 +1 @@
+/basyx_components.jar
diff --git a/examples/basys.examples/WebContent/WEB-INF/lib/jersey/.gitignore b/examples/basys.examples/WebContent/WEB-INF/lib/jersey/.gitignore
new file mode 100644
index 0000000..8f9fad4
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/lib/jersey/.gitignore
@@ -0,0 +1,10 @@
+/javax.ws.rs-api-2.1.jar
+/jersey-client.jar
+/jersey-common.jar
+/jersey-container-servlet-core.jar
+/jersey-container-servlet.jar
+/jersey-hk2.jar
+/jersey-media-jaxb.jar
+/jersey-media-json-binding.jar
+/jersey-media-sse.jar
+/jersey-server.jar
diff --git a/examples/basys.examples/WebContent/WEB-INF/lib/jersey/ext/.gitignore b/examples/basys.examples/WebContent/WEB-INF/lib/jersey/ext/.gitignore
new file mode 100644
index 0000000..7ef177e
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/lib/jersey/ext/.gitignore
@@ -0,0 +1,21 @@
+/hk2-api-2.5.0-b42.jar
+/hk2-locator-2.5.0-b42.jar
+/hk2-utils-2.5.0-b42.jar
+/javassist-3.22.0-CR2.jar
+/javax.annotation-api-1.2.jar
+/javax.inject-1.jar
+/javax.inject-2.5.0-b42.jar
+/javax.json-1.1.jar
+/validation-api-1.1.0.Final.jar
+/yasson-1.0.jar
+/org.osgi.core-4.2.0.jar
+/osgi-resource-locator-1.0.1.jar
+/persistence-api-1.0.jar
+/javax.json-api-1.1.jar
+/javax.json.bind-api-1.0.jar
+/javax.servlet-api-3.0.1.jar
+/jaxb-api-2.2.7.jar
+/jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar
+/jsr250-api-1.0.jar
+/el-api-2.2.jar
+/cdi-api-1.1.jar
diff --git a/examples/basys.examples/WebContent/WEB-INF/lib/jersey/ext/aopalliance-repackaged-2.5.0-b42.jar b/examples/basys.examples/WebContent/WEB-INF/lib/jersey/ext/aopalliance-repackaged-2.5.0-b42.jar
new file mode 100644
index 0000000..83558eb
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/lib/jersey/ext/aopalliance-repackaged-2.5.0-b42.jar
Binary files differ
diff --git a/examples/basys.examples/WebContent/WEB-INF/lib/sdk/.gitignore b/examples/basys.examples/WebContent/WEB-INF/lib/sdk/.gitignore
new file mode 100644
index 0000000..6feb9f5
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/lib/sdk/.gitignore
@@ -0,0 +1 @@
+/basyx_sdk.jar
diff --git a/examples/basys.examples/WebContent/WEB-INF/web.xml b/examples/basys.examples/WebContent/WEB-INF/web.xml
new file mode 100644
index 0000000..40853bc
--- /dev/null
+++ b/examples/basys.examples/WebContent/WEB-INF/web.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
+ <display-name>basys.components</display-name>
+
+
+
+ <servlet>
+ <servlet-name>AAS_Server</servlet-name>
+ <servlet-class> org.eclipse.basyx.components.servlets.RawCFGSubModelProviderServlet </servlet-class>
+
+ <init-param>
+ <param-name>config</param-name>
+ <param-value>/WEB-INF/config/aasServer/aasServer.properties</param-value>
+ </init-param>
+
+ <load-on-startup>5</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>AAS_Server</servlet-name>
+ <url-pattern>/Testsuite/components/BaSys/1.0/aasserver/*</url-pattern>
+ </servlet-mapping>
+
+
+
+ <servlet>
+ <servlet-name>DeviceStatusVABObject</servlet-name>
+ <servlet-class> examples.controllingdevice.vab.object.SimpleVABElementServlet </servlet-class>
+
+ <load-on-startup>5</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>DeviceStatusVABObject</servlet-name>
+ <url-pattern>/Testsuite/components/BaSys/1.0/devicestatusVAB/*</url-pattern>
+ </servlet-mapping>
+
+
+ <servlet>
+ <servlet-name>DeviceStatusSubmodel</servlet-name>
+ <servlet-class> examples.controllingdevice.vab.object.SimpleSubmodelServlet </servlet-class>
+
+ <load-on-startup>5</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>DeviceStatusSubmodel</servlet-name>
+ <url-pattern>/Testsuite/components/BaSys/1.0/devicestatusSM/*</url-pattern>
+ </servlet-mapping>
+
+
+
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ <welcome-file>index.htm</welcome-file>
+ <welcome-file>index.jsp</welcome-file>
+ <welcome-file>default.html</welcome-file>
+ <welcome-file>default.htm</welcome-file>
+ <welcome-file>default.jsp</welcome-file>
+ </welcome-file-list>
+</web-app>
\ No newline at end of file
diff --git a/examples/basys.examples/directory/examples/directory/ExamplesDirectory.java b/examples/basys.examples/directory/examples/directory/ExamplesDirectory.java
new file mode 100644
index 0000000..bb06a65
--- /dev/null
+++ b/examples/basys.examples/directory/examples/directory/ExamplesDirectory.java
@@ -0,0 +1,28 @@
+package examples.directory;
+
+import org.eclipse.basyx.testsuite.support.backend.common.stubs.java.directory.TestsuiteDirectory;
+
+
+
+
+/**
+ * Implement the test suite directory service with pre-configured directory entries
+ *
+ * @author kuhn
+ *
+ */
+public class ExamplesDirectory extends TestsuiteDirectory {
+
+
+ /**
+ * Constructor - load all directory entries
+ */
+ public ExamplesDirectory() {
+ // Populate with entries from base implementation
+ super();
+
+ // Define mappings
+ // - AAS server mapping
+ addMapping("AASServer", "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/aasserver/");
+ }
+}
diff --git a/examples/basys.examples/examples.txt b/examples/basys.examples/examples.txt
new file mode 100644
index 0000000..8763873
--- /dev/null
+++ b/examples/basys.examples/examples.txt
@@ -0,0 +1,60 @@
+Product AAS
+- Application, e.g. ERP system creates a product AAS
+ - Loads product AAS on server
+ - Registers product AAS with registry
+ - Lookup product AAS descriptor from server
+ - Access product AAS, read "idShort" property
+
+
+Device AAS 1
+- A new device is added
+ - Device transfers its AAS to server
+ - Device transfers its status sub model to sub model server
+ - Device registers AAS on server in registry
+ - Device updates property "ready" of status sub model
+ - Dashboard looks up device AAS
+ - Dashboard retrieves status sub model end point from AAS descriptor
+ - Dashboard connects to status sub model provider
+ - Dashboard queries "ready" property of sub model
+
+
+Device AAS 2
+- A new device is added
+ - Administrator transfers device AAS, device sub model, and registers AAS on server in registry
+ - Device updates property "ready" of status sub model
+ - Dashboard looks up device AAS
+ - Dashboard retrieves status sub model end point from AAS descriptor
+ - Dashboard connects to status sub model provider
+ - Dashboard queries "ready" property of sub model
+
+
+Device status
+- Device publishes its status in non-standard VAB data object
+ - Active device status AAS sub model continuously queries device state and writes device state into AAS sub model property
+ - Dashboard connects to device status sub model
+ - Dashboard reads "status" property, indicates device not available
+ - Device comes online, updates its status in local VAB object to ready
+ - Active device status AAS sub model continuously queries device state and writes device state into AAS sub model property
+ - Dashboard reads "status" property, indicates device is ready
+
+
+Controlling device (sub model)
+- Read device end point from AAS sub model
+ - Connect to device end point (device exports conforming sub model)
+ - Read device status
+ - Set device mode
+
+
+Controlling device (VAB object)
+- Read device end point from AAS sub model
+ - Connect to device end point via VAB (device does not export conforming sub model)
+ - Read device status
+ - Set device mode
+
+
+
+
+----------------
+Bugs:
+- BaSys connector sollte stabiler werden bzgl '/' am ende/anfang von Pfadsegment
+- Leerzeichen in Padnamen funktionieren nicht
diff --git a/examples/basys.examples/examples/examples/controllingdevice/submodel/object/DeviceStatusSubmodel.java b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/DeviceStatusSubmodel.java
new file mode 100644
index 0000000..e8bfba4
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/DeviceStatusSubmodel.java
@@ -0,0 +1,64 @@
+package examples.controllingdevice.submodel.object;
+
+import java.util.Map;
+import org.eclipse.basyx.aas.api.resources.IAssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.factory.MetaModelElementFactory;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.SubModel;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.property.atomicdataproperty.PropertySingleValued;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.qualifier.Identification;
+
+
+
+/**
+ * Implement a sub model that describes a device status
+ *
+ * @author kuhn
+ *
+ */
+public class DeviceStatusSubmodel extends SubModel {
+
+
+ /**
+ * Version of serialized instances
+ */
+ private static final long serialVersionUID = 1L;
+
+
+
+ /**
+ * Constructor
+ */
+ @SuppressWarnings("unchecked")
+ public DeviceStatusSubmodel() {
+
+ // Meta model element factory
+ MetaModelElementFactory factory = new MetaModelElementFactory();
+
+ // Initialize this sub model
+ ((Map<String, Object>) this.get("identification")).put("id", "urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#002");
+ ((Map<String, Object>) this.get("identification")).put("idType", Identification.URI);
+
+
+ // This sub model only defines two property named "device status" and "mode"
+ PropertySingleValued deviceStatusProperty = factory.create(new PropertySingleValued(), "offline");
+ deviceStatusProperty.setId("deviceStatus");
+ PropertySingleValued deviceModeProperty = factory.create(new PropertySingleValued(), "idle");
+ deviceModeProperty.setId("mode");
+
+ // Add properties to sub model properties
+ ((Map<String, Object>) get("properties")).put("deviceStatus", deviceStatusProperty);
+ ((Map<String, Object>) get("properties")).put("mode", deviceModeProperty);
+ }
+
+
+ /**
+ * Constructor
+ */
+ public DeviceStatusSubmodel(IAssetAdministrationShell aas) {
+ // Invoke default constructor
+ this();
+
+ // Add sub model to AAS
+ aas.addSubModel(this);
+ }
+}
diff --git a/examples/basys.examples/examples/examples/controllingdevice/submodel/object/DeviceTCPServer.java b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/DeviceTCPServer.java
new file mode 100644
index 0000000..c0f8735
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/DeviceTCPServer.java
@@ -0,0 +1,34 @@
+package examples.controllingdevice.submodel.object;
+
+import org.eclipse.basyx.vab.backend.server.basyx.BaSyxTCPServer;
+import org.eclipse.basyx.vab.provider.hashmap.VABHashmapProvider;
+
+
+
+/**
+ * BaSyx TCP server that communicates using the native BaSyx protocol
+ *
+ * @author kuhn
+ *
+ */
+public class DeviceTCPServer {
+
+
+ /**
+ * Main method
+ */
+ public static void main(String[] args) {
+
+ // Create IModelProvider that provides a VAB element
+ VABHashmapProvider modelProvider = new VABHashmapProvider(new DeviceStatusSubmodel());
+
+ // Create native BaSyx TCP server using default port
+ BaSyxTCPServer<VABHashmapProvider> tcpServer = new BaSyxTCPServer<VABHashmapProvider>(modelProvider, 6998);
+
+ // Start TCP server
+ tcpServer.start();
+
+ // Wait until TCP server completes (which will never happen) or do something else meaningful
+ try {tcpServer.join();} catch (InterruptedException e) {e.printStackTrace();}
+ }
+}
diff --git a/examples/basys.examples/examples/examples/controllingdevice/submodel/object/ExampleDirectory.java b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/ExampleDirectory.java
new file mode 100644
index 0000000..619a91f
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/ExampleDirectory.java
@@ -0,0 +1,24 @@
+package examples.controllingdevice.submodel.object;
+
+import org.eclipse.basyx.aas.impl.services.PreconfiguredDirectory;
+
+
+
+
+/**
+ * Implement a directory for the example setting
+ *
+ * @author kuhn
+ *
+ */
+public class ExampleDirectory extends PreconfiguredDirectory {
+
+
+ /**
+ * Constructor - load all directory entries
+ */
+ public ExampleDirectory() {
+ // VAB Element mapping
+ addMapping("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#002", "localhost:6998");
+ }
+}
diff --git a/examples/basys.examples/examples/examples/controllingdevice/submodel/object/RunExample.java b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/RunExample.java
new file mode 100644
index 0000000..021f76f
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/submodel/object/RunExample.java
@@ -0,0 +1,42 @@
+package examples.controllingdevice.submodel.object;
+
+import org.eclipse.basyx.aas.backend.connector.basyx.BaSyxConnectorProvider;
+import org.eclipse.basyx.vab.core.VABConnectionManager;
+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;
+import org.junit.Test;
+
+
+
+/**
+ * Run example for controlling device (SubModel/BaSyx TCP)
+ *
+ * @author kuhn
+ *
+ */
+public class RunExample {
+
+
+ /**
+ * VAB connection manager backend
+ */
+ protected VABConnectionManager connManager = new VABConnectionManager(new ExampleDirectory(), new BaSyxConnectorProvider());
+
+
+
+ /**
+ * Test basic queries
+ */
+ @Test
+ public void test() throws Exception {
+
+ // Server connections
+ // - Connect to AAS server
+ VABElementProxy connSubModel = this.connManager.connectToVABElement("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#002");
+
+ // Device updates status to ready
+ Object devState = connSubModel.readElementValue("properties/deviceStatus/value");
+
+ // Output device status
+ System.out.println("Status:"+devState);
+ }
+}
diff --git a/examples/basys.examples/examples/examples/controllingdevice/vab/object/DeviceStatusVABObject.java b/examples/basys.examples/examples/examples/controllingdevice/vab/object/DeviceStatusVABObject.java
new file mode 100644
index 0000000..40b6f82
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/vab/object/DeviceStatusVABObject.java
@@ -0,0 +1,37 @@
+package examples.controllingdevice.vab.object;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+/**
+ * A device status VAB object that does not conform to the sub model meta model.
+ *
+ * @author kuhn
+ *
+ */
+public class DeviceStatusVABObject extends HashMap<String, Object> {
+
+
+ /**
+ * Version of serialized instances
+ */
+ private static final long serialVersionUID = -1339664424451243526L;
+
+
+ /**
+ * Constructor
+ */
+ public DeviceStatusVABObject() {
+
+ // Create contained property map
+ Map<String, Object> propertyMap = new HashMap<>();
+ // - Create device status and mode property
+ propertyMap.put("deviceStatus", new String("offline"));
+ propertyMap.put("mode", new String("idle"));
+
+ // Put properties into 'elements' map of this provider
+ put("properties", propertyMap);
+ }
+}
diff --git a/examples/basys.examples/examples/examples/controllingdevice/vab/object/ExampleDirectory.java b/examples/basys.examples/examples/examples/controllingdevice/vab/object/ExampleDirectory.java
new file mode 100644
index 0000000..6695f14
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/vab/object/ExampleDirectory.java
@@ -0,0 +1,27 @@
+package examples.controllingdevice.vab.object;
+
+import org.eclipse.basyx.aas.impl.services.PreconfiguredDirectory;
+
+
+
+
+/**
+ * Implement a pre-configured directory service. This is most helpful for static topologies or test setups.
+ *
+ * @author kuhn
+ *
+ */
+public class ExampleDirectory extends PreconfiguredDirectory {
+
+
+ /**
+ * Constructor - load all directory entries
+ */
+ public ExampleDirectory() {
+ // Define mappings
+ // - Device sub model (VAB)
+ addMapping("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#003", "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/devicestatusVAB/");
+ // - Device sub model (SM)
+ addMapping("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#004", "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/devicestatusSM/");
+ }
+}
diff --git a/examples/basys.examples/examples/examples/controllingdevice/vab/object/RunExample.java b/examples/basys.examples/examples/examples/controllingdevice/vab/object/RunExample.java
new file mode 100644
index 0000000..f12ce07
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/vab/object/RunExample.java
@@ -0,0 +1,75 @@
+package examples.controllingdevice.vab.object;
+
+import org.eclipse.basyx.aas.backend.connector.http.HTTPConnectorProvider;
+import org.eclipse.basyx.vab.core.VABConnectionManager;
+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;
+import org.junit.Test;
+
+
+
+/**
+ * Run example for controlling device (SubModel/BaSyx TCP)
+ *
+ * @author kuhn
+ *
+ */
+public class RunExample {
+
+
+ /**
+ * VAB connection manager backend
+ */
+ protected VABConnectionManager connManager = new VABConnectionManager(new ExampleDirectory(), new HTTPConnectorProvider());
+
+
+
+ /**
+ * Test basic queries
+ */
+ @Test
+ public void test() throws Exception {
+
+ // Server connections
+ // - Connect to device (VAB object)
+ VABElementProxy connSubModel1 = this.connManager.connectToVABElement("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#003");
+
+ // Read status from device
+ Object devState1 = connSubModel1.readElementValue("properties/deviceStatus");
+ // - Output device status
+ System.out.println("Status1:"+devState1);
+
+ // Read mode from device
+ Object devMode1a = connSubModel1.readElementValue("properties/mode");
+ // - Output device mode
+ System.out.println("Mode1a:"+devMode1a);
+ // - Update device mode
+ connSubModel1.updateElementValue("properties/mode", "start");
+ // Read mode from device again
+ Object devMode1b = connSubModel1.readElementValue("properties/mode");
+ // - Output device mode again
+ System.out.println("Mode1b:"+devMode1b);
+
+
+
+ // Server connections
+ // - Connect to device (sub model)
+ VABElementProxy connSubModel2 = this.connManager.connectToVABElement("urn:de.FHG:devices.es.iese:statusSM:1.0:3:x-509#004");
+
+ // Read status from device
+ Object devState2 = connSubModel2.readElementValue("properties/deviceStatus/value");
+ // - Output device status
+ System.out.println("Status2:"+devState2);
+
+ // Read mode from device
+ Object devMode2a = connSubModel2.readElementValue("properties/mode/value");
+ // - Output device mode
+ System.out.println("Mode2a:"+devMode2a);
+ // - Update device mode
+ connSubModel2.updateElementValue("properties/mode/value", "start");
+ // Read mode from device again
+ Object devMode2b = connSubModel2.readElementValue("properties/mode/value");
+ // - Output device mode again
+ System.out.println("Mode2b:"+devMode2b);
+ }
+}
+
diff --git a/examples/basys.examples/examples/examples/controllingdevice/vab/object/SimpleSubmodelServlet.java b/examples/basys.examples/examples/examples/controllingdevice/vab/object/SimpleSubmodelServlet.java
new file mode 100644
index 0000000..02d1889
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/vab/object/SimpleSubmodelServlet.java
@@ -0,0 +1,32 @@
+package examples.controllingdevice.vab.object;
+
+import org.eclipse.basyx.vab.backend.server.http.VABHTTPInterface;
+import org.eclipse.basyx.vab.provider.hashmap.VABHashmapProvider;
+
+import examples.controllingdevice.submodel.object.DeviceStatusSubmodel;
+
+
+
+/**
+ * Servlet interface for VAB elements, e.g. AAS, sub model, or other VAB objects
+ *
+ * @author kuhn
+ *
+ */
+public class SimpleSubmodelServlet extends VABHTTPInterface<VABHashmapProvider> {
+
+
+ /**
+ * Version information to identify the version of serialized instances
+ */
+ private static final long serialVersionUID = 1L;
+
+
+ /**
+ * Constructor
+ */
+ public SimpleSubmodelServlet() {
+ // Invoke base constructor, instantiate device status sub model
+ super(new VABHashmapProvider(new DeviceStatusSubmodel()));
+ }
+}
diff --git a/examples/basys.examples/examples/examples/controllingdevice/vab/object/SimpleVABElementServlet.java b/examples/basys.examples/examples/examples/controllingdevice/vab/object/SimpleVABElementServlet.java
new file mode 100644
index 0000000..4b49c86
--- /dev/null
+++ b/examples/basys.examples/examples/examples/controllingdevice/vab/object/SimpleVABElementServlet.java
@@ -0,0 +1,30 @@
+package examples.controllingdevice.vab.object;
+
+import org.eclipse.basyx.vab.backend.server.http.VABHTTPInterface;
+import org.eclipse.basyx.vab.provider.hashmap.VABHashmapProvider;
+
+
+
+/**
+ * Servlet interface for VAB elements, e.g. AAS, sub model, or other VAB objects
+ *
+ * @author kuhn
+ *
+ */
+public class SimpleVABElementServlet extends VABHTTPInterface<VABHashmapProvider> {
+
+
+ /**
+ * Version information to identify the version of serialized instances
+ */
+ private static final long serialVersionUID = 1L;
+
+
+ /**
+ * Constructor
+ */
+ public SimpleVABElementServlet() {
+ // Invoke base constructor, instantiate a device status VAB object
+ super(new VABHashmapProvider(new DeviceStatusVABObject()));
+ }
+}
diff --git a/examples/basys.examples/examples/examples/deviceaas/RunExample.java b/examples/basys.examples/examples/examples/deviceaas/RunExample.java
new file mode 100644
index 0000000..38f1b23
--- /dev/null
+++ b/examples/basys.examples/examples/examples/deviceaas/RunExample.java
@@ -0,0 +1,127 @@
+package examples.deviceaas;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.basyx.aas.backend.connector.http.HTTPConnectorProvider;
+import org.eclipse.basyx.aas.backend.http.tools.JSONTools;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.AssetAdministrationShell_;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.SubModel_;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.qualifier.Identification;
+import org.eclipse.basyx.tools.webserviceclient.WebServiceRawClient;
+import org.eclipse.basyx.vab.core.VABConnectionManager;
+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;
+import org.junit.Test;
+
+import basys.examples.aasdescriptor.AASDescriptor;
+import basys.examples.aasdescriptor.SubmodelDescriptor;
+import basys.examples.urntools.ModelUrn;
+import org.json.JSONObject;
+import examples.directory.ExamplesDirectory;
+
+
+
+/**
+ * Run example for device AAS
+ *
+ * @author kuhn
+ *
+ */
+public class RunExample {
+
+
+ /**
+ * VAB connection manager backend
+ */
+ protected VABConnectionManager connManager = new VABConnectionManager(new ExamplesDirectory(), new HTTPConnectorProvider());
+
+
+
+ /**
+ * Test basic queries
+ */
+ @SuppressWarnings("unchecked")
+ @Test
+ public void test() throws Exception {
+
+ // Server connections
+ // - Connect to AAS server
+ VABElementProxy connSubModel = this.connManager.connectToVABElement("AASServer");
+ // - Invoke BaSyx service calls via web services
+ WebServiceRawClient client = new WebServiceRawClient();
+ // - Directory web service URL
+ String wsURL = "http://localhost:8080/basys.components/Testsuite/Directory/SQL";
+ // - AAS repository server URL
+ String aasSrvURL = "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/aasserver";
+
+
+
+ // Create device AAS
+ // - Product ID (urn:<legalEntity>:<subUnit>:<subModel>:<version>:<revision>:<elementID>#<elementInstance>)
+ ModelUrn deviceAASID = new ModelUrn("de.FHG", "devices.es.iese", "aas", "1.0", "3", "x-509", "001");
+ // - Create device AAS
+ AssetAdministrationShell_ aas = new AssetAdministrationShell_();
+ aas.put("idShort", "DeviceIDShort");
+ // - AAS URL on server
+ String aasURLOnServer = "/aas/submodels/aasRepository/"+deviceAASID.getEncodedURN();
+ // - Transfer device AAS to server
+ connSubModel.createElement(aasURLOnServer, aas);
+
+
+ // The device also brings a sub model structure with an own ID that is being pushed on the server
+ ModelUrn deviceStatusSMID = new ModelUrn("de.FHG", "devices.es.iese", "statusSM", "1.0", "3", "x-509", "001");
+ // - Create generic sub model
+ SubModel_ statusSM = new SubModel_();
+ ((Map<String, Object>) statusSM.get("properties")).put("status", "offline");
+ // - Sub model URL on server
+ String statusSubmodelURLOnServer = "/aas/submodels/aasRepository/"+deviceStatusSMID.getEncodedURN();
+ // - Transfer device sub model to server
+ connSubModel.createElement(statusSubmodelURLOnServer, statusSM);
+
+
+ // The device also brings a sub model structure with an own ID that is being pushed on the server
+ ModelUrn deviceControllerSMID = new ModelUrn("jp.orin", "devices.orin", "controllerSM", "1.0", "3", "x-509", "001");
+ // - Create generic sub model
+ SubModel_ controllerSM = new SubModel_();
+ // - Create sub model contents
+ Map<String, Object> listOfControllers = new HashMap<>();
+ ((Map<String, Object>) controllerSM.get("properties")).put("controllers", listOfControllers);
+ // - Sub model URL on server
+ String controllerSubmodelURLOnServer = "/aas/submodels/aasRepository/"+deviceControllerSMID.getEncodedURN();
+ // - Transfer device sub model to server
+ connSubModel.createElement(controllerSubmodelURLOnServer, controllerSM);
+
+
+
+ // Register AAS and sub models in directory (push AAS descriptor to server)
+ // - Create an AAS descriptor
+ AASDescriptor deviceAASDescriptor = new AASDescriptor(deviceAASID.getURN(), Identification.URI, aasSrvURL+aasURLOnServer);
+ // - Add a sub model descriptor for device
+ SubmodelDescriptor deviceStatusSubmodelDescriptor = new SubmodelDescriptor(deviceStatusSMID.getURN(), Identification.URI, aasSrvURL+statusSubmodelURLOnServer);
+ deviceAASDescriptor.addSubmodelDescriptor(deviceStatusSubmodelDescriptor);
+ SubmodelDescriptor deviceControllerSubmodelDescriptor = new SubmodelDescriptor(deviceControllerSMID.getURN(), Identification.URI, aasSrvURL+controllerSubmodelURLOnServer);
+ deviceAASDescriptor.addSubmodelDescriptor(deviceControllerSubmodelDescriptor);
+ // - Push AAS descriptor to server
+ client.post(wsURL+"/api/v1/registry", JSONTools.Instance.serialize(deviceAASDescriptor).toString());
+
+
+ // Device updates status to ready
+ connSubModel.updateElementValue(statusSubmodelURLOnServer+"/properties/status", "ready");
+
+
+ // Lookup device AAS
+ // - Lookup AAS from AAS directory, get AAS descriptor
+ String jsonData = client.get(wsURL+"/api/v1/registry/"+deviceAASID.getEncodedURN());
+ // - Read AAS end point from AAS descriptor
+ AASDescriptor aasDescriptor = new AASDescriptor((Map<String, Object>) JSONTools.Instance.deserialize(new JSONObject(jsonData)));
+ // - Get information about status sub model
+ SubmodelDescriptor smDescriptor = aasDescriptor.getSubModelDescriptor(deviceStatusSMID.getURN());
+
+
+ // Connect to status sub model end point
+ VABElementProxy connSM = connManager.connectToVABElementByURL(smDescriptor.getFirstEndpoint());
+ Map<String, Object> deviceSM = (Map<String, Object>) connSM.readElementValue("/");
+ // - Output status information
+ System.out.println("ReadBack:"+((Map<String, Object>) deviceSM.get("properties")).get("status"));
+ }
+}
diff --git a/examples/basys.examples/examples/examples/deviceaas/RunExampleSimpleAPIManualRegistry.java b/examples/basys.examples/examples/examples/deviceaas/RunExampleSimpleAPIManualRegistry.java
new file mode 100644
index 0000000..c295d9a
--- /dev/null
+++ b/examples/basys.examples/examples/examples/deviceaas/RunExampleSimpleAPIManualRegistry.java
@@ -0,0 +1,126 @@
+package examples.deviceaas;
+
+import org.eclipse.basyx.aas.backend.connector.http.HTTPConnectorProvider;
+import org.eclipse.basyx.aas.metamodel.hashmap.VABModelMap;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.AssetAdministrationShell_;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.SubModel_;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.qualifier.Identification;
+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;
+import org.junit.Test;
+
+import basys.examples.aasdescriptor.AASDescriptor;
+import basys.examples.aasdescriptor.SubmodelDescriptor;
+import basys.examples.frontend.client.connmanager.BaSysConnectionManager;
+import basys.examples.frontend.client.connmanager.ModelServerProxy;
+import basys.examples.frontend.client.proxies.AASRegistryProxy;
+import basys.examples.urntools.ModelUrn;
+import examples.directory.ExamplesDirectory;
+
+
+
+/**
+ * Run example for device AAS
+ *
+ * @author kuhn
+ *
+ */
+public class RunExampleSimpleAPIManualRegistry {
+
+
+ /**
+ * BaSys connection manager backend
+ */
+ protected BaSysConnectionManager connManager = new BaSysConnectionManager(new ExamplesDirectory(), new HTTPConnectorProvider());
+
+
+
+ /**
+ * Test basic queries
+ */
+ @Test @SuppressWarnings("unchecked")
+ public void test() throws Exception {
+
+ // Server connections
+ // - Connect to AAS server
+ //VABElementProxy connSubModel = this.connManager.connectToVABElement("AASServer");
+ ModelServerProxy modelServer = this.connManager.connectToModelServer("AASServer");
+ // - Invoke BaSyx service calls via web services
+ //WebServiceRawClient client = new WebServiceRawClient();
+ // - Directory web service URL
+ //String wsURL = "http://localhost:8080/basys.components/Testsuite/Directory/SQL";
+ // - AAS repository server URL
+ //String aasSrvURL = "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/aasserver";
+
+
+ // Instantiate AAS registry proxy
+ AASRegistryProxy registry = new AASRegistryProxy("http://localhost:8080/basys.components/Testsuite/Directory/SQL");
+
+
+ // Create device AAS
+ // - Product ID (urn:<legalEntity>:<subUnit>:<subModel>:<version>:<revision>:<elementID>#<elementInstance>)
+ ModelUrn deviceAASID = new ModelUrn("de.FHG", "devices.es.iese", "aas", "1.0", "3", "x-509", "001");
+ // - Create device AAS
+ AssetAdministrationShell_ aas = new AssetAdministrationShell_();
+ aas.put("idShort", "DeviceIDShort");
+ // - Push AAS to model repository
+ modelServer.pushToServer(deviceAASID, aas);
+ // - AAS URL on server
+ //String aasURLOnServer = "/aas/submodels/aasRepository/"+deviceAASID.getEncodedURN();
+ // - Transfer device AAS to server
+ //connSubModel.createElement(aasURLOnServer, aas);
+
+
+ // The device also brings a sub model structure with an own ID that is being pushed on the server
+ ModelUrn deviceStatusSMID = new ModelUrn("de.FHG", "devices.es.iese", "statusSM", "1.0", "3", "x-509", "001");
+ // - Create generic sub model
+ SubModel_ statusSM = new SubModel_();
+ statusSM.putPath("properties/status", "offline");
+ //((Map<String, Object>) statusSM.get("properties")).put("status", "offline");
+ // - Push static sub model to model repository
+ modelServer.pushToServer(deviceStatusSMID, statusSM);
+ // - Sub model URL on server
+ //String statusSubmodelURLOnServer = "/aas/submodels/aasRepository/"+deviceStatusSMID.getEncodedURN();
+ // - Transfer device sub model to server
+ //connSubModel.createElement(statusSubmodelURLOnServer, statusSM);
+
+
+ // Register AAS and sub models in directory (push AAS descriptor to server)
+ // - Create an AAS descriptor
+ //AASDescriptor deviceAASDescriptor = new AASDescriptor(deviceAASID.getURN(), Identification.URI, aasSrvURL+aasURLOnServer);
+ AASDescriptor deviceAASDescriptor = new AASDescriptor(deviceAASID.getURN(), Identification.URI, modelServer.getURLToModel(deviceAASID));
+ // - Add a sub model descriptor for device
+ SubmodelDescriptor deviceStatusSubmodelDescriptor = new SubmodelDescriptor(deviceStatusSMID.getURN(), Identification.URI, modelServer.getURLToModel(deviceStatusSMID));
+ deviceAASDescriptor.addSubmodelDescriptor(deviceStatusSubmodelDescriptor);
+ // - Push AAS descriptor to server
+ //client.post(wsURL+"/api/v1/registry", JSONTools.Instance.serialize(deviceAASDescriptor).toString());
+ registry.register(deviceAASDescriptor);
+
+
+ // Device updates status to ready
+ //connSubModel.updateElementValue(statusSubmodelURLOnServer+"/properties/status", "ready");
+ modelServer.updateElementValue(deviceStatusSMID, "/properties/status", "ready");
+ // - Read updated status back
+ modelServer.readElementValue(deviceStatusSMID, "/properties/status");
+
+
+ // Lookup device AAS
+ // - Lookup AAS from AAS directory, get AAS descriptor
+ //String jsonData = client.get(wsURL+"/api/v1/registry/"+deviceAASID.getEncodedURN());
+ // - Read AAS end point from AAS descriptor
+ //AASDescriptor aasDescriptor = new AASDescriptor((Map<String, Object>) JSONTools.Instance.deserialize(new JSONObject(jsonData)));
+ AASDescriptor aasDescriptor = registry.lookup(deviceAASID);
+ // - Get information about status sub model
+ SubmodelDescriptor smDescriptor = aasDescriptor.getSubModelDescriptor(deviceStatusSMID.getURN());
+
+
+ // Connect to status sub model end point
+ // - FIXME - we need the ability to connect to an absolute URL here
+ //Map<String, Object> deviceSM = (Map<String, Object>) connSubModel.readElementValue(statusSubmodelURLOnServer);
+ //Map<String, Object> deviceSM = (Map<String, Object>) connSubModel.readElementValue(smDescriptor.getFirstEndpoint());
+ VABElementProxy connSubModel = connManager.connectToVABElementByURL(smDescriptor.getFirstEndpoint());
+ VABModelMap<Object> deviceSM = (VABModelMap<Object>) connSubModel.readElementValue("/");
+ // - Output status information
+ //System.out.println("ReadBack:"+((Map<String, Object>) deviceSM.get("properties")).get("status"));
+ System.out.println("ReadBack:"+deviceSM.getPath("properties/status"));
+ }
+}
diff --git a/examples/basys.examples/examples/examples/productaas/RunExample.java b/examples/basys.examples/examples/examples/productaas/RunExample.java
new file mode 100644
index 0000000..2f9300d
--- /dev/null
+++ b/examples/basys.examples/examples/examples/productaas/RunExample.java
@@ -0,0 +1,89 @@
+package examples.productaas;
+
+import java.util.Map;
+
+import org.eclipse.basyx.aas.backend.connector.http.HTTPConnectorProvider;
+import org.eclipse.basyx.aas.backend.http.tools.JSONTools;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.AssetAdministrationShell_;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.qualifier.Identification;
+import org.eclipse.basyx.tools.webserviceclient.WebServiceRawClient;
+import org.eclipse.basyx.vab.core.VABConnectionManager;
+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;
+import org.json.JSONObject;
+import org.junit.Test;
+
+import basys.examples.aasdescriptor.AASDescriptor;
+import basys.examples.urntools.ModelUrn;
+import examples.directory.ExamplesDirectory;
+
+
+
+/**
+ * Run example for product AAS
+ *
+ * @author kuhn
+ *
+ */
+public class RunExample {
+
+
+ /**
+ * VAB connection manager backend
+ */
+ protected VABConnectionManager connManager = new VABConnectionManager(new ExamplesDirectory(), new HTTPConnectorProvider());
+
+
+
+ /**
+ * Test basic queries
+ */
+ @SuppressWarnings("unchecked")
+ @Test
+ public void test() throws Exception {
+
+ // Server connections
+ // - Connect to AAS server
+ VABElementProxy connSubModel = this.connManager.connectToVABElement("AASServer");
+ // - Invoke BaSyx service calls via web services
+ WebServiceRawClient client = new WebServiceRawClient();
+ // - Directory web service URL
+ String wsURL = "http://localhost:8080/basys.components/Testsuite/Directory/SQL";
+ // - AAS repository server URL
+ String aasSrvURL = "http://localhost:8080/basys.examples/Testsuite/components/BaSys/1.0/aasserver";
+
+
+
+ // Create product AAS
+ // - Product ID (urn:<legalEntity>:<subUnit>:<subModel>:<version>:<revision>:<elementID>#<elementInstance>)
+ ModelUrn productID = new ModelUrn("de.FHG", "products.es.iese", "aas", "1.0", "3", "product1", null);
+ // - Create map with complex type
+ AssetAdministrationShell_ aas = new AssetAdministrationShell_();
+ aas.put("idShort", "ProductIDShort");
+ // - AAS URL on server
+ String aasURLOnServer = "/aas/submodels/aasRepository/"+productID.getEncodedURN();
+ // - Create AAS structure on server
+ connSubModel.createElement(aasURLOnServer, aas);
+
+
+ // Register AAS in directory (push AAS descriptor to server)
+ // - Create an AAS descriptor
+ AASDescriptor productAASDescriptor = new AASDescriptor(productID.getURN(), Identification.URI, aasSrvURL+aasURLOnServer);
+ // - Push AAS descriptor to server
+ client.post(wsURL+"/api/v1/registry", JSONTools.Instance.serialize(productAASDescriptor).toString());
+
+
+ // Lookup AAS
+ // - Lookup AAS from AAS directory, get AAS descriptor
+ String jsonData = client.get(wsURL+"/api/v1/registry/"+productID.getEncodedURN());
+ // - Read AAS end point from AAS descriptor
+ AASDescriptor aasDescriptor = new AASDescriptor((Map<String, Object>) JSONTools.Instance.deserialize(new JSONObject(jsonData)));
+ System.out.println("Endpoint:"+aasDescriptor.getFirstEndpoint());
+
+
+ // Connect to AAS end point
+ VABElementProxy connSM = connManager.connectToVABElementByURL(aasDescriptor.getFirstEndpoint());
+ Map<String, Object> productAAS = (Map<String, Object>) connSM.readElementValue("");
+ // - Read product AAS from server
+ System.out.println("ReadBack:"+productAAS.get("idShort"));
+ }
+}
diff --git a/examples/basys.examples/examples/examples/productaas/RunExampleSimpleAPI.java b/examples/basys.examples/examples/examples/productaas/RunExampleSimpleAPI.java
new file mode 100644
index 0000000..fef42bf
--- /dev/null
+++ b/examples/basys.examples/examples/examples/productaas/RunExampleSimpleAPI.java
@@ -0,0 +1,80 @@
+package examples.productaas;
+
+import org.eclipse.basyx.aas.backend.connector.http.HTTPConnectorProvider;
+import org.eclipse.basyx.aas.metamodel.hashmap.VABModelMap;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.AssetAdministrationShell_;
+import org.eclipse.basyx.aas.metamodel.hashmap.aas.qualifier.Identification;
+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;
+import org.junit.Test;
+
+import basys.examples.aasdescriptor.AASDescriptor;
+import basys.examples.frontend.client.connmanager.BaSysConnectionManager;
+import basys.examples.frontend.client.connmanager.ModelServerProxy;
+import basys.examples.frontend.client.proxies.AASRegistryProxy;
+import basys.examples.urntools.ModelUrn;
+import examples.directory.ExamplesDirectory;
+
+
+
+/**
+ * Run example for product AAS
+ *
+ * @author kuhn
+ *
+ */
+public class RunExampleSimpleAPI {
+
+
+ /**
+ * VAB connection manager backend
+ */
+ protected BaSysConnectionManager connManager = new BaSysConnectionManager(new ExamplesDirectory(), new HTTPConnectorProvider());
+
+
+
+ /**
+ * Test basic queries
+ */
+ @SuppressWarnings("unchecked")
+ @Test
+ public void test() throws Exception {
+
+ // Server connections
+ // - Connect to AAS server
+ ModelServerProxy modelServer = this.connManager.connectToModelServer("AASServer");
+
+
+ // Instantiate AAS registry proxy
+ AASRegistryProxy registry = new AASRegistryProxy("http://localhost:8080/basys.components/Testsuite/Directory/SQL");
+
+
+ // Create product AAS
+ // - Product ID (urn:<legalEntity>:<subUnit>:<subModel>:<version>:<revision>:<elementID>#<elementInstance>)
+ ModelUrn productID = new ModelUrn("de.FHG", "products.es.iese", "aas", "1.0", "3", "product1", null);
+ // - Create map with complex type
+ AssetAdministrationShell_ aas = new AssetAdministrationShell_();
+ aas.put("idShort", "ProductIDShort");
+ // - Push AAS to model repository
+ modelServer.pushToServer(productID, aas);
+
+
+ // Register AAS in directory (push AAS descriptor to server)
+ // - Create an AAS descriptor
+ AASDescriptor productAASDescriptor = new AASDescriptor(productID.getURN(), Identification.URI, modelServer.getURLToModel(productID));
+ // - Push AAS descriptor to server
+ registry.register(productAASDescriptor);
+
+
+ // Lookup AAS
+ // - Read AAS end point from AAS descriptor
+ AASDescriptor aasDescriptor = registry.lookup(productID);
+ System.out.println("Endpoint:"+aasDescriptor.getFirstEndpoint());
+
+
+ // Connect to AAS end point
+ VABElementProxy connSubModel = connManager.connectToVABElementByURL(aasDescriptor.getFirstEndpoint());
+ VABModelMap<Object> productAAS = (VABModelMap<Object>) connSubModel.readElementValue("/");
+ // - Read product AAS from server
+ System.out.println("ReadBack:"+productAAS.get("idShort"));
+ }
+}
diff --git a/examples/basys.examples/pom.xml b/examples/basys.examples/pom.xml
new file mode 100644
index 0000000..4070d6f
--- /dev/null
+++ b/examples/basys.examples/pom.xml
@@ -0,0 +1,273 @@
+<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>
+ <groupId>basys.examples</groupId>
+ <artifactId>basys.examples</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <packaging>war</packaging>
+ <repositories>
+ <repository>
+ <id>data-local</id>
+ <name>data</name>
+ <url>file://${project.basedir}/repo</url>
+ </repository>
+ </repositories>
+
+ <build>
+ <sourceDirectory></sourceDirectory>
+
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ <resource>
+ <directory>servlets</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ <resource>
+ <directory>examples</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ <resource>
+ <directory>directory</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+
+ <testSourceDirectory>
+ ${project.basedir}/examples
+ </testSourceDirectory>
+
+ <plugins>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.7.0</version>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ <compilerArgument>-proc:none</compilerArgument>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-war-plugin</artifactId>
+ <version>3.0.0</version>
+ <!-- <configuration>
+ <warSourceDirectory>WebContent</warSourceDirectory>
+ </configuration> -->
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <!-- <version>2.12.1</version> -->
+ <version>2.4.2</version>
+ <configuration>
+ <excludes>
+ <exclude>**/*HTTP*</exclude>
+ <exclude>**/*TCP*</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <version>2.12.4</version>
+ <configuration>
+ <includes>
+ <include>**/*HTTP*</include>
+ <include>**/*TCP*</include>
+ </includes>
+ </configuration>
+ <executions>
+ <execution>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+
+
+ <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
+ <!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->
+ <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-client -->
+ <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
+ <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-catalina (Tomcat 8, not 9) -->
+
+ <dependency>
+ <groupId>org.json</groupId>
+ <artifactId>json</artifactId>
+ <version>20180813</version>
+ <!-- <scope>provided</scope> -->
+ </dependency>
+
+ <!-- Dependencies removed from Classpath -->
+ <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
+ <dependency>
+ <groupId>org.postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ <version>42.2.2</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/org.glassfish.hk2.external/aopalliance-repackaged -->
+ <dependency>
+ <groupId>org.glassfish.hk2.external</groupId>
+ <artifactId>aopalliance-repackaged</artifactId>
+ <version>2.5.0-b42</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/javax.enterprise/cdi-api -->
+ <dependency>
+ <groupId>javax.enterprise</groupId>
+ <artifactId>cdi-api</artifactId>
+ <version>2.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/javax.el/el-api -->
+ <dependency>
+ <groupId>javax.el</groupId>
+ <artifactId>el-api</artifactId>
+ <version>2.2</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/org.glassfish.hk2/hk2-api -->
+ <dependency>
+ <groupId>org.glassfish.hk2</groupId>
+ <artifactId>hk2-api</artifactId>
+ <version>2.5.0</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/javassist/javassist -->
+ <dependency>
+ <groupId>javassist</groupId>
+ <artifactId>javassist</artifactId>
+ <version>3.12.1.GA</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
+ <!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
+ <dependency>
+ <groupId>javax.inject</groupId>
+ <artifactId>javax.inject</artifactId>
+ <version>1</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/javax.json/javax.json-api -->
+ <dependency>
+ <groupId>javax.json</groupId>
+ <artifactId>javax.json-api</artifactId>
+ <version>1.0</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
+ <dependency>
+ <groupId>javax.xml.bind</groupId>
+ <artifactId>jaxb-api</artifactId>
+ <version>2.3.0</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/org.jboss.spec.javax.interceptor/jboss-interceptors-api_1.1_spec -->
+ <dependency>
+ <groupId>org.jboss.spec.javax.interceptor</groupId>
+ <artifactId>jboss-interceptors-api_1.1_spec</artifactId>
+ <version>1.0.1.Final</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
+ <dependency>
+ <groupId>javax.annotation</groupId>
+ <artifactId>javax.annotation-api</artifactId>
+ <version>1.3.2</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/org.osgi/org.osgi.core -->
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>4.2.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/org.glassfish.hk2/osgi-resource-locator -->
+ <dependency>
+ <groupId>org.glassfish.hk2</groupId>
+ <artifactId>osgi-resource-locator</artifactId>
+ <version>1.0.1</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/javax.persistence/persistence-api -->
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+ <version>1.0.2</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
+ <dependency>
+ <groupId>javax.validation</groupId>
+ <artifactId>validation-api</artifactId>
+ <version>2.0.1.Final</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>javax.servlet-api</artifactId>
+ <version>3.1.0</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <!-- https://mvnrepository.com/artifact/org.eclipse/yasson -->
+ <dependency>
+ <groupId>org.eclipse</groupId>
+ <artifactId>yasson</artifactId>
+ <version>1.0.2</version>
+ </dependency>
+
+ <!-- https://mvnrepository.com/artifact/javax.xml.xquery/xqj-api (Add from local repository because jar cannot be found on maven central -->
+ <dependency>
+ <groupId>javax.xml.xquery</groupId>
+ <artifactId>xqj-api</artifactId>
+ <version>1.0</version>
+ </dependency>
+
+ <!-- https://mvnrepository.com/artifact/net.sf.saxon/saxon-xqj -->
+ <!-- <dependency>
+ <groupId>net.sf.saxon</groupId>
+ <artifactId>saxon-xqj</artifactId>
+ <version>9.x</version>
+ </dependency> -->
+
+ <!-- https://mvnrepository.com/artifact/net.sf.saxon/saxon-xqj -->
+ <dependency>
+ <groupId>net.sf.saxon</groupId>
+ <artifactId>saxon-xqj</artifactId>
+ <version>8.9</version>
+ </dependency>
+
+
+ <!-- https://mvnrepository.com/artifact/net.sf.saxon/Saxon-HE -->
+ <dependency>
+ <groupId>net.sf.saxon</groupId>
+ <artifactId>Saxon-HE</artifactId>
+ <version>9.5.1-5</version>
+ </dependency>
+
+
+ <!-- Add BaSys SDK from local repository. Maven build of SDK must generate a jar and place it into the repository to update -->
+ <dependency>
+ <groupId>basys.sdk</groupId>
+ <artifactId>basys.sdk</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </dependency>
+
+ <!-- Add BaSys components from local repository. Maven build of SDK must generate a jar and place it into the repository to update -->
+ <dependency>
+ <groupId>basys.components</groupId>
+ <artifactId>basys.components</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </dependency>
+
+ </dependencies>
+</project>
\ No newline at end of file
diff --git a/examples/basys.examples/repo/basys/components/basys.components/0.0.1-SNAPSHOT/.gitignore b/examples/basys.examples/repo/basys/components/basys.components/0.0.1-SNAPSHOT/.gitignore
new file mode 100644
index 0000000..fddf610
--- /dev/null
+++ b/examples/basys.examples/repo/basys/components/basys.components/0.0.1-SNAPSHOT/.gitignore
@@ -0,0 +1 @@
+/basys.components-0.0.1-SNAPSHOT.jar
diff --git a/examples/basys.examples/repo/basys/sdk/basys.sdk/0.0.1-SNAPSHOT/.gitignore b/examples/basys.examples/repo/basys/sdk/basys.sdk/0.0.1-SNAPSHOT/.gitignore
new file mode 100644
index 0000000..0d11971
--- /dev/null
+++ b/examples/basys.examples/repo/basys/sdk/basys.sdk/0.0.1-SNAPSHOT/.gitignore
@@ -0,0 +1 @@
+/basys.sdk-0.0.1-SNAPSHOT.jar
diff --git a/examples/basys.examples/src/basys/examples/frontend/client/connmanager/BaSysConnectionManager.java b/examples/basys.examples/src/basys/examples/frontend/client/connmanager/BaSysConnectionManager.java
new file mode 100644
index 0000000..e56500e
--- /dev/null
+++ b/examples/basys.examples/src/basys/examples/frontend/client/connmanager/BaSysConnectionManager.java
@@ -0,0 +1,51 @@
+package basys.examples.frontend.client.connmanager;
+
+import org.eclipse.basyx.vab.core.IConnectorProvider;
+import org.eclipse.basyx.vab.core.IDirectoryService;
+import org.eclipse.basyx.vab.core.VABConnectionManager;
+
+
+
+
+
+/**
+ * Connection manager that creates BaSys specific connections on request
+ *
+ * @author kuhn
+ *
+ */
+public class BaSysConnectionManager extends VABConnectionManager {
+
+
+ /**
+ * Constructor
+ *
+ * @param networkDirectoryService Directory service provider
+ * @param providerProvider Connection provider
+ */
+ public BaSysConnectionManager(IDirectoryService networkDirectoryService, IConnectorProvider providerProvider) {
+ // Invoke base constructor
+ super(networkDirectoryService, providerProvider);
+ }
+
+
+
+ /**
+ * Connect to an model provider server
+ *
+ * Model provider servers are network repositories that store models and enable access to them.
+ *
+ * @param urn the URN that describes the model provider server
+ */
+ public ModelServerProxy connectToModelServer(String urn) {
+ // Get AAS from directory
+ String addr = null;
+
+ // Lookup address in directory server
+ addr = directoryService.lookup(urn);
+
+ // Return a new ModelServerProxy
+ return new ModelServerProxy(addr, providerProvider.getConnector(addr));
+ }
+}
+
diff --git a/examples/basys.examples/src/basys/examples/frontend/client/connmanager/ModelServerProxy.java b/examples/basys.examples/src/basys/examples/frontend/client/connmanager/ModelServerProxy.java
new file mode 100644
index 0000000..0c66cca
--- /dev/null
+++ b/examples/basys.examples/src/basys/examples/frontend/client/connmanager/ModelServerProxy.java
@@ -0,0 +1,117 @@
+package basys.examples.frontend.client.connmanager;
+
+import java.util.HashMap;
+
+import org.eclipse.basyx.vab.core.IModelProvider;
+import org.eclipse.basyx.vab.core.proxy.VABElementProxy;
+
+import basys.examples.urntools.ModelUrn;
+
+
+
+/**
+ * Proxy class for connecting to a model server.
+ *
+ * Model servers provide static data models to the VAB. this class hides the nasty details to communicate via VAB primitives with model servers.
+ *
+ * @author kuhn
+ *
+ */
+public class ModelServerProxy extends VABElementProxy {
+
+
+ /**
+ * Constructor
+ *
+ * @param addr Address
+ * @param provider Provider reference
+ */
+ public ModelServerProxy(String addr, IModelProvider provider) {
+ super(addr, provider);
+ // TODO Auto-generated constructor stub
+ }
+
+
+
+
+ /**
+ * Push model to model repository
+ */
+ public void pushToServer(ModelUrn modelID, HashMap<String, Object> model) {
+ // Model URL on server
+ String modelURLOnServer = "/aas/submodels/aasRepository/"+modelID.getEncodedURN();
+
+ // Transfer model to server
+ this.createElement(modelURLOnServer, model);
+ }
+
+
+ /**
+ * Get URL to model on server
+ */
+ public String getURLToModel(ModelUrn modelID) {
+ // Return address on server
+ return this.addr+"/aas/submodels/aasRepository/"+modelID.getEncodedURN();
+ }
+
+
+ /**
+ * Update model element value on server
+ */
+ public void updateElementValue(ModelUrn modelID, String elementPath, Object newValue) {
+ // Build URL
+ String modelURLOnServer = "/aas/submodels/aasRepository/"+modelID.getEncodedURN();
+
+ // Invoke base function
+ updateElementValue(modelURLOnServer+elementPath, newValue);
+ }
+
+
+ /**
+ * Read model element value
+ */
+ public Object readElementValue(ModelUrn modelID, String elementPath) {
+ // Build URL
+ String modelURLOnServer = "/aas/submodels/aasRepository/"+modelID.getEncodedURN();
+
+ // Invoke base function
+ return readElementValue(modelURLOnServer+elementPath);
+ }
+
+
+ /**
+ * Create model element
+ */
+ public void createElement(ModelUrn modelID, String elementPath, Object newValue) {
+ // Build URL
+ String modelURLOnServer = "/aas/submodels/aasRepository/"+modelID.getEncodedURN();
+
+ // Invoke base function
+ createElement(modelURLOnServer+elementPath, newValue);
+ }
+
+
+ /**
+ * Delete model element based on path
+ */
+ public void deleteElement(ModelUrn modelID, String elementPath) {
+ // Build URL
+ String modelURLOnServer = "/aas/submodels/aasRepository/"+modelID.getEncodedURN();
+
+ // Invoke base function
+ deleteElement(modelURLOnServer+elementPath);
+ }
+
+
+ /**
+ * Delete model element based on path and value
+ */
+ public void deleteElement(ModelUrn modelID, String elementPath, Object value) {
+ // Build URL
+ String modelURLOnServer = "/aas/submodels/aasRepository/"+modelID.getEncodedURN();
+
+ // Invoke base function
+ deleteElement(modelURLOnServer+elementPath, value);
+ }
+}
+
diff --git a/examples/basys.examples/src/basys/examples/frontend/client/proxies/AASRegistryProxy.java b/examples/basys.examples/src/basys/examples/frontend/client/proxies/AASRegistryProxy.java
new file mode 100644
index 0000000..a6635c9
--- /dev/null
+++ b/examples/basys.examples/src/basys/examples/frontend/client/proxies/AASRegistryProxy.java
@@ -0,0 +1,75 @@
+package basys.examples.frontend.client.proxies;
+
+import java.util.Map;
+
+import org.eclipse.basyx.aas.backend.http.tools.JSONTools;
+import org.eclipse.basyx.tools.webserviceclient.WebServiceRawClient;
+import org.json.JSONObject;
+
+import basys.examples.aasdescriptor.AASDescriptor;
+import basys.examples.urntools.ModelUrn;
+
+
+
+
+/**
+ * Local proxy class that hides HTTP calls to BaSys registry
+ *
+ * @author kuhn
+ *
+ */
+public class AASRegistryProxy {
+
+
+ /**
+ * Store AAS registry URL
+ */
+ protected String aasRegistryURL = null;
+
+
+ /**
+ * Invoke BaSyx service calls via web services
+ */
+ protected WebServiceRawClient client = null;
+
+
+
+
+
+ /**
+ * Constructor
+ */
+ public AASRegistryProxy(String aasRegURL) {
+ // Store URL
+ aasRegistryURL = aasRegURL;
+
+ // Create web service client
+ client = new WebServiceRawClient();
+ }
+
+
+ /**
+ * Register AAS descriptor in registry
+ */
+ public void register(AASDescriptor deviceAASDescriptor) {
+ // Perform web service call to registry
+ client.post(aasRegistryURL+"/api/v1/registry", JSONTools.Instance.serialize(deviceAASDescriptor).toString());
+ }
+
+
+ /**
+ * Lookup device AAS
+ */
+ @SuppressWarnings("unchecked")
+ public AASDescriptor lookup(ModelUrn aasID) {
+ // Lookup AAS from AAS directory, get AAS descriptor
+ String jsonData = client.get(aasRegistryURL+"/api/v1/registry/"+aasID.getEncodedURN());
+
+ // Deserialize AAS descriptor
+ AASDescriptor aasDescriptor = new AASDescriptor((Map<String, Object>) JSONTools.Instance.deserialize(new JSONObject(jsonData)));
+
+ // Return AAS descriptor
+ return aasDescriptor;
+ }
+}
+
diff --git a/examples/basys.examples/src/basys/examples/urntools/ModelUrn.java b/examples/basys.examples/src/basys/examples/urntools/ModelUrn.java
new file mode 100644
index 0000000..2f691a9
--- /dev/null
+++ b/examples/basys.examples/src/basys/examples/urntools/ModelUrn.java
@@ -0,0 +1,75 @@
+package basys.examples.urntools;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+/**
+ * Create URNs with the format urn:<legalEntity>:<subUnit>:<subModel>:<version>:<revision>:<elementID>#<elementInstance>
+ *
+ * @author kuhn
+ *
+ */
+public class ModelUrn {
+
+
+ /**
+ * URN string
+ */
+ protected String urnString = null;
+
+
+
+ /**
+ * Constructor that accepts a single, raw URN
+ */
+ public ModelUrn(String rawURN) {
+ urnString = rawURN;
+ }
+
+
+ /**
+ * Constructor that build a URN
+ */
+ public ModelUrn(String legalEntity, String subUnit, String subModel, String version, String revision, String elementId, String elementInstance) {
+ // Goal is: urn:<legalEntity>:<subUnit>:<subModel>:<version>:<revision>:<elementID>#<elementInstance>
+ StringBuffer urnBuilder = new StringBuffer();
+
+ // Start with header
+ urnBuilder.append("urn:");
+ // - Add URN components until instance
+ if (legalEntity != null) urnBuilder.append(legalEntity); urnBuilder.append(":");
+ if (subUnit != null) urnBuilder.append(subUnit); urnBuilder.append(":");
+ if (subModel != null) urnBuilder.append(subModel); urnBuilder.append(":");
+ if (version != null) urnBuilder.append(version); urnBuilder.append(":");
+ if (revision != null) urnBuilder.append(revision); urnBuilder.append(":");
+ if (elementId != null) urnBuilder.append(elementId);
+ // - Add element instance, prefix with '#'
+ if (elementInstance != null) urnBuilder.append("#"+elementInstance);
+
+ // Build URN
+ urnString = urnBuilder.toString();
+ }
+
+
+
+ /**
+ * Get URN as string
+ */
+ public String getURN() {
+ return urnString;
+ }
+
+
+ /**
+ * Get URL encoded URN as string
+ */
+ public String getEncodedURN() {
+ try {
+ // Try to encode urn string
+ return URLEncoder.encode(urnString, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ // Catch block
+ e.printStackTrace(); return null;
+ }
+ }
+}