You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by ld...@apache.org on 2020/10/22 11:45:32 UTC

[plc4x] 01/01: PLC4X-252 Support passing of PlcField in read/write builders.

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

ldywicki pushed a commit to branch issue/PLC4X-252
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit c84aa39d585454330553b1287f8e11fe7b5d7294
Author: Ɓukasz Dywicki <lu...@code-house.org>
AuthorDate: Thu Oct 22 13:42:36 2020 +0200

    PLC4X-252 Support passing of PlcField in read/write builders.
---
 .../plc4x/java/api/messages/PlcReadRequest.java    |  3 +
 .../plc4x/java/api/messages/PlcWriteRequest.java   | 16 ++++
 .../java/spi/messages/DefaultPlcReadRequest.java   | 17 +++-
 .../java/spi/messages/DefaultPlcWriteRequest.java  | 94 ++++++++++++++++++++--
 4 files changed, 121 insertions(+), 9 deletions(-)

diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java
index 0fa6f4e..52faebf 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java
@@ -18,6 +18,8 @@
  */
 package org.apache.plc4x.java.api.messages;
 
+import org.apache.plc4x.java.api.model.PlcField;
+
 import java.util.concurrent.CompletableFuture;
 
 /**
@@ -34,6 +36,7 @@ public interface PlcReadRequest extends PlcFieldRequest {
         PlcReadRequest build();
 
         Builder addItem(String name, String fieldQuery);
+        Builder addItem(String name, PlcField fieldQuery);
 
     }
 
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 556cfcb..df0b833 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
@@ -18,6 +18,8 @@
  */
 package org.apache.plc4x.java.api.messages;
 
+import org.apache.plc4x.java.api.model.PlcField;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.LocalDate;
@@ -38,32 +40,46 @@ public interface PlcWriteRequest extends PlcFieldRequest {
         PlcWriteRequest build();
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, Boolean... values);
+        PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, Boolean... values);
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, Byte... values);
+        PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, Byte... values);
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, Short... values);
+        PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, Short... values);
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, Integer... values);
+        PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, Integer... values);
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, BigInteger... values);
+        PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, BigInteger... values);
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, Long... values);
+        PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, Long... values);
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, Float... values);
+        PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, Float... values);
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, Double... values);
+        PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, Double... values);
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, BigDecimal... values);
+        PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, BigDecimal... values);
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, String... values);
+        PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, String... values);
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, LocalTime... values);
+        PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, LocalTime... values);
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, LocalDate... values);
+        PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, LocalDate... values);
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, LocalDateTime... values);
+        PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, LocalDateTime... values);
 
         <T> PlcWriteRequest.Builder addItem(String name, String fieldQuery, T... values);
+        <T> PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, T... values);
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadRequest.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadRequest.java
index 705b4be..1acbfb3 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadRequest.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcReadRequest.java
@@ -33,6 +33,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 import java.util.concurrent.CompletableFuture;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
@@ -107,7 +108,7 @@ public class DefaultPlcReadRequest implements InternalPlcReadRequest, InternalPl
 
         private final PlcReader reader;
         private final PlcFieldHandler fieldHandler;
-        private final Map<String, String> fields;
+        private final Map<String, Supplier<PlcField>> fields;
 
         public Builder(PlcReader reader, PlcFieldHandler fieldHandler) {
             this.reader = reader;
@@ -120,7 +121,16 @@ public class DefaultPlcReadRequest implements InternalPlcReadRequest, InternalPl
             if (fields.containsKey(name)) {
                 throw new PlcRuntimeException("Duplicate field definition '" + name + "'");
             }
-            fields.put(name, fieldQuery);
+            fields.put(name, () -> fieldHandler.createField(fieldQuery));
+            return this;
+        }
+
+        @Override
+        public PlcReadRequest.Builder addItem(String name, PlcField fieldQuery) {
+            if (fields.containsKey(name)) {
+                throw new PlcRuntimeException("Duplicate field definition '" + name + "'");
+            }
+            fields.put(name, () -> fieldQuery);
             return this;
         }
 
