You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sk...@apache.org on 2018/10/28 12:44:31 UTC

[incubator-plc4x] branch feature/refactor-abstract-connection updated (9ed446b -> 512a733)

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

skorikov pushed a change to branch feature/refactor-abstract-connection
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git.


 discard 9ed446b  fixed hello plc4x example
 discard 6f6d96d  extracted AbstractPlcConnection class
 discard 9a5f6fd  renamed AbstractPlcConnection to NettyPlcConnection
     add 08dd73e  [plc4j-pool] invalidating proxy after returning it to the pool.
     add 1b9ca25  [plc4j-pool] added test for pool removal method. + Added TODO for maybe necessary connection eviction.
     add 89309b5  [plc4j-pool] increased test coverage and fixed some sonar issues
     add 9bb69d9  [plc4j-pool] removed obsolete exception
     add 4ad765e  [plc4j-opm] fixed build, fixed some issues and added some tests.
     add 1c51cfd  [plc4j-opm] added fqn of entity to fields on request
     add c947721  [plc4j-opm] added sanity checks for getter having no parameters.
     add 3a187b3  [plc4j-opm] fixed is-getter calls.
     add 2bfb4ec  [plc4j-opm] renamed single letter parameters
     add 33af28e  [plc4j-opm] rearrange exception blocks (sonar issue :/)
     add 1716a22  [plc4j-opm] make timeout configurable
     add 778b224  [plc4j-opm] added left over types and added test for the remaining once.
     add 5670401  - Fixed some version related problems (Made sure they can't reoccur)
     add 4a1b19e  - Replaced the S7FieldItems with the Default ones from driver-base
     add 5b80c1b  [OPM] Moved connection string from Entity to the connect / read methods.
     add d168e12  [OPM] Small refactoring, introduced OpmUtils.
     add 2906972  fix build
     add 29c83a2  [OPM] Refactoring. Added PlcEntityInterceptor.
     add a5ae69b  [OPM] Added Documentation, some refactoring.
     add 0654828  [plc4j-pool] invalidate connections on PlcConnectionException
     add 342fb75  [driver-bases] re-enabled subscription support on SingleItemToSingleRequestProtocol un-sub still needs to be re-enabling
     add 0d7c25d  - Cleaning up in the examples - Added an mqtt example (untested)
     add b978413  - Made the MqttConnector actually work with a dummy public server using the test-driver.
     add 2ce3b2f  - Get rid of an annoying sonar report ...
     new d07c612  renamed AbstractPlcConnection to NettyPlcConnection
     new 14ab66e  extracted AbstractPlcConnection class
     new 512a733  fixed hello plc4x example

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (9ed446b)
            \
             N -- N -- N   refs/heads/feature/refactor-abstract-connection (512a733)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 3 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:
 examples/{azure => hello-cloud-azure}/pom.xml      |   4 +-
 .../cloud/azure}/S7PlcToAzureIoTHubSample.java     |  32 +-
 examples/{google => hello-cloud-google}/README.md  |   0
 examples/{google => hello-cloud-google}/pom.xml    |   4 +-
 .../examples/cloud/google}/MqttExampleOptions.java |  38 +-
 .../cloud/google}/S7PlcToGoogleIoTCoreSample.java  |  36 +-
 .../src/main/resources/logback.xml                 |   0
 .../src/remote-resources/META-INF/LICENSE          |   0
 .../kafka-connector.yml}                           |  18 +-
 .../pom.xml                                        |  13 +-
 .../server.sh                                      |   0
 .../connectivity/kafka/KafkaConnector.java}        |  54 +--
 .../connectivity/kafka/model/Configuration.java    |  56 +++
 .../connectivity/kafka}/model/KafkaConfig.java     |  36 +-
 .../connectivity/kafka}/model/PlcConfig.java       |  36 +-
 .../connectivity/kafka}/model/PlcFieldConfig.java  |  32 +-
 .../connectivity/kafka/model/PlcMemoryBlock.java   |  22 +-
 .../src/main/resources/logback.xml                 |   0
 .../mqtt-connector.yml}                            |  23 +-
 examples/hello-connectivity-mqtt/pom.xml           | 135 +++++++
 .../examples/connectivity/mqtt/MqttConnector.java  | 154 ++++++++
 .../connectivity/mqtt/model/Configuration.java     |  56 +++
 .../connectivity/mqtt/model/MqttConfig.java        |  47 ++-
 .../connectivity/mqtt}/model/PlcConfig.java        |  36 +-
 .../connectivity/mqtt}/model/PlcFieldConfig.java   |  32 +-
 .../connectivity/mqtt/model/PlcMemoryBlock.java    |  22 +-
 .../src/main/resources/logback.xml                 |   0
 .../pom.xml                                        |   8 +-
 .../examples/integration/edgent}/PlcLogger.java    |  36 +-
 .../src/main/resources/logback.xml                 |   0
 .../README.adoc                                    |   0
 .../pom.xml                                        |   8 +-
 .../elasticsearch/ElasticsearchStorage.java}       |  41 +--
 .../src/main/resources/log4j2.xml                  |   0
 .../src/main/resources/logback.xml                 |   0
 .../{hello-plc4x => hello-world-plc4x}/pom.xml     |  11 +-
 .../plc4x/java/examples/helloplc4x/HelloPlc4x.java | 111 ++++++
 .../src/main/resources/logback.xml                 |   0
 examples/iotree/pom.xml                            |  84 -----
 .../apache/plc4x/java/examples/iotree/IoTree.java  | 109 ------
 .../examples/kafkabridge/model/Configuration.java  |  65 ----
 .../examples/kafkabridge/model/PlcMemoryBlock.java |  41 ---
 examples/pom.xml                                   |  14 +-
 .../apache-nifi/nifi-plc4x-processors/pom.xml      |   1 -
 integrations/apache-nifi/pom.xml                   |   8 +
 .../ads/connection/AdsSerialPlcConnection.java     |   5 +-
 .../java/ads/connection/AdsTcpPlcConnection.java   |   2 +-
 .../messages/DefaultPlcSubscriptionRequest.java    |  10 +-
 .../messages/DefaultPlcSubscriptionResponse.java   |   4 +
 .../base/messages/InternalPlcFieldRequest.java     |   2 +-
 .../messages/InternalPlcSubscriptionRequest.java   |   3 +
 .../messages/InternalPlcSubscriptionResponse.java  |   7 +-
 .../SingleItemToSingleRequestProtocol.java         |  73 +++-
 .../SingleItemToSingleRequestProtocolTest.java     | 393 ++++++++++++---------
 .../modbus/connection/ModbusTcpPlcConnection.java  |   5 +-
 .../s7/messages/items/S7BigIntegerFieldItem.java   |  43 ---
 .../java/s7/messages/items/S7BooleanFieldItem.java |  52 ---
 .../messages/items/S7LocalDateTimeFieldItem.java   |  49 ---
 .../java/s7/messages/items/S7LongFieldItem.java    |  53 ---
 .../java/s7/messages/items/S7StringFieldItem.java  |  47 ---
 .../plc4x/java/s7/netty/Plc4XS7Protocol.java       |  53 ++-
 .../java/s7/netty/util/S7PlcFieldHandler.java      | 174 +++++----
 .../java/s7/netty/util/S7PlcFieldHandlerTest.java  |  86 +++--
 .../connectionpool/PooledPlcConnectionFactory.java |   2 +-
 .../connectionpool/PooledPlcDriverManager.java     |  59 ++--
 .../WrappedPooledConnectionException.java          |  33 --
 .../connectionpool/PooledPlcDriverManagerTest.java | 132 ++++++-
 plc4j/utils/opm/pom.xml                            |  21 +-
 .../java/opm/{OPMException.java => OpmUtils.java}  |  25 +-
 .../java/org/apache/plc4x/java/opm/PlcEntity.java  |   1 -
 .../plc4x/java/opm/PlcEntityInterceptor.java       | 321 +++++++++++++++++
 .../apache/plc4x/java/opm/PlcEntityManager.java    | 311 ++++------------
 .../java/org/apache/plc4x/java/opm/PlcField.java   |   3 +
 .../utils/opm/src/site/asciidoc/opm/using-opm.adoc |  61 ++++
 plc4j/utils/opm/src/site/site.xml                  |  30 ++
 .../plc4x/java/opm/PlcEntityManagerTest.java       | 265 ++++++++++----
 .../opm/src/test}/resources/logback.xml            |   4 +-
 pom.xml                                            |  11 +-
 78 files changed, 2226 insertions(+), 1537 deletions(-)
 rename examples/{azure => hello-cloud-azure}/pom.xml (96%)
 rename examples/{azure/src/main/java/org/apache/plc4x/java/examples/azure/iothub => hello-cloud-azure/src/main/java/org/apache/plc4x/java/examples/cloud/azure}/S7PlcToAzureIoTHubSample.java (77%)
 rename examples/{google => hello-cloud-google}/README.md (100%)
 rename examples/{google => hello-cloud-google}/pom.xml (97%)
 rename examples/{google/src/main/java/org/apache/plc4x/java/examples/google/iotcore => hello-cloud-google/src/main/java/org/apache/plc4x/java/examples/cloud/google}/MqttExampleOptions.java (85%)
 rename examples/{google/src/main/java/org/apache/plc4x/java/examples/google/iotcore => hello-cloud-google/src/main/java/org/apache/plc4x/java/examples/cloud/google}/S7PlcToGoogleIoTCoreSample.java (93%)
 rename examples/{google => hello-cloud-google}/src/main/resources/logback.xml (100%)
 rename examples/{google => hello-cloud-google}/src/remote-resources/META-INF/LICENSE (100%)
 copy examples/{kafka-bridge/kafka-bridge.yml => hello-connectivity-kafka/kafka-connector.yml} (82%)
 rename examples/{kafka-bridge => hello-connectivity-kafka}/pom.xml (90%)
 rename examples/{kafka-bridge => hello-connectivity-kafka}/server.sh (100%)
 rename examples/{kafka-bridge/src/main/java/org/apache/plc4x/java/examples/kafkabridge/KafkaBridge.java => hello-connectivity-kafka/src/main/java/org/apache/plc4x/java/examples/connectivity/kafka/KafkaConnector.java} (77%)
 create mode 100644 examples/hello-connectivity-kafka/src/main/java/org/apache/plc4x/java/examples/connectivity/kafka/model/Configuration.java
 rename examples/{kafka-bridge/src/main/java/org/apache/plc4x/java/examples/kafkabridge => hello-connectivity-kafka/src/main/java/org/apache/plc4x/java/examples/connectivity/kafka}/model/KafkaConfig.java (51%)
 copy examples/{kafka-bridge/src/main/java/org/apache/plc4x/java/examples/kafkabridge => hello-connectivity-kafka/src/main/java/org/apache/plc4x/java/examples/connectivity/kafka}/model/PlcConfig.java (51%)
 copy examples/{kafka-bridge/src/main/java/org/apache/plc4x/java/examples/kafkabridge => hello-connectivity-kafka/src/main/java/org/apache/plc4x/java/examples/connectivity/kafka}/model/PlcFieldConfig.java (51%)
 copy plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java => examples/hello-connectivity-kafka/src/main/java/org/apache/plc4x/java/examples/connectivity/kafka/model/PlcMemoryBlock.java (66%)
 rename examples/{kafka-bridge => hello-connectivity-kafka}/src/main/resources/logback.xml (100%)
 rename examples/{kafka-bridge/kafka-bridge.yml => hello-connectivity-mqtt/mqtt-connector.yml} (75%)
 create mode 100644 examples/hello-connectivity-mqtt/pom.xml
 create mode 100644 examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/MqttConnector.java
 create mode 100644 examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/model/Configuration.java
 rename plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7FloatingPointFieldItem.java => examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/model/MqttConfig.java (50%)
 rename examples/{kafka-bridge/src/main/java/org/apache/plc4x/java/examples/kafkabridge => hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt}/model/PlcConfig.java (51%)
 rename examples/{kafka-bridge/src/main/java/org/apache/plc4x/java/examples/kafkabridge => hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt}/model/PlcFieldConfig.java (51%)
 copy plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java => examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/model/PlcMemoryBlock.java (66%)
 rename examples/{iotree => hello-connectivity-mqtt}/src/main/resources/logback.xml (100%)
 rename examples/{plclogger => hello-integration-edgent}/pom.xml (90%)
 rename examples/{plclogger/src/main/java/org/apache/plc4x/java/examples/plclogger => hello-integration-edgent/src/main/java/org/apache/plc4x/java/examples/integration/edgent}/PlcLogger.java (66%)
 rename examples/{plclogger => hello-integration-edgent}/src/main/resources/logback.xml (100%)
 rename examples/{iot-factory => hello-storage-elasticsearch}/README.adoc (100%)
 rename examples/{iot-factory => hello-storage-elasticsearch}/pom.xml (92%)
 rename examples/{iot-factory/src/main/java/org/apache/plc4x/java/examples/iotfactory/IotElasticsearchFactory.java => hello-storage-elasticsearch/src/main/java/org/apache/plc4x/java/examples/storage/elasticsearch/ElasticsearchStorage.java} (91%)
 rename examples/{iot-factory => hello-storage-elasticsearch}/src/main/resources/log4j2.xml (100%)
 rename examples/{iot-factory => hello-storage-elasticsearch}/src/main/resources/logback.xml (100%)
 rename examples/{hello-plc4x => hello-world-plc4x}/pom.xml (88%)
 create mode 100644 examples/hello-world-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
 rename examples/{hello-plc4x => hello-world-plc4x}/src/main/resources/logback.xml (100%)
 delete mode 100644 examples/iotree/pom.xml
 delete mode 100644 examples/iotree/src/main/java/org/apache/plc4x/java/examples/iotree/IoTree.java
 delete mode 100644 examples/kafka-bridge/src/main/java/org/apache/plc4x/java/examples/kafkabridge/model/Configuration.java
 delete mode 100644 examples/kafka-bridge/src/main/java/org/apache/plc4x/java/examples/kafkabridge/model/PlcMemoryBlock.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BigIntegerFieldItem.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BooleanFieldItem.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7LocalDateTimeFieldItem.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7LongFieldItem.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7StringFieldItem.java
 delete mode 100644 plc4j/utils/connection-pool/src/main/java/org/apache/plc4x/java/utils/connectionpool/WrappedPooledConnectionException.java
 copy plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/{OPMException.java => OpmUtils.java} (53%)
 create mode 100644 plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityInterceptor.java
 create mode 100644 plc4j/utils/opm/src/site/asciidoc/opm/using-opm.adoc
 create mode 100644 plc4j/utils/opm/src/site/site.xml
 copy plc4j/{protocols/benchmarks/src/main => utils/opm/src/test}/resources/logback.xml (95%)


