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) -> {