This is an automated email from the ASF dual-hosted git repository.
glcj pushed a commit to branch feature/merlot
in repository https://gitbox.apache.org/repos/asf/plc4x-extras.git
The following commit(s) were added to refs/heads/feature/merlot by this push:
new 7b67615 Kafka multitopic support from decanter model. Working on.
7b67615 is described below
commit 7b67615a712ae383f2eace125ec36b8fc76ca5b9
Author: César García <[email protected]>
AuthorDate: Sun Apr 26 09:58:37 2026 -0400
Kafka multitopic support from decanter model. Working on.
---
.gitignore | 1 +
.../merlot/drv/s7/core/S7DBAiFactoryTest.java | 204 ++++-------
.../merlot/drv/s7/core/S7DBDiFactoryTest.java | 123 +++++++
.../merlot/org.apache.plc4x.merlot.kafka/pom.xml | 108 ++++++
.../org.apache.karaf.decanter.collector.kafka.cfg | 85 +++++
.../apache/plc4x/merlot/kafka/api/MyService.java | 23 ++
.../plc4x/merlot/kafka/api/MyServiceImpl.java | 25 ++
.../core/MerlotKafkaManagedServiceFactory.java | 41 +++
.../kafka/impl/MerlotKafkaDecanterCollector.java | 109 ++++++
.../resources/OSGI-INF/blueprint/kafka-service.xml | 31 ++
plc4j/tools/merlot/pom.xml | 404 ++++++++++++++-------
11 files changed, 886 insertions(+), 268 deletions(-)
diff --git a/.gitignore b/.gitignore
index 1a86979..a002f0d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@ target
# Source bundle from PLC4C
/plc4c/plc4c/
/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/nbproject/
+/plc4j/tools/merlot/org.apache.plc4x.merlot.archiver/nbproject/
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/test/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiFactoryTest.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/test/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiFactoryTest.java
index 640cfb4..a5d85fd 100644
---
a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/test/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiFactoryTest.java
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/test/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiFactoryTest.java
@@ -29,9 +29,10 @@ import org.junit.Before;
import org.junit.Test;
import java.util.UUID;
import static org.junit.Assert.*;
-import org.junit.Ignore;
-@Ignore
+/**
+ * Functional test for S7DBAiFactory (Analog Input).
+ */
public class S7DBAiFactoryTest {
private S7DBAiFactory factory;
@@ -44,42 +45,42 @@ public class S7DBAiFactoryTest {
factory = new S7DBAiFactory();
record = factory.create("AI_TEST");
- // Setup Buffer
+ // Setup Buffer (BUFFER_SIZE = 64 in S7DBAiFactory)
byteBuf = Unpooled.buffer(64);
- // Initialize buffer with some data
- // iMode (short) at 0
- byteBuf.setShort(0, 1);
- // iErrorCode (short) at 2
- byteBuf.setShort(2, 0);
- // iStatus (short) at 4
- byteBuf.setShort(4, 100);
- // rActiveValue (float) at 6
+
+ // Fill buffer based on S7DBAiFactory.update() logic:
+ // Offset 0: iMode (short)
+ byteBuf.setShort(0, (short) 2);
+ // Offset 2: iErrorCode (short)
+ byteBuf.setShort(2, (short) 0);
+ // Offset 4: iStatus (short)
+ byteBuf.setShort(4, (short) 100);
+ // Offset 6: rActiveValue (float)
byteBuf.setFloat(6, 12.34f);
- // rInputValue (float) at 10
+ // Offset 10: rInputValue (float)
byteBuf.setFloat(10, 56.78f);
- // rManualValue (float) at 14
+ // Offset 14: rManualValue (float)
byteBuf.setFloat(14, 90.12f);
- // bPB_ResetError, bPBEN_ResetError, bError at 18 (byte)
- // Bit 0: bPB_ResetError, Bit 1: bPBEN_ResetError, Bit 2: bError
- byteBuf.setByte(18, 0b00000111); // All true
-
- // Status byte at 20
- // Bit 0: bLowLowAlarm, Bit 1: bHighHighAlarm, Bit 2: bInvalid
- byteBuf.setByte(20, 0b00000101); // LowLow=true, HighHigh=false,
Invalid=true
-
- // Parameters
- // iSensorType (short) at 22
- byteBuf.setShort(22, 2);
- // rInEngUnitsMin (float) at 24
+
+ // Offset 18: byTemp (bits: 0:bPB_ResetError, 1:bPBEN_ResetError,
2:bError)
+ // Set bits 0 and 2 to true (0b00000101 = 5)
+ byteBuf.setByte(18, (byte) 5);
+
+ // Offset 20: byTemp (bits: 0:bLowLowAlarm, 1:bHighHighAlarm,
2:bInvalid)
+ // Set bit 1 to true (0b00000010 = 2)
+ byteBuf.setByte(20, (byte) 2);
+
+ // Offset 22: iSensorType (short)
+ byteBuf.setShort(22, (short) 1);
+ // Offset 24: rInEngUnitsMin (float)
byteBuf.setFloat(24, 0.0f);
- // rInEngUnitsMax (float) at 28
+ // Offset 28: rInEngUnitsMax (float)
byteBuf.setFloat(28, 100.0f);
- // ... other floats ...
// Setup PlcItem
String uuid = UUID.randomUUID().toString();
- plcItem = new PlcItemImpl.PlcItemBuilder("ITEM_TEST")
- .setItemDescription("Test Item")
+ plcItem = new PlcItemImpl.PlcItemBuilder("ITEM_AI_TEST")
+ .setItemDescription("Test Item for S7 Analog Input")
.setItemId(uuid)
.setItemUid(UUID.fromString(uuid))
.build();
@@ -88,123 +89,68 @@ public class S7DBAiFactoryTest {
}
@Test
- public void testCreate() {
- assertNotNull(record);
+ public void testStructureCreation() {
+ assertNotNull("Record should not be null", record);
PVStructure pvStructure =
record.getPVRecordStructure().getPVStructure();
- assertNotNull(pvStructure);
-
- assertNotNull(pvStructure.getStructureField("cmd"));
- assertNotNull(pvStructure.getStructureField("sts"));
- assertNotNull(pvStructure.getStructureField("par"));
- assertNotNull(pvStructure.getStringField("id"));
+
+ assertNotNull("cmd structure should exist",
pvStructure.getStructureField("cmd"));
+ assertNotNull("sts structure should exist",
pvStructure.getStructureField("sts"));
+ assertNotNull("par structure should exist",
pvStructure.getStructureField("par"));
+ assertNotNull("id field should exist",
pvStructure.getStringField("id"));
}
@Test
- public void testAttach() {
- PVString id =
record.getPVRecordStructure().getPVStructure().getStringField("id");
- id.put("s7:%DB100:23:BYTE[64]"); // Example S7 address
-
+ public void testAttachAndParsing() {
+ PVStructure pvStructure =
record.getPVRecordStructure().getPVStructure();
+ // S7DBAiFactory uses the 'id' field to parse the S7 address
+ pvStructure.getStringField("id").put("s7:%DB100:0:BYTE[64]");
+
record.atach(plcItem);
-
- assertEquals(23, record.getByteOffset());
- // Bit offset is usually 0 unless specified otherwise
- assertEquals(0, record.getBiteOffset());
+
+ assertEquals("Byte offset should be 0", 0, record.getByteOffset());
}
@Test
- public void testUpdate() {
- PVString id =
record.getPVRecordStructure().getPVStructure().getStringField("id");
- id.put("s7:%DB100:0:BYTE[64]"); // Offset 0 for simplicity with our
buffer
+ public void testDataUpdateMapping() {
+ PVStructure pvStructure =
record.getPVRecordStructure().getPVStructure();
+ pvStructure.getStringField("id").put("s7:%DB100:0:BYTE[64]");
+
record.atach(plcItem);
-
- // Manually set the inner buffer of the record to match our test buffer
- // because atach() slices the buffer based on offset.
- // Since we created a raw buffer and wrapped it in PlcRawByteArray,
- // and PlcItemImpl might handle it differently, let's ensure the
record has
- // access to data.
- // In S7DBAiFactory.atach: innerBuffer =
- // plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
- // We need to make sure plcItem.getItemByteBuf() returns something
valid.
- // PlcItemImpl usually wraps the PlcValue.
-
- // Let's simulate the update
record.update();
- PVStructure pvStructure =
record.getPVRecordStructure().getPVStructure();
PVStructure cmd = pvStructure.getStructureField("cmd");
PVStructure sts = pvStructure.getStructureField("sts");
PVStructure par = pvStructure.getStructureField("par");
- assertEquals(1, cmd.getShortField("iMode").get());
- assertEquals(100, cmd.getShortField("iStatus").get());
- assertEquals(12.34f, cmd.getFloatField("rActiveValue").get(), 0.001f);
- assertEquals(56.78f, cmd.getFloatField("rInputValue").get(), 0.001f);
- assertEquals(90.12f, cmd.getFloatField("rManualValue").get(), 0.001f);
-
- assertEquals(true, cmd.getBooleanField("bPB_ResetError").get());
- assertEquals(true, cmd.getBooleanField("bPBEN_ResetError").get());
- assertEquals(true, cmd.getBooleanField("bError").get());
-
- assertEquals(true, sts.getBooleanField("bLowLowAlarm").get());
- assertEquals(false, sts.getBooleanField("bHighHighAlarm").get());
- assertEquals(true, sts.getBooleanField("bInvalid").get());
-
- assertEquals(2, par.getShortField("iSensorType").get());
- assertEquals(0.0f, par.getFloatField("rInEngUnitsMin").get(), 0.001f);
- assertEquals(100.0f, par.getFloatField("rInEngUnitsMax").get(),
0.001f);
- }
-
- @Test
- public void testProcess() {
- PVString id =
record.getPVRecordStructure().getPVStructure().getStringField("id");
- id.put("s7:%DB100:0:BYTE[64]");
- record.atach(plcItem);
-
- // Enable write
- PVBoolean writeEnable =
record.getPVRecordStructure().getPVStructure().getBooleanField("write_enable");
- writeEnable.put(true);
-
- // Change a value in PV
- PVStructure cmd =
record.getPVRecordStructure().getPVStructure().getStructureField("cmd");
- cmd.getShortField("iMode").put((short) 5);
-
- // Call process
- record.process();
-
- // Verify that the buffer (which represents the PLC memory) is updated
- // Note: S7DBAiFactory.process() calls super.process().
- // We need to verify if super.process() writes back to the buffer or
sends a
- // write request.
- // Assuming it writes back to the buffer mapped to the fields.
- // Let's check if the buffer was modified.
- // The factory maps fields to offsets. iMode is at offset 3 (from
fieldOffsets
- // in Factory)?
- // Wait, let's check fieldOffsets in S7DBAiFactory.java
- // fieldOffsets.add(3, new ImmutablePair(0, (byte) -1)); //iMode ->
Offset 0
-
- // So if we change iMode to 5, the buffer at offset 0 should be 5.
- // However, process() logic in DBBaseFactory usually handles writing
from PV to
- // Buffer/PLC.
- // Let's assume it writes to the buffer if it's a local buffer
simulation.
-
- // Re-reading the buffer to see if it changed requires access to the
inner
- // buffer or the original buffer.
- // Since innerBuffer is a slice of the original buffer, changes should
reflect
- // if it's a direct slice.
-
- // Let's check the byteBuf we created.
- // assertEquals(5, byteBuf.getShort(0));
- // Note: This assertion depends heavily on DBBaseFactory
implementation.
- // If it doesn't write back immediately or uses a different mechanism,
this
- // might fail.
- // But for a unit test of the Factory logic (mapping), this is the
intention.
+ // Verify Command values
+ assertEquals("iMode should be 2", (short) 2,
cmd.getShortField("iMode").get());
+ assertEquals("rActiveValue should be 12.34", 12.34f,
cmd.getFloatField("rActiveValue").get(), 0.001f);
+ assertTrue("bPB_ResetError (bit 0) should be true",
cmd.getBooleanField("bPB_ResetError").get());
+ assertFalse("bPBEN_ResetError (bit 1) should be false",
cmd.getBooleanField("bPBEN_ResetError").get());
+ assertTrue("bError (bit 2) should be true",
cmd.getBooleanField("bError").get());
+
+ // Verify Status values
+ assertFalse("bLowLowAlarm (bit 0) should be false",
sts.getBooleanField("bLowLowAlarm").get());
+ assertTrue("bHighHighAlarm (bit 1) should be true",
sts.getBooleanField("bHighHighAlarm").get());
+
+ // Verify Parameter values
+ assertEquals("iSensorType should be 1", (short) 1,
par.getShortField("iSensorType").get());
+ assertEquals("rInEngUnitsMin should be 0.0", 0.0f,
par.getFloatField("rInEngUnitsMin").get(), 0.001f);
+ assertEquals("rInEngUnitsMax should be 100.0", 100.0f,
par.getFloatField("rInEngUnitsMax").get(), 0.001f);
}
@Test
- public void testGetFieldsToMonitor() {
- String fields = record.getFieldsToMonitor();
- assertNotNull(fields);
- assertTrue(fields.contains("cmd{iMode"));
- assertTrue(fields.contains("par{iSensorType"));
+ public void testFieldOffsetsMapping() {
+ assertNotNull("Field offsets should be initialized",
record.getFieldOffsets());
+
+ // iMode is at index 3, pointing to byte offset 0
+ assertEquals("iMode byte offset should be 0", (Object) 0,
record.getFieldOffsets().get(3).getLeft());
+
+ // rManualValue is at index 4, pointing to byte offset 14
+ assertEquals("rManualValue byte offset should be 14", (Object) 14,
record.getFieldOffsets().get(4).getLeft());
+
+ // bPB_ResetError is at index 5, pointing to byte offset 18, bit 0
+ assertEquals("bPB_ResetError byte offset should be 18", (Object) 18,
record.getFieldOffsets().get(5).getLeft());
+ assertEquals("bPB_ResetError bit offset should be 0", (Object) (byte)
0, record.getFieldOffsets().get(5).getRight());
}
}
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/test/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDiFactoryTest.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/test/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDiFactoryTest.java
new file mode 100644
index 0000000..03d0e82
--- /dev/null
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/test/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDiFactoryTest.java
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.merlot.drv.s7.core;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.apache.plc4x.java.spi.values.PlcRawByteArray;
+import org.apache.plc4x.merlot.api.PlcItem;
+import org.apache.plc4x.merlot.api.impl.PlcItemImpl;
+import org.apache.plc4x.merlot.db.api.DBRecord;
+import org.epics.pvdata.pv.*;
+import org.junit.Before;
+import org.junit.Test;
+import java.util.UUID;
+import static org.junit.Assert.*;
+
+/**
+ * Functional test for S7DBDiFactory.
+ */
+public class S7DBDiFactoryTest {
+
+ private S7DBDiFactory factory;
+ private DBRecord record;
+ private PlcItem plcItem;
+ private ByteBuf byteBuf;
+
+ @Before
+ public void setUp() {
+ factory = new S7DBDiFactory();
+ record = factory.create("DI_TEST");
+
+ // Setup Buffer (BUFFER_SIZE = 3 in S7DBDiFactory)
+ byteBuf = Unpooled.buffer(3);
+
+ // 1. Set iMode (short) at offset 0 -> Value: 1234
+ byteBuf.setShort(0, (short) 1234);
+
+ // 2. Set byTemp (byte) at offset 2
+ // Bit mapping in S7DBDiFactory:
+ // Bit 0: bOn, Bit 1: bOnActual, Bit 2: bPB_On, Bit 3: bPB_Off, Bit 4:
bPBEN_On, Bit 5: bPBEN_Off
+ // Let's set bits 0, 2, 4 to true (0b00010101 = 21 decimal)
+ byteBuf.setByte(2, (byte) 21);
+
+ // Setup PlcItem with the buffer
+ String uuid = UUID.randomUUID().toString();
+ plcItem = new PlcItemImpl.PlcItemBuilder("ITEM_TEST")
+ .setItemDescription("Test Item for S7 Digital Input")
+ .setItemId(uuid)
+ .setItemUid(UUID.fromString(uuid))
+ .build();
+
+ plcItem.setPlcValue(new PlcRawByteArray(byteBuf.array()));
+ }
+
+ @Test
+ public void testStructureCreation() {
+ assertNotNull("Record should not be null", record);
+ PVStructure pvStructure =
record.getPVRecordStructure().getPVStructure();
+
+ assertNotNull("udtHMI structure should exist",
pvStructure.getStructureField("udtHMI"));
+ assertNotNull("udtError structure should exist",
pvStructure.getStructureField("udtError"));
+ assertNotNull("write_enable field should exist",
pvStructure.getBooleanField("write_enable"));
+ assertNotNull("offset field should exist",
pvStructure.getStringField("offset"));
+ }
+
+ @Test
+ public void testDataUpdateMapping() {
+ PVStructure pvStructure =
record.getPVRecordStructure().getPVStructure();
+
+ // Set offset to 0 so it reads from the beginning of our buffer
+ pvStructure.getStringField("offset").put("0");
+
+ // Attach and trigger update
+ record.atach(plcItem);
+ record.update();
+
+ PVStructure udtHMI = pvStructure.getStructureField("udtHMI");
+
+ // Verify iMode
+ assertEquals("iMode should match buffer value", (short) 1234,
udtHMI.getShortField("iMode").get());
+
+ // Verify Bits (based on byte value 21 -> 0b00010101)
+ assertTrue("bOn (bit 0) should be true",
udtHMI.getBooleanField("bOn").get());
+ assertFalse("bOnActual (bit 1) should be false",
udtHMI.getBooleanField("bOnActual").get());
+ assertTrue("bPB_On (bit 2) should be true",
udtHMI.getBooleanField("bPB_On").get());
+ assertFalse("bPB_Off (bit 3) should be false",
udtHMI.getBooleanField("bPB_Off").get());
+ assertTrue("bPBEN_On (bit 4) should be true",
udtHMI.getBooleanField("bPBEN_On").get());
+ assertFalse("bPBEN_Off (bit 5) should be false",
udtHMI.getBooleanField("bPBEN_Off").get());
+
+ // Verify write_enable is automatically enabled after first run
+ assertTrue("write_enable should be true after update",
pvStructure.getBooleanField("write_enable").get());
+ }
+
+ @Test
+ public void testFieldOffsetsMapping() {
+ // Verify that the factory correctly initialized the field offsets for
writing
+ assertNotNull("Field offsets should be initialized",
record.getFieldOffsets());
+
+ // iMode is at index 3 in the list, pointing to byte offset 2 (as per
S7DBDiFactory source)
+ // Note: The factory uses fieldOffsets.add(3, new ImmutablePair(2,
(byte) -1))
+ assertEquals("iMode offset should be 2", (Object) 2,
record.getFieldOffsets().get(3).getLeft());
+
+ // bPB_On is at index 4, pointing to byte offset 4, bit 2
+ assertEquals("bPB_On byte offset should be 4", (Object) 4,
record.getFieldOffsets().get(4).getLeft());
+ assertEquals("bPB_On bit offset should be 2", (Object) (byte) 2,
record.getFieldOffsets().get(4).getRight());
+ }
+}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/pom.xml
b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/pom.xml
new file mode 100644
index 0000000..d65ee83
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/pom.xml
@@ -0,0 +1,108 @@
+<?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/xsd/maven-4.0.0.xsd">
+
+ <!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <artifactId>merlot</artifactId>
+ <groupId>org.apache.plc4x</groupId>
+ <version>0.13.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.apache.plc4x.merlot.kafka</groupId>
+ <artifactId>org.apache.plc4x.merlot.kafka</artifactId>
+ <version>0.13.0-SNAPSHOT</version>
+ <packaging>bundle</packaging>
+
+ <name>PLC4J: Merlot :: kafka :: Appender&Collector</name>
+ <description>org.apache.plc4x.merlot.kafka OSGi blueprint bundle
project.</description>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>5.1.9</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+ <Bundle-Version>${project.version}</Bundle-Version>
+
<Export-Package>org.apache.plc4x.merlot.kafka*;version=${project.version}</Export-Package>
+ <Import-Package>*</Import-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-clean-plugin</artifactId>
+ <version>3.4.0</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>3.3.1</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.13.0</version>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ <maxmem>256M</maxmem>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>3.5.2</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-install-plugin</artifactId>
+ <version>3.1.3</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <version>3.1.3</version>
+ </plugin>
+
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>osgi.core</artifactId>
+ <version>8.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.service.cm</artifactId>
+ <version>1.6.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>osgi.annotation</artifactId>
+ <version>8.1.0</version>
+ </dependency>
+ </dependencies>
+</project>
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/cfg/org.apache.karaf.decanter.collector.kafka.cfg
b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/cfg/org.apache.karaf.decanter.collector.kafka.cfg
new file mode 100644
index 0000000..15ebd09
--- /dev/null
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/cfg/org.apache.karaf.decanter.collector.kafka.cfg
@@ -0,0 +1,85 @@
+################################################################################
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+###############################
+# Decanter Kafka Configuration
+###############################
+
+# A list of host/port pairs to use for establishing the initial connection to
the Kafka cluster
+#bootstrap.servers=localhost:9092
+
+# An id string to identify the group where the consumer belongs to
+#group.id=decanter
+
+# Enable auto commit of consumed messages
+#enable.auto.commit=true
+
+# Auto commit interval (in ms) triggering the commit
+#auto.commit.interval.ms=1000
+
+# Timeout on the consumer session
+#session.timeout.ms=30000
+
+# Serializer class for key that implements the Serializer interface
+#key.serializer=org.apache.kafka.common.serialization.StringSerializer
+
+# Serializer class for value that implements the Serializer interface.
+#value.serializer=org.apache.kafka.common.serialization.StringSerializer
+
+# Name of the topic
+#topic=decanter
+
+# Security (SSL)
+#security.protocol=SSL
+
+# SSL truststore location (Kafka broker) and password
+#ssl.truststore.location=${karaf.etc}/keystores/keystore.jks
+#ssl.truststore.password=karaf
+
+# SSL keystore (if client authentication is required)
+#ssl.keystore.location=${karaf.etc}/keystores/clientstore.jks
+#ssl.keystore.password=karaf
+#ssl.key.password=karaf
+
+# (Optional) SSL provider (default uses the JVM one)
+#ssl.provider=
+
+# (Optional) SSL Cipher suites
+#ssl.cipher.suites=
+
+# (Optional) SSL Protocols enabled (default is TLSv1.2,TLSv1.1,TLSv1)
+#ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1
+
+# (Optional) SSL Truststore type (default is JKS)
+#ssl.truststore.type=JKS
+
+# (Optional) SSL Keystore type (default is JKS)
+#ssl.keystore.type=JKS
+
+# Security (SASL)
+# For SASL, you have to configure Java System property as explained in
http://kafka.apache.org/documentation.html#security_ssl
+
+# message type (text to use the unmarshaller or raw to not use it)
+message.type=text
+
+# Unmarshaller to use (json is recommended)
+unmarshaller.target=(dataFormat=json)
+
+# custom fields
+fields.remove.request-size-max=remove
\ No newline at end of file
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/java/org/apache/plc4x/merlot/kafka/api/MyService.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/java/org/apache/plc4x/merlot/kafka/api/MyService.java
new file mode 100644
index 0000000..1dd42ce
--- /dev/null
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/java/org/apache/plc4x/merlot/kafka/api/MyService.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.kafka.api;
+
+public interface MyService {
+
+ public String echo(String message);
+
+}
\ No newline at end of file
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/java/org/apache/plc4x/merlot/kafka/api/MyServiceImpl.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/java/org/apache/plc4x/merlot/kafka/api/MyServiceImpl.java
new file mode 100644
index 0000000..f840714
--- /dev/null
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/java/org/apache/plc4x/merlot/kafka/api/MyServiceImpl.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.kafka.api;
+
+public class MyServiceImpl implements MyService {
+
+ public String echo(String message) {
+ return "Echo processed: " + message;
+ }
+
+}
\ No newline at end of file
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/java/org/apache/plc4x/merlot/kafka/core/MerlotKafkaManagedServiceFactory.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/java/org/apache/plc4x/merlot/kafka/core/MerlotKafkaManagedServiceFactory.java
new file mode 100644
index 0000000..361e283
--- /dev/null
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/java/org/apache/plc4x/merlot/kafka/core/MerlotKafkaManagedServiceFactory.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.kafka.core;
+
+import java.util.Dictionary;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedServiceFactory;
+
+
+public class MerlotKafkaManagedServiceFactory implements ManagedServiceFactory
{
+
+ @Override
+ public String getName() {
+ return "Prueba";
+ }
+
+ @Override
+ public void updated(String pid, Dictionary<String, ?> properties) throws
ConfigurationException {
+ System.out.println("pid: " + pid);
+ }
+
+ @Override
+ public void deleted(String pid) {
+ System.out.println("pid: " + pid);
+ }
+
+}
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/java/org/apache/plc4x/merlot/kafka/impl/MerlotKafkaDecanterCollector.java
b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/java/org/apache/plc4x/merlot/kafka/impl/MerlotKafkaDecanterCollector.java
new file mode 100644
index 0000000..774c6a4
--- /dev/null
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/java/org/apache/plc4x/merlot/kafka/impl/MerlotKafkaDecanterCollector.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.plc4x.merlot.kafka.impl;
+
+import java.util.Dictionary;
+import java.util.Properties;
+
+
+public class MerlotKafkaDecanterCollector {
+
+ private String topic;
+ private String eventAdminTopic;
+ private boolean consuming = false;
+ private String messageType;
+
+ public void activate(String pid, Dictionary<String, Object> properties) {
+
+ topic = getValue(properties, "topic", "decanter");
+ eventAdminTopic = getValue(properties, EventConstants.EVENT_TOPIC,
"decanter/collect/kafka/decanter");
+ messageType = getValue(properties, "message.type", "text");
+
+ Properties config = new Properties();
+
+ String bootstrapServers = getValue(properties, "bootstrap.servers",
"localhost:9092");
+ config.put("bootstrap.servers", bootstrapServers);
+
+ String groupId = getValue(properties, "group.id", "decanter");
+ config.put("group.id", groupId);
+
+ String enableAutoCommit = getValue(properties, "enable.auto.commit",
"true");
+ config.put("enable.auto.commit", enableAutoCommit);
+
+ String autoCommitIntervalMs = getValue(properties,
"auto.commit.interval.ms", "1000");
+ config.put("auto.commit.interval.ms", autoCommitIntervalMs);
+
+ String sessionTimeoutMs = getValue(properties, "session.timeout.ms",
"10000");
+ config.put("session.timeout.ms", sessionTimeoutMs);
+
+ String keyDeserializer = getValue(properties, "key.deserializer",
"org.apache.kafka.common.serialization.StringDeserializer");
+ config.put("key.deserializer", keyDeserializer);
+
+ String valueDeserializer = getValue(properties, "value.deserializer",
"org.apache.kafka.common.serialization.StringDeserializer");
+ config.put("value.deserializer", valueDeserializer);
+
+ String securityProtocol = getValue(properties, "security.protocol",
null);
+ if (securityProtocol != null)
+ config.put("security.protocol", securityProtocol);
+
+ String sslTruststoreLocation = getValue(properties,
"ssl.truststore.location", null);
+ if (sslTruststoreLocation != null)
+ config.put("ssl.truststore.location", sslTruststoreLocation);
+
+ String sslTruststorePassword = getValue(properties,
"ssl.truststore.password", null);
+ if (sslTruststorePassword != null)
+ config.put("ssl.truststore.password", sslTruststorePassword);
+
+ String sslKeystoreLocation = getValue(properties,
"ssl.keystore.location", null);
+ if (sslKeystoreLocation != null)
+ config.put("ssl.keystore.location", sslKeystoreLocation);
+
+ String sslKeystorePassword = getValue(properties,
"ssl.keystore.password", null);
+ if (sslKeystorePassword != null)
+ config.put("ssl.keystore.password", sslKeystorePassword);
+
+ String sslKeyPassword = getValue(properties, "ssl.key.password", null);
+ if (sslKeyPassword != null)
+ config.put("ssl.key.password", sslKeyPassword);
+
+ String sslProvider = getValue(properties, "ssl.provider", null);
+ if (sslProvider != null)
+ config.put("ssl.provider", sslProvider);
+
+ String sslCipherSuites = getValue(properties, "ssl.cipher.suites",
null);
+ if (sslCipherSuites != null)
+ config.put("ssl.cipher.suites", sslCipherSuites);
+
+ String sslEnabledProtocols = getValue(properties,
"ssl.enabled.protocols", null);
+ if (sslEnabledProtocols != null)
+ config.put("ssl.enabled.protocols", sslEnabledProtocols);
+
+ String sslTruststoreType = getValue(properties, "ssl.truststore.type",
null);
+ if (sslTruststoreType != null)
+ config.put("ssl.truststore.type", sslTruststoreType);
+
+ String sslKeystoreType = getValue(properties, "ssl.keystore.type",
null);
+ if (sslKeystoreType != null)
+ config.put("ssl.keystore.type", sslKeystoreType);
+ }
+
+ private String getValue(Dictionary<String, Object> config, String key,
String defaultValue) {
+ String value = (String)config.get(key);
+ return (value != null) ? value : defaultValue;
+ }
+
+}
diff --git
a/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/resources/OSGI-INF/blueprint/kafka-service.xml
b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/resources/OSGI-INF/blueprint/kafka-service.xml
new file mode 100644
index 0000000..e4e9ac7
--- /dev/null
+++
b/plc4j/tools/merlot/org.apache.plc4x.merlot.kafka/src/main/resources/OSGI-INF/blueprint/kafka-service.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
default-activation="eager">
+
+ <bean id="serviceBean"
+
class="org.apache.plc4x.merlot.kafka.core.MerlotKafkaManagedServiceFactory"
+ scope="singleton"/>
+
+ <service ref="serviceBean"
+ interface="org.osgi.service.cm.ManagedServiceFactory">
+ <service-properties>
+ <entry key="service.pid"
value="org.apache.karaf.decanter.collector.kafka"/>
+ </service-properties>
+ </service>
+
+</blueprint>
\ No newline at end of file
diff --git a/plc4j/tools/merlot/pom.xml b/plc4j/tools/merlot/pom.xml
index 4e37564..74a9a78 100644
--- a/plc4j/tools/merlot/pom.xml
+++ b/plc4j/tools/merlot/pom.xml
@@ -16,157 +16,283 @@ software distributed under the License is distributed on
an
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
--->
-
-<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">
+--><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>
- <modelVersion>4.0.0</modelVersion>
- <!-- <parent>
+ <!-- <parent>
<groupId>org.apache.plc4x</groupId>
<artifactId>plc4j-integrations</artifactId>
<version>0.13.0-SNAPSHOT</version>
</parent>-->
+
- <groupId>org.apache.plc4x</groupId>
- <artifactId>merlot</artifactId>
- <version>0.13.0-SNAPSHOT</version>
-
- <packaging>pom</packaging>
- <name>PLC4J: Integrations: Apache Karaf</name>
- <description>Integration module for integrating PLC4X into Apache
Karaf.</description>
+ <groupId>org.apache.plc4x</groupId>
- <repositories>
- <repository>
- <id>gitlab-maven-antlr4</id>
-
<url>http://gitlab.devops.aimsites.nl/api/v4/projects/152/packages/maven</url>
- </repository>
- </repositories>
+ <artifactId>merlot</artifactId>
- <pluginRepositories>
- <pluginRepository>
- <id>gitlab-maven-antlr4</id>
-
<url>http://gitlab.devops.aimsites.nl/api/v4/projects/152/packages/maven</url>
- </pluginRepository>
- </pluginRepositories>
-
- <properties>
- <!-- Inherited -->
- <plc4x.version>0.13.1</plc4x.version>
- <apache.log4j.version>2.20.0</apache.log4j.version>
- <bit-io.version>1.4.3</bit-io.version>
- <c3p0.version>0.9.5.5</c3p0.version>
- <commons-codec.version>1.19.0</commons-codec.version>
- <commons-net.version>3.12.0</commons-net.version>
- <commons-lang3.version>3.20.0</commons-lang3.version>
- <commons-io.version>2.21.0</commons-io.version>
- <hikaricp.version>2.7.9</hikaricp.version>
- <netty.version>4.1.104.Final</netty.version>
- <quartz.version>2.3.2</quartz.version>
- <slf4j.version>2.0.3</slf4j.version>
- <spifly.version>1.3.6</spifly.version>
- <jackson.version>2.19.0</jackson.version>
- <jakarta.xml.bind.version>2.3.3</jakarta.xml.bind.version>
- <parser-ng.version>0.1.8</parser-ng.version>
- <vavr.version>0.10.4</vavr.version>
- <logback.version>1.5.3</logback.version>
- <aries.spifly.version>1.3.7</aries.spifly.version>
- <asm.version>9.6</asm.version>
- <artemis.version>2.38.0</artemis.version>
- <awaitility.version>3.1.6</awaitility.version>
- <decanter.version>2.10.0</decanter.version>
- <hawtbuf.version>1.11</hawtbuf.version>
- <hawtdispatch.version>1.22</hawtdispatch.version>
- <mqtt-client.version>1.16</mqtt-client.version>
- <javax.servlet.version>4.0.1</javax.servlet.version>
-
- <!-- Database used in Pax-jdbc -->
- <derby.version>10.14.2.0</derby.version>
- <h2.version>2.1.210</h2.version>
- <sqlite-jdbc.version>3.46.1.0</sqlite-jdbc.version>
-
- <!-- Remove GPL licence -->
- <javaluator.version>3.0.3</javaluator.version>
-
- <!-- Integration version -->
- <karaf.version>4.4.10</karaf.version>
- <decanter.version>2.10.0</decanter.version>
- <org.osgi.core.version>6.0.0</org.osgi.core.version>
- <osgi.core.version>8.0.0</osgi.core.version>
- <osgi.cmpn.version>7.0.0</osgi.cmpn.version>
- <osgi.device.version>1.1.0</osgi.device.version>
- <org.osgi.dal.version>1.0.2</org.osgi.dal.version>
- <disruptor.version>4.0.0</disruptor.version>
- <maven-failsafe-plugin.version>3.5.3</maven-failsafe-plugin.version>
-
- <!-- EPICS -->
- <epics.core.version>7.0.9</epics.core.version>
- <epics.util.version>1.0.7</epics.util.version>
- <epics.vtype.version>1.0.7</epics.vtype.version>
- <epics.vtype.json.version>2.9.0</epics.vtype.json.version>
- <epics.vtype.all.version>1.0.7</epics.vtype.all.version>
- <epics.ntypes.version>0.3.8</epics.ntypes.version>
- <epics.jca.version>2.4.8</epics.jca.version>
- <epics.pvaccess.version>5.1.8</epics.pvaccess.version>
- <epics.pvaclient.version>4.3.2</epics.pvaclient.version>
- <epics.pvdata.version>6.1.8</epics.pvdata.version>
- <epics.pvdatabase.version>4.3.1</epics.pvdatabase.version>
- <epics.gpclient.version>1.0.8</epics.gpclient.version>
- <epics.gpclient.core.version>1.0.8</epics.gpclient.core.version>
- <epics.gpclient.sim.version>1.0.8</epics.gpclient.sim.version>
- <epics.gpclient.loc.version>1.0.8</epics.gpclient.loc.version>
- <epics.gpclient.pva.version>1.0.8</epics.gpclient.pva.version>
- <epics.gpclient.ca.version>1.0.8</epics.gpclient.ca.version>
+ <version>0.13.0-SNAPSHOT</version>
+
+ <packaging>pom</packaging>
+
+ <name>PLC4J: Integrations: Apache Karaf</name>
+
+ <description>Integration module for integrating PLC4X into Apache
Karaf.</description>
+
+
+ <repositories>
+
+ <repository>
+
+ <id>gitlab-maven-antlr4</id>
+
+
<url>http://gitlab.devops.aimsites.nl/api/v4/projects/152/packages/maven</url>
+
+ </repository>
+
+ </repositories>
+
+
+ <pluginRepositories>
+
+ <pluginRepository>
+
+ <id>gitlab-maven-antlr4</id>
+
+
<url>http://gitlab.devops.aimsites.nl/api/v4/projects/152/packages/maven</url>
+
+ </pluginRepository>
+
+ </pluginRepositories>
+
+ <properties>
+
+ <!-- Inherited -->
+
+ <plc4x.version>0.13.1</plc4x.version>
+
+ <apache.log4j.version>2.20.0</apache.log4j.version>
+
+ <bit-io.version>1.4.3</bit-io.version>
+
+ <c3p0.version>0.9.5.5</c3p0.version>
+
+ <commons-codec.version>1.19.0</commons-codec.version>
+
+ <commons-net.version>3.12.0</commons-net.version>
+
+
+ <commons-lang3.version>3.20.0</commons-lang3.version>
+
+ <commons-io.version>2.21.0</commons-io.version>
+
+
+ <hikaricp.version>2.7.9</hikaricp.version>
+
+ <netty.version>4.1.104.Final</netty.version>
+
+ <quartz.version>2.3.2</quartz.version>
+
+ <slf4j.version>2.0.3</slf4j.version>
+
+ <spifly.version>1.3.6</spifly.version>
+
+ <jackson.version>2.19.0</jackson.version>
+
+ <jakarta.xml.bind.version>2.3.3</jakarta.xml.bind.version>
+
+ <parser-ng.version>0.1.8</parser-ng.version>
+
+ <vavr.version>0.10.4</vavr.version>
+
+ <logback.version>1.5.3</logback.version>
+
+ <aries.spifly.version>1.3.7</aries.spifly.version>
+
+ <asm.version>9.6</asm.version>
+
+ <artemis.version>2.38.0</artemis.version>
+
+ <awaitility.version>3.1.6</awaitility.version>
+
+
+ <decanter.version>2.10.0</decanter.version>
+
+ <hawtbuf.version>1.11</hawtbuf.version>
+
+ <hawtdispatch.version>1.22</hawtdispatch.version>
+
+ <mqtt-client.version>1.16</mqtt-client.version>
+
+
+ <javax.servlet.version>4.0.1</javax.servlet.version>
+
+ <!-- Database used in Pax-jdbc -->
+
+ <derby.version>10.14.2.0</derby.version>
+
+ <h2.version>2.1.210</h2.version>
+
+ <sqlite-jdbc.version>3.46.1.0</sqlite-jdbc.version>
+
+ <!-- Remove GPL licence -->
+
+ <javaluator.version>3.0.3</javaluator.version>
+
+ <!-- Integration version -->
+
+ <karaf.version>4.4.10</karaf.version>
+
+ <decanter.version>2.10.0</decanter.version>
+
+ <org.osgi.core.version>6.0.0</org.osgi.core.version>
+
+ <osgi.core.version>8.0.0</osgi.core.version>
+
+ <osgi.cmpn.version>7.0.0</osgi.cmpn.version>
+
+ <osgi.device.version>1.1.0</osgi.device.version>
+
+ <org.osgi.dal.version>1.0.2</org.osgi.dal.version>
+
+ <disruptor.version>4.0.0</disruptor.version>
+
+ <maven-failsafe-plugin.version>3.5.3</maven-failsafe-plugin.version>
+
- <!-- GRPC Service -->
- <protobuf.version>4.31.1</protobuf.version>
- <protobuf.nano.version>3.1.0</protobuf.nano.version>
- <proto.google.commons.version>2.58.0</proto.google.commons.version>
- <grpc.version>1.62.2</grpc.version>
- <guava.android.version>32.1.3-android</guava.android.version>
- <errorprone.version>2.23.0</errorprone.version>
- <annotations.api.version>6.0.53</annotations.api.version>
- <failureaccess.version>1.0.1</failureaccess.version>
- <j2objc.version>2.8</j2objc.version>
- <jsr305.version>3.0.2</jsr305.version>
- <okio.version>3.9.0</okio.version>
- <tomcat.annotation.version>6.0.53</tomcat.annotation.version>
- <annotation.version>13.0</annotation.version>
- <kotlin.version>1.9.21</kotlin.version>
- <!-- IoTDB -->
- <iotdb.session.version>2.0.7</iotdb.session.version>
- <tsfile.version>2.2.1</tsfile.version>
- <lz4.versio>1.3.0</lz4.versio>
- <thrift.version>0.13.0</thrift.version>
-
- </properties>
+ <!-- EPICS -->
+
+ <epics.core.version>7.0.9</epics.core.version>
+
+ <epics.util.version>1.0.7</epics.util.version>
+
+ <epics.vtype.version>1.0.7</epics.vtype.version>
+
+ <epics.vtype.json.version>2.9.0</epics.vtype.json.version>
+
+ <epics.vtype.all.version>1.0.7</epics.vtype.all.version>
+
+ <epics.ntypes.version>0.3.8</epics.ntypes.version>
+
+ <epics.jca.version>2.4.8</epics.jca.version>
+
+ <epics.pvaccess.version>5.1.8</epics.pvaccess.version>
+
+ <epics.pvaclient.version>4.3.2</epics.pvaclient.version>
+
+ <epics.pvdata.version>6.1.8</epics.pvdata.version>
+
+ <epics.pvdatabase.version>4.3.1</epics.pvdatabase.version>
+
+ <epics.gpclient.version>1.0.8</epics.gpclient.version>
+
+ <epics.gpclient.core.version>1.0.8</epics.gpclient.core.version>
+
+ <epics.gpclient.sim.version>1.0.8</epics.gpclient.sim.version>
+
+ <epics.gpclient.loc.version>1.0.8</epics.gpclient.loc.version>
+
+ <epics.gpclient.pva.version>1.0.8</epics.gpclient.pva.version>
+
+ <epics.gpclient.ca.version>1.0.8</epics.gpclient.ca.version>
+
+ <!-- GRPC Service -->
+
+ <protobuf.version>4.31.1</protobuf.version>
+
+ <protobuf.nano.version>3.1.0</protobuf.nano.version>
+
+ <proto.google.commons.version>2.58.0</proto.google.commons.version>
+
+ <grpc.version>1.62.2</grpc.version>
+
+ <guava.android.version>32.1.3-android</guava.android.version>
+
+ <errorprone.version>2.23.0</errorprone.version>
+
+ <annotations.api.version>6.0.53</annotations.api.version>
+
+ <failureaccess.version>1.0.1</failureaccess.version>
+
+ <j2objc.version>2.8</j2objc.version>
+
+ <jsr305.version>3.0.2</jsr305.version>
+
+ <okio.version>3.9.0</okio.version>
+
+ <tomcat.annotation.version>6.0.53</tomcat.annotation.version>
+
+ <annotation.version>13.0</annotation.version>
+
+ <kotlin.version>1.9.21</kotlin.version>
+
+
+ <!-- IoTDB -->
+
+ <iotdb.session.version>2.0.7</iotdb.session.version>
+
+ <tsfile.version>2.2.1</tsfile.version>
+
+ <lz4.versio>1.3.0</lz4.versio>
+
+ <thrift.version>0.13.0</thrift.version>
+
+
+ </properties>
+
- <modules>
- <module>org.apache.plc4x.merlot.modbus.dev</module>
- <module>org.apache.plc4x.merlot.modbus.svr</module>
- <module>org.apache.plc4x.merlot.scheduler</module>
- <module>org.apache.plc4x.merlot.branding</module>
- <module>org.apache.plc4x.merlot.uns</module>
- <module>org.apache.plc4x.merlot.features</module>
- <module>org.apache.plc4x.merlot.das</module>
- <module>org.apache.plc4x.merlot.modbus.sim</module>
- <module>org.apache.plc4x.merlot.db</module>
- <module>org.apache.plc4x.merlot.das.api</module>
- <module>org.apache.plc4x.merlot.derby</module>
- <module>org.apache.plc4x.merlot.h2</module>
- <module>org.apache.plc4x.merlot.drv.simulated</module>
- <module>org.apache.plc4x.merlot.das.ref</module>
- <module>org.apache.plc4x.merlot.grpc</module>
- <!-- <module>org.apache.plc4x.merlot.ui</module> -->
- <module>org.apache.plc4x.merlot.drv.s7</module>
- <module>org.apache.plc4x.merlot.drv.mb</module>
- <module>org.apache.plc4x.merlot.archiver</module>
- <module>org.apache.plc4x.merlot</module>
- </modules>
-
+
+ <modules>
+
+ <module>org.apache.plc4x.merlot.modbus.dev</module>
+
+ <module>org.apache.plc4x.merlot.modbus.svr</module>
+
+ <module>org.apache.plc4x.merlot.scheduler</module>
+
+ <module>org.apache.plc4x.merlot.branding</module>
+
+ <module>org.apache.plc4x.merlot.uns</module>
+
+ <module>org.apache.plc4x.merlot.features</module>
+
+ <module>org.apache.plc4x.merlot.das</module>
+
+ <module>org.apache.plc4x.merlot.modbus.sim</module>
+
+ <module>org.apache.plc4x.merlot.db</module>
+
+ <module>org.apache.plc4x.merlot.das.api</module>
+
+ <module>org.apache.plc4x.merlot.derby</module>
+
+ <module>org.apache.plc4x.merlot.h2</module>
+
+ <module>org.apache.plc4x.merlot.drv.simulated</module>
+
+ <module>org.apache.plc4x.merlot.das.ref</module>
+
+ <module>org.apache.plc4x.merlot.grpc</module>
+
+ <!-- <module>org.apache.plc4x.merlot.ui</module> -->
+
+ <module>org.apache.plc4x.merlot.drv.s7</module>
+
+ <module>org.apache.plc4x.merlot.drv.mb</module>
+
+ <module>org.apache.plc4x.merlot.archiver</module>
+
+ <module>org.apache.plc4x.merlot</module>
+
+
+ <module>org.apache.plc4x.merlot.kafka</module>
+
+ </modules>
+
+
</project>