[incubator-plc4x] 03/03: fixed hello plc4x example

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

skorikov pushed a commit to branch feature/refactor-abstract-connection
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit 512a733766afbda905717e2f470b598f990970b7
Author: Andrey Skorikov <an...@codecentric.de>
AuthorDate: Fri Oct 26 16:26:30 2018 +0200

    fixed hello plc4x example
---
 .../plc4x/java/examples/helloplc4x/HelloPlc4x.java | 110 +++++++++++++++++++++
 1 file changed, 110 insertions(+)

diff --git a/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java b/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
new file mode 100644
index 0000000..1204bd3
--- /dev/null
+++ b/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
@@ -0,0 +1,110 @@
+/*
+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.java.examples.helloplc4x;
+
+import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
+
+import java.util.concurrent.CompletableFuture;
+
+public class HelloPlc4x {
+
+    /**
+     * Example code do demonstrate using PLC4X.
+     *
+     * @param args ignored.
+     */
+public static void main(String[] args) throws Exception {
+    if (args.length < 2) {
+        System.out.println("Usage: HelloPlc4x {connection-string} {address-string}+");
+        System.out.println("Example: HelloPlc4x s7://10.10.64.20/1/1 %Q0.0:BOOL %Q0:BYTE");
+        return;
+    }
+
+    // Establish a connection to the plc using the url provided as first argument
+    try (PlcConnection plcConnection = new PlcDriverManager().getConnection(args[0])) {
+
+        // Check if this connection support reading of data.
+        if (!plcConnection.getMetadata().canRead()) {
+            System.err.println("This connection doesn't support reading.");
+            return;
+        }
+
+        // Create a new read request:
+        // - Give the single item requested the alias name "value"
+        PlcReadRequest.Builder builder = plcConnection.readRequestBuilder();
+        for (int i = 1; i < args.length; i++) {
+            builder.addItem("value-" + i, args[i]);
+        }
+
+        //////////////////////////////////////////////////////////
+        // Read synchronously ...
+        // NOTICE: the ".get()" immediately lets this thread pause until
+        // the response is processed and available.
+        System.out.println("Synchronous request ...");
+        PlcReadRequest syncReadRequest = builder.build();
+        PlcReadResponse syncResponse = syncReadRequest.execute().get();
+        // Simply iterating over the field names returned in the response.
+        printResponse(syncResponse);
+
+        //////////////////////////////////////////////////////////
+        // Read asynchronously ...
+        // Register a callback executed as soon as a response arrives.
+        System.out.println("Asynchronous request ...");
+        PlcReadRequest asyncReadRequest = builder.build();
+        CompletableFuture<? extends PlcReadResponse> asyncResponse = asyncReadRequest.execute();
+        asyncResponse.whenComplete((readResponse, throwable) -> {
+            if (readResponse != null) {
+                printResponse(readResponse);
+            } else {
+                System.err.println("An error occurred: " + throwable.getMessage());
+                throwable.printStackTrace();
+            }
+        });
+
+    }
+}
+
+private static void printResponse(PlcReadResponse response) {
+    for (String fieldName : response.getFieldNames()) {
+        if(response.getResponseCode(fieldName) == PlcResponseCode.OK) {
+            int numValues = response.getNumberOfValues(fieldName);
+            // If it's just one element, output just one single line.
+            if(numValues == 1) {
+                System.out.println("Value[" + fieldName + "]: " + response.getObject(fieldName));
+            }
+            // If it's more than one element, output each in a single row.
+            else {
+                System.out.println("Value[" + fieldName + "]:");
+                for(int i = 0; i < numValues; i++) {
+                    System.out.println(" - " + response.getObject(fieldName, i));
+                }
+            }
+        }
+        // Something went wrong, to output an error message instead.
+        else {
+            System.out.println("Error[" + fieldName + "]: " + response.getResponseCode(fieldName).name());
+        }
+    }
+}
+
+}


