You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2026/01/11 16:26:48 UTC

(plc4x) branch develop updated (a70695f094 -> d3bd3d4075)

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a change to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


    from a70695f094 feat: Add github link to header
     new f87bd6b686 refactor: Refactored the ConnectionStateListener to allow reporting more types of events.
     new d3bd3d4075 fix: Updated the prereqisiteCheck to also deal with new versions of libpcap.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 RELEASE_NOTES                                      |  6 ++++++
 .../java/api/listener/ConnectionStateListener.java |  6 +++---
 .../api/model/PlcConnectionStateChangedEvent.java} | 24 ++++++++++++----------
 ...ionType.java => ConnectionStateChangeType.java} | 22 ++++++++++++--------
 .../spi/connection/DefaultNettyPlcConnection.java  | 10 +++++++--
 .../SingleProtocolStackConfigurerTest.java         | 16 ++++++++++-----
 src/main/script/prerequisiteCheck.groovy           | 12 ++++++++---
 7 files changed, 63 insertions(+), 33 deletions(-)
 copy plc4j/{drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/security/MessageSecurity.java => api/src/main/java/org/apache/plc4x/java/api/model/PlcConnectionStateChangedEvent.java} (60%)
 copy plc4j/api/src/main/java/org/apache/plc4x/java/api/types/{OptionType.java => ConnectionStateChangeType.java} (57%)


(plc4x) 02/02: fix: Updated the prereqisiteCheck to also deal with new versions of libpcap.

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit d3bd3d407530ccb2cb5d7a730594ef3fbf2efab4
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Sun Jan 11 17:26:38 2026 +0100

    fix: Updated the prereqisiteCheck to also deal with new versions of libpcap.
---
 src/main/script/prerequisiteCheck.groovy | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/main/script/prerequisiteCheck.groovy b/src/main/script/prerequisiteCheck.groovy
index acb260c53c..406e1becfa 100644
--- a/src/main/script/prerequisiteCheck.groovy
+++ b/src/main/script/prerequisiteCheck.groovy
@@ -319,9 +319,15 @@ def checkLibPcap(String minVersion, String os, String arch) {
             }
         }
         output = org.pcap4j.core.Pcaps.libVersion()
-        String version = output - ~/^libpcap version /
-        def result = checkVersionAtLeast(version, minVersion)
-        if (!result) {
+        Matcher matcher = extractVersion(output)
+        if (matcher.size() > 0) {
+            String version = matcher[0][1]
+            def result = checkVersionAtLeast(version, minVersion)
+            if (!result) {
+                allConditionsMet = false
+            }
+        } else {
+            println "unable to parse version from: " + output
             allConditionsMet = false
         }
     } catch (Error e) {


(plc4x) 01/02: refactor: Refactored the ConnectionStateListener to allow reporting more types of events.

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit f87bd6b686a15fc0e27abc573cc252aeaa97d6e0
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Sun Jan 11 17:25:48 2026 +0100

    refactor: Refactored the ConnectionStateListener to allow reporting more types of events.
---
 RELEASE_NOTES                                      |  6 +++++
 .../java/api/listener/ConnectionStateListener.java |  6 ++---
 .../PlcConnectionStateChangedEvent.java}           | 28 +++++++++++++++-------
 .../ConnectionStateChangeType.java}                | 21 +++++++++-------
 .../spi/connection/DefaultNettyPlcConnection.java  | 10 ++++++--
 .../SingleProtocolStackConfigurerTest.java         | 16 +++++++++----
 6 files changed, 61 insertions(+), 26 deletions(-)

diff --git a/RELEASE_NOTES b/RELEASE_NOTES
index f47f4b739f..73c3ffadbc 100644
--- a/RELEASE_NOTES
+++ b/RELEASE_NOTES
@@ -23,6 +23,12 @@ Incompatible changes
 - Updated the signature of the PlcBrowseRequestInterceptor to
   also accept a queryName, query and item instead of just an
   item.
+- The ConnectionStateListener interface was updated to no longer
+  have a connected() and disconnected() method, but use a
+  onConnectionStateChanged method instead that accepts
+  PlcConnectionStateChangedEvent events which have many more
+  state change options beyond a simple connected and disconnected
+  event.
 
 Bug Fixes
 ---------
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/listener/ConnectionStateListener.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/listener/ConnectionStateListener.java
index 43352e904f..93982f1dbd 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/listener/ConnectionStateListener.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/listener/ConnectionStateListener.java
@@ -18,13 +18,13 @@
  */
 package org.apache.plc4x.java.api.listener;
 
