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:49 UTC
(plc4x) 01/02: refactor: Refactored the ConnectionStateListener to allow reporting more types of events.
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