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 2022/02/04 23:42:44 UTC
[plc4x] branch develop updated (3dfdc12 -> ecf3453)
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 3dfdc12 chore(plc4j/plc4x): Finished implementing the read- and write request logic.
new 3f92555 fix(plc4j/connection-cache): Implemented Writing for the connection cache
new 958dfea chore(plc4j/plc4x): Implemented the write-part on the server.
new ecf3453 chore(protocols/knx): Added new manufacturers
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:
.../knxnetip/readwrite/model/KnxManufacturer.go | 34 +++++++---
.../org/apache/plc4x/java/plc4x/Plc4xDriver.java | 3 +-
.../apache/plc4x/java/plc4x/field/Plc4xField.java | 11 +++-
.../plc4x/java/plc4x/field/Plc4xFieldHandler.java | 9 ++-
.../java/plc4x/protocol/Plc4xProtocolLogic.java | 12 ++--
.../{Plc4xClient.java => Plc4xReadClient.java} | 2 +-
.../{Plc4xClient.java => Plc4xWriteClient.java} | 12 ++--
.../utils/connectionpool2/CachedPlcConnection.java | 76 +++++++++++++++++++---
...hedReadRequest.java => CachedWriteRequest.java} | 21 ++++--
...Builder.java => CachedWriteRequestBuilder.java} | 21 +++---
.../plc4xserver/protocol/Plc4xServerAdapter.java | 63 ++++++++++++++++--
.../knxnetip/readwrite/model/KnxManufacturer.cs | 23 ++++---
12 files changed, 221 insertions(+), 66 deletions(-)
copy plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/{Plc4xClient.java => Plc4xReadClient.java} (98%)
rename plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/{Plc4xClient.java => Plc4xWriteClient.java} (73%)
copy plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/{CachedReadRequest.java => CachedWriteRequest.java} (72%)
copy plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/{CachedReadRequestBuilder.java => CachedWriteRequestBuilder.java} (66%)
[plc4x] 03/03: chore(protocols/knx): Added new manufacturers
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 ecf34532ef43b9d6688ca534762385770374b30f
Author: cdutz <ch...@c-ware.de>
AuthorDate: Sat Feb 5 00:42:36 2022 +0100
chore(protocols/knx): Added new manufacturers
---
.../knxnetip/readwrite/model/KnxManufacturer.go | 34 ++++++++++++++++------
.../knxnetip/readwrite/model/KnxManufacturer.cs | 23 ++++++++++-----
2 files changed, 40 insertions(+), 17 deletions(-)
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go
index 365924f..51f1cc4 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go
@@ -614,8 +614,9 @@ const (
KnxManufacturer_M_SVIT KnxManufacturer = 576
KnxManufacturer_M_TECGET KnxManufacturer = 577
KnxManufacturer_M_XEROPOINT KnxManufacturer = 578
- KnxManufacturer_M_ABB___RESERVED KnxManufacturer = 579
- KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED KnxManufacturer = 580
+ KnxManufacturer_M_HONEYWELL_BUILDING_TECHNOLOGIES KnxManufacturer = 579
+ KnxManufacturer_M_ABB___RESERVED KnxManufacturer = 580
+ KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED KnxManufacturer = 581
)
var KnxManufacturerValues []KnxManufacturer
@@ -1202,6 +1203,7 @@ func init() {
KnxManufacturer_M_SVIT,
KnxManufacturer_M_TECGET,
KnxManufacturer_M_XEROPOINT,
+ KnxManufacturer_M_HONEYWELL_BUILDING_TECHNOLOGIES,
KnxManufacturer_M_ABB___RESERVED,
KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED,
}
@@ -3343,7 +3345,7 @@ func (e KnxManufacturer) Number() uint16 {
}
case 579:
{ /* '579' */
- return 43954
+ return 637
}
case 58:
{ /* '58' */
@@ -3351,6 +3353,10 @@ func (e KnxManufacturer) Number() uint16 {
}
case 580:
{ /* '580' */
+ return 43954
+ }
+ case 581:
+ { /* '581' */
return 43959
}
case 59:
@@ -5685,7 +5691,7 @@ func (e KnxManufacturer) Name() string {
}
case 579:
{ /* '579' */
- return "ABB - reserved"
+ return "Honeywell Building Technologies"
}
case 58:
{ /* '58' */
@@ -5693,6 +5699,10 @@ func (e KnxManufacturer) Name() string {
}
case 580:
{ /* '580' */
+ return "ABB - reserved"
+ }
+ case 581:
+ { /* '581' */
return "Busch-Jaeger Elektro - reserved"
}
case 59:
@@ -6959,10 +6969,12 @@ func KnxManufacturerByValue(value uint16) KnxManufacturer {
case 578:
return KnxManufacturer_M_XEROPOINT
case 579:
- return KnxManufacturer_M_ABB___RESERVED
+ return KnxManufacturer_M_HONEYWELL_BUILDING_TECHNOLOGIES
case 58:
return KnxManufacturer_M_DAETWYLER
case 580:
+ return KnxManufacturer_M_ABB___RESERVED
+ case 581:
return KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED
case 59:
return KnxManufacturer_M_ELECTRAK
@@ -8126,10 +8138,12 @@ func KnxManufacturerByName(value string) KnxManufacturer {
return KnxManufacturer_M_TECGET
case "M_XEROPOINT":
return KnxManufacturer_M_XEROPOINT
- case "M_ABB___RESERVED":
- return KnxManufacturer_M_ABB___RESERVED
+ case "M_HONEYWELL_BUILDING_TECHNOLOGIES":
+ return KnxManufacturer_M_HONEYWELL_BUILDING_TECHNOLOGIES
case "M_DAETWYLER":
return KnxManufacturer_M_DAETWYLER
+ case "M_ABB___RESERVED":
+ return KnxManufacturer_M_ABB___RESERVED
case "M_BUSCH_JAEGER_ELEKTRO___RESERVED":
return KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED
case "M_ELECTRAK":
@@ -9333,10 +9347,12 @@ func (e KnxManufacturer) name() string {
return "M_TECGET"
case KnxManufacturer_M_XEROPOINT:
return "M_XEROPOINT"
- case KnxManufacturer_M_ABB___RESERVED:
- return "M_ABB___RESERVED"
+ case KnxManufacturer_M_HONEYWELL_BUILDING_TECHNOLOGIES:
+ return "M_HONEYWELL_BUILDING_TECHNOLOGIES"
case KnxManufacturer_M_DAETWYLER:
return "M_DAETWYLER"
+ case KnxManufacturer_M_ABB___RESERVED:
+ return "M_ABB___RESERVED"
case KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED:
return "M_BUSCH_JAEGER_ELEKTRO___RESERVED"
case KnxManufacturer_M_ELECTRAK:
diff --git a/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs b/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs
index 4cd7c06..61da32e 100644
--- a/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs
+++ b/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs
@@ -603,8 +603,9 @@ namespace org.apache.plc4net.drivers.knxnetip.readwrite.model
M_SVIT = 576,
M_TECGET = 577,
M_XEROPOINT = 578,
- M_ABB___RESERVED = 579,
- M_BUSCH_JAEGER_ELEKTRO___RESERVED = 580,
+ M_HONEYWELL_BUILDING_TECHNOLOGIES = 579,
+ M_ABB___RESERVED = 580,
+ M_BUSCH_JAEGER_ELEKTRO___RESERVED = 581,
}
public static class KnxManufacturerInfo
@@ -2213,13 +2214,16 @@ namespace org.apache.plc4net.drivers.knxnetip.readwrite.model
case KnxManufacturer.M_XEROPOINT: { /* '578' */
return 636;
}
- case KnxManufacturer.M_ABB___RESERVED: { /* '579' */
- return 43954;
+ case KnxManufacturer.M_HONEYWELL_BUILDING_TECHNOLOGIES: { /* '579' */
+ return 637;
}
case KnxManufacturer.M_DAETWYLER: { /* '58' */
return 97;
}
- case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '580' */
+ case KnxManufacturer.M_ABB___RESERVED: { /* '580' */
+ return 43954;
+ }
+ case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '581' */
return 43959;
}
case KnxManufacturer.M_ELECTRAK: { /* '59' */
@@ -3966,13 +3970,16 @@ namespace org.apache.plc4net.drivers.knxnetip.readwrite.model
case KnxManufacturer.M_XEROPOINT: { /* '578' */
return "Xeropoint";
}
- case KnxManufacturer.M_ABB___RESERVED: { /* '579' */
- return "ABB - reserved";
+ case KnxManufacturer.M_HONEYWELL_BUILDING_TECHNOLOGIES: { /* '579' */
+ return "Honeywell Building Technologies";
}
case KnxManufacturer.M_DAETWYLER: { /* '58' */
return "Dätwyler";
}
- case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '580' */
+ case KnxManufacturer.M_ABB___RESERVED: { /* '580' */
+ return "ABB - reserved";
+ }
+ case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '581' */
return "Busch-Jaeger Elektro - reserved";
}
case KnxManufacturer.M_ELECTRAK: { /* '59' */
[plc4x] 02/03: chore(plc4j/plc4x): Implemented the write-part on the server.
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 958dfeab3c1b0886007aa518b26258ec9fd69c27
Author: cdutz <ch...@c-ware.de>
AuthorDate: Sat Feb 5 00:41:23 2022 +0100
chore(plc4j/plc4x): Implemented the write-part on the server.
---
.../org/apache/plc4x/java/plc4x/Plc4xDriver.java | 3 +-
.../apache/plc4x/java/plc4x/field/Plc4xField.java | 11 +++-
.../plc4x/java/plc4x/field/Plc4xFieldHandler.java | 9 +++-
.../java/plc4x/protocol/Plc4xProtocolLogic.java | 12 +++--
.../{Plc4xClient.java => Plc4xReadClient.java} | 2 +-
.../{Plc4xClient.java => Plc4xWriteClient.java} | 12 ++---
.../plc4xserver/protocol/Plc4xServerAdapter.java | 63 +++++++++++++++++++---
7 files changed, 90 insertions(+), 22 deletions(-)
diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/Plc4xDriver.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/Plc4xDriver.java
index 0edf996..eeccd2f 100644
--- a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/Plc4xDriver.java
+++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/Plc4xDriver.java
@@ -29,6 +29,7 @@ import org.apache.plc4x.java.spi.connection.GeneratedDriverBase;
import org.apache.plc4x.java.spi.connection.PlcFieldHandler;
import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer;
import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer;
+import org.apache.plc4x.java.spi.values.IEC61131ValueHandler;
import java.util.function.ToIntFunction;
@@ -56,7 +57,7 @@ public class Plc4xDriver extends GeneratedDriverBase<Plc4xMessage> {
@Override
protected PlcValueHandler getValueHandler() {
- return null;
+ return new IEC61131ValueHandler();
}
@Override
diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/field/Plc4xField.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/field/Plc4xField.java
index f323110..62fcd3a 100644
--- a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/field/Plc4xField.java
+++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/field/Plc4xField.java
@@ -19,6 +19,7 @@
package org.apache.plc4x.java.plc4x.field;
import org.apache.plc4x.java.api.model.PlcField;
+import org.apache.plc4x.java.plc4x.readwrite.Plc4xValueType;
import org.apache.plc4x.java.spi.generation.SerializationException;
import org.apache.plc4x.java.spi.generation.WriteBuffer;
import org.apache.plc4x.java.spi.utils.Serializable;
@@ -26,18 +27,24 @@ import org.apache.plc4x.java.spi.utils.Serializable;
public class Plc4xField implements PlcField, Serializable {
private final String address;
+ private final Plc4xValueType valueType;
- public Plc4xField(String address) {
+ public Plc4xField(String address, Plc4xValueType valueType) {
this.address = address;
+ this.valueType = valueType;
}
public String getAddress() {
return address;
}
+ public Plc4xValueType getValueType() {
+ return valueType;
+ }
+
@Override
public String getPlcDataType() {
- return PlcField.super.getPlcDataType();
+ return valueType.name();
}
@Override
diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/field/Plc4xFieldHandler.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/field/Plc4xFieldHandler.java
index ce36791..cef1c87 100644
--- a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/field/Plc4xFieldHandler.java
+++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/field/Plc4xFieldHandler.java
@@ -18,14 +18,21 @@
*/
package org.apache.plc4x.java.plc4x.field;
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
import org.apache.plc4x.java.api.model.PlcField;
+import org.apache.plc4x.java.plc4x.readwrite.Plc4xValueType;
import org.apache.plc4x.java.spi.connection.PlcFieldHandler;
public class Plc4xFieldHandler implements PlcFieldHandler {
@Override
public PlcField createField(String fieldQuery) {
- return new Plc4xField(fieldQuery);
+ if(!fieldQuery.contains(":")) {
+ throw new PlcInvalidFieldException(fieldQuery);
+ }
+ String address = fieldQuery.substring(0, fieldQuery.lastIndexOf(":"));
+ String dataType = fieldQuery.substring(fieldQuery.lastIndexOf(":") + 1);
+ return new Plc4xField(address, Plc4xValueType.valueOf(dataType));
}
}
diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/protocol/Plc4xProtocolLogic.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/protocol/Plc4xProtocolLogic.java
index 521fbe6..60c6f2c 100644
--- a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/protocol/Plc4xProtocolLogic.java
+++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/protocol/Plc4xProtocolLogic.java
@@ -92,8 +92,10 @@ public class Plc4xProtocolLogic extends Plc4xProtocolBase<Plc4xMessage> implemen
// Prepare the request.
List<Plc4xFieldRequest> plc4xFields = new ArrayList<>(apiReadRequest.getNumberOfFields());
for (String fieldName : apiReadRequest.getFieldNames()) {
- final org.apache.plc4x.java.plc4x.field.Plc4xField plc4xField = (org.apache.plc4x.java.plc4x.field.Plc4xField) apiReadRequest.getField(fieldName);
- Plc4xFieldRequest plc4xFieldRequest = new Plc4xFieldRequest(new Plc4xField(fieldName, plc4xField.getAddress()));
+ final org.apache.plc4x.java.plc4x.field.Plc4xField plc4xField =
+ (org.apache.plc4x.java.plc4x.field.Plc4xField) apiReadRequest.getField(fieldName);
+ Plc4xFieldRequest plc4xFieldRequest = new Plc4xFieldRequest(
+ new Plc4xField(fieldName, plc4xField.getAddress() + ":" + plc4xField.getPlcDataType()));
plc4xFields.add(plc4xFieldRequest);
}
final int requestId = txIdGenerator.getAndIncrement();
@@ -133,11 +135,11 @@ public class Plc4xProtocolLogic extends Plc4xProtocolBase<Plc4xMessage> implemen
// Prepare the request.
List<Plc4xFieldValueRequest> fields = new ArrayList<>(writeRequest.getNumberOfFields());
for (String fieldName : writeRequest.getFieldNames()) {
- final org.apache.plc4x.java.plc4x.field.Plc4xField field = (org.apache.plc4x.java.plc4x.field.Plc4xField) writeRequest.getField(fieldName);
- final Plc4xValueType plc4xValueType = Plc4xValueType.BOOL;
+ final org.apache.plc4x.java.plc4x.field.Plc4xField plc4xField = (org.apache.plc4x.java.plc4x.field.Plc4xField) writeRequest.getField(fieldName);
+ final Plc4xValueType plc4xValueType = plc4xField.getValueType();
final PlcValue plcValue = writeRequest.getPlcValue(fieldName);
Plc4xFieldValueRequest fieldRequest = new Plc4xFieldValueRequest(
- new Plc4xField(fieldName, field.getAddress()), plc4xValueType, plcValue);
+ new Plc4xField(fieldName, plc4xField.getAddress() + ":" + plc4xField.getPlcDataType()), plc4xValueType, plcValue);
fields.add(fieldRequest);
}
final int requestId = txIdGenerator.getAndIncrement();
diff --git a/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xClient.java b/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xReadClient.java
similarity index 98%
copy from plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xClient.java
copy to plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xReadClient.java
index c9bdc0b..2824870 100644
--- a/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xClient.java
+++ b/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xReadClient.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
import org.apache.plc4x.java.api.messages.PlcReadResponse;
-public class Plc4xClient {
+public class Plc4xReadClient {
public static void main(String[] args) throws Exception {
try (final PlcConnection connection = new PlcDriverManager().getConnection("plc4x://localhost?remote-connection-string=simulated%3A%2F%2Flocalhost")) {
diff --git a/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xClient.java b/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xWriteClient.java
similarity index 73%
rename from plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xClient.java
rename to plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xWriteClient.java
index c9bdc0b..c6a1691 100644
--- a/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xClient.java
+++ b/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xWriteClient.java
@@ -20,16 +20,16 @@ package org.apache.plc4x.java.plc4x;
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.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.messages.PlcWriteResponse;
-public class Plc4xClient {
+public class Plc4xWriteClient {
public static void main(String[] args) throws Exception {
try (final PlcConnection connection = new PlcDriverManager().getConnection("plc4x://localhost?remote-connection-string=simulated%3A%2F%2Flocalhost")) {
- final PlcReadRequest readRequest = connection.readRequestBuilder().addItem("lalala", "RANDOM/foo:INT").build();
- final PlcReadResponse readResponse = readRequest.execute().get();
- System.out.println(readResponse);
+ final PlcWriteRequest writeRequest = connection.writeRequestBuilder().addItem("lalala", "STDOUT/foo:INT", (short) 23).build();
+ final PlcWriteResponse writeResponse = writeRequest.execute().get();
+ System.out.println(writeResponse);
}
}
diff --git a/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java b/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java
index b67ccd0..4625bee 100644
--- a/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java
+++ b/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java
@@ -23,13 +23,14 @@ import io.netty.channel.ChannelInboundHandlerAdapter;
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.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.messages.PlcWriteResponse;
import org.apache.plc4x.java.api.types.PlcResponseCode;
import org.apache.plc4x.java.api.value.PlcValue;
import org.apache.plc4x.java.plc4x.readwrite.*;
import org.apache.plc4x.java.utils.connectionpool2.PooledDriverManager;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@@ -73,7 +74,7 @@ public class Plc4xServerAdapter extends ChannelInboundHandlerAdapter {
final Plc4xReadRequest request = (Plc4xReadRequest) plc4xMessage;
String connectionUrl = connectionUrls.get(request.getConnectionId());
try (final PlcConnection connection = driverManager.getConnection(connectionUrl)) {
- // Build a read request for all fields in the requet.
+ // Build a read request for all fields in the request.
final PlcReadRequest.Builder builder = connection.readRequestBuilder();
for (Plc4xFieldRequest requestField : request.getFields()) {
builder.addItem(requestField.getField().getName(), requestField.getField().getFieldQuery());
@@ -87,8 +88,8 @@ public class Plc4xServerAdapter extends ChannelInboundHandlerAdapter {
if(throwable == null) {
// Create the response.
List<Plc4xFieldValueResponse> fields = new ArrayList<>(plcReadResponse.getFieldNames().size());
- for (Plc4xFieldRequest requestField : request.getFields()) {
- final PlcResponseCode responseCode = plcReadResponse.getResponseCode(requestField.getField().getName());
+ for (Plc4xFieldRequest plc4xRequestField : request.getFields()) {
+ final PlcResponseCode responseCode = plcReadResponse.getResponseCode(plc4xRequestField.getField().getName());
Plc4xResponseCode resCode;
Plc4xValueType valueType;
PlcValue value;
@@ -96,14 +97,14 @@ public class Plc4xServerAdapter extends ChannelInboundHandlerAdapter {
resCode = Plc4xResponseCode.OK;
// TODO: Get the real type.
valueType = Plc4xValueType.INT;
- value = plcReadResponse.getPlcValue(requestField.getField().getName());
+ value = plcReadResponse.getPlcValue(plc4xRequestField.getField().getName());
} else {
resCode = Plc4xResponseCode.INVALID_ADDRESS;
valueType = Plc4xValueType.NULL;
value = null;
}
fields.add(new Plc4xFieldValueResponse(
- requestField.getField(), resCode, valueType, value));
+ plc4xRequestField.getField(), resCode, valueType, value));
}
Plc4xReadResponse response = new Plc4xReadResponse(
request.getRequestId(), request.getConnectionId(), Plc4xResponseCode.OK, fields);
@@ -128,6 +129,56 @@ public class Plc4xServerAdapter extends ChannelInboundHandlerAdapter {
}
case WRITE_REQUEST:
+ final Plc4xWriteRequest plc4xWriteRequest = (Plc4xWriteRequest) plc4xMessage;
+ String connectionUrl = connectionUrls.get(plc4xWriteRequest.getConnectionId());
+ try (final PlcConnection connection = driverManager.getConnection(connectionUrl)) {
+ // Build a write request for all fields in the request.
+ final PlcWriteRequest.Builder builder = connection.writeRequestBuilder();
+ for (Plc4xFieldValueRequest plc4xRequestField : plc4xWriteRequest.getFields()) {
+ builder.addItem(plc4xRequestField.getField().getName(),
+ plc4xRequestField.getField().getFieldQuery(), plc4xRequestField.getValue().getObject());
+ }
+ final PlcWriteRequest apiWriteRequest = builder.build();
+
+ // Execute the query.
+ final CompletableFuture<? extends PlcWriteResponse> execute = apiWriteRequest.execute();
+
+ execute.whenComplete((apiWriteResponse, throwable) -> {
+ if(throwable == null) {
+ // Create the response.
+ List<Plc4xFieldResponse> plc4xFields =
+ new ArrayList<>(apiWriteResponse.getFieldNames().size());
+ for (Plc4xFieldValueRequest plc4xRequestField : plc4xWriteRequest.getFields()) {
+ final PlcResponseCode apiResponseCode =
+ apiWriteResponse.getResponseCode(plc4xRequestField.getField().getName());
+ Plc4xResponseCode resCode;
+ if(apiResponseCode == PlcResponseCode.OK) {
+ resCode = Plc4xResponseCode.OK;
+ } else {
+ resCode = Plc4xResponseCode.INVALID_ADDRESS;
+ }
+ plc4xFields.add(new Plc4xFieldResponse(plc4xRequestField.getField(), resCode));
+ }
+ Plc4xWriteResponse plc4xWriteResponse = new Plc4xWriteResponse(
+ plc4xWriteRequest.getRequestId(), plc4xWriteRequest.getConnectionId(),
+ Plc4xResponseCode.OK, plc4xFields);
+
+ // Send the response.
+ ctx.writeAndFlush(plc4xWriteResponse);
+ } else {
+ Plc4xReadResponse response = new Plc4xReadResponse(
+ plc4xWriteRequest.getRequestId(), plc4xWriteRequest.getConnectionId(),
+ Plc4xResponseCode.NOT_FOUND, Collections.emptyList());
+ // Send the response.
+ ctx.writeAndFlush(response);
+ }
+ });
+ } catch (Exception e) {
+ Plc4xReadResponse response = new Plc4xReadResponse(
+ plc4xWriteRequest.getRequestId(), plc4xWriteRequest.getConnectionId(),
+ Plc4xResponseCode.INVALID_ADDRESS, Collections.emptyList());
+ ctx.writeAndFlush(response);
+ }
break;
}
}
[plc4x] 01/03: fix(plc4j/connection-cache): Implemented Writing for the connection cache
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 3f92555c539705ebe4c4125fa312fc2f2f94c29c
Author: cdutz <ch...@c-ware.de>
AuthorDate: Sat Feb 5 00:40:19 2022 +0100
fix(plc4j/connection-cache): Implemented Writing for the connection cache
---
.../utils/connectionpool2/CachedPlcConnection.java | 76 ++++++++++++++++++---
.../utils/connectionpool2/CachedWriteRequest.java | 77 ++++++++++++++++++++++
.../connectionpool2/CachedWriteRequestBuilder.java | 46 +++++++++++++
3 files changed, 189 insertions(+), 10 deletions(-)
diff --git a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedPlcConnection.java b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedPlcConnection.java
index d1aab72..6373a38 100644
--- a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedPlcConnection.java
+++ b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedPlcConnection.java
@@ -22,11 +22,7 @@ import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
import org.apache.plc4x.java.api.exceptions.PlcUnsupportedOperationException;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-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.messages.*;
import org.apache.plc4x.java.api.metadata.PlcConnectionMetadata;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -72,7 +68,7 @@ public class CachedPlcConnection implements PlcConnection, PlcConnectionMetadata
}
}
- private CompletableFuture<? extends PlcReadResponse> wrapWithTimeout(CompletableFuture<? extends PlcReadResponse> future, long timeoutMillis) {
+ private CompletableFuture<? extends PlcReadResponse> wrapReadWithTimeout(CompletableFuture<? extends PlcReadResponse> future, long timeoutMillis) {
//schedule watcher
final CompletableFuture<PlcReadResponse> responseFuture = new CompletableFuture<>();
schedulerExecutor.schedule(() -> {
@@ -100,6 +96,34 @@ public class CachedPlcConnection implements PlcConnection, PlcConnectionMetadata
return responseFuture;
}
+ private CompletableFuture<? extends PlcWriteResponse> wrapWriteWithTimeout(CompletableFuture<? extends PlcWriteResponse> future, long timeoutMillis) {
+ //schedule watcher
+ final CompletableFuture<PlcWriteResponse> responseFuture = new CompletableFuture<>();
+ schedulerExecutor.schedule(() -> {
+ if (!future.isDone()) {
+ logger.debug("Timing out the PLC request!");
+ future.cancel(true);
+ responseFuture.completeExceptionally(new TimeoutException("Response did not finish in Time!"));
+ } else {
+ logger.trace("Unnecessary to cancel the request!");
+ }
+ }, timeoutMillis, TimeUnit.MILLISECONDS);
+ future.handle(new BiFunction<PlcWriteResponse, Throwable, Object>() {
+ @Override
+ public Object apply(PlcWriteResponse plcWriteResponse, Throwable throwable) {
+ if (plcWriteResponse != null) {
+ logger.debug("Request finsihed successfull!");
+ responseFuture.complete(plcWriteResponse);
+ } else {
+ logger.debug("Request failed", throwable);
+ responseFuture.completeExceptionally(throwable);
+ }
+ return null;
+ }
+ });
+ return responseFuture;
+ }
+
/**
* Executes the Request.
*/
@@ -110,7 +134,7 @@ public class CachedPlcConnection implements PlcConnection, PlcConnectionMetadata
}
try {
logger.trace("Executing Request {}", request);
- final CompletableFuture<? extends PlcReadResponse> responseFuture = wrapWithTimeout(request.execute(), 5_000);
+ final CompletableFuture<? extends PlcReadResponse> responseFuture = wrapReadWithTimeout(request.execute(), 5_000);
// final CompletableFuture<? extends PlcReadResponse> responseFuture = request.execute();
// The following code handles the case, that a read fails (which is handled async and thus not really connected
// to the connection, yet
@@ -128,11 +152,40 @@ public class CachedPlcConnection implements PlcConnection, PlcConnectionMetadata
});
return handledResponseFuture;
} catch (Exception e) {
- return closeConnectionExceptionally(e);
+ return (CompletableFuture<? extends PlcReadResponse>) closeConnectionExceptionally(e);
+ }
+ }
+
+ public CompletableFuture<? extends PlcWriteResponse> execute(PlcWriteRequest request) {
+ logger.trace("Trying to executing Request {}", request);
+ if (closed) {
+ throw new IllegalStateException("Trying to execute a Request on a closed Connection!");
+ }
+ try {
+ logger.trace("Executing Request {}", request);
+ final CompletableFuture<? extends PlcWriteResponse> responseFuture = wrapWriteWithTimeout(request.execute(), 5_000);
+// final CompletableFuture<? extends PlcReadResponse> responseFuture = request.execute();
+ // The following code handles the case, that a read fails (which is handled async and thus not really connected
+ // to the connection, yet
+ // Thus, we register our own listener who gets the notification and reports the connection as broken
+ final CompletableFuture<PlcWriteResponse> handledResponseFuture = responseFuture.handleAsync(new BiFunction<PlcWriteResponse, Throwable, PlcWriteResponse>() {
+ @Override
+ public PlcWriteResponse apply(PlcWriteResponse plcWriteResponse, Throwable throwable) {
+ if (throwable != null) {
+ // Do something here...
+ logger.warn("Request finished with exception. Reporting Connection as Broken", throwable);
+ closeConnectionExceptionally(null);
+ }
+ return plcWriteResponse;
+ }
+ });
+ return handledResponseFuture;
+ } catch (Exception e) {
+ return (CompletableFuture<? extends PlcWriteResponse>) closeConnectionExceptionally(e);
}
}
- private CompletableFuture<? extends PlcReadResponse> closeConnectionExceptionally(Exception e) {
+ private CompletableFuture<? extends PlcResponse> closeConnectionExceptionally(Exception e) {
// First, close this connection and allow no further operations on it!
this.closed = true;
// Return the Connection as invalid
@@ -184,7 +237,10 @@ public class CachedPlcConnection implements PlcConnection, PlcConnectionMetadata
@Override
public PlcWriteRequest.Builder writeRequestBuilder() {
- return null;
+ if (closed) {
+ throw new IllegalStateException("Trying to build a Request on a closed Connection!");
+ }
+ return new CachedWriteRequestBuilder(this, this.getActiveConnection().writeRequestBuilder());
}
@Override
diff --git a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedWriteRequest.java b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedWriteRequest.java
new file mode 100644
index 0000000..229fe7d
--- /dev/null
+++ b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedWriteRequest.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.utils.connectionpool2;
+
+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.model.PlcField;
+import org.apache.plc4x.java.api.value.PlcValue;
+
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+public class CachedWriteRequest implements PlcWriteRequest {
+
+ private final CachedPlcConnection parent;
+ private final PlcWriteRequest innerRequest;
+
+ public CachedWriteRequest(CachedPlcConnection parent, PlcWriteRequest innerRequest) {
+ this.parent = parent;
+ this.innerRequest = innerRequest;
+ }
+
+ @Override
+ public CompletableFuture<? extends PlcWriteResponse> execute() {
+ // Only allowed if connection is still active
+ return parent.execute(innerRequest);
+ }
+
+ @Override
+ public int getNumberOfFields() {
+ return innerRequest.getNumberOfFields();
+ }
+
+ @Override
+ public LinkedHashSet<String> getFieldNames() {
+ return innerRequest.getFieldNames();
+ }
+
+ @Override
+ public PlcField getField(String s) {
+ return innerRequest.getField(s);
+ }
+
+ @Override
+ public List<PlcField> getFields() {
+ return innerRequest.getFields();
+ }
+
+ @Override
+ public int getNumberOfValues(String name) {
+ return innerRequest.getNumberOfValues(name);
+ }
+
+ @Override
+ public PlcValue getPlcValue(String name) {
+ return innerRequest.getPlcValue(name);
+ }
+}
diff --git a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedWriteRequestBuilder.java b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedWriteRequestBuilder.java
new file mode 100644
index 0000000..1c99e4f
--- /dev/null
+++ b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedWriteRequestBuilder.java
@@ -0,0 +1,46 @@
+/*
+ * 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.utils.connectionpool2;
+
+import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.model.PlcField;
+
+public class CachedWriteRequestBuilder implements PlcWriteRequest.Builder {
+
+ private final CachedPlcConnection parent;
+ private final PlcWriteRequest.Builder builder;
+
+ public CachedWriteRequestBuilder(CachedPlcConnection parent, PlcWriteRequest.Builder builder) {
+ this.parent = parent;
+ this.builder = builder;
+ }
+
+ @Override
+ public PlcWriteRequest.Builder addItem(String name, String fieldQuery, Object... values) {
+ builder.addItem(name, fieldQuery, values);
+ return this;
+ }
+
+ @Override
+ public PlcWriteRequest build() {
+ return new CachedWriteRequest(parent, builder.build());
+ }
+
+}