@@ -128,8 +138,7 @@ public class DefaultPlcReadRequest implements InternalPlcReadRequest, InternalPl
         public PlcReadRequest build() {
             LinkedHashMap<String, PlcField> parsedFields = new LinkedHashMap<>();
             fields.forEach((name, fieldQuery) -> {
-                PlcField parsedField = fieldHandler.createField(fieldQuery);
-                parsedFields.put(name, parsedField);
+                parsedFields.put(name, fieldQuery.get());
             });
             return new DefaultPlcReadRequest(reader, parsedFields);
         }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
index 1caf576..fbac6aa 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
@@ -48,6 +48,7 @@ import java.util.Objects;
 import java.util.TreeMap;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.BiFunction;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
@@ -181,14 +182,28 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest, Internal
         }
 
         @Override
+        public Builder addItem(String name, PlcField fieldQuery, Boolean... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeBoolean);
+        }
+
+        @Override
         public Builder addItem(String name, String fieldQuery, Byte... values) {
             return addItem(name, fieldQuery, values, fieldHandler::encodeByte);
         }
 
         @Override
+        public Builder addItem(String name, PlcField fieldQuery, Byte... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeByte);
+        }
+
+        @Override
         public Builder addItem(String name, String fieldQuery, Short... values) {
             return addItem(name, fieldQuery, values, fieldHandler::encodeShort);
         }
+        @Override
+        public Builder addItem(String name, PlcField fieldQuery, Short... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeShort);
+        }
 
         @Override
         public Builder addItem(String name, String fieldQuery, Integer... values) {
@@ -196,52 +211,113 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest, Internal
         }
 
         @Override
+        public Builder addItem(String name, PlcField fieldQuery, Integer... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeInteger);
+        }
+
+        @Override
         public PlcWriteRequest.Builder addItem(String name, String fieldQuery, BigInteger... values) {
             return addItem(name, fieldQuery, values, fieldHandler::encodeBigInteger);
         }
 
         @Override
+        public PlcWriteRequest.Builder addItem(String name, PlcField fieldQuery, BigInteger... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeBigInteger);
+        }
+
+        @Override
         public Builder addItem(String name, String fieldQuery, Long... values) {
             return addItem(name, fieldQuery, values, fieldHandler::encodeLong);
         }
 
         @Override
+        public Builder addItem(String name, PlcField fieldQuery, Long... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeLong);
+        }
+
+        @Override
         public Builder addItem(String name, String fieldQuery, Float... values) {
             return addItem(name, fieldQuery, values, fieldHandler::encodeFloat);
         }
 
         @Override
+        public Builder addItem(String name, PlcField fieldQuery, Float... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeFloat);
+        }
+
+        @Override
         public Builder addItem(String name, String fieldQuery, Double... values) {
             return addItem(name, fieldQuery, values, fieldHandler::encodeDouble);
         }
 
         @Override
+        public Builder addItem(String name, PlcField fieldQuery, Double... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeDouble);
+        }
+
+        @Override
         public Builder addItem(String name, String fieldQuery, BigDecimal... values) {
             return addItem(name, fieldQuery, values, fieldHandler::encodeBigDecimal);
         }
 
         @Override
+        public Builder addItem(String name, PlcField fieldQuery, BigDecimal... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeBigDecimal);
+        }
+
+        @Override
         public Builder addItem(String name, String fieldQuery, String... values) {
             return addItem(name, fieldQuery, values, fieldHandler::encodeString);
         }
 
         @Override
+        public Builder addItem(String name, PlcField fieldQuery, String... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeString);
+        }
+
+        @Override
         public Builder addItem(String name, String fieldQuery, LocalTime... values) {
             return addItem(name, fieldQuery, values, fieldHandler::encodeTime);
         }
 
         @Override
