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 <sru...@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) -> {

Reply via email to