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:31 UTC

[plc4x] branch issue/PLC4X-252 created (now c84aa39)

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

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


      at c84aa39  PLC4X-252 Support passing of PlcField in read/write builders.

This branch includes the following new commits:

     new c84aa39  PLC4X-252 Support passing of PlcField in read/write builders.

The 1 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.



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

Posted by ld...@apache.org.
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;