Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Espen2021-10-01 13:03:33 +0000
committerFrank Schnicke2021-10-09 09:37:59 +0000
commit4c49245f947ece8231379f12af2fd144282f2529 (patch)
treea07bc4a49ca7ff32dc02c2a7486afd0672048981
parentaf2483084c86b8f2f785acd2828ddecbccc37385 (diff)
downloadbasyx-feature-updater.tar.gz
basyx-feature-updater.tar.xz
basyx-feature-updater.zip
Adds initial version for aas updaterfeature-updater
Change-Id: If5b2dcda02036c6092d778197b9a9cdc41c3d8d5 Signed-off-by: Daniel Espen <daniel.espen@iese.fraunhofer.de>
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.AASServer/pom.xml20
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/java/org/eclipse/basyx/regression/AASServer/TestAASUpdater.java99
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/resources/aasx/updatertest.aasxbin0 -> 2450 bytes
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/resources/config/moquette.conf13
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/Dockerfile34
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/pom.xml133
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/java/org/eclipse/basyx/components/updater/components/aas/AASComponentConfigurer.java61
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/java/org/eclipse/basyx/components/updater/components/aas/AASEndpointConfigurer.java73
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/resources/META-INF/services/org/apache/camel/configurer/aas-component2
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/resources/META-INF/services/org/apache/camel/configurer/aas-endpoint2
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/resources/org/eclipse/basyx/components/updater/components/aas/aas.json37
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/java/org/eclipse/basyx/components/updater/components/aas/AASComponent.java17
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/java/org/eclipse/basyx/components/updater/components/aas/AASEndpoint.java65
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/java/org/eclipse/basyx/components/updater/components/aas/AASProducer.java24
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/resources/META-INF/services/org/apache/camel/component/aas1
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/test/resources/log4j2.properties7
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/build.bat1
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/build.sh2
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/docker-compose.yml25
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/pom.xml111
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/UpdaterComponent.java73
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/BaSyxRouteBuilder.java69
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/DatasourceEndpointBuilderFactory.java13
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/IDatasourceEndpointBuilder.java7
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/MQTTEndpointBuilder.java22
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/DatasinkConfiguration.java18
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/DatasourceConfiguration.java6
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/MQTTDatasourceConfiguration.java7
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/RouteConfiguration.java10
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/RoutesConfiguration.java16
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/TransformerConfiguration.java5
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/AASQualifierParser.java118
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/MQTTQualifierParser.java27
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/QualifierDatasourceParser.java7
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/QualifierDatasourceParserFactory.java48
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/executable/UpdaterExecutable.java25
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/resources/context.properties24
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/main/resources/logback.xml26
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/src/test/resources/.env39
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/start.bat3
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/start.sh4
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/stop.bat3
-rw-r--r--components/basys.components/basyx.components.docker/basyx.components.updater/stop.sh4
-rw-r--r--components/basys.components/basyx.components.docker/pom.xml9
-rw-r--r--components/basys.components/pom.xml292
45 files changed, 1451 insertions, 151 deletions
diff --git a/components/basys.components/basyx.components.docker/basyx.components.AASServer/pom.xml b/components/basys.components/basyx.components.docker/basyx.components.AASServer/pom.xml
index d73f23638..d9e8fd1de 100644
--- a/components/basys.components/basyx.components.docker/basyx.components.AASServer/pom.xml
+++ b/components/basys.components/basyx.components.docker/basyx.components.AASServer/pom.xml
@@ -54,6 +54,12 @@
<artifactId>basyx.sdk</artifactId>
<classifier>tests</classifier>
</dependency>
+
+ <dependency>
+ <groupId>org.eclipse.basyx</groupId>
+ <artifactId>basyx.components.updater</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
<!-- Used for reading .aasx files -->
<dependency>
@@ -61,6 +67,20 @@
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
+
+ <!-- Moquette MQTT broker for testing MQTT events -->
+ <dependency>
+ <groupId>io.moquette</groupId>
+ <artifactId>moquette-broker</artifactId>
+ <version>0.15</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
</dependencies>
diff --git a/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/java/org/eclipse/basyx/regression/AASServer/TestAASUpdater.java b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/java/org/eclipse/basyx/regression/AASServer/TestAASUpdater.java
new file mode 100644
index 000000000..0c8c93650
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/java/org/eclipse/basyx/regression/AASServer/TestAASUpdater.java
@@ -0,0 +1,99 @@
+package org.eclipse.basyx.regression.AASServer;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.aas.metamodel.connected.ConnectedAssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.map.descriptor.CustomId;
+import org.eclipse.basyx.aas.registration.memory.InMemoryRegistry;
+import org.eclipse.basyx.components.aas.AASServerComponent;
+import org.eclipse.basyx.components.aas.configuration.AASServerBackend;
+import org.eclipse.basyx.components.aas.configuration.BaSyxAASServerConfiguration;
+import org.eclipse.basyx.components.configuration.BaSyxContextConfiguration;
+import org.eclipse.basyx.components.updater.UpdaterComponent;
+import org.eclipse.basyx.submodel.metamodel.api.ISubmodel;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElement;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.eclipse.paho.client.mqttv3.MqttPersistenceException;
+import org.eclipse.paho.client.mqttv3.MqttSecurityException;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import io.moquette.broker.Server;
+import io.moquette.broker.config.ClasspathResourceLoader;
+import io.moquette.broker.config.IConfig;
+import io.moquette.broker.config.IResourceLoader;
+import io.moquette.broker.config.ResourceLoaderConfig;
+
+public class TestAASUpdater {
+ private static AASServerComponent aasServer;
+ private static UpdaterComponent updater;
+ private static InMemoryRegistry registry;
+ protected static Server mqttBroker;
+
+ protected static IIdentifier deviceAAS = new CustomId("TestUpdatedDeviceAAS");
+ private static BaSyxContextConfiguration aasContextConfig;
+
+ @BeforeClass
+ public static void setUp() throws IOException {
+ startMqttBroker();
+
+ registry = new InMemoryRegistry();
+
+ aasContextConfig = new BaSyxContextConfiguration(4001, "");
+ BaSyxAASServerConfiguration aasConfig = new BaSyxAASServerConfiguration(AASServerBackend.INMEMORY, "aasx/updatertest.aasx");
+ aasServer = new AASServerComponent(aasContextConfig, aasConfig);
+ aasServer.setRegistry(registry);
+
+ updater = new UpdaterComponent(registry, deviceAAS);
+ }
+
+ @Test
+ public void test() throws MqttException, InterruptedException {
+ aasServer.startComponent();
+ System.out.println("AAS STARTED");
+ Thread.sleep(1000);
+ System.out.println("START UPDATER");
+ updater.startComponent();
+ System.out.println("UPDATER STARTED");
+ Thread.sleep(1000);
+ System.out.println("PUBLISH EVENT");
+ publishNewDatapoint();
+ System.out.println("EVENT PUBLISHED");
+ Thread.sleep(1000);
+ checkIfPropertyIsUpdated();
+ updater.stopComponent();
+ aasServer.stopComponent();
+ }
+
+ private void checkIfPropertyIsUpdated() {
+ ConnectedAssetAdministrationShellManager manager = new ConnectedAssetAdministrationShellManager(registry);
+ ConnectedAssetAdministrationShell aas = manager.retrieveAAS(deviceAAS);
+ ISubmodel sm = aas.getSubmodels().get("ConnectedSubmodel");
+ ISubmodelElement updatedProp = sm.getSubmodelElement("ConnectedPropertyB");
+ Object propValue = updatedProp.getValue();
+ System.out.println("UpdatedPROP" + propValue);
+ assertEquals(3, propValue);
+ }
+
+ private void publishNewDatapoint() throws MqttException, MqttSecurityException, MqttPersistenceException {
+ MqttClient mqttClient = new MqttClient("tcp://localhost:1884", "testClient", new MemoryPersistence());
+ mqttClient.connect();
+ mqttClient.publish("PropertyB", new MqttMessage("3".getBytes()));
+ mqttClient.disconnect();
+ mqttClient.close();
+ }
+
+ private static void startMqttBroker() throws IOException {
+ mqttBroker = new Server();
+ IResourceLoader classpathLoader = new ClasspathResourceLoader();
+ final IConfig classPathConfig = new ResourceLoaderConfig(classpathLoader);
+ mqttBroker.startServer(classPathConfig);
+ }
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/resources/aasx/updatertest.aasx b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/resources/aasx/updatertest.aasx
new file mode 100644
index 000000000..1297badb0
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/resources/aasx/updatertest.aasx
Binary files differ
diff --git a/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/resources/config/moquette.conf b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/resources/config/moquette.conf
new file mode 100644
index 000000000..7a1ec57cf
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.AASServer/src/test/resources/config/moquette.conf
@@ -0,0 +1,13 @@
+# Moquette Java Broker configuration file for testing
+port 1884
+websocket_port 8080
+host 0.0.0.0
+persistence false
+
+# false to accept only client connections with credentials
+# true to accept client connection without credentials, validating only the one that provides credentials
+allow_anonymous true
+
+# false to prohibit clients from connecting without a clientid.
+# true to allow clients to connect without a clientid. One will be generated for them.
+allow_zero_byte_client_id false \ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/Dockerfile b/components/basys.components/basyx.components.docker/basyx.components.updater/Dockerfile
new file mode 100644
index 000000000..c9f4b7820
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/Dockerfile
@@ -0,0 +1,34 @@
+# 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
+COPY src/main/resources/context.properties /usr/share/config/context.properties
+COPY src/main/resources/registry.properties /usr/share/config/registry.properties
+COPY src/test/resources/dockerSQL.properties /usr/share/config/sql.properties
+COPY src/test/resources/dockerMongodb.properties /usr/share/config/mongodb.properties
+
+# Expose the appropriate port. In case of Tomcat, this is 8080.
+ARG PORT
+EXPOSE ${PORT}
+
+# Set the path for the registry configuration file
+ARG REGISTRY_CONFIG_KEY
+ENV ${REGISTRY_CONFIG_KEY} "/usr/share/config/registry.properties"
+
+# Set the path for the context configuration file
+ARG CONTEXT_CONFIG_KEY
+ENV ${CONTEXT_CONFIG_KEY} "/usr/share/config/context.properties"
+
+# Set the path for the sql configuration file
+ARG SQL_CONFIG_KEY
+ENV ${SQL_CONFIG_KEY} "/usr/share/config/sql.properties"
+
+# Set the path for the mongodb configuration file
+ARG MONGODB_CONFIG_KEY
+ENV ${MONGODB_CONFIG_KEY} "/usr/share/config/mongodb.properties"
+
+# 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.updater/basyx.components.camel-aas/pom.xml b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/pom.xml
new file mode 100644
index 000000000..a189f0375
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/pom.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.eclipse.basyx</groupId>
+ <artifactId>basyx.components.camel-aas</artifactId>
+ <packaging>jar</packaging>
+ <version>1.0.0-SNAPSHOT</version>
+
+ <name>Camel AAS Component</name>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ </properties>
+
+ <dependencyManagement>
+ <dependencies>
+ <!-- Camel BOM -->
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-bom</artifactId>
+ <version>3.12.0</version>
+ <scope>import</scope>
+ <type>pom</type>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+
+ <!-- camel -->
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-support</artifactId>
+ </dependency>
+
+ <!-- logging -->
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
+ <version>2.13.3</version>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- testing -->
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <!-- BaSyx SDK -->
+ <dependency>
+ <groupId>org.eclipse.basyx</groupId>
+ <artifactId>basyx.sdk</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+
+
+ <build>
+ <defaultGoal>install</defaultGoal>
+
+ <plugins>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.8.1</version>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>3.2.0</version>
+ <configuration>
+ <encoding>UTF-8</encoding>
+ </configuration>
+ </plugin>
+
+ <!-- generate camel meta-data -->
+ <plugin>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-component-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <?m2e ignore?>
+ <id>generate</id>
+ <goals>
+ <goal>generate</goal>
+ </goals>
+ <phase>process-classes</phase>
+ </execution>
+ </executions>
+ </plugin>
+
+
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <version>3.2.0</version>
+ <executions>
+ <execution>
+ <phase>initialize</phase>
+ <goals>
+ <goal>add-source</goal>
+ <goal>add-resource</goal>
+ </goals>
+ <configuration>
+ <sources>
+ <source>src/generated/java</source>
+ </sources>
+ <resources>
+ <resource>
+ <directory>src/generated/resources</directory>
+ </resource>
+ </resources>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+
+ </build>
+
+</project>
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/java/org/eclipse/basyx/components/updater/components/aas/AASComponentConfigurer.java b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/java/org/eclipse/basyx/components/updater/components/aas/AASComponentConfigurer.java
new file mode 100644
index 000000000..93474225e
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/java/org/eclipse/basyx/components/updater/components/aas/AASComponentConfigurer.java
@@ -0,0 +1,61 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.eclipse.basyx.components.updater.components.aas;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class AASComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+ @Override
+ public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+ AASComponent target = (AASComponent) obj;
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "autowiredenabled":
+ case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true;
+ case "bridgeerrorhandler":
+ case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+ case "lazystartproducer":
+ case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+ default: return false;
+ }
+ }
+
+ @Override
+ public Class<?> getOptionType(String name, boolean ignoreCase) {
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "autowiredenabled":
+ case "autowiredEnabled": return boolean.class;
+ case "bridgeerrorhandler":
+ case "bridgeErrorHandler": return boolean.class;
+ case "lazystartproducer":
+ case "lazyStartProducer": return boolean.class;
+ default: return null;
+ }
+ }
+
+ @Override
+ public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+ AASComponent target = (AASComponent) obj;
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "autowiredenabled":
+ case "autowiredEnabled": return target.isAutowiredEnabled();
+ case "bridgeerrorhandler":
+ case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+ case "lazystartproducer":
+ case "lazyStartProducer": return target.isLazyStartProducer();
+ default: return null;
+ }
+ }
+}
+
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/java/org/eclipse/basyx/components/updater/components/aas/AASEndpointConfigurer.java b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/java/org/eclipse/basyx/components/updater/components/aas/AASEndpointConfigurer.java
new file mode 100644
index 000000000..1e77407aa
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/java/org/eclipse/basyx/components/updater/components/aas/AASEndpointConfigurer.java
@@ -0,0 +1,73 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.eclipse.basyx.components.updater.components.aas;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class AASEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+ @Override
+ public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+ AASEndpoint target = (AASEndpoint) obj;
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "bridgeerrorhandler":
+ case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+ case "exceptionhandler":
+ case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
+ case "exchangepattern":
+ case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true;
+ case "lazystartproducer":
+ case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+ case "propertypath":
+ case "propertyPath": target.setPropertyPath(property(camelContext, java.lang.String.class, value)); return true;
+ default: return false;
+ }
+ }
+
+ @Override
+ public Class<?> getOptionType(String name, boolean ignoreCase) {
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "bridgeerrorhandler":
+ case "bridgeErrorHandler": return boolean.class;
+ case "exceptionhandler":
+ case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class;
+ case "exchangepattern":
+ case "exchangePattern": return org.apache.camel.ExchangePattern.class;
+ case "lazystartproducer":
+ case "lazyStartProducer": return boolean.class;
+ case "propertypath":
+ case "propertyPath": return java.lang.String.class;
+ default: return null;
+ }
+ }
+
+ @Override
+ public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+ AASEndpoint target = (AASEndpoint) obj;
+ switch (ignoreCase ? name.toLowerCase() : name) {
+ case "bridgeerrorhandler":
+ case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+ case "exceptionhandler":
+ case "exceptionHandler": return target.getExceptionHandler();
+ case "exchangepattern":
+ case "exchangePattern": return target.getExchangePattern();
+ case "lazystartproducer":
+ case "lazyStartProducer": return target.isLazyStartProducer();
+ case "propertypath":
+ case "propertyPath": return target.getPropertyPath();
+ default: return null;
+ }
+ }
+}
+
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/resources/META-INF/services/org/apache/camel/configurer/aas-component b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/resources/META-INF/services/org/apache/camel/configurer/aas-component
new file mode 100644
index 000000000..d859ce446
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/resources/META-INF/services/org/apache/camel/configurer/aas-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.eclipse.basyx.components.updater.components.aas.AASComponentConfigurer
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/resources/META-INF/services/org/apache/camel/configurer/aas-endpoint b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/resources/META-INF/services/org/apache/camel/configurer/aas-endpoint
new file mode 100644
index 000000000..afd5fe814
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/resources/META-INF/services/org/apache/camel/configurer/aas-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.eclipse.basyx.components.updater.components.aas.AASEndpointConfigurer
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/resources/org/eclipse/basyx/components/updater/components/aas/aas.json b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/resources/org/eclipse/basyx/components/updater/components/aas/aas.json
new file mode 100644
index 000000000..6029a32f8
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/generated/resources/org/eclipse/basyx/components/updater/components/aas/aas.json
@@ -0,0 +1,37 @@
+{
+ "component": {
+ "kind": "component",
+ "name": "aas",
+ "title": "AAS",
+ "description": "AAS component which can connect to Asset Administration Shells via a given registry",
+ "deprecated": false,
+ "firstVersion": "1.0.0-SNAPSHOT",
+ "label": "java",
+ "javaType": "org.eclipse.basyx.components.updater.components.aas.AASComponent",
+ "supportLevel": "Preview",
+ "groupId": "org.eclipse.basyx",
+ "artifactId": "basyx.components.camel-aas",
+ "version": "1.0.0-SNAPSHOT",
+ "scheme": "aas",
+ "extendsScheme": "",
+ "syntax": "aas:name",
+ "async": false,
+ "api": false,
+ "consumerOnly": false,
+ "producerOnly": false,
+ "lenientProperties": false
+ },
+ "componentProperties": {
+ "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored." },
+ "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing." },
+ "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc." }
+ },
+ "properties": {
+ "name": { "kind": "path", "displayName": "Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Some description of this option, and what it does" },
+ "propertyPath": { "kind": "parameter", "displayName": "Property Path", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The path to the property relative to the target AAS" },
+ "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored." },
+ "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored." },
+ "exchangePattern": { "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut", "InOptionalOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
+ "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing." }
+ }
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/java/org/eclipse/basyx/components/updater/components/aas/AASComponent.java b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/java/org/eclipse/basyx/components/updater/components/aas/AASComponent.java
new file mode 100644
index 000000000..7566dc2c4
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/java/org/eclipse/basyx/components/updater/components/aas/AASComponent.java
@@ -0,0 +1,17 @@
+package org.eclipse.basyx.components.updater.components.aas;
+
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.support.DefaultComponent;
+
+@org.apache.camel.spi.annotations.Component("aas")
+public class AASComponent extends DefaultComponent {
+
+ @Override
+ protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+ Endpoint endpoint = new AASEndpoint(uri, this);
+ setProperties(endpoint, parameters);
+ return endpoint;
+ }
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/java/org/eclipse/basyx/components/updater/components/aas/AASEndpoint.java b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/java/org/eclipse/basyx/components/updater/components/aas/AASEndpoint.java
new file mode 100644
index 000000000..650dde665
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/java/org/eclipse/basyx/components/updater/components/aas/AASEndpoint.java
@@ -0,0 +1,65 @@
+package org.eclipse.basyx.components.updater.components.aas;
+
+import org.apache.camel.Category;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriPath;
+import org.apache.camel.support.DefaultEndpoint;
+
+/**
+ * AAS component which can connect to Asset Administration Shells via a given
+ * registry
+ */
+@UriEndpoint(firstVersion = "1.0.0-SNAPSHOT", scheme = "aas", title = "AAS", syntax = "aas:name",
+ category = {Category.JAVA})
+public class AASEndpoint extends DefaultEndpoint {
+ @UriPath @Metadata(required = true)
+ private String name;
+
+ @UriParam(defaultValue = "")
+ private String propertyPath = "/smIdShort/smElementCollection/myPropertyIdShort";
+
+ public AASEndpoint() {
+ }
+
+ public AASEndpoint(String uri, AASComponent component) {
+ super(uri, component);
+ }
+
+ @Override
+ public Producer createProducer() throws Exception {
+ return new AASProducer(this);
+ }
+
+ @Override
+ public Consumer createConsumer(Processor processor) throws Exception {
+ return null;
+ }
+
+ /**
+ * Some description of this option, and what it does
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * The path to the property relative to the target AAS
+ */
+ public String getPropertyPath() {
+ return propertyPath;
+ }
+
+ public void setPropertyPath(String propertyPath) {
+ this.propertyPath = propertyPath;
+ }
+
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/java/org/eclipse/basyx/components/updater/components/aas/AASProducer.java b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/java/org/eclipse/basyx/components/updater/components/aas/AASProducer.java
new file mode 100644
index 000000000..ad1114505
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/java/org/eclipse/basyx/components/updater/components/aas/AASProducer.java
@@ -0,0 +1,24 @@
+package org.eclipse.basyx.components.updater.components.aas;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.support.DefaultProducer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AASProducer extends DefaultProducer {
+ private static final Logger LOG = LoggerFactory.getLogger(AASProducer.class);
+ private AASEndpoint endpoint;
+
+ public AASProducer(AASEndpoint endpoint) {
+ super(endpoint);
+ this.endpoint = endpoint;
+ LOG.info("Creating ASS Producer for endpoint " + endpoint.getEndpointUri());
+ }
+
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ LOG.info("Got msg for property: " + exchange.getIn().getBody());
+ LOG.info("TODO: Write value into property with endpoint " + endpoint);
+ }
+
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/resources/META-INF/services/org/apache/camel/component/aas b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/resources/META-INF/services/org/apache/camel/component/aas
new file mode 100644
index 000000000..fac90dfd4
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/main/resources/META-INF/services/org/apache/camel/component/aas
@@ -0,0 +1 @@
+class=org.eclipse.basyx.components.updater.components.aas.AASComponent
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/test/resources/log4j2.properties b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/test/resources/log4j2.properties
new file mode 100644
index 000000000..328db356d
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/basyx.components.camel-aas/src/test/resources/log4j2.properties
@@ -0,0 +1,7 @@
+
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = [%30.30t] %-30.30c{1} %-5p %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.out.ref = out
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/build.bat b/components/basys.components/basyx.components.docker/basyx.components.updater/build.bat
new file mode 100644
index 000000000..64f74e32b
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/build.bat
@@ -0,0 +1 @@
+../.././mvnw clean install -U -Pdocker -DskipTests \ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/build.sh b/components/basys.components/basyx.components.docker/basyx.components.updater/build.sh
new file mode 100644
index 000000000..6820cccf0
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/build.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env sh
+../../mvnw clean install -U -Pdocker -DskipTests \ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/docker-compose.yml b/components/basys.components/basyx.components.docker/basyx.components.updater/docker-compose.yml
new file mode 100644
index 000000000..717a3e3cc
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/docker-compose.yml
@@ -0,0 +1,25 @@
+version: '2.1'
+services:
+ registry:
+ image: ${BASYX_IMAGE_NAME}:${BASYX_IMAGE_TAG}
+ container_name: ${BASYX_CONTAINER_NAME}
+ ports:
+ - ${BASYX_HOST_PORT}:${BASYX_CONTAINER_PORT}
+# depends_on:
+# mongodb:
+# condition: service_healthy
+# links:
+# - mongodb
+
+# mongodb:
+# image: mongo:latest
+# container_name: mongodb
+# Possibility to enable authentication
+# environment:
+# MONGO_INITDB_ROOT_USERNAME: root
+# MONGO_INITDB_ROOT_PASSWORD: example
+# healthcheck:
+# test: echo 'db.runCommand("ping").ok' | mongo mongodb:27017/test --quiet
+# interval: 3s
+# timeout: 3s
+# retries: 5 \ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/pom.xml b/components/basys.components/basyx.components.docker/basyx.components.updater/pom.xml
new file mode 100644
index 000000000..776c18e38
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/pom.xml
@@ -0,0 +1,111 @@
+<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>
+
+ <parent>
+ <groupId>org.eclipse.basyx</groupId>
+ <artifactId>basyx.components.docker</artifactId>
+ <version>1.0.0</version>
+ </parent>
+
+ <artifactId>basyx.components.updater</artifactId>
+ <name>BaSyx AASUpdater</name>
+ <version>1.0.0-SNAPSHOT</version>
+
+ <properties>
+ <basyx.components.executable>org.eclipse.basyx.components.registry.executable.UpdaterExecutable</basyx.components.executable>
+ </properties>
+
+ <packaging>jar</packaging>
+
+ <build>
+ <!-- Define additional plugins that are not included by default -->
+ <!-- Plugin configuration is done in parent project(s) -->
+ <plugins>
+ <!-- Attach sources to jar file -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-bom</artifactId>
+ <version>3.11.2</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-core</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-componentdsl</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-endpointdsl</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-paho</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.basyx</groupId>
+ <artifactId>basyx.components.camel-aas</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+
+ </dependencies>
+
+ <profiles>
+ <profile>
+ <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>
+</project> \ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/UpdaterComponent.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/UpdaterComponent.java
new file mode 100644
index 000000000..d520ba078
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/UpdaterComponent.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (C) 2021 the Eclipse BaSyx Authors
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ******************************************************************************/
+package org.eclipse.basyx.components.updater;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.eclipse.basyx.aas.registration.api.IAASRegistry;
+import org.eclipse.basyx.components.IComponent;
+import org.eclipse.basyx.components.updater.builder.BaSyxRouteBuilder;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Generic registry that can start and stop a registry with different kinds of backends.
+ * Currently supports MongoDB and SQL. For development purposes, the component can also start a
+ * registry without a backend and without persistency.
+ *
+ * @author espen
+ *
+ */
+public class UpdaterComponent implements IComponent {
+ private static Logger logger = LoggerFactory.getLogger(UpdaterComponent.class);
+
+ private IIdentifier targetAASId;
+
+ protected CamelContext camelContext;
+
+ private IAASRegistry registry;
+
+ public UpdaterComponent(IAASRegistry registry, IIdentifier aasId) {
+ setRegistry(registry);
+ this.targetAASId = aasId;
+ }
+
+ /**
+ * Starts the context at http://${hostName}:${port}/${path}
+ */
+ @Override
+ public void startComponent() {
+ camelContext = new DefaultCamelContext();
+ try {
+ camelContext.addRoutes(new BaSyxRouteBuilder(registry, targetAASId));
+ camelContext.start();
+ logger.info("Updater started");
+ } catch (Exception e) {
+ e.printStackTrace();
+ camelContext = null;
+ }
+ }
+
+ /**
+ * Stops the updater component
+ */
+ @Override
+ public void stopComponent() {
+ if (camelContext != null && !camelContext.isStopped()) {
+ camelContext.stop();
+ logger.info("Updater stopped");
+ }
+ }
+
+ public void setRegistry(IAASRegistry registry) {
+ this.registry = registry;
+ }
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/BaSyxRouteBuilder.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/BaSyxRouteBuilder.java
new file mode 100644
index 000000000..c00d93ab0
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/BaSyxRouteBuilder.java
@@ -0,0 +1,69 @@
+package org.eclipse.basyx.components.updater.builder;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.eclipse.basyx.aas.manager.ConnectedAssetAdministrationShellManager;
+import org.eclipse.basyx.aas.metamodel.connected.ConnectedAssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.map.descriptor.AASDescriptor;
+import org.eclipse.basyx.aas.registration.api.IAASRegistry;
+import org.eclipse.basyx.components.updater.configuration.DatasinkConfiguration;
+import org.eclipse.basyx.components.updater.configuration.DatasourceConfiguration;
+import org.eclipse.basyx.components.updater.configuration.RouteConfiguration;
+import org.eclipse.basyx.components.updater.configuration.RoutesConfiguration;
+import org.eclipse.basyx.components.updater.configuration.parser.AASQualifierParser;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+
+public class BaSyxRouteBuilder extends RouteBuilder
+{
+ private IAASRegistry registry;
+ private IIdentifier aasId;
+
+ public BaSyxRouteBuilder(IAASRegistry registry, IIdentifier aasId) {
+ this.registry = registry;
+ this.aasId = aasId;
+ }
+
+ @Override
+ public void configure() throws Exception {
+ AASQualifierParser configParser = createQualifierParser();
+ RoutesConfiguration configuration = configParser.newConfiguration();
+ createRoutesFromConfiguration(configuration);
+ }
+
+ private AASQualifierParser createQualifierParser() {
+ ConnectedAssetAdministrationShellManager manager = new ConnectedAssetAdministrationShellManager(registry);
+ ConnectedAssetAdministrationShell targetAAS = manager.retrieveAAS(aasId);
+ AASDescriptor aasDesc = registry.lookupAAS(aasId);
+ String aasEndpoint = aasDesc.getFirstEndpoint();
+ return new AASQualifierParser(targetAAS, aasEndpoint);
+ }
+
+ public void createRoutesFromConfiguration(RoutesConfiguration configuration) {
+ // Here, it would be possible to optimize routes
+ // optimizeRoutes(configuration.routes);
+ // Here, a more complex route builder could generate a routes from a route graph
+ // instead of building one separate route per property
+ for (RouteConfiguration routeConfig : configuration.routes) {
+ createRoute(configuration, routeConfig);
+ }
+ }
+
+ private void createRoute(RoutesConfiguration configuration, RouteConfiguration routeConfig) {
+ String datasourceEndpoint = createDatasourceEndpoint(configuration, routeConfig.datasource);
+ String datasinkEndpoint = createDatasinkEndpoint(configuration, routeConfig.datasinks.get(0));
+ from(datasourceEndpoint).to(datasinkEndpoint).to("log:updater");
+ }
+
+ private String createDatasinkEndpoint(RoutesConfiguration routesConfig, String datasinkId) {
+ DatasinkConfiguration dsConfig = routesConfig.datasinks.get(datasinkId);
+ String endpointDefinition = "aas:";
+ endpointDefinition += dsConfig.endpoint;
+ endpointDefinition += "?propertyPath=" + dsConfig.path;
+ return endpointDefinition;
+ }
+
+ private String createDatasourceEndpoint(RoutesConfiguration routesConfig, String datasourceId) {
+ DatasourceConfiguration dsConfig = routesConfig.datasources.get(datasourceId);
+ IDatasourceEndpointBuilder builder = DatasourceEndpointBuilderFactory.create(dsConfig);
+ return builder.createEndpoint(dsConfig);
+ }
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/DatasourceEndpointBuilderFactory.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/DatasourceEndpointBuilderFactory.java
new file mode 100644
index 000000000..86cf52626
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/DatasourceEndpointBuilderFactory.java
@@ -0,0 +1,13 @@
+package org.eclipse.basyx.components.updater.builder;
+
+import org.eclipse.basyx.components.updater.configuration.DatasourceConfiguration;
+import org.eclipse.basyx.components.updater.configuration.MQTTDatasourceConfiguration;
+
+public class DatasourceEndpointBuilderFactory {
+ public static IDatasourceEndpointBuilder create(DatasourceConfiguration config) {
+ if (config.type.equals(MQTTDatasourceConfiguration.TYPE)) {
+ return new MQTTEndpointBuilder();
+ }
+ return null;
+ }
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/IDatasourceEndpointBuilder.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/IDatasourceEndpointBuilder.java
new file mode 100644
index 000000000..8c788fbc9
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/IDatasourceEndpointBuilder.java
@@ -0,0 +1,7 @@
+package org.eclipse.basyx.components.updater.builder;
+
+import org.eclipse.basyx.components.updater.configuration.DatasourceConfiguration;
+
+public interface IDatasourceEndpointBuilder {
+ public String createEndpoint(DatasourceConfiguration config);
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/MQTTEndpointBuilder.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/MQTTEndpointBuilder.java
new file mode 100644
index 000000000..d8481754e
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/builder/MQTTEndpointBuilder.java
@@ -0,0 +1,22 @@
+package org.eclipse.basyx.components.updater.builder;
+
+import org.eclipse.basyx.components.updater.configuration.DatasourceConfiguration;
+import org.eclipse.basyx.components.updater.configuration.MQTTDatasourceConfiguration;
+
+public class MQTTEndpointBuilder implements IDatasourceEndpointBuilder {
+
+ @Override
+ public String createEndpoint(DatasourceConfiguration config) {
+ if (!(config instanceof MQTTDatasourceConfiguration)) {
+ throw new RuntimeException("Invalid config");
+ }
+ MQTTDatasourceConfiguration mqttConfig = (MQTTDatasourceConfiguration) config;
+
+ return buildComponentString(mqttConfig);
+ }
+
+ private String buildComponentString(MQTTDatasourceConfiguration mqttConfig) {
+ return "paho:" + mqttConfig.topic + "?brokerUrl=" + mqttConfig.endpoint;
+ }
+
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/DatasinkConfiguration.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/DatasinkConfiguration.java
new file mode 100644
index 000000000..e09786e8e
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/DatasinkConfiguration.java
@@ -0,0 +1,18 @@
+package org.eclipse.basyx.components.updater.configuration;
+
+/**
+ * TODO: create meaningfull datasink configuration
+ */
+public class DatasinkConfiguration {
+ private static final String PROPERTY_TYPE = "PROPERTY";
+
+ public String type;
+ public String endpoint;
+ public String path;
+
+ public DatasinkConfiguration(String aasEndpoint, String propertyPath) {
+ this.type = PROPERTY_TYPE;
+ this.endpoint = aasEndpoint;
+ this.path = propertyPath;
+ }
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/DatasourceConfiguration.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/DatasourceConfiguration.java
new file mode 100644
index 000000000..2eb2920e0
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/DatasourceConfiguration.java
@@ -0,0 +1,6 @@
+package org.eclipse.basyx.components.updater.configuration;
+
+public class DatasourceConfiguration {
+ public String type;
+ public String endpoint;
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/MQTTDatasourceConfiguration.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/MQTTDatasourceConfiguration.java
new file mode 100644
index 000000000..674235e4c
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/MQTTDatasourceConfiguration.java
@@ -0,0 +1,7 @@
+package org.eclipse.basyx.components.updater.configuration;
+
+public class MQTTDatasourceConfiguration extends DatasourceConfiguration {
+ public static final String TYPE = "MQTT";
+
+ public String topic;
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/RouteConfiguration.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/RouteConfiguration.java
new file mode 100644
index 000000000..5ac7dbffb
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/RouteConfiguration.java
@@ -0,0 +1,10 @@
+package org.eclipse.basyx.components.updater.configuration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RouteConfiguration {
+ public String datasource;
+ public List<String> transformers = new ArrayList<>();
+ public List<String> datasinks = new ArrayList<>();
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/RoutesConfiguration.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/RoutesConfiguration.java
new file mode 100644
index 000000000..79a587011
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/RoutesConfiguration.java
@@ -0,0 +1,16 @@
+package org.eclipse.basyx.components.updater.configuration;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * TODO: Configuration format for updater
+ */
+public class RoutesConfiguration {
+ public Map<String, DatasourceConfiguration> datasources = new HashMap<>();
+ public Map<String, TransformerConfiguration> transformers = new HashMap<>();
+ public Map<String, DatasinkConfiguration> datasinks = new HashMap<>();
+ public List<RouteConfiguration> routes = new ArrayList<>();
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/TransformerConfiguration.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/TransformerConfiguration.java
new file mode 100644
index 000000000..c22cdc901
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/TransformerConfiguration.java
@@ -0,0 +1,5 @@
+package org.eclipse.basyx.components.updater.configuration;
+
+public class TransformerConfiguration {
+
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/AASQualifierParser.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/AASQualifierParser.java
new file mode 100644
index 000000000..17760bf44
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/AASQualifierParser.java
@@ -0,0 +1,118 @@
+package org.eclipse.basyx.components.updater.configuration.parser;
+
+import org.eclipse.basyx.aas.metamodel.api.IAssetAdministrationShell;
+import org.eclipse.basyx.components.updater.configuration.DatasinkConfiguration;
+import org.eclipse.basyx.components.updater.configuration.DatasourceConfiguration;
+import org.eclipse.basyx.components.updater.configuration.RouteConfiguration;
+import org.eclipse.basyx.components.updater.configuration.RoutesConfiguration;
+import org.eclipse.basyx.components.updater.configuration.TransformerConfiguration;
+import org.eclipse.basyx.submodel.metamodel.api.ISubmodel;
+import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElement;
+import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElementCollection;
+import org.eclipse.basyx.submodel.metamodel.api.submodelelement.dataelement.IProperty;
+import org.eclipse.basyx.vab.modelprovider.VABPathTools;
+
+public class AASQualifierParser {
+ private IAssetAdministrationShell aas;
+ private String aasEndpoint;
+
+ private RoutesConfiguration config;
+
+ public AASQualifierParser(IAssetAdministrationShell aas, String aasEndpoint) {
+ this.aasEndpoint = aasEndpoint;
+ this.aas = aas;
+ }
+
+ public RoutesConfiguration newConfiguration() {
+ this.config = new RoutesConfiguration();
+ extendConfiguration(config);
+ return this.config;
+ }
+
+ public void extendConfiguration(RoutesConfiguration config) {
+ this.config = config;
+ parseAAS(this.aas);
+ }
+
+ private void parseAAS(IAssetAdministrationShell aas) {
+ aas.getSubmodels().values().forEach(this::parseSubmodel);
+ }
+
+ private void parseSubmodel(ISubmodel sm) {
+ sm.getSubmodelElements().values().forEach(element -> {
+ parseSMElement(element, sm.getIdShort());
+ });
+ }
+
+ private void parseSMElement(ISubmodelElement element, String parentPath) {
+ if (element instanceof IProperty) {
+ parseProperty((IProperty) element, parentPath);
+ } else if (element instanceof ISubmodelElementCollection) {
+ parseCollection((ISubmodelElementCollection) element, parentPath);
+ }
+ }
+
+ private void parseCollection(ISubmodelElementCollection collection, String parentPath) {
+ String idShort = collection.getIdShort();
+ String currentPath = VABPathTools.concatenatePaths(parentPath, idShort);
+ collection.getValues().values().forEach(value -> {
+ if (value instanceof ISubmodelElement) {
+ parseSMElement((ISubmodelElement) value, currentPath);
+ }
+ });
+ }
+
+ private void parseProperty(IProperty property, String parentPath) {
+ if (!isPropertyConnected(property)) {
+ return;
+ }
+
+ String propPath = VABPathTools.concatenatePaths(parentPath, property.getIdShort());
+ String configId = parentPath + "." + property.getIdShort();
+
+ DatasourceConfiguration datasourceConfig = createDatasourceConfigFromProperty(property);
+ DatasinkConfiguration datasinkConfig = createDatasinkConfigFromProperty(propPath);
+ TransformerConfiguration transformerConfig = createTransformerConfigFromProperty(property);
+
+ extendConfiguration(configId, datasourceConfig, datasinkConfig, transformerConfig);
+ }
+
+ private void extendConfiguration(String configId, DatasourceConfiguration datasourceConfig, DatasinkConfiguration datasinkConfig, TransformerConfiguration transformerConfig) {
+ config.datasources.put(configId, datasourceConfig);
+ config.datasinks.put(configId, datasinkConfig);
+ if (transformerConfig != null) {
+ config.transformers.put(configId, transformerConfig);
+ }
+
+ RouteConfiguration routeConfig = createRouteConfiguration(configId, transformerConfig);
+
+ config.routes.add(routeConfig);
+ }
+
+ private RouteConfiguration createRouteConfiguration(String configId, TransformerConfiguration transformerConfig) {
+ RouteConfiguration routeConfig = new RouteConfiguration();
+ routeConfig.datasource = configId;
+ routeConfig.datasinks.add(configId);
+ if (transformerConfig != null) {
+ routeConfig.transformers.add(configId);
+ }
+ return routeConfig;
+ }
+
+ private boolean isPropertyConnected(IProperty property) {
+ return QualifierDatasourceParserFactory.hasDatasourceDefinition(property);
+ }
+
+ private TransformerConfiguration createTransformerConfigFromProperty(IProperty property) {
+ return null;
+ }
+
+ private DatasinkConfiguration createDatasinkConfigFromProperty(String parentPath) {
+ return new DatasinkConfiguration(aasEndpoint, parentPath);
+ }
+
+ private DatasourceConfiguration createDatasourceConfigFromProperty(IProperty property) {
+ QualifierDatasourceParser sinkParser = QualifierDatasourceParserFactory.createParser(property);
+ return sinkParser.parseDatasourceConfiguration();
+ }
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/MQTTQualifierParser.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/MQTTQualifierParser.java
new file mode 100644
index 000000000..c023ac88a
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/MQTTQualifierParser.java
@@ -0,0 +1,27 @@
+package org.eclipse.basyx.components.updater.configuration.parser;
+
+import java.util.Map;
+
+import org.eclipse.basyx.components.updater.configuration.DatasourceConfiguration;
+import org.eclipse.basyx.components.updater.configuration.MQTTDatasourceConfiguration;
+
+public class MQTTQualifierParser implements QualifierDatasourceParser {
+ public static final String BROKER_ENDPOINT = "BaSyxMQTTBrokerEndpoint";
+ public static final String TOPIC = "BaSyxMQTTTopic";
+
+ private Map<String, String> qualifierMap;
+
+ public MQTTQualifierParser(Map<String, String> qualifierMap) {
+ this.qualifierMap = qualifierMap;
+ }
+
+ @Override
+ public DatasourceConfiguration parseDatasourceConfiguration() {
+ MQTTDatasourceConfiguration dsConfiguration = new MQTTDatasourceConfiguration();
+ dsConfiguration.type = MQTTDatasourceConfiguration.TYPE;
+ dsConfiguration.endpoint = qualifierMap.get(BROKER_ENDPOINT);
+ dsConfiguration.topic = qualifierMap.get(TOPIC);
+ return dsConfiguration;
+ }
+
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/QualifierDatasourceParser.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/QualifierDatasourceParser.java
new file mode 100644
index 000000000..794a868ba
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/QualifierDatasourceParser.java
@@ -0,0 +1,7 @@
+package org.eclipse.basyx.components.updater.configuration.parser;
+
+import org.eclipse.basyx.components.updater.configuration.DatasourceConfiguration;
+
+public interface QualifierDatasourceParser {
+ public DatasourceConfiguration parseDatasourceConfiguration();
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/QualifierDatasourceParserFactory.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/QualifierDatasourceParserFactory.java
new file mode 100644
index 000000000..14bbc1a09
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/configuration/parser/QualifierDatasourceParserFactory.java
@@ -0,0 +1,48 @@
+package org.eclipse.basyx.components.updater.configuration.parser;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.basyx.submodel.metamodel.api.qualifier.qualifiable.IConstraint;
+import org.eclipse.basyx.submodel.metamodel.api.qualifier.qualifiable.IQualifiable;
+import org.eclipse.basyx.submodel.metamodel.api.qualifier.qualifiable.IQualifier;
+
+public class QualifierDatasourceParserFactory {
+ public static final String DATASOURCE_TYPE = "BaSyxDatasourceType";
+
+ public QualifierDatasourceParserFactory() {
+ }
+
+ public static QualifierDatasourceParser createParser(IQualifiable qualifiable) {
+ Collection<IConstraint> qualifiers = qualifiable.getQualifiers();
+ Map<String, String> qualifierMap = convertQualifiersToMap(qualifiers);
+ return createParser(qualifierMap);
+ }
+
+ public static boolean hasDatasourceDefinition(IQualifiable qualifiable) {
+ Collection<IConstraint> qualifiers = qualifiable.getQualifiers();
+ Map<String, String> qualifierMap = convertQualifiersToMap(qualifiers);
+ return qualifierMap.containsKey(DATASOURCE_TYPE);
+ }
+
+ private static QualifierDatasourceParser createParser(Map<String, String> qualifierMap) {
+ if (qualifierMap.get(DATASOURCE_TYPE).equals("MQTT")) {
+ return new MQTTQualifierParser(qualifierMap);
+ }
+ return null;
+ }
+
+ private static Map<String, String> convertQualifiersToMap(Collection<IConstraint> qualifiers) {
+ Map<String, String> qualifierMap = new HashMap<>();
+ for (IConstraint constraint : qualifiers) {
+ if (constraint instanceof IQualifier) {
+ IQualifier qualifier = (IQualifier) constraint;
+ String type = qualifier.getType();
+ String value = (String) qualifier.getValue();
+ qualifierMap.put(type, value);
+ }
+ }
+ return qualifierMap;
+ }
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/executable/UpdaterExecutable.java b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/executable/UpdaterExecutable.java
new file mode 100644
index 000000000..b0176bfad
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/java/org/eclipse/basyx/components/updater/executable/UpdaterExecutable.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (C) 2021 the Eclipse BaSyx Authors
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ ******************************************************************************/
+package org.eclipse.basyx.components.updater.executable;
+
+/**
+ * A registry executable for a modular AAS updater
+ *
+ * @author espen
+ */
+public class UpdaterExecutable {
+ private UpdaterExecutable() {
+ }
+
+ public static void main(String[] args) {
+ // UpdaterComponent component = new UpdaterComponent();
+ // component.startComponent();
+ }
+}
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/resources/context.properties b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/resources/context.properties
new file mode 100644
index 000000000..9ff1ad20a
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/resources/context.properties
@@ -0,0 +1,24 @@
+# ###############################
+# HTTP Context configuration file
+# ###############################
+
+# ###############################
+# Context Path
+# ###############################
+# Specifies the subpath in the url for this server context
+
+contextPath=/registry
+
+# ###############################
+# Hostname
+# ###############################
+# Specifies the hostname for this server context
+
+contextHostname=localhost
+
+# ###############################
+# Port
+# ###############################
+# Specifies the port for this server context
+
+contextPort=4000 \ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/resources/logback.xml b/components/basys.components/basyx.components.docker/basyx.components.updater/src/main/resources/logback.xml
new file mode 100644
index 000000000..86341d620
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/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.updater/src/test/resources/.env b/components/basys.components/basyx.components.docker/basyx.components.updater/src/test/resources/.env
new file mode 100644
index 000000000..36083e885
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/src/test/resources/.env
@@ -0,0 +1,39 @@
+# ##################
+# Docker Environment
+# ##################
+
+# ##################
+# Host Port
+# ##################
+# Specifies the port for the Docker HOST the container port is mapped to
+
+BASYX_HOST_PORT=8082
+
+# ##################
+# Container Port
+# ##################
+# Specifies the port for the Docker CONTAINER that is be mapped for the host
+
+BASYX_CONTAINER_PORT=4000
+
+# ##################
+# Image Name
+# ##################
+# The image of the image that is build for this component
+
+BASYX_IMAGE_NAME=eclipsebasyx/aas-registry
+
+# ##################
+# Image Tag
+# ##################
+# The image tag of the image that is build for this component
+
+BASYX_IMAGE_TAG=1.0.2
+
+# ##################
+# Container Name
+# ##################
+# The name of the container used for the default environment
+
+BASYX_CONTAINER_NAME=registry
+
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/start.bat b/components/basys.components/basyx.components.docker/basyx.components.updater/start.bat
new file mode 100644
index 000000000..f0ff9e1d1
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/start.bat
@@ -0,0 +1,3 @@
+cd src/test/resources
+docker-compose up
+cd ../../.. \ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/start.sh b/components/basys.components/basyx.components.docker/basyx.components.updater/start.sh
new file mode 100644
index 000000000..4b9b54aaf
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/start.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+cd src/test/resources
+docker-compose up
+cd ../../.. \ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/stop.bat b/components/basys.components/basyx.components.docker/basyx.components.updater/stop.bat
new file mode 100644
index 000000000..b6452468b
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/stop.bat
@@ -0,0 +1,3 @@
+cd src/test/resources
+docker-compose down
+cd ../../.. \ No newline at end of file
diff --git a/components/basys.components/basyx.components.docker/basyx.components.updater/stop.sh b/components/basys.components/basyx.components.docker/basyx.components.updater/stop.sh
new file mode 100644
index 000000000..e11a931cf
--- /dev/null
+++ b/components/basys.components/basyx.components.docker/basyx.components.updater/stop.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+cd src/test/resources
+docker-compose down
+cd ../../.. \ 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 6afe08387..2c99cf8a5 100644
--- a/components/basys.components/basyx.components.docker/pom.xml
+++ b/components/basys.components/basyx.components.docker/pom.xml
@@ -14,10 +14,11 @@
<packaging>pom</packaging>
<!-- Includes all components in this project as separated modules -->
- <modules>
- <module>basyx.components.registry</module>
- <module>basyx.components.AASServer</module>
- </modules>
+ <modules>
+ <module>basyx.components.registry</module>
+ <module>basyx.components.AASServer</module>
+ <module>basyx.components.updater</module>
+ </modules>
<build>
<pluginManagement>
diff --git a/components/basys.components/pom.xml b/components/basys.components/pom.xml
index 9dd688ef9..a44e0500a 100644
--- a/components/basys.components/pom.xml
+++ b/components/basys.components/pom.xml
@@ -1,157 +1,155 @@
-<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>org.eclipse.basyx</groupId>
- <artifactId>basyx.components</artifactId>
- <version>1.0.0</version>
- <name>BaSyx Components</name>
+<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>
- <packaging>pom</packaging>
+ <groupId>org.eclipse.basyx</groupId>
+ <artifactId>basyx.components</artifactId>
+ <version>1.0.0</version>
+ <name>BaSyx Components</name>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- </properties>
-
- <!-- Includes all components in this project as separated modules -->
- <modules>
- <module>basyx.components.lib</module>
- <module>basyx.components.docker</module>
- </modules>
-
- <build>
- <!-- Specifies plugin settings that are common for all submodules -->
- <pluginManagement>
- <plugins>
- <!-- Compile Java sources using Java 8 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.8.1</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- </plugin>
-
- <!-- Attach sources to jar file -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-source-plugin</artifactId>
- <version>3.2.1</version>
- <executions>
- <execution>
- <id>attach-sources</id>
- <goals>
- <goal>jar-no-fork</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
-
- <!-- Generate separate jar for tests and exclude logback.xml from generated jars -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <version>3.1.1</version>
- <configuration>
- <excludes>
- <exclude>**/logback.xml</exclude>
- </excludes>
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>test-jar</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
-
- <!-- Run unit tests (Test*.java, *Test.java, *Tests.java and *TestCase.java excluding HTTP and TCP tests) -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <version>3.0.0-M3</version>
- <configuration>
- <excludes>
- <exclude>**/*HTTP*</exclude>
- <exclude>**/*TCP*</exclude>
- <!-- Exclude explicit MongoDB tests for CI -->
- <exclude>**/*MongoDB*</exclude>
- </excludes>
- </configuration>
- </plugin>
-
- <!-- Run integration tests (IT*.java, *IT.java and *ITCase.java) -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-failsafe-plugin</artifactId>
- <version>3.0.0-M3</version>
- <executions>
- <execution>
- <goals>
- <goal>integration-test</goal>
- <goal>verify</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </pluginManagement>
-
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
+ <packaging>pom</packaging>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ </properties>
+
+ <!-- Includes all components in this project as separated modules -->
+ <modules>
+ <module>basyx.components.lib</module>
+ <module>basyx.components.docker</module>
+ </modules>
+
+ <build>
+ <!-- Specifies plugin settings that are common for all submodules -->
+ <pluginManagement>
+ <plugins>
+ <!-- Compile Java sources using Java 8 -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.8.1</version>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ </configuration>
+ </plugin>
+
+ <!-- Attach sources to jar file -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-source-plugin</artifactId>
+ <version>3.2.1</version>
+ <executions>
+ <execution>
+ <id>attach-sources</id>
+ <goals>
+ <goal>jar-no-fork</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <!-- Generate separate jar for tests and exclude logback.xml from generated jars -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>3.1.1</version>
+ <configuration>
+ <excludes>
+ <exclude>**/logback.xml</exclude>
+ </excludes>
+ </configuration>
+ <executions>
+ <execution>
+ <goals>
+ <goal>test-jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <!-- Run unit tests (Test*.java, *Test.java, *Tests.java and *TestCase.java excluding HTTP and TCP tests) -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>3.0.0-M3</version>
+ <configuration>
+ <excludes>
+ <exclude>**/*HTTP*</exclude>
+ <exclude>**/*TCP*</exclude>
+ <!-- Exclude explicit MongoDB tests for CI -->
+ <exclude>**/*MongoDB*</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+
+ <!-- Run integration tests (IT*.java, *IT.java and *ITCase.java) -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <version>3.0.0-M3</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.2.0</version>
<configuration>
- <source>8</source>
- </configuration>
+ <source>8</source>
+ </configuration>
<executions>
- <execution>
- <goals>
- <goal>javadoc</goal>
+ <execution>
+ <goals>
+ <goal>javadoc</goal>
</goals>
<id>generate-javadoc</id>
<phase>package</phase>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-
- <!-- Every submodule depends on these dependencies -->
- <dependencies>
- <!-- JUnit 4 for running JUnit tests -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <!-- Specifies dependency settings for all submodules using these dependencies -->
- <dependencyManagement>
- <dependencies>
- <!-- BaSyx SDK -->
- <dependency>
- <groupId>org.eclipse.basyx</groupId>
- <artifactId>basyx.sdk</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- </dependency>
-
- <!-- BaSyx SDK tests -->
- <dependency>
- <groupId>org.eclipse.basyx</groupId>
- <artifactId>basyx.sdk</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <classifier>tests</classifier>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <!-- Every submodule depends on these dependencies -->
+ <dependencies>
+ <!-- JUnit 4 for running JUnit tests -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.12</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <!-- Specifies dependency settings for all submodules using these dependencies -->
+ <dependencyManagement>
+ <dependencies>
+ <!-- BaSyx SDK -->
+ <dependency>
+ <groupId>org.eclipse.basyx</groupId>
+ <artifactId>basyx.sdk</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </dependency>
+
+ <!-- BaSyx SDK tests -->
+ <dependency>
+ <groupId>org.eclipse.basyx</groupId>
+ <artifactId>basyx.sdk</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ <classifier>tests</classifier>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
</project> \ No newline at end of file

Back to the top