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 2018/09/17 07:07:53 UTC
[incubator-plc4x] 09/29: added possibility to add types only known
at runtime to plc write requests
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
commit 140b01c88de878f1758f1c0e4a2899929a9251fe
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Sep 13 10:58:56 2018 +0200
added possibility to add types only known at runtime to plc write requests
---
.../plc4x/java/api/messages/PlcWriteRequest.java | 2 ++
.../java/base/messages/DefaultPlcWriteRequest.java | 32 ++++++++++++++++++++++
2 files changed, 34 insertions(+)
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
index a53d421..c89c003 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
@@ -49,6 +49,8 @@ public interface PlcWriteRequest extends PlcFieldRequest {
PlcWriteRequest.Builder addItem(String name, String fieldQuery, LocalDate... values);
PlcWriteRequest.Builder addItem(String name, String fieldQuery, LocalDateTime... values);
+
+ <T> PlcWriteRequest.Builder addItem(String name, String fieldQuery, T... values);
}
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java
index 218d61e..113bc5b 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java
@@ -80,10 +80,23 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest {
private final PlcFieldHandler fieldHandler;
private final Map<String, BuilderItem<Object>> fields;
+ private final Map<Class<?>, BiFunction<PlcField, Object[], FieldItem>> handlerMap;
public Builder(PlcFieldHandler fieldHandler) {
this.fieldHandler = fieldHandler;
fields = new TreeMap<>();
+ handlerMap = new HashMap<>();
+ handlerMap.put(Boolean.class, fieldHandler::encodeBoolean);
+ handlerMap.put(Byte.class, fieldHandler::encodeByte);
+ handlerMap.put(Short.class, fieldHandler::encodeShort);
+ handlerMap.put(Integer.class, fieldHandler::encodeInteger);
+ handlerMap.put(Long.class, fieldHandler::encodeLong);
+ handlerMap.put(Float.class, fieldHandler::encodeFloat);
+ handlerMap.put(Double.class, fieldHandler::encodeDouble);
+ handlerMap.put(String.class, fieldHandler::encodeString);
+ handlerMap.put(LocalTime.class, fieldHandler::encodeTime);
+ handlerMap.put(LocalDate.class, fieldHandler::encodeDate);
+ handlerMap.put(LocalDateTime.class, fieldHandler::encodeDateTime);
}
@Override
@@ -142,6 +155,25 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest {
}
@Override
+ public <T> Builder addItem(String name, String fieldQuery, T... values) {
+ Objects.requireNonNull(values);
+ Class<?> checkedClazz = null;
+ for (T value : values) {
+ if (checkedClazz == null) {
+ checkedClazz = value.getClass();
+ }
+ if (value.getClass() != checkedClazz) {
+ throw new IllegalArgumentException("Invalid class found " + value.getClass() + ". should all be " + checkedClazz);
+ }
+ }
+ BiFunction<PlcField, Object[], FieldItem> plcFieldFieldItemBiFunction = handlerMap.get(checkedClazz);
+ if (plcFieldFieldItemBiFunction == null) {
+ throw new IllegalArgumentException("no field handler for " + checkedClazz + " found");
+ }
+ return addItem(name, fieldQuery, values, plcFieldFieldItemBiFunction);
+ }
+
+ @Override
public PlcWriteRequest build() {
LinkedHashMap<String, Pair<PlcField, FieldItem>> parsedFields = new LinkedHashMap<>();
fields.forEach((name, builderItem) -> {