You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2018/09/13 09:43:35 UTC

[incubator-plc4x] 02/05: 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.

sruehl pushed a commit to branch feature/api-redesign-chris-c
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) -> {