+import org.apache.plc4x.java.api.model.PlcConnectionStateChangedEvent;
+
 /**
  * Additional helper for tracking connection state.
  */
 public interface ConnectionStateListener extends EventListener {
 
-    void connected();
-
-    void disconnected();
+    void onConnectionStateChanged(PlcConnectionStateChangedEvent event);
 
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/listener/ConnectionStateListener.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcConnectionStateChangedEvent.java
similarity index 55%
copy from plc4j/api/src/main/java/org/apache/plc4x/java/api/listener/ConnectionStateListener.java
copy to plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcConnectionStateChangedEvent.java
index 43352e904f..19ea46d45a 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/listener/ConnectionStateListener.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcConnectionStateChangedEvent.java
@@ -7,7 +7,7 @@
  * "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
+ *   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
@@ -16,15 +16,27 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.api.listener;
 
-/**
- * Additional helper for tracking connection state.
- */
-public interface ConnectionStateListener extends EventListener {
+package org.apache.plc4x.java.api.model;
+
+import org.apache.plc4x.java.api.types.ConnectionStateChangeType;
+
+public class PlcConnectionStateChangedEvent {
+
+    private final ConnectionStateChangeType changeType;
+    private final String details;
+
+    public PlcConnectionStateChangedEvent(ConnectionStateChangeType changeType, String details) {
+        this.changeType = changeType;
+        this.details = details;
+    }
 
-    void connected();
+    public ConnectionStateChangeType getChangeType() {
+        return changeType;
+    }
 
-    void disconnected();
+    public String getDetails() {
+        return details;
+    }
 
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/listener/ConnectionStateListener.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/ConnectionStateChangeType.java
similarity index 51%
copy from plc4j/api/src/main/java/org/apache/plc4x/java/api/listener/ConnectionStateListener.java
copy to plc4j/api/src/main/java/org/apache/plc4x/java/api/types/ConnectionStateChangeType.java
index 43352e904f..8319930b38 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/listener/ConnectionStateListener.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/ConnectionStateChangeType.java
@@ -7,7 +7,7 @@
  * "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
+ *   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
@@ -16,15 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.api.listener;
 
-/**
- * Additional helper for tracking connection state.
- */
-public interface ConnectionStateListener extends EventListener {
+package org.apache.plc4x.java.api.types;
 
-    void connected();
+public enum ConnectionStateChangeType {
+    // Connection lifecycle
+    CONNECTED,              // Connection established successfully
+    DISCONNECTED,           // Graceful disconnection (close() called)
+    CONNECTION_LOST,        // Unexpected disconnection (network error, timeout, etc.)
 
-    void disconnected();
+    // Tag/metadata changes
+    TAGS_CHANGED,           // Available tags changed, re-browse needed
 
+    // PLC mode changes
+    MODE_RUN,               // PLC in RUN mode (executing program)
+    MODE_STOP,              // PLC in STOP mode (program halted)
+    MODE_CONFIG             // PLC in CONFIG/PROGRAM mode (being programmed)
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java
index de73b83385..8cc242d688 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java
@@ -22,6 +22,8 @@ import io.netty.channel.*;
 import java.util.concurrent.RejectedExecutionException;
 import org.apache.plc4x.java.api.EventPlcConnection;
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
+import org.apache.plc4x.java.api.model.PlcConnectionStateChangedEvent;
+import org.apache.plc4x.java.api.types.ConnectionStateChangeType;
 import org.apache.plc4x.java.spi.configuration.PlcConnectionConfiguration;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcIoException;
@@ -238,10 +240,14 @@ public class DefaultNettyPlcConnection extends AbstractPlcConnection implements
                             .map(ConnectionStateListener.class::cast);
                         if (evt instanceof ConnectedEvent) {
                             sessionSetupCompleteFuture.complete(null);
-                            eventListeners.forEach(ConnectionStateListener::connected);
+                            eventListeners.forEach(connectionStateListener ->
+                                connectionStateListener.onConnectionStateChanged(
+                                    new PlcConnectionStateChangedEvent(ConnectionStateChangeType.CONNECTED, "Connected")));
                         } else if (evt instanceof DisconnectedEvent) {
                             sessionDisconnectCompleteFuture.complete(null);
-                            eventListeners.forEach(ConnectionStateListener::disconnected);
+                            eventListeners.forEach(connectionStateListener ->
+                                connectionStateListener.onConnectionStateChanged(
+                                    new PlcConnectionStateChangedEvent(ConnectionStateChangeType.DISCONNECTED, "Disconnected")));
                             // Fix for https://github.com/apache/plc4x/issues/801
                             super.userEventTriggered(ctx, evt);
                         } else if (evt instanceof DiscoveredEvent) {
diff --git a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/connection/SingleProtocolStackConfigurerTest.java b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/connection/SingleProtocolStackConfigurerTest.java
index 0a75a0cf67..15dfe18c28 100644
--- a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/connection/SingleProtocolStackConfigurerTest.java
+++ b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/connection/SingleProtocolStackConfigurerTest.java
@@ -20,6 +20,7 @@
 package org.apache.plc4x.java.spi.connection;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -56,10 +57,12 @@ class SingleProtocolStackConfigurerTest {
         connection.addEventListener(connectionListener);
 
         connection.connect();
-        verify(connectionListener).connected();
+        // TODO: Update this to validate the type of event ...
+        verify(connectionListener).onConnectionStateChanged(any());
 
         connection.close();
-        verify(connectionListener).disconnected();
+        // TODO: Update this to validate the type of event ...
+        verify(connectionListener).onConnectionStateChanged(any());
     }
 
     @Test
@@ -74,15 +77,18 @@ class SingleProtocolStackConfigurerTest {
         connection.addEventListener(connectionListener);
 
         connection.connect();
-        verify(connectionListener).connected();
+        // TODO: Update this to validate the type of event ...
+        verify(connectionListener).onConnectionStateChanged(any());
 
         // append listener after connection been made
         ConnectionStateListener dynamicListener = mock(ConnectionStateListener.class);
         connection.addEventListener(dynamicListener);
 
         connection.close();
-        verify(connectionListener).disconnected();
-        verify(dynamicListener).disconnected();
+        // TODO: Update this to validate the type of event ...
+        verify(connectionListener).onConnectionStateChanged(any());
+        // TODO: Update this to validate the type of event ...
+        verify(dynamicListener).onConnectionStateChanged(any());
     }
 
     @Test