+        public Builder addItem(String name, PlcField fieldQuery, LocalTime... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeTime);
+        }
+
+        @Override
         public Builder addItem(String name, String fieldQuery, LocalDate... values) {
             return addItem(name, fieldQuery, values, fieldHandler::encodeDate);
         }
 
         @Override
+        public Builder addItem(String name, PlcField fieldQuery, LocalDate... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeDate);
+        }
+
+        @Override
         public Builder addItem(String name, String fieldQuery, LocalDateTime... values) {
             return addItem(name, fieldQuery, values, fieldHandler::encodeDateTime);
         }
 
         @Override
+        public Builder addItem(String name, PlcField fieldQuery, LocalDateTime... values) {
+            return addItem(name, fieldQuery, values, fieldHandler::encodeDateTime);
+        }
+
+        @Override
         public <T> Builder addItem(String name, String fieldQuery, T... values) {
+            BiFunction<PlcField, Object[], PlcValue> plcFieldPlcValueBiFunction = validateArray(values);
+            return addItem(name, fieldQuery, values, plcFieldPlcValueBiFunction);
+        }
+
+        @Override
+        public <T> Builder addItem(String name, PlcField fieldQuery, T... values) {
+            BiFunction<PlcField, Object[], PlcValue> plcFieldPlcValueBiFunction = validateArray(values);
+            return addItem(name, fieldQuery, values, plcFieldPlcValueBiFunction);
+        }
+
+        private <T> BiFunction<PlcField, Object[], PlcValue> validateArray(T[] values) {
             Objects.requireNonNull(values);
             Class<?> checkedClazz = null;
             for (T value : values) {
@@ -256,7 +332,7 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest, Internal
             if (plcFieldPlcValueBiFunction == null) {
                 throw new IllegalArgumentException("no field handler for " + checkedClazz + " found");
             }
-            return addItem(name, fieldQuery, values, plcFieldPlcValueBiFunction);
+            return plcFieldPlcValueBiFunction;
         }
 
         @Override
@@ -264,7 +340,7 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest, Internal
             LinkedHashMap<String, FieldValueItem> parsedFields = new LinkedHashMap<>();
             fields.forEach((name, builderItem) -> {
                 // Compile the query string.
-                PlcField parsedField = fieldHandler.createField(builderItem.fieldQuery);
+                PlcField parsedField = builderItem.fieldQuery.get();
                 // Encode the payload.
                 // TODO: Depending on the field type, handle the PlcValue creation differently.
                 PlcValue value = builderItem.encoder.apply(parsedField, builderItem.values);
@@ -277,16 +353,24 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest, Internal
             if (fields.containsKey(name)) {
                 throw new PlcRuntimeException("Duplicate field definition '" + name + "'");
             }
-            fields.put(name, new BuilderItem<>(fieldQuery, values, encoder));
+            fields.put(name, new BuilderItem<>(() -> fieldHandler.createField(fieldQuery), values, encoder));
+            return this;
+        }
+
+        private Builder addItem(String name, PlcField field, Object[] values, BiFunction<PlcField, Object[], PlcValue> encoder) {
+            if (fields.containsKey(name)) {
+                throw new PlcRuntimeException("Duplicate field definition '" + name + "'");
+            }
+            fields.put(name, new BuilderItem<>(() -> field, values, encoder));
             return this;
         }
 
         private static class BuilderItem<T> {
-            private final String fieldQuery;
+            private final Supplier<PlcField> fieldQuery;
             private final T[] values;
             private final BiFunction<PlcField, T[], PlcValue> encoder;
 
-            private BuilderItem(String fieldQuery, T[] values, BiFunction<PlcField, T[], PlcValue> encoder) {
+            private BuilderItem(Supplier<PlcField> fieldQuery, T[] values, BiFunction<PlcField, T[], PlcValue> encoder) {
                 this.fieldQuery = fieldQuery;
                 this.values = values;
                 this.encoder = encoder;