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;