[incubator-plc4x] 01/03: renamed AbstractPlcConnection to NettyPlcConnection

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

skorikov pushed a commit to branch feature/refactor-abstract-connection
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit d07c6129c1487084d74f6cda45fd5eb83869996f
Author: Andrey Skorikov <an...@codecentric.de>
AuthorDate: Fri Oct 26 15:16:41 2018 +0200

    renamed AbstractPlcConnection to NettyPlcConnection
---
 .../plc4x/java/examples/dummydriver/connection/DummyConnection.java | 4 ++--
 .../src/test/java/org/apache/plc4x/java/mock/MockConnection.java    | 4 ++--
 .../apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java  | 4 ++--
 .../apache/plc4x/java/ads/connection/AdsConnectionFactoryTest.java  | 6 +++---
 .../plc4x/java/ads/connection/AdsSerialPlcConnectionTest.java       | 4 ++--
 .../{AbstractPlcConnection.java => NettyPlcConnection.java}         | 6 +++---
 .../java/org/apache/plc4x/java/base/connection/MockConnection.java  | 2 +-
 .../java/ethernetip/connection/BaseEtherNetIpPlcConnection.java     | 4 ++--
 .../plc4x/java/modbus/connection/BaseModbusPlcConnection.java       | 4 ++--
 .../plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java   | 6 +++---
 .../plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java | 4 ++--
 .../java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java   | 4 ++--
 .../src/site/asciidoc/developers/implementing-drivers.adoc          | 2 +-
 13 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/connection/DummyConnection.java b/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/connection/DummyConnection.java
index ed84e90..627ce55 100644
--- a/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/connection/DummyConnection.java
+++ b/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/connection/DummyConnection.java
@@ -25,7 +25,7 @@ import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteResponse;
-import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory;
 import org.apache.plc4x.java.base.messages.*;
 import org.slf4j.Logger;
@@ -34,7 +34,7 @@ import org.slf4j.LoggerFactory;
 import java.net.InetAddress;
 import java.util.concurrent.CompletableFuture;
 
-public class DummyConnection extends AbstractPlcConnection implements PlcReader, PlcWriter {
+public class DummyConnection extends NettyPlcConnection implements PlcReader, PlcWriter {
 
     @SuppressWarnings("unused")
     private static final Logger logger = LoggerFactory.getLogger(DummyConnection.class);
diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java
index d44fc5d..4662485 100644
--- a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java
+++ b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java
@@ -22,12 +22,12 @@ import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelInitializer;
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
-import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.connection.TestChannelFactory;
 
 import java.util.concurrent.CompletableFuture;
 
-public class MockConnection extends AbstractPlcConnection {
+public class MockConnection extends NettyPlcConnection {
 
     private final PlcAuthentication authentication;
 
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java
index 22023cf..858a18f 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java
@@ -34,7 +34,7 @@ import org.apache.plc4x.java.ads.model.SymbolicAdsField;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.messages.*;
-import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.connection.ChannelFactory;
 import org.apache.plc4x.java.base.messages.*;
 import org.slf4j.Logger;
@@ -42,7 +42,7 @@ import org.slf4j.LoggerFactory;
 
 import java.util.concurrent.*;
 
-public abstract class AdsAbstractPlcConnection extends AbstractPlcConnection implements PlcReader, PlcWriter, PlcProprietarySender {
+public abstract class AdsAbstractPlcConnection extends NettyPlcConnection implements PlcReader, PlcWriter, PlcProprietarySender {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(AdsAbstractPlcConnection.class);
 
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsConnectionFactoryTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsConnectionFactoryTest.java
index edd3850..82b4d38 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsConnectionFactoryTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsConnectionFactoryTest.java
@@ -21,7 +21,7 @@ package org.apache.plc4x.java.ads.connection;
 import org.apache.commons.lang3.reflect.FieldUtils;
 import org.apache.plc4x.java.ads.api.generic.types.AmsNetId;
 import org.apache.plc4x.java.ads.api.generic.types.AmsPort;
-import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.connection.SerialChannelFactory;
 import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory;
 import org.junit.Test;
@@ -117,7 +117,7 @@ public class AdsConnectionFactoryTest {
 
     public void assertPort(AdsTcpPlcConnection adsTcpPlcConnection, int port) throws Exception {
         TcpSocketChannelFactory channelFactory = (TcpSocketChannelFactory) FieldUtils
-            .getDeclaredField(AbstractPlcConnection.class, "channelFactory", true)
+            .getDeclaredField(NettyPlcConnection.class, "channelFactory", true)
             .get(adsTcpPlcConnection);
         assertEquals(port, channelFactory.getPort());
     }
@@ -157,7 +157,7 @@ public class AdsConnectionFactoryTest {
 
     public void assertPort(AdsSerialPlcConnection adsSerialPlcConnection, String serialPort) throws Exception {
         SerialChannelFactory channelFactory = (SerialChannelFactory) FieldUtils
-            .getDeclaredField(AbstractPlcConnection.class, "channelFactory", true)
+            .getDeclaredField(NettyPlcConnection.class, "channelFactory", true)
             .get(adsSerialPlcConnection);
         assertEquals(serialPort, channelFactory.getSerialPort());
     }
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsSerialPlcConnectionTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsSerialPlcConnectionTest.java
index 9b0a7f4..8a24c99 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsSerialPlcConnectionTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsSerialPlcConnectionTest.java
@@ -30,7 +30,7 @@ import org.apache.plc4x.java.ads.api.serial.AmsSerialFrame;
 import org.apache.plc4x.java.ads.api.serial.types.*;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.connection.SerialChannelFactory;
 import org.junit.After;
 import org.junit.Before;
@@ -83,7 +83,7 @@ public class AdsSerialPlcConnectionTest {
     }
 
     private void prepareSerialSimulator() throws Exception {
-        Field channelFactoryField = FieldUtils.getField(AbstractPlcConnection.class, "channelFactory", true);
+        Field channelFactoryField = FieldUtils.getField(NettyPlcConnection.class, "channelFactory", true);
         SerialChannelFactory serialChannelFactory = (SerialChannelFactory) channelFactoryField.get(SUT);
         SerialChannelFactory serialChannelFactorySpied = spy(serialChannelFactory);
         EmbeddedChannel embeddedChannel = new EmbeddedChannel(SUT.getChannelHandler(null));
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java
similarity index 95%
rename from plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
rename to plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java
index ea8ddcd..b271fb7 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java
@@ -36,7 +36,7 @@ import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 
-public abstract class AbstractPlcConnection implements PlcConnection, PlcConnectionMetadata {
+public abstract class NettyPlcConnection implements PlcConnection, PlcConnectionMetadata {
 
     /**
      * a {@link HashedWheelTimer} shall be only instantiated once.
@@ -52,11 +52,11 @@ public abstract class AbstractPlcConnection implements PlcConnection, PlcConnect
 
     protected boolean connected;
 
-    protected AbstractPlcConnection(ChannelFactory channelFactory) {
+    protected NettyPlcConnection(ChannelFactory channelFactory) {
         this(channelFactory, false);
     }
 
-    protected AbstractPlcConnection(ChannelFactory channelFactory, boolean awaitSessionSetupComplete) {
+    protected NettyPlcConnection(ChannelFactory channelFactory, boolean awaitSessionSetupComplete) {
         this.channelFactory = channelFactory;
         this.awaitSessionSetupComplete = awaitSessionSetupComplete;
         this.connected = false;
diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/MockConnection.java b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/MockConnection.java
index bbd489f..5d265b8 100644
--- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/MockConnection.java
+++ b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/MockConnection.java
@@ -22,7 +22,7 @@ import io.netty.channel.ChannelHandler;
 
 import java.util.concurrent.CompletableFuture;
 
-public class MockConnection extends AbstractPlcConnection {
+public class MockConnection extends NettyPlcConnection {
 
     public MockConnection() {
         super(new TestChannelFactory());
diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java b/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java
index 56a6ddc..8e88331 100644
--- a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java
+++ b/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteResponse;
-import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.connection.ChannelFactory;
 import org.apache.plc4x.java.base.messages.*;
 import org.apache.plc4x.java.ethernetip.netty.util.EnipPlcFieldHandler;
@@ -32,7 +32,7 @@ import org.slf4j.LoggerFactory;
 
 import java.util.concurrent.CompletableFuture;
 
-public abstract class BaseEtherNetIpPlcConnection extends AbstractPlcConnection implements PlcReader, PlcWriter {
+public abstract class BaseEtherNetIpPlcConnection extends NettyPlcConnection implements PlcReader, PlcWriter {
 
     private static final Logger logger = LoggerFactory.getLogger(BaseEtherNetIpPlcConnection.class);
 
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
index 3d4ab33..055eb3c 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteResponse;
-import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.connection.ChannelFactory;
 import org.apache.plc4x.java.base.messages.*;
 import org.apache.plc4x.java.modbus.util.ModbusPlcFieldHandler;
@@ -32,7 +32,7 @@ import org.slf4j.LoggerFactory;
 
 import java.util.concurrent.CompletableFuture;
 
-public abstract class BaseModbusPlcConnection extends AbstractPlcConnection implements PlcReader, PlcWriter {
+public abstract class BaseModbusPlcConnection extends NettyPlcConnection implements PlcReader, PlcWriter {
 
     private static final Logger logger = LoggerFactory.getLogger(BaseModbusPlcConnection.class);
 
diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java
index c4e3711..e4dbc97 100644
--- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java
+++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java
@@ -19,7 +19,7 @@
 package org.apache.plc4x.java.modbus.connection;
 
 import org.apache.commons.lang3.reflect.FieldUtils;
-import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.connection.SerialChannelFactory;
 import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory;
 import org.junit.Test;
@@ -70,7 +70,7 @@ public class ModbusConnectionFactoryTest {
 
     public void assertPort(ModbusTcpPlcConnection modbusTcpPlcConnection, int port) throws Exception {
         TcpSocketChannelFactory channelFactory = (TcpSocketChannelFactory) FieldUtils
-            .getDeclaredField(AbstractPlcConnection.class, "channelFactory", true)
+            .getDeclaredField(NettyPlcConnection.class, "channelFactory", true)
             .get(modbusTcpPlcConnection);
         assertEquals(port, channelFactory.getPort());
     }
@@ -88,7 +88,7 @@ public class ModbusConnectionFactoryTest {
 
     public void assertPort(ModbusSerialPlcConnection modbusSerialPlcConnection, String serialPort) throws Exception {
         SerialChannelFactory channelFactory = (SerialChannelFactory) FieldUtils
-            .getDeclaredField(AbstractPlcConnection.class, "channelFactory", true)
+            .getDeclaredField(NettyPlcConnection.class, "channelFactory", true)
             .get(modbusSerialPlcConnection);
         assertEquals(serialPort, channelFactory.getSerialPort());
     }
diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java
index 519d4b9..57aacf7 100644
--- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java
+++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java
@@ -26,7 +26,7 @@ import org.apache.commons.lang3.reflect.FieldUtils;
 import org.apache.commons.lang3.reflect.MethodUtils;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.connection.SerialChannelFactory;
 import org.junit.After;
 import org.junit.Before;
@@ -73,7 +73,7 @@ public class ModbusSerialPlcConnectionTest {
     }
 
     private void prepareSerialSimulator() throws Exception {
-        Field channelFactoryField = FieldUtils.getField(AbstractPlcConnection.class, "channelFactory", true);
+        Field channelFactoryField = FieldUtils.getField(NettyPlcConnection.class, "channelFactory", true);
         SerialChannelFactory serialChannelFactory = (SerialChannelFactory) channelFactoryField.get(SUT);
         SerialChannelFactory serialChannelFactorySpied = spy(serialChannelFactory);
         EmbeddedChannel embeddedChannel = new EmbeddedChannel(SUT.getChannelHandler(null));
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
index ab23437..8e4a063 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
@@ -27,7 +27,7 @@ import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteResponse;
-import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.connection.ChannelFactory;
 import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory;
 import org.apache.plc4x.java.base.events.ConnectEvent;
@@ -72,7 +72,7 @@ import java.util.concurrent.TimeoutException;
  * where the {bit-offset} is optional.
  * All Available Memory Areas for this mode are defined in the {@link MemoryArea} enum.
  */
-public class S7PlcConnection extends AbstractPlcConnection implements PlcReader, PlcWriter {
+public class S7PlcConnection extends NettyPlcConnection implements PlcReader, PlcWriter {
 
     private static final int ISO_ON_TCP_PORT = 102;
 
diff --git a/plc4j/protocols/src/site/asciidoc/developers/implementing-drivers.adoc b/plc4j/protocols/src/site/asciidoc/developers/implementing-drivers.adoc
index 5c62a03..bed4d3c 100644
--- a/plc4j/protocols/src/site/asciidoc/developers/implementing-drivers.adoc
+++ b/plc4j/protocols/src/site/asciidoc/developers/implementing-drivers.adoc
@@ -198,7 +198,7 @@ If no form of `PlcAuthentication` is provided, the normal `connect` method is th
 If however authentication information is provided, the second connect method is used.
 However we still have to find and implement a protocol that actually supports authentication.
 
-The probably simplest way to implement a custom connection is to extend `org.apache.plc4x.java.base.connection.AbstractPlcConnection`.
+The probably simplest way to implement a custom connection is to extend `org.apache.plc4x.java.base.connection.NettyPlcConnection`.
 This allows passing in a `ChannelFactory` instance, which allows overriding the default communication channel used by the driver.
 
 An `AbstractPlcConnection` is required to implement a method called `getChannelHandler`.


[incubator-plc4x] 02/03: extracted AbstractPlcConnection class

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

skorikov pushed a commit to branch feature/refactor-abstract-connection
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit 14ab66e1422e120c03dcfad0ebc0687bce35b139
Author: Andrey Skorikov <an...@codecentric.de>
AuthorDate: Fri Oct 26 15:32:06 2018 +0200

    extracted AbstractPlcConnection class
---
 .../base/connection/AbstractPlcConnection.java     | 77 ++++++++++++++++++++++
 .../java/base/connection/NettyPlcConnection.java   | 49 +-------------
 .../org/apache/plc4x/java/test/TestConnection.java | 31 ++-------
 3 files changed, 84 insertions(+), 73 deletions(-)

diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
new file mode 100644
index 0000000..2a19470
--- /dev/null
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
@@ -0,0 +1,77 @@
+/*
+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.java.base.connection;
+
+import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.exceptions.PlcUnsupportedOperationException;
+import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
+import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest;
+import org.apache.plc4x.java.api.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.metadata.PlcConnectionMetadata;
+
+/**
+ * Base class for implementing connections.
+ * Per default, all operations (read, write, subscribe) are unsupported.
+ * Concrete implementations should override the methods indicating connection capabilities
+ * and for obtaining respective request builders.
+ */
+public abstract class AbstractPlcConnection implements PlcConnection, PlcConnectionMetadata {
+
+    @Override
+    public PlcConnectionMetadata getMetadata() {
+        return this;
+    }
+
+    @Override
+    public boolean canRead() {
+        return false;
+    }
+
+    @Override
+    public boolean canWrite() {
+        return false;
+    }
+
+    @Override
+    public boolean canSubscribe() {
+        return false;
+    }
+
+    @Override
+    public PlcReadRequest.Builder readRequestBuilder() {
+        throw new PlcUnsupportedOperationException("The connection does not support reading");
+    }
+
+    @Override
+    public PlcWriteRequest.Builder writeRequestBuilder() {
+        throw new PlcUnsupportedOperationException("The connection does not support writing");
+    }
+
+    @Override
+    public PlcSubscriptionRequest.Builder subscriptionRequestBuilder() {
+        throw new PlcUnsupportedOperationException("The connection does not support subscription");
+    }
+
+    @Override
+    public PlcUnsubscriptionRequest.Builder unsubscriptionRequestBuilder() {
+        throw new PlcUnsupportedOperationException("The connection does not support subscription");
+    }
+
+}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java
index b271fb7..7dbb258 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java
@@ -22,21 +22,14 @@ import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandler;
 import io.netty.util.HashedWheelTimer;
 import io.netty.util.Timer;
-import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcIoException;
-import org.apache.plc4x.java.api.exceptions.PlcUnsupportedOperationException;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
-import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
-import org.apache.plc4x.java.api.metadata.PlcConnectionMetadata;
 
 import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 
-public abstract class NettyPlcConnection implements PlcConnection, PlcConnectionMetadata {
+public abstract class NettyPlcConnection extends AbstractPlcConnection {
 
     /**
      * a {@link HashedWheelTimer} shall be only instantiated once.
@@ -107,46 +100,6 @@ public abstract class NettyPlcConnection implements PlcConnection, PlcConnection
         return connected;
     }
 
-    @Override
-    public PlcConnectionMetadata getMetadata() {
-        return this;
-    }
-
-    @Override
-    public boolean canRead() {
-        return false;
-    }
-
-    @Override
-    public boolean canWrite() {
-        return false;
-    }
-
-    @Override
-    public boolean canSubscribe() {
-        return false;
-    }
-
-    @Override
-    public PlcReadRequest.Builder readRequestBuilder() {
-        throw new PlcUnsupportedOperationException("The connection does not support reading");
-    }
-
-    @Override
-    public PlcWriteRequest.Builder writeRequestBuilder() {
-        throw new PlcUnsupportedOperationException("The connection does not support writing");
-    }
-
-    @Override
-    public PlcSubscriptionRequest.Builder subscriptionRequestBuilder() {
-        throw new PlcUnsupportedOperationException("The connection does not support subscription");
-    }
-
-    @Override
-    public PlcUnsubscriptionRequest.Builder unsubscriptionRequestBuilder() {
-        throw new PlcUnsupportedOperationException("The connection does not support subscription");
-    }
-
     public Channel getChannel() {
         return channel;
     }
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java
index 4a0199d..50ef026 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java
+++ b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java
@@ -20,11 +20,12 @@ package org.apache.plc4x.java.test;
 
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.api.exceptions.PlcUnsupportedOperationException;
-import org.apache.plc4x.java.api.messages.*;
-import org.apache.plc4x.java.api.metadata.PlcConnectionMetadata;
+import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.messages.PlcWriteResponse;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
 import org.apache.plc4x.java.base.messages.*;
 import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
@@ -37,7 +38,7 @@ import java.util.concurrent.CompletableFuture;
  * Connection to a test device.
  * This class is not thread-safe.
  */
-class TestConnection implements PlcConnection, PlcConnectionMetadata, PlcReader, PlcWriter {
+class TestConnection extends AbstractPlcConnection implements PlcReader, PlcWriter {
     private final TestDevice device;
     private boolean connected = false;
 
@@ -61,11 +62,6 @@ class TestConnection implements PlcConnection, PlcConnectionMetadata, PlcReader,
     }
 
     @Override
-    public PlcConnectionMetadata getMetadata() {
-        return this;
-    }
-
-    @Override
     public boolean canRead() {
         return true;
     }
@@ -76,11 +72,6 @@ class TestConnection implements PlcConnection, PlcConnectionMetadata, PlcReader,
     }
 
     @Override
-    public boolean canSubscribe() {
-        return false;
-    }
-
-    @Override
     public PlcReadRequest.Builder readRequestBuilder() {
         return new DefaultPlcReadRequest.Builder(this, new TestFieldHandler());
     }
@@ -91,16 +82,6 @@ class TestConnection implements PlcConnection, PlcConnectionMetadata, PlcReader,
     }
 
     @Override
-    public PlcSubscriptionRequest.Builder subscriptionRequestBuilder() {
-        throw new PlcUnsupportedOperationException("The connection does not support subscription");
-    }
-
-    @Override
-    public PlcUnsubscriptionRequest.Builder unsubscriptionRequestBuilder() {
-        throw new PlcUnsupportedOperationException("The connection does not support subscription");
-    }
-
-    @Override
     public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
         if(!(readRequest instanceof InternalPlcReadRequest)) {
             throw new IllegalArgumentException("Read request doesn't implement InternalPlcReadRequest");