diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcTagRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcTagRequest.java index 3b98fdd01aa..b6a9f08e0e2 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcTagRequest.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcTagRequest.java @@ -19,6 +19,7 @@ package org.apache.plc4x.java.api.messages; import org.apache.plc4x.java.api.model.PlcTag; +import org.apache.plc4x.java.api.types.PlcResponseCode; import java.util.LinkedHashSet; import java.util.List; @@ -33,7 +34,9 @@ public interface PlcTagRequest extends PlcRequest { LinkedHashSet getTagNames(); - PlcTag getTag(String name); + PlcResponseCode getTagResponseCode(String tagName); + + PlcTag getTag(String tagName); List getTags(); diff --git a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/AbEthDriver.java b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/AbEthDriver.java index c088dc74102..22e673b82f6 100644 --- a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/AbEthDriver.java +++ b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/AbEthDriver.java @@ -28,7 +28,6 @@ import org.apache.plc4x.java.spi.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.spi.configuration.PlcTransportConfiguration; import org.apache.plc4x.java.api.model.PlcTag; -import org.apache.plc4x.java.spi.values.PlcValueHandler; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -82,11 +81,6 @@ protected AbEthTagHandler getTagHandler() { return new AbEthTagHandler(); } - @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); - } - /** * This protocol doesn't have a disconnect procedure, so there is no need to wait for a login to finish. * @return false diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java index 5ea45433677..f7b4a24c310 100644 --- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java +++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java @@ -29,7 +29,6 @@ import org.apache.plc4x.java.spi.configuration.PlcTransportConfiguration; import org.apache.plc4x.java.api.messages.PlcDiscoveryRequest; import org.apache.plc4x.java.spi.messages.DefaultPlcDiscoveryRequest; -import org.apache.plc4x.java.spi.values.PlcValueHandler; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -121,11 +120,6 @@ protected AdsTagHandler getTagHandler() { return new AdsTagHandler(); } - @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); - } - /** * This protocol doesn't have a disconnect procedure, so there is no need to wait for a login to finish. * @return false diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java index bc4e3089286..7ac46eb3d2e 100644 --- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java +++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java @@ -672,7 +672,7 @@ protected CompletableFuture singleRead(PlcReadRequest readReque if(directAdsTag == null) { return CompletableFuture.completedFuture(new DefaultPlcReadResponse(readRequest, Collections.singletonMap( readRequest.getTagNames().stream().findFirst().orElseThrow(), - new ResponseItem<>(PlcResponseCode.INVALID_ADDRESS, null)))); + new ResponseItem<>(PlcResponseCode.NOT_FOUND, null)))); } CompletableFuture future = new CompletableFuture<>(); diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/tag/SymbolicAdsTag.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/tag/SymbolicAdsTag.java index 8aa5c41cdee..a708ee97a94 100644 --- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/tag/SymbolicAdsTag.java +++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/tag/SymbolicAdsTag.java @@ -37,8 +37,7 @@ */ public class SymbolicAdsTag implements AdsTag { - // TODO: Model the end of this address to allow usage of multi-dimensional arrays. - private static final Pattern SYMBOLIC_ADDRESS_PATTERN = Pattern.compile("^(?.+)"); + private static final Pattern SYMBOLIC_ADDRESS_PATTERN = Pattern.compile("^([\\w_]+)(\"[\"\\d*]\")*(\\.(\\w+)(\"[\"\\d*]\")*)*"); private final String symbolicAddress; @@ -57,9 +56,7 @@ public static SymbolicAdsTag of(String address) { if (!matcher.matches()) { throw new PlcInvalidTagException(address, SYMBOLIC_ADDRESS_PATTERN, "{address}"); } - String symbolicAddress = matcher.group("symbolicAddress"); - - return new SymbolicAdsTag(symbolicAddress, null, Collections.emptyList()); + return new SymbolicAdsTag(address, null, Collections.emptyList()); } public static boolean matches(String address) { @@ -120,4 +117,5 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { writeBuffer.popContext(getClass().getSimpleName()); } + } diff --git a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/java/ads/tag/SymbolicAdsTagTest.java b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/java/ads/tag/SymbolicAdsTagTest.java new file mode 100644 index 00000000000..8ec9bc0038c --- /dev/null +++ b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/java/ads/tag/SymbolicAdsTagTest.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.ads.tag; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class SymbolicAdsTagTest { + + @Test + void of() { + + + } + +} \ No newline at end of file diff --git a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ManualAdsDriverTest.java b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ManualAdsDriverTest.java index b04acbbdf5e..07dcfd8b8f0 100644 --- a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ManualAdsDriverTest.java +++ b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ManualAdsDriverTest.java @@ -18,6 +18,7 @@ */ package org.apache.plc4x.protocol.ads; +import org.apache.plc4x.java.api.types.PlcResponseCode; import org.apache.plc4x.java.api.value.PlcValue; import org.apache.plc4x.java.spi.values.*; import org.apache.plc4x.test.manual.ManualTest; @@ -131,6 +132,10 @@ public static void main(String[] args) throws Exception { children.put("hurz_TIME_OF_DAY", new PlcTIME_OF_DAY(LocalTime.parse("15:36:30.123"))); children.put("hurz_DATE_AND_TIME", new PlcDATE_AND_TIME(LocalDateTime.parse("1996-05-06T15:36:30"))); test.addTestCase("MAIN.hurz_Struct", new PlcStruct(children)); + test.addTestCase("MAIN.thisVariableDoesntExist", PlcResponseCode.NOT_FOUND); + // TODO: Add some complex array path + test.addTestCase("...3323(/987", PlcResponseCode.INVALID_ADDRESS); + test.addTestCase("MAIN.hurz_UDT_array[4].hurz_INT_array[2].someProperty", PlcResponseCode.NOT_FOUND); test.run(); } diff --git a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/BacNetIpDriver.java b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/BacNetIpDriver.java index 28d1e9a2f12..12acec0c5a3 100644 --- a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/BacNetIpDriver.java +++ b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/BacNetIpDriver.java @@ -31,7 +31,6 @@ import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; -import org.apache.plc4x.java.spi.values.PlcValueHandler; import java.util.Arrays; import java.util.List; @@ -99,11 +98,6 @@ protected BacNetIpTagHandler getTagHandler() { return new BacNetIpTagHandler(); } - @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); - } - @Override protected ProtocolStackConfigurer getStackConfigurer() { return SingleProtocolStackConfigurer.builder(BVLC.class, BVLC::staticParse) diff --git a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/CBusDriver.java b/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/CBusDriver.java index 300ffa9450f..c6fed8e1329 100644 --- a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/CBusDriver.java +++ b/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/CBusDriver.java @@ -19,12 +19,9 @@ package org.apache.plc4x.java.cbus; import io.netty.buffer.ByteBuf; -import org.apache.plc4x.java.cbus.readwrite.CBusMessage; import org.apache.plc4x.java.cbus.readwrite.CBusOptions; -import org.apache.plc4x.java.cbus.readwrite.RequestContext; import org.apache.plc4x.java.spi.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.spi.configuration.PlcTransportConfiguration; -import org.apache.plc4x.java.api.value.PlcValueHandler; import org.apache.plc4x.java.cbus.configuration.CBusConfiguration; import org.apache.plc4x.java.cbus.configuration.CBusTcpTransportConfiguration; import org.apache.plc4x.java.cbus.context.CBusDriverContext; @@ -88,11 +85,6 @@ protected PlcTagHandler getTagHandler() { return null; } - @Override - protected PlcValueHandler getValueHandler() { - return null; - } - @Override protected ProtocolStackConfigurer getStackConfigurer() { return SingleProtocolStackConfigurer.builder(CBusCommand.class, io -> diff --git a/plc4j/drivers/can/src/main/java/org/apache/plc4x/java/can/generic/GenericCANDriver.java b/plc4j/drivers/can/src/main/java/org/apache/plc4x/java/can/generic/GenericCANDriver.java index 4d31b799a08..5efc8735452 100644 --- a/plc4j/drivers/can/src/main/java/org/apache/plc4x/java/can/generic/GenericCANDriver.java +++ b/plc4j/drivers/can/src/main/java/org/apache/plc4x/java/can/generic/GenericCANDriver.java @@ -33,7 +33,6 @@ import org.apache.plc4x.java.spi.generation.Message; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; import org.apache.plc4x.java.spi.transport.Transport; -import org.apache.plc4x.java.spi.values.PlcValueHandler; import org.apache.plc4x.java.transport.can.CANTransport; import java.util.Optional; @@ -85,11 +84,6 @@ protected GenericCANTagHandler getTagHandler() { return new GenericCANTagHandler(); } - @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); - } - /** * This protocol doesn't have a disconnect procedure, so there is no need to wait for a login to finish. * @return false diff --git a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/CANOpenPlcDriver.java b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/CANOpenPlcDriver.java index 39dce5bd6fa..ccb6be076b5 100644 --- a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/CANOpenPlcDriver.java +++ b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/CANOpenPlcDriver.java @@ -87,7 +87,7 @@ protected CANOpenTagHandler getTagHandler() { } @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { + protected PlcValueHandler getValueHandler() { return new PlcValueHandler() { @Override public PlcValue newPlcValue(PlcTag tag, Object[] values) { diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java index a6d731526bb..abf99de0192 100644 --- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java +++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java @@ -38,8 +38,6 @@ import org.apache.plc4x.java.spi.messages.DefaultPlcDiscoveryRequest; import org.apache.plc4x.java.spi.transport.Transport; -import org.apache.plc4x.java.api.value.PlcValueHandler; - import java.util.Collections; import java.util.List; import java.util.Optional; @@ -97,11 +95,6 @@ protected PlcTagHandler getTagHandler() { return new EipTagHandler(); } - @Override - protected PlcValueHandler getValueHandler() { - return new org.apache.plc4x.java.spi.values.PlcValueHandler(); - } - @Override public PlcDiscoveryRequest.Builder discoveryRequestBuilder() { return new DefaultPlcDiscoveryRequest.Builder(new EipPlcDiscoverer()); diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/LogixDriver.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/LogixDriver.java index b8bb251d2a9..4e0d4c2b94d 100644 --- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/LogixDriver.java +++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/LogixDriver.java @@ -21,7 +21,6 @@ import io.netty.buffer.ByteBuf; import org.apache.plc4x.java.spi.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.spi.configuration.PlcTransportConfiguration; -import org.apache.plc4x.java.api.value.PlcValueHandler; import org.apache.plc4x.java.eip.base.tag.EipTag; import org.apache.plc4x.java.eip.base.protocol.EipProtocolLogic; import org.apache.plc4x.java.eip.logix.configuration.LogixConfiguration; @@ -77,11 +76,6 @@ protected PlcTagHandler getTagHandler() { return new EipTagHandler(); } - @Override - protected PlcValueHandler getValueHandler() { - return new org.apache.plc4x.java.spi.values.PlcValueHandler(); - } - @Override protected boolean awaitDisconnectComplete() { return true; diff --git a/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/FirmataDriver.java b/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/FirmataDriver.java index de494150400..631a532fa37 100644 --- a/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/FirmataDriver.java +++ b/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/FirmataDriver.java @@ -26,7 +26,6 @@ import org.apache.plc4x.java.firmata.readwrite.tag.FirmataTag; import org.apache.plc4x.java.firmata.readwrite.tag.FirmataTagHandler; import org.apache.plc4x.java.firmata.readwrite.protocol.FirmataProtocolLogic; -import org.apache.plc4x.java.spi.values.PlcValueHandler; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.PlcTagHandler; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; @@ -80,11 +79,6 @@ protected PlcTagHandler getTagHandler() { return new FirmataTagHandler(); } - @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); - } - /** * This protocol doesn't have a disconnect procedure, so there is no need to wait for a login to finish. * @return false diff --git a/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/Iec60870514PlcDriver.java b/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/Iec60870514PlcDriver.java index 559dde03160..85ad63e5a59 100644 --- a/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/Iec60870514PlcDriver.java +++ b/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/Iec60870514PlcDriver.java @@ -28,7 +28,6 @@ import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; -import org.apache.plc4x.java.spi.values.PlcValueHandler; import java.util.Collections; import java.util.List; @@ -88,11 +87,6 @@ protected Iec608705104TagHandler getTagHandler() { return new Iec608705104TagHandler(); } - @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); - } - /** * This protocol doesn't have a disconnect procedure, so there is no need to wait for a login to finish. * @return false diff --git a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/KnxNetIpDriver.java b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/KnxNetIpDriver.java index fda82f4442d..99c3378dac9 100644 --- a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/KnxNetIpDriver.java +++ b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/KnxNetIpDriver.java @@ -33,7 +33,6 @@ import org.apache.plc4x.java.knxnetip.tag.KnxNetIpTagHandler; import org.apache.plc4x.java.knxnetip.protocol.KnxNetIpProtocolLogic; import org.apache.plc4x.java.spi.messages.DefaultPlcDiscoveryRequest; -import org.apache.plc4x.java.spi.values.PlcValueHandler; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.PlcTagHandler; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; @@ -128,11 +127,6 @@ protected PlcTagHandler getTagHandler() { return new KnxNetIpTagHandler(); } - @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); - } - @Override protected boolean awaitDisconnectComplete() { return true; } diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/ModbusAsciiDriver.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/ModbusAsciiDriver.java index c698b342ff8..e79dc8cc9c8 100644 --- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/ModbusAsciiDriver.java +++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/ModbusAsciiDriver.java @@ -22,8 +22,6 @@ import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Hex; import org.apache.plc4x.java.modbus.ascii.context.ModbusAsciiContext; -import org.apache.plc4x.java.modbus.readwrite.ModbusADU; -import org.apache.plc4x.java.modbus.readwrite.ModbusRtuADU; import org.apache.plc4x.java.spi.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.spi.configuration.PlcTransportConfiguration; import org.apache.plc4x.java.modbus.ascii.config.ModbusAsciiConfiguration; @@ -39,7 +37,6 @@ import org.apache.plc4x.java.spi.generation.*; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; import org.apache.plc4x.java.spi.optimizer.SingleTagOptimizer; -import org.apache.plc4x.java.spi.values.PlcValueHandler; import java.nio.charset.StandardCharsets; import java.util.Arrays; @@ -127,11 +124,6 @@ protected ModbusTagHandler getTagHandler() { return new ModbusTagHandler(); } - @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); - } - @Override protected ProtocolStackConfigurer getStackConfigurer() { return SingleProtocolStackConfigurer.builder(ModbusAsciiADU.class, new ModbusAsciiInput(), new ModbusAsciiOutput()) diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/base/optimizer/ModbusOptimizer.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/base/optimizer/ModbusOptimizer.java index d88998472b1..0c9e98f605d 100644 --- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/base/optimizer/ModbusOptimizer.java +++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/base/optimizer/ModbusOptimizer.java @@ -45,7 +45,9 @@ import org.apache.plc4x.java.spi.messages.DefaultPlcReadRequest; import org.apache.plc4x.java.spi.messages.DefaultPlcReadResponse; import org.apache.plc4x.java.spi.messages.PlcReader; +import org.apache.plc4x.java.spi.messages.utils.DefaultTagItem; import org.apache.plc4x.java.spi.messages.utils.ResponseItem; +import org.apache.plc4x.java.spi.messages.utils.TagItem; import org.apache.plc4x.java.spi.optimizer.SingleTagOptimizer; import org.apache.plc4x.java.spi.values.PlcBOOL; import org.slf4j.Logger; @@ -302,8 +304,8 @@ protected List processCoilRequests(TreeSet tags, PlcR // finish this one and start a new one. if (tag.getAddress() + (sizeInCoils * tag.getNumberOfElements()) > maxCoilCurRequest) { // Finish the current sub-request - LinkedHashMap subTags = new LinkedHashMap<>(); - subTags.put("coils" + subRequests.size(), new ModbusTagCoil(firstCoil, lastCoil - firstCoil, ModbusDataType.BYTE, Collections.emptyMap())); + LinkedHashMap subTags = new LinkedHashMap<>(); + subTags.put("coils" + subRequests.size(), new DefaultTagItem(new ModbusTagCoil(firstCoil, lastCoil - firstCoil, ModbusDataType.BYTE, Collections.emptyMap()))); subRequests.add(new DefaultPlcReadRequest(reader, subTags)); // Re-initialize the structures for the next request. @@ -318,8 +320,8 @@ protected List processCoilRequests(TreeSet tags, PlcR } // Finish the last sub-request - LinkedHashMap subTags = new LinkedHashMap<>(); - subTags.put("coils" + subRequests.size(), new ModbusTagCoil(firstCoil, lastCoil - firstCoil, ModbusDataType.BYTE, Collections.emptyMap())); + LinkedHashMap subTags = new LinkedHashMap<>(); + subTags.put("coils" + subRequests.size(), new DefaultTagItem(new ModbusTagCoil(firstCoil, lastCoil - firstCoil, ModbusDataType.BYTE, Collections.emptyMap()))); subRequests.add(new DefaultPlcReadRequest(reader, subTags)); return subRequests; } @@ -343,8 +345,8 @@ protected List processRegisterRequests(TreeSet tags, // finish this one and start a new one. if (tag.getAddress() + (sizeInRegisters * tag.getNumberOfElements()) > maxRegisterCurRequest) { // Finish the current sub-request - LinkedHashMap subTags = new LinkedHashMap<>(); - subTags.put("registers" + subRequests.size(), tagFactory.createTag(firstRegister, lastRegister - firstRegister, ModbusDataType.WORD)); + LinkedHashMap subTags = new LinkedHashMap<>(); + subTags.put("registers" + subRequests.size(), new DefaultTagItem(tagFactory.createTag(firstRegister, lastRegister - firstRegister, ModbusDataType.WORD))); subRequests.add(new DefaultPlcReadRequest(reader, subTags)); // Re-initialize the structures for the next request. @@ -359,8 +361,8 @@ protected List processRegisterRequests(TreeSet tags, } // Finish the last sub-request - LinkedHashMap subTags = new LinkedHashMap<>(); - subTags.put("registers" + subRequests.size(), tagFactory.createTag(firstRegister, lastRegister - firstRegister, ModbusDataType.WORD)); + LinkedHashMap subTags = new LinkedHashMap<>(); + subTags.put("registers" + subRequests.size(), new DefaultTagItem(tagFactory.createTag(firstRegister, lastRegister - firstRegister, ModbusDataType.WORD))); subRequests.add(new DefaultPlcReadRequest(reader, subTags)); return subRequests; } diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/ModbusRtuDriver.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/ModbusRtuDriver.java index 176f6758ae8..392968317e7 100644 --- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/ModbusRtuDriver.java +++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/ModbusRtuDriver.java @@ -33,12 +33,10 @@ import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; -import org.apache.plc4x.java.spi.generation.MessageInput; import org.apache.plc4x.java.spi.generation.ParseException; import org.apache.plc4x.java.spi.generation.ReadBufferByteBased; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; import org.apache.plc4x.java.spi.optimizer.SingleTagOptimizer; -import org.apache.plc4x.java.spi.values.PlcValueHandler; import java.util.Arrays; import java.util.List; @@ -124,11 +122,6 @@ protected ModbusTagHandler getTagHandler() { return new ModbusTagHandler(); } - @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); - } - @Override protected ProtocolStackConfigurer getStackConfigurer() { return SingleProtocolStackConfigurer.builder(ModbusRtuADU.class, io -> (ModbusRtuADU) ModbusRtuADU.staticParse(io, DriverType.MODBUS_RTU, true)) diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/ModbusTcpDriver.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/ModbusTcpDriver.java index 09fff6f3156..d49c0d452fd 100644 --- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/ModbusTcpDriver.java +++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/ModbusTcpDriver.java @@ -33,8 +33,6 @@ import org.apache.plc4x.java.modbus.readwrite.ModbusTcpADU; import org.apache.plc4x.java.modbus.tcp.protocol.ModbusTcpProtocolLogic; import org.apache.plc4x.java.spi.messages.DefaultPlcDiscoveryRequest; -import org.apache.plc4x.java.spi.optimizer.SingleTagOptimizer; -import org.apache.plc4x.java.spi.values.PlcValueHandler; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -129,11 +127,6 @@ protected ModbusTagHandler getTagHandler() { return new ModbusTagHandler(); } - @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); - } - @Override protected ProtocolStackConfigurer getStackConfigurer() { return SingleProtocolStackConfigurer.builder(ModbusTcpADU.class, (io) -> (ModbusTcpADU) ModbusTcpADU.staticParse(io, DriverType.MODBUS_TCP, true)) diff --git a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/base/optimizer/ModbusOptimizerTest.java b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/base/optimizer/ModbusOptimizerTest.java index 5c8eadf3912..328e0cd243a 100644 --- a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/base/optimizer/ModbusOptimizerTest.java +++ b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/base/optimizer/ModbusOptimizerTest.java @@ -28,6 +28,8 @@ import org.apache.plc4x.java.modbus.types.ModbusByteOrder; import org.apache.plc4x.java.spi.messages.DefaultPlcReadRequest; import org.apache.plc4x.java.spi.messages.PlcReader; +import org.apache.plc4x.java.spi.messages.utils.DefaultTagItem; +import org.apache.plc4x.java.spi.messages.utils.TagItem; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -225,10 +227,10 @@ void processReadRequest(PlcTag[] tags, CheckResult check) { Mockito.when(driverContext.getByteOrder()).thenReturn(ModbusByteOrder.BIG_ENDIAN); Mockito.when(driverContext.getMaxCoilsPerRequest()).thenReturn(2000); Mockito.when(driverContext.getMaxRegistersPerRequest()).thenReturn(125); - LinkedHashMap tagMap = new LinkedHashMap<>(); + LinkedHashMap tagMap = new LinkedHashMap<>(); int i = 0; for (PlcTag tag : tags) { - tagMap.put("tag" + i++, tag); + tagMap.put("tag" + i++, new DefaultTagItem(tag)); } ModbusOptimizer sut = new ModbusOptimizer(); List plcReadRequests = sut.processReadRequest(new DefaultPlcReadRequest(reader, tagMap), driverContext); diff --git a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java index 6d083cfb693..2a8d8f483dc 100644 --- a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java +++ b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java @@ -30,7 +30,6 @@ import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; -import org.apache.plc4x.java.spi.values.PlcValueHandler; import java.util.Collections; import java.util.List; @@ -89,11 +88,6 @@ protected OpcuaPlcTagHandler getTagHandler() { return new OpcuaPlcTagHandler(); } - @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); - } - @Override protected boolean fireDiscoverEvent() { return true; diff --git a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/optimizer/OpcuaOptimizer.java b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/optimizer/OpcuaOptimizer.java index 5daec530e7b..54a343bac1e 100644 --- a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/optimizer/OpcuaOptimizer.java +++ b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/optimizer/OpcuaOptimizer.java @@ -24,6 +24,8 @@ import org.apache.plc4x.java.opcua.tag.OpcuaTag; import org.apache.plc4x.java.spi.context.DriverContext; import org.apache.plc4x.java.spi.messages.DefaultPlcReadRequest; +import org.apache.plc4x.java.spi.messages.utils.DefaultTagItem; +import org.apache.plc4x.java.spi.messages.utils.TagItem; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; import java.util.LinkedHashMap; @@ -37,11 +39,11 @@ protected List processReadRequest(PlcReadRequest readRequest, Dr List processedRequests = new LinkedList<>(); // List of all items in the current request. - LinkedHashMap curTags = new LinkedHashMap<>(); + LinkedHashMap curTags = new LinkedHashMap<>(); for (String tagName : readRequest.getTagNames()) { OpcuaTag tag = (OpcuaTag) readRequest.getTag(tagName); - curTags.put(tagName, tag); + curTags.put(tagName, new DefaultTagItem(tag)); } // Create a new PlcReadRequest from the remaining tag items. diff --git a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java index 6bdf9d68434..dacd6674406 100644 --- a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java +++ b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java @@ -32,7 +32,6 @@ import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; import org.apache.plc4x.java.spi.optimizer.SingleTagOptimizer; -import org.apache.plc4x.java.spi.values.PlcValueHandler; import java.util.Collections; import java.util.List; @@ -105,11 +104,6 @@ protected OpenProtocolTagHandler getTagHandler() { return new OpenProtocolTagHandler(); } - @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); - } - @Override protected ProtocolStackConfigurer getStackConfigurer() { return SingleProtocolStackConfigurer.builder(OpenProtocolMessage.class, io -> OpenProtocolMessage.staticParse(io, 1)) diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/Plc4xDriver.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/Plc4xDriver.java index 93ea3b3f71c..ec7a61bcc96 100644 --- a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/Plc4xDriver.java +++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/Plc4xDriver.java @@ -30,7 +30,6 @@ import org.apache.plc4x.java.spi.connection.PlcTagHandler; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; -import org.apache.plc4x.java.spi.values.PlcValueHandler; import java.util.Collections; import java.util.List; @@ -79,11 +78,6 @@ protected PlcTagHandler getTagHandler() { return new Plc4XTagHandler(); } - @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); - } - /** * This protocol doesn't have a disconnect procedure, so there is no need to wait for a login to finish. * @return false diff --git a/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java b/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java index adbd18f44c2..ef9743fd393 100644 --- a/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java +++ b/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java @@ -46,6 +46,7 @@ import org.apache.plc4x.java.spi.messages.DefaultPlcDiscoveryRequest; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; import org.apache.plc4x.java.spi.optimizer.SingleTagOptimizer; +import org.apache.plc4x.java.spi.values.PlcValueHandler; import org.pcap4j.core.*; import org.pcap4j.packet.EthernetPacket; import org.pcap4j.packet.IllegalRawDataException; @@ -172,8 +173,8 @@ protected ProfinetTagHandler getTagHandler() { } @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new org.apache.plc4x.java.spi.values.PlcValueHandler(); + protected PlcValueHandler getValueHandler() { + return new PlcValueHandler(); } @Override diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java index 60de10c6d04..c433b22d08d 100644 --- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java @@ -37,6 +37,7 @@ import org.apache.plc4x.java.spi.optimizer.SingleTagOptimizer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; +import org.apache.plc4x.java.spi.values.PlcValueHandler; import org.pcap4j.core.*; import java.util.Collections; @@ -141,8 +142,8 @@ protected ProfinetTagHandler getTagHandler() { } @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new org.apache.plc4x.java.spi.values.PlcValueHandler(); + protected PlcValueHandler getValueHandler() { + return new PlcValueHandler(); } @Override diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java index 047aabc6477..2ed596a3640 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java @@ -105,7 +105,7 @@ protected S7PlcTagHandler getTagHandler() { } @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { + protected PlcValueHandler getValueHandler() { return new PlcValueHandler(); } diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java index 5695bfec433..d932a8e41ee 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java @@ -22,7 +22,6 @@ import org.apache.plc4x.java.api.messages.PlcReadRequest; import org.apache.plc4x.java.api.messages.PlcReadResponse; import org.apache.plc4x.java.api.messages.PlcWriteRequest; -import org.apache.plc4x.java.api.model.PlcTag; import org.apache.plc4x.java.api.types.PlcResponseCode; import org.apache.plc4x.java.api.types.PlcValueType; import org.apache.plc4x.java.api.value.PlcValue; @@ -35,7 +34,10 @@ import org.apache.plc4x.java.spi.messages.DefaultPlcReadRequest; import org.apache.plc4x.java.spi.messages.DefaultPlcReadResponse; import org.apache.plc4x.java.spi.messages.DefaultPlcWriteRequest; +import org.apache.plc4x.java.spi.messages.utils.DefaultTagItem; +import org.apache.plc4x.java.spi.messages.utils.DefaultTagValueItem; import org.apache.plc4x.java.spi.messages.utils.ResponseItem; +import org.apache.plc4x.java.spi.messages.utils.TagItem; import org.apache.plc4x.java.spi.messages.utils.TagValueItem; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; import org.apache.plc4x.java.spi.utils.Serializable; @@ -78,14 +80,15 @@ protected List processReadRequest(PlcReadRequest readRequest, Dr // List of all items in the current request. - LinkedHashMap curTags = new LinkedHashMap<>(); + LinkedHashMap curTagItems = new LinkedHashMap<>(); for (String tagName : readRequest.getTagNames()) { //TODO: Individual processing of these types of tags. like S7StringTag if ((readRequest.getTag(tagName) instanceof S7SzlTag) || (readRequest.getTag(tagName) instanceof S7ClkTag)) { - curTags.put(tagName, readRequest.getTag(tagName)); + // We are only expecting valid tagValueItems being passed in. + curTagItems.put(tagName, new DefaultTagItem(readRequest.getTag(tagName))); continue; } @@ -119,7 +122,8 @@ protected List processReadRequest(PlcReadRequest readRequest, Dr curResponseSize += readResponseItemSize; // Add the tag to the current request - curTags.put(tagName, tag); + // We are only expecting valid tagValueItems being passed in. + curTagItems.put(tagName, new DefaultTagItem(tag)); } // If the current item would exceed the PDU size in the response, even if this is a new request, split // up the array to fill up the last request and create so many sub-requests that read all in total. @@ -132,8 +136,8 @@ else if (EMPTY_READ_RESPONSE_SIZE + readResponseItemSize > s7DriverContext.getPd for(int curRequest = 0; curRequest < numRequests; curRequest++) { int numCurRequestItems = Math.min(numItemsPerRequest, itemsLeft); S7Tag tagFragment = new S7Tag(tag.getDataType(), tag.getMemoryArea(), tag.getBlockNumber(), curByteOffset, (byte) 0, numCurRequestItems); - LinkedHashMap tagFragments = new LinkedHashMap<>(); - tagFragments.put(tagName, tagFragment); + LinkedHashMap tagFragments = new LinkedHashMap<>(); + tagFragments.put(tagName, new DefaultTagItem(tagFragment)); processedRequests.add(new DefaultPlcReadRequest(((DefaultPlcReadRequest) readRequest).getReader(), tagFragments)); curByteOffset += numItemsPerRequest * tag.getDataType().getSizeInBytes(); itemsLeft -= numCurRequestItems; @@ -143,12 +147,12 @@ else if (EMPTY_READ_RESPONSE_SIZE + readResponseItemSize > s7DriverContext.getPd else { // Create a new PlcReadRequest containing the current tag item. processedRequests.add(new DefaultPlcReadRequest( - ((DefaultPlcReadRequest) readRequest).getReader(), curTags)); + ((DefaultPlcReadRequest) readRequest).getReader(), curTagItems)); // Reset the size and item lists. curRequestSize = EMPTY_READ_REQUEST_SIZE + readRequestItemSize; curResponseSize = EMPTY_READ_RESPONSE_SIZE + readResponseItemSize; - curTags = new LinkedHashMap<>(); + curTagItems = new LinkedHashMap<>(); // Splitting of huge tags not yet implemented, throw an exception instead. if (((curRequestSize + readRequestItemSize) > s7DriverContext.getPduSize()) && @@ -157,14 +161,15 @@ else if (EMPTY_READ_RESPONSE_SIZE + readResponseItemSize > s7DriverContext.getPd } // Add the tag to the new current request - curTags.put(tagName, tag); + // We are only expecting valid tagValueItems being passed in. + curTagItems.put(tagName, new DefaultTagItem(tag)); } } // Create a new PlcReadRequest from the remaining tag items. - if (!curTags.isEmpty()) { + if (!curTagItems.isEmpty()) { processedRequests.add(new DefaultPlcReadRequest( - ((DefaultPlcReadRequest) readRequest).getReader(), curTags)); + ((DefaultPlcReadRequest) readRequest).getReader(), curTagItems)); } return processedRequests; @@ -326,7 +331,8 @@ else if (tag instanceof S7StringVarLengthTag) { throw new PlcRuntimeException("Tag size exceeds maximum payload for one item."); } } - curTags.put(tagName, new TagValueItem(tag, value)); + // We are only expecting valid tagValueItems being passed in. + curTags.put(tagName, new DefaultTagValueItem(tag, value)); } // Create a new PlcWriteRequest from the remaining tag items. diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HGeneratedDriverBase.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HGeneratedDriverBase.java index e7b54148c11..11be0f145c7 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HGeneratedDriverBase.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HGeneratedDriverBase.java @@ -23,7 +23,6 @@ import org.apache.plc4x.java.spi.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.spi.configuration.PlcTransportConfiguration; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; -import org.apache.plc4x.java.api.value.PlcValueHandler; import org.apache.plc4x.java.s7.readwrite.TPKTPacket; import org.apache.plc4x.java.s7.readwrite.configuration.S7Configuration; import org.apache.plc4x.java.s7.readwrite.configuration.S7TcpTransportConfiguration; @@ -182,10 +181,6 @@ protected PlcTagHandler getTagHandler() { throw new UnsupportedOperationException("getTagHandler, Not supported yet."); } - @Override - protected PlcValueHandler getValueHandler() { - throw new UnsupportedOperationException("getValueHandler, Not supported yet."); - } @Override protected ProtocolStackConfigurer getStackConfigurer() { throw new UnsupportedOperationException("getStackConfigurer, Not supported yet."); diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HPlcConnection.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HPlcConnection.java index 3bc1392b5ec..00950d4871b 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HPlcConnection.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HPlcConnection.java @@ -34,7 +34,6 @@ import org.apache.plc4x.java.api.messages.PlcPingResponse; import org.apache.plc4x.java.api.messages.PlcReadRequest; import org.apache.plc4x.java.api.messages.PlcReadResponse; -import org.apache.plc4x.java.api.value.PlcValueHandler; import org.apache.plc4x.java.s7.readwrite.TPKTPacket; import org.apache.plc4x.java.spi.configuration.ConfigurationFactory; import org.apache.plc4x.java.spi.connection.ChannelFactory; @@ -45,6 +44,7 @@ import org.apache.plc4x.java.spi.events.ConnectedEvent; import org.apache.plc4x.java.spi.events.DisconnectEvent; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; +import org.apache.plc4x.java.spi.values.PlcValueHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java index 001dc77fca3..dad30bc04dd 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java @@ -44,7 +44,10 @@ import org.apache.plc4x.java.spi.context.DriverContext; import org.apache.plc4x.java.spi.generation.*; import org.apache.plc4x.java.spi.messages.*; +import org.apache.plc4x.java.spi.messages.utils.DefaultTagItem; +import org.apache.plc4x.java.spi.messages.utils.DefaultTagValueItem; import org.apache.plc4x.java.spi.messages.utils.ResponseItem; +import org.apache.plc4x.java.spi.messages.utils.TagItem; import org.apache.plc4x.java.spi.messages.utils.TagValueItem; import org.apache.plc4x.java.spi.model.DefaultPlcSubscriptionTag; import org.apache.plc4x.java.spi.transaction.RequestTransactionManager; @@ -70,8 +73,6 @@ import org.apache.plc4x.java.s7.events.S7UserEvent; import org.apache.plc4x.java.s7.readwrite.utils.S7PlcSubscriptionRequest; -import javax.xml.crypto.Data; - /** * The S7 Protocol states that there can not be more then {min(maxAmqCaller, maxAmqCallee} "ongoing" requests. * So we need to limit those. @@ -1292,19 +1293,21 @@ private CompletableFuture performVarLengthStringReadRequest(DefaultPl // Replace the var-length string fields with requests to read the // length information instead of the string content. int numVarLengthStrings = 0; - LinkedHashMap updatedRequestItems = new LinkedHashMap<>(request.getNumberOfTags()); + LinkedHashMap updatedRequestItems = new LinkedHashMap<>(request.getNumberOfTags()); for (String tagName : request.getTagNames()) { - S7Tag s7tag = (S7Tag) request.getTag(tagName); - if(s7tag instanceof S7StringVarLengthTag) { - if(s7tag.getDataType() == TransportSize.STRING) { - updatedRequestItems.put(tagName, new S7Tag(TransportSize.BYTE, s7tag.getMemoryArea(), s7tag.getBlockNumber(), s7tag.getByteOffset(), s7tag.getBitOffset(), 2)); + TagItem tagItem = request.getTagItem(tagName); + if(tagItem.getTag() instanceof S7StringVarLengthTag) { + S7Tag s7Tag = (S7Tag) tagItem.getTag(); + TransportSize dataType = s7Tag.getDataType(); + if(dataType == TransportSize.STRING) { + updatedRequestItems.put(tagName, new DefaultTagItem(new S7Tag(TransportSize.BYTE, s7Tag.getMemoryArea(), s7Tag.getBlockNumber(), s7Tag.getByteOffset(), s7Tag.getBitOffset(), 2))); numVarLengthStrings++; - } else if(s7tag.getDataType() == TransportSize.WSTRING) { - updatedRequestItems.put(tagName, new S7Tag(TransportSize.BYTE, s7tag.getMemoryArea(), s7tag.getBlockNumber(), s7tag.getByteOffset(), s7tag.getBitOffset(), 4)); + } else if(dataType == TransportSize.WSTRING) { + updatedRequestItems.put(tagName, new DefaultTagItem(new S7Tag(TransportSize.BYTE, s7Tag.getMemoryArea(), s7Tag.getBlockNumber(), s7Tag.getByteOffset(), s7Tag.getBitOffset(), 4))); numVarLengthStrings++; } } else { - updatedRequestItems.put(tagName, s7tag); + updatedRequestItems.put(tagName, tagItem); } } @@ -1316,24 +1319,24 @@ private CompletableFuture performVarLengthStringReadRequest(DefaultPl return; } // Collect the responses for the var-length strings and read them separately. - LinkedHashMap varLengthStringTags = new LinkedHashMap<>(finalNumVarLengthStrings); + LinkedHashMap varLengthStringTags = new LinkedHashMap<>(finalNumVarLengthStrings); int curItem = 0; for (String tagName : request.getTagNames()) { S7Tag s7tag = (S7Tag) request.getTag(tagName); if(s7tag instanceof S7StringVarLengthTag) { S7VarPayloadDataItem s7VarPayloadDataItem = ((S7PayloadReadVarResponse) s7Message.getPayload()).getItems().get(curItem); - // Simply ignore processing var-lenght strings that are not ok + // Simply ignore processing var-length strings that are not ok if(s7VarPayloadDataItem.getReturnCode() == DataTransportErrorCode.OK) { ReadBuffer rb = new ReadBufferByteBased(s7VarPayloadDataItem.getData()); try { if (s7tag.getDataType() == TransportSize.STRING) { rb.readShort(8); int stringLength = rb.readShort(8); - varLengthStringTags.put(tagName, new S7StringFixedLengthTag(TransportSize.STRING, s7tag.getMemoryArea(), s7tag.getBlockNumber(), s7tag.getByteOffset(), s7tag.getBitOffset(), 1, stringLength)); + varLengthStringTags.put(tagName, new DefaultTagItem(new S7StringFixedLengthTag(TransportSize.STRING, s7tag.getMemoryArea(), s7tag.getBlockNumber(), s7tag.getByteOffset(), s7tag.getBitOffset(), 1, stringLength))); } else if (s7tag.getDataType() == TransportSize.WSTRING) { rb.readInt(16); int stringLength = rb.readInt(16); - varLengthStringTags.put(tagName, new S7StringFixedLengthTag(TransportSize.WSTRING, s7tag.getMemoryArea(), s7tag.getBlockNumber(), s7tag.getByteOffset(), s7tag.getBitOffset(), 1, stringLength)); + varLengthStringTags.put(tagName, new DefaultTagItem(new S7StringFixedLengthTag(TransportSize.WSTRING, s7tag.getMemoryArea(), s7tag.getBlockNumber(), s7tag.getByteOffset(), s7tag.getBitOffset(), 1, stringLength))); } } catch (Exception e) { logger.warn("Error parsing string size for tag {}", tagName, e); @@ -1438,9 +1441,9 @@ private CompletableFuture performVarLengthStringWriteRequest(DefaultP S7StringFixedLengthTag newTag = new S7StringFixedLengthTag(varLengthTag.getDataType(), varLengthTag.getMemoryArea(), varLengthTag.getBlockNumber(), varLengthTag.getByteOffset(), varLengthTag.getBitOffset(), varLengthTag.getNumberOfElements(), stringLength); - updatedRequestItems.put(tagName, new TagValueItem(newTag, value)); + updatedRequestItems.put(tagName, new DefaultTagValueItem(newTag, value)); } else { - updatedRequestItems.put(tagName, new TagValueItem(tag, value)); + updatedRequestItems.put(tagName, new DefaultTagValueItem(tag, value)); } } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/AbstractPlcConnection.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/AbstractPlcConnection.java index b9d25454320..d55025ba9b1 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/AbstractPlcConnection.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/AbstractPlcConnection.java @@ -31,7 +31,7 @@ import org.apache.plc4x.java.spi.generation.Message; import org.apache.plc4x.java.spi.messages.*; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; -import org.apache.plc4x.java.api.value.PlcValueHandler; +import org.apache.plc4x.java.spi.values.PlcValueHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java index 147b6db3cea..b97d94d347e 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java @@ -28,11 +28,11 @@ import org.apache.plc4x.java.api.listener.ConnectionStateListener; import org.apache.plc4x.java.api.listener.EventListener; import org.apache.plc4x.java.api.messages.PlcPingResponse; -import org.apache.plc4x.java.api.value.PlcValueHandler; import org.apache.plc4x.java.spi.configuration.ConfigurationFactory; import org.apache.plc4x.java.spi.events.*; import org.apache.plc4x.java.spi.messages.DefaultPlcPingRequest; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; +import org.apache.plc4x.java.spi.values.PlcValueHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedDriverBase.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedDriverBase.java index 8c037d908b2..aeeec81d20c 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedDriverBase.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedDriverBase.java @@ -29,7 +29,6 @@ import org.apache.plc4x.java.api.metadata.OptionMetadata; import org.apache.plc4x.java.api.types.OptionType; import org.apache.plc4x.java.api.metadata.PlcDriverMetadata; -import org.apache.plc4x.java.api.value.PlcValueHandler; import org.apache.plc4x.java.spi.configuration.ConfigurationFactory; import org.apache.plc4x.java.spi.configuration.annotations.*; import org.apache.plc4x.java.spi.configuration.annotations.defaults.*; @@ -38,6 +37,7 @@ import org.apache.plc4x.java.spi.metadata.DefaultOptionMetadata; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; import org.apache.plc4x.java.spi.transport.Transport; +import org.apache.plc4x.java.spi.values.PlcValueHandler; import java.lang.reflect.Field; import java.util.*; @@ -286,7 +286,9 @@ protected BaseOptimizer getOptimizer() { protected abstract PlcTagHandler getTagHandler(); - protected abstract PlcValueHandler getValueHandler(); + protected PlcValueHandler getValueHandler() { + return new PlcValueHandler(); + } protected abstract ProtocolStackConfigurer getStackConfigurer(); 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 3d189926ffd..21952d844fa 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 @@ -23,19 +23,22 @@ import org.apache.plc4x.java.api.messages.PlcReadResponse; import org.apache.plc4x.java.api.messages.PlcTagRequest; import org.apache.plc4x.java.api.model.PlcTag; +import org.apache.plc4x.java.api.types.PlcResponseCode; import org.apache.plc4x.java.spi.connection.PlcTagHandler; import org.apache.plc4x.java.spi.generation.SerializationException; import org.apache.plc4x.java.spi.generation.WriteBuffer; +import org.apache.plc4x.java.spi.messages.utils.DefaultTagErrorItem; +import org.apache.plc4x.java.spi.messages.utils.DefaultTagItem; +import org.apache.plc4x.java.spi.messages.utils.TagItem; import org.apache.plc4x.java.spi.utils.Serializable; import java.util.LinkedHashMap; import java.util.LinkedHashSet; -import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; +import java.util.stream.Collectors; import static org.apache.plc4x.java.spi.generation.WithReaderWriterArgs.WithRenderAsList; @@ -43,10 +46,10 @@ public class DefaultPlcReadRequest implements PlcReadRequest, PlcTagRequest, Ser private final PlcReader reader; // This is intentionally a linked hash map in order to keep the order of how elements were added. - private final LinkedHashMap tags; + private final LinkedHashMap tags; public DefaultPlcReadRequest(PlcReader reader, - LinkedHashMap tags) { + LinkedHashMap tags) { this.reader = reader; this.tags = tags; } @@ -67,14 +70,23 @@ public LinkedHashSet getTagNames() { return new LinkedHashSet<>(tags.keySet()); } + public TagItem getTagItem(String tagName) { + return tags.get(tagName); + } + + @Override + public PlcTag getTag(String tagName) { + return tags.get(tagName).getTag(); + } + @Override - public PlcTag getTag(String name) { - return tags.get(name); + public PlcResponseCode getTagResponseCode(String tagName) { + return tags.get(tagName).getResponseCode(); } @Override public List getTags() { - return new LinkedList<>(tags.values()); + return tags.values().stream().map(TagItem::getTag).collect(Collectors.toList()); } public PlcReader getReader() { @@ -87,14 +99,11 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { writeBuffer.pushContext("PlcTagRequest"); writeBuffer.pushContext("tags", WithRenderAsList(true)); - for (Map.Entry tagEntry : tags.entrySet()) { + for (Map.Entry tagEntry : tags.entrySet()) { String tagName = tagEntry.getKey(); writeBuffer.pushContext(tagName); - PlcTag tag = tagEntry.getValue(); - if(!(tag instanceof Serializable)) { - throw new RuntimeException("Error serializing. Tag doesn't implement Serializable"); - } - ((Serializable) tag).serialize(writeBuffer); + TagItem tagResponseCode = tagEntry.getValue(); + ((Serializable) tagResponseCode).serialize(writeBuffer); writeBuffer.popContext(tagName); } writeBuffer.popContext("tags"); @@ -107,36 +116,46 @@ public static class Builder implements PlcReadRequest.Builder { private final PlcReader reader; private final PlcTagHandler tagHandler; - private final Map> tags; + private final Map> tagItems; public Builder(PlcReader reader, PlcTagHandler tagHandler) { this.reader = reader; this.tagHandler = tagHandler; - tags = new LinkedHashMap<>(); + tagItems = new LinkedHashMap<>(); } @Override public PlcReadRequest.Builder addTagAddress(String name, String tagAddress) { - if (tags.containsKey(name)) { + if (tagItems.containsKey(name)) { throw new PlcRuntimeException("Duplicate tag definition '" + name + "'"); } - tags.put(name, () -> tagHandler.parseTag(tagAddress)); + tagItems.put(name, () -> { + try { + PlcTag tag = tagHandler.parseTag(tagAddress); + return new DefaultTagItem(tag); + } catch (Exception e) { + return new DefaultTagErrorItem(PlcResponseCode.INVALID_ADDRESS); + } + }); return this; } @Override public PlcReadRequest.Builder addTag(String name, PlcTag tag) { - if (tags.containsKey(name)) { + if (tagItems.containsKey(name)) { throw new PlcRuntimeException("Duplicate tag definition '" + name + "'"); } - tags.put(name, () -> tag); + tagItems.put(name, () -> new DefaultTagItem(tag)); return this; } @Override public PlcReadRequest build() { - LinkedHashMap parsedTags = new LinkedHashMap<>(); - tags.forEach((name, tagSupplier) -> parsedTags.put(name, tagSupplier.get())); + LinkedHashMap parsedTags = new LinkedHashMap<>(); + tagItems.forEach((name, tagItemSupplier) -> { + TagItem tagItem = tagItemSupplier.get(); + parsedTags.put(name, tagItem); + }); return new DefaultPlcReadRequest(reader, parsedTags); } } 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 d66d1f1c9c8..74a17459810 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 @@ -18,20 +18,22 @@ */ package org.apache.plc4x.java.spi.messages; -import org.apache.commons.lang3.tuple.Pair; import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.api.messages.PlcWriteRequest; import org.apache.plc4x.java.api.messages.PlcWriteResponse; import org.apache.plc4x.java.api.model.PlcTag; +import org.apache.plc4x.java.api.types.PlcResponseCode; import org.apache.plc4x.java.api.value.PlcValue; -import org.apache.plc4x.java.api.value.PlcValueHandler; import org.apache.plc4x.java.spi.codegen.WithOption; import org.apache.plc4x.java.spi.connection.PlcTagHandler; import org.apache.plc4x.java.spi.generation.SerializationException; import org.apache.plc4x.java.spi.generation.WriteBuffer; +import org.apache.plc4x.java.spi.messages.utils.DefaultTagErrorItem; +import org.apache.plc4x.java.spi.messages.utils.DefaultTagValueItem; import org.apache.plc4x.java.spi.messages.utils.TagValueItem; import org.apache.plc4x.java.spi.utils.Serializable; import org.apache.plc4x.java.spi.values.PlcList; +import org.apache.plc4x.java.spi.values.PlcValueHandler; import java.nio.charset.StandardCharsets; import java.util.*; @@ -69,6 +71,11 @@ public LinkedHashSet getTagNames() { return new LinkedHashSet<>(tags.keySet()); } + @Override + public PlcResponseCode getTagResponseCode(String tagName) { + return tags.get(tagName).getResponseCode(); + } + @Override public PlcTag getTag(String name) { return tags.get(name).getTag(); @@ -154,62 +161,82 @@ public static class Builder implements PlcWriteRequest.Builder { private final PlcWriter writer; private final PlcTagHandler tagHandler; private final PlcValueHandler valueHandler; - private final Map, Object[]>> tags; + private final Map> tagValues; public Builder(PlcWriter writer, PlcTagHandler tagHandler, PlcValueHandler valueHandler) { this.writer = writer; this.tagHandler = tagHandler; this.valueHandler = valueHandler; - tags = new TreeMap<>(); + tagValues = new TreeMap<>(); } @Override public Builder addTagAddress(String name, String tagAddress, Object... values) { - if (tags.containsKey(name)) { + if (tagValues.containsKey(name)) { throw new PlcRuntimeException("Duplicate tag definition '" + name + "'"); } - tags.put(name, Pair.of(() -> tagHandler.parseTag(tagAddress), values)); + tagValues.put(name, () -> { + try { + PlcTag tag = tagHandler.parseTag(tagAddress); + try { + PlcValue plcValue = parsePlcValue(tag, values); + return new DefaultTagValueItem(tag, plcValue); + } catch (Exception e) { + return new DefaultTagErrorItem(PlcResponseCode.INVALID_DATA); + } + } catch (Exception e) { + return new DefaultTagErrorItem(PlcResponseCode.INVALID_ADDRESS); + } + }); return this; } @Override public Builder addTag(String name, PlcTag tag, Object... values) { - if (tags.containsKey(name)) { + if (tagValues.containsKey(name)) { throw new PlcRuntimeException("Duplicate tag definition '" + name + "'"); } - tags.put(name, Pair.of(() -> tag, values)); + tagValues.put(name, () -> { + try { + PlcValue plcValue = parsePlcValue(tag, values); + return new DefaultTagValueItem(tag, plcValue); + } catch (Exception e) { + return new DefaultTagErrorItem(PlcResponseCode.INVALID_DATA); + } + }); return this; } + protected PlcValue parsePlcValue(PlcTag tag, Object... values) { + // If this is more than one element the value itself will definitely be a list. + if(values.length > 1) { + List listItems = new ArrayList<>(values.length); + for (Object value : values) { + if(value instanceof PlcValue) { + listItems.add((PlcValue) value); + } else { + PlcValue plcItemValue = valueHandler.newPlcValue(tag, value); + listItems.add(plcItemValue); + } + } + return new PlcList(listItems); + } + // If the values are already PlcValues, just use them. + else if(values[0] instanceof PlcValue) { + return (PlcValue) values[0]; + } + // In all other cases use the value-handler. + else { + return valueHandler.newPlcValue(tag, values[0]); + } + } + @Override public PlcWriteRequest build() { LinkedHashMap parsedTags = new LinkedHashMap<>(); - tags.forEach((name, tagValues) -> { - // Compile the query string. - PlcTag tag = tagValues.getLeft().get(); - PlcValue plcValue; - // If this is more than one element the value itself will definitely be a list. - if(tagValues.getRight().length > 1) { - List listItems = new ArrayList<>(tagValues.getRight().length); - for (Object tagValue : tagValues.getRight()) { - if(tagValue instanceof PlcValue) { - listItems.add((PlcValue) tagValue); - } else { - PlcValue plcItemValue = valueHandler.newPlcValue(tag, tagValue); - listItems.add(plcItemValue); - } - } - plcValue = new PlcList(listItems); - } - // If the values are already PlcValues, just use them. - else if(tagValues.getRight()[0] instanceof PlcValue) { - plcValue = (PlcValue) tagValues.getRight()[0]; - } - // In all other cases use the value-handler. - else { - plcValue = valueHandler.newPlcValue(tag, tagValues.getRight()[0]); - } - parsedTags.put(name, new TagValueItem(tag, plcValue)); + tagValues.forEach((name, tagValueItemSupplier) -> { + TagValueItem tagValueItem = tagValueItemSupplier.get(); + parsedTags.put(name, tagValueItem); }); return new DefaultPlcWriteRequest(writer, parsedTags); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/DefaultTagErrorItem.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/DefaultTagErrorItem.java new file mode 100644 index 00000000000..8d5b64f1ed2 --- /dev/null +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/DefaultTagErrorItem.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.spi.messages.utils; + +import org.apache.plc4x.java.api.types.PlcResponseCode; +import org.apache.plc4x.java.spi.generation.SerializationException; +import org.apache.plc4x.java.spi.generation.WriteBuffer; +import org.apache.plc4x.java.spi.utils.Serializable; + +public class DefaultTagErrorItem implements TagItem, TagValueItem, Serializable { + + private final PlcResponseCode responseCode; + + public DefaultTagErrorItem(PlcResponseCode responseCode) { + this.responseCode = responseCode; + } + + public PlcResponseCode getResponseCode() { + return responseCode; + } + + @Override + public void serialize(WriteBuffer writeBuffer) throws SerializationException { + writeBuffer.pushContext("DefaultTagErrorItem"); + writeBuffer.writeString("responseCode", responseCode.name().length() * 8, responseCode.name()); + writeBuffer.popContext("DefaultTagErrorItem"); + } + +} diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/DefaultTagItem.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/DefaultTagItem.java new file mode 100644 index 00000000000..eda4045b4bc --- /dev/null +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/DefaultTagItem.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.spi.messages.utils; + +import org.apache.plc4x.java.api.model.PlcTag; +import org.apache.plc4x.java.spi.generation.SerializationException; +import org.apache.plc4x.java.spi.generation.WriteBuffer; +import org.apache.plc4x.java.spi.utils.Serializable; + +public class DefaultTagItem implements TagItem, Serializable { + + private final PlcTag tag; + + public DefaultTagItem(PlcTag tag) { + this.tag = tag; + } + + public PlcTag getTag() { + return tag; + } + + @Override + public void serialize(WriteBuffer writeBuffer) throws SerializationException { + writeBuffer.pushContext("DefaultTagItem"); + if(tag instanceof Serializable) { + writeBuffer.pushContext("tag"); + writeBuffer.writeSerializable((Serializable) tag); + writeBuffer.popContext("tag"); + } + writeBuffer.popContext("DefaultTagItem"); + } + +} diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/DefaultTagValueItem.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/DefaultTagValueItem.java new file mode 100644 index 00000000000..9ac47c15f7b --- /dev/null +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/DefaultTagValueItem.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.plc4x.java.spi.messages.utils; + +import org.apache.plc4x.java.api.model.PlcTag; +import org.apache.plc4x.java.api.types.PlcResponseCode; +import org.apache.plc4x.java.api.value.PlcValue; +import org.apache.plc4x.java.spi.generation.SerializationException; +import org.apache.plc4x.java.spi.generation.WriteBuffer; +import org.apache.plc4x.java.spi.utils.Serializable; + +public class DefaultTagValueItem extends DefaultTagItem implements TagValueItem, Serializable { + + private final PlcValue value; + + public DefaultTagValueItem(PlcTag tag, PlcValue value) { + super(tag); + this.value = value; + } + + public PlcValue getValue() { + return value; + } + + @Override + public void serialize(WriteBuffer writeBuffer) throws SerializationException { + writeBuffer.pushContext("PlcWriteRequest"); + if(getTag() instanceof Serializable) { + writeBuffer.pushContext("tag"); + writeBuffer.writeSerializable((Serializable) getTag()); + writeBuffer.popContext("tag"); + } + if(value instanceof Serializable) { + writeBuffer.pushContext("value"); + writeBuffer.writeSerializable((Serializable) value); + writeBuffer.popContext("value"); + } + writeBuffer.popContext("PlcWriteRequest"); + } + +} diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueHandler.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/TagItem.java similarity index 70% rename from plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueHandler.java rename to plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/TagItem.java index 97972a22c9f..c9b83617d62 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueHandler.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/TagItem.java @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * https://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an @@ -16,18 +16,20 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.plc4x.java.api.value; + +package org.apache.plc4x.java.spi.messages.utils; import org.apache.plc4x.java.api.model.PlcTag; +import org.apache.plc4x.java.api.types.PlcResponseCode; -/** - * Base Valuehandler - */ -public interface PlcValueHandler { +public interface TagItem { + + default PlcResponseCode getResponseCode() { + return PlcResponseCode.OK; + } - PlcValue newPlcValue(Object value); - PlcValue newPlcValue(Object[] values); - PlcValue newPlcValue(PlcTag tag, Object value); - PlcValue newPlcValue(PlcTag tag, Object[] values); + default PlcTag getTag() { + return null; + } } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/TagValueItem.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/TagValueItem.java index 14c9540af1a..fcd11543fb8 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/TagValueItem.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/utils/TagValueItem.java @@ -18,25 +18,12 @@ */ package org.apache.plc4x.java.spi.messages.utils; -import org.apache.plc4x.java.api.model.PlcTag; import org.apache.plc4x.java.api.value.PlcValue; -public class TagValueItem { +public interface TagValueItem extends TagItem { - private final PlcTag tag; - private final PlcValue value; - - public TagValueItem(PlcTag tag, PlcValue value) { - this.tag = tag; - this.value = value; - } - - public PlcTag getTag() { - return tag; - } - - public PlcValue getValue() { - return value; + default PlcValue getValue() { + return null; } } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/optimizer/SingleTagOptimizer.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/optimizer/SingleTagOptimizer.java index 105188f3e58..79faf446c21 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/optimizer/SingleTagOptimizer.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/optimizer/SingleTagOptimizer.java @@ -19,13 +19,15 @@ package org.apache.plc4x.java.spi.optimizer; import org.apache.plc4x.java.api.messages.PlcReadRequest; -import org.apache.plc4x.java.api.messages.PlcRequest; import org.apache.plc4x.java.api.messages.PlcWriteRequest; import org.apache.plc4x.java.api.model.PlcTag; +import org.apache.plc4x.java.api.types.PlcResponseCode; import org.apache.plc4x.java.api.value.PlcValue; import org.apache.plc4x.java.spi.context.DriverContext; import org.apache.plc4x.java.spi.messages.DefaultPlcReadRequest; import org.apache.plc4x.java.spi.messages.DefaultPlcWriteRequest; +import org.apache.plc4x.java.spi.messages.utils.DefaultTagItem; +import org.apache.plc4x.java.spi.messages.utils.DefaultTagValueItem; import org.apache.plc4x.java.spi.messages.utils.TagValueItem; import java.util.ArrayList; @@ -48,7 +50,8 @@ protected List processReadRequest(PlcReadRequest readRequest, Dr PlcTag tag = readRequest.getTag(tagName); PlcReadRequest subRequest = new DefaultPlcReadRequest( ((DefaultPlcReadRequest) readRequest).getReader(), - new LinkedHashMap<>(Collections.singletonMap(tagName, tag))); + // We are only expecting valid tagItems being passed in. + new LinkedHashMap<>(Collections.singletonMap(tagName, new DefaultTagItem(tag)))); subRequests.add(subRequest); } return subRequests; @@ -65,7 +68,8 @@ protected List processWriteRequest(PlcWriteRequest writeRequest PlcValue value = writeRequest.getPlcValue(tagName); PlcWriteRequest subRequest = new DefaultPlcWriteRequest( ((DefaultPlcWriteRequest) writeRequest).getWriter(), - new LinkedHashMap<>(Collections.singletonMap(tagName, new TagValueItem(tag, value)))); + // We are only expecting valid tagValueItems being passed in. + new LinkedHashMap<>(Collections.singletonMap(tagName, new DefaultTagValueItem(tag, value)))); subRequests.add(subRequest); } return subRequests; diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcValueHandler.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcValueHandler.java index 5ec85a89291..c9d80d85e8a 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcValueHandler.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcValueHandler.java @@ -30,15 +30,7 @@ import java.time.LocalTime; import java.util.List; -public class PlcValueHandler implements org.apache.plc4x.java.api.value.PlcValueHandler { - - public PlcValue newPlcValue(Object value) { - return of(new Object[]{value}); - } - - public PlcValue newPlcValue(Object[] values) { - return of(values); - } +public class PlcValueHandler { public PlcValue newPlcValue(PlcTag tag, Object value) { return of(tag, new Object[]{value}); diff --git a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/LeasedPlcConnection.java b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/LeasedPlcConnection.java index 05dbf4e963e..73da3e02fcc 100644 --- a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/LeasedPlcConnection.java +++ b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/LeasedPlcConnection.java @@ -29,6 +29,7 @@ import org.apache.plc4x.java.api.model.PlcSubscriptionHandle; import org.apache.plc4x.java.api.model.PlcSubscriptionTag; import org.apache.plc4x.java.api.model.PlcTag; +import org.apache.plc4x.java.api.types.PlcResponseCode; import org.apache.plc4x.java.api.value.PlcValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -158,8 +159,7 @@ public CompletableFuture execute() { } else { // Mark the connection as invalid. invalidateConnection = true; - log.debug("ReadRequest execution completed exceptionally invalidateConnection={} t={}", - invalidateConnection, + log.debug("ReadRequest execution completed exceptionally invalidateConnection=true", throwable); responseFuture.completeExceptionally(throwable); } @@ -178,6 +178,11 @@ public LinkedHashSet getTagNames() { return innerPlcReadRequest.getTagNames(); } + @Override + public PlcResponseCode getTagResponseCode(String tagName) { + return innerPlcReadRequest.getTagResponseCode(tagName); + } + @Override public PlcTag getTag(String name) { return innerPlcReadRequest.getTag(name); @@ -251,6 +256,11 @@ public LinkedHashSet getTagNames() { return innerPlcWriteRequest.getTagNames(); } + @Override + public PlcResponseCode getTagResponseCode(String tagName) { + return innerPlcWriteRequest.getTagResponseCode(tagName); + } + @Override public PlcTag getTag(String name) { return innerPlcWriteRequest.getTag(name); diff --git a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java index 0bd40ffd7bb..3d5ef6f5583 100644 --- a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java +++ b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java @@ -242,7 +242,7 @@ public boolean isBrowseSupported() { )); return CompletableFuture.completedFuture(new DefaultPlcWriteResponse(writeRequest, map)); }; - when(connection.writeRequestBuilder()).then(invocation -> new DefaultPlcWriteRequest.Builder(writer, getTagHandler(), getValueHandler())); + when(connection.writeRequestBuilder()).then(invocation -> new DefaultPlcWriteRequest.Builder(writer, getTagHandler(), new PlcValueHandler())); return new PlcEntityManager(mock); } @@ -251,10 +251,6 @@ private PlcTagHandler getTagHandler() { return new NoOpPlcTagHandler(); } - private org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new NoOpPlcValueHandler(); - } - private static class NoOpPlcTagHandler implements PlcTagHandler { @Override public org.apache.plc4x.java.api.model.PlcTag parseTag(String tagAddress) throws PlcInvalidTagException { @@ -282,28 +278,6 @@ public PlcQuery parseQuery(String query) { } } - private static class NoOpPlcValueHandler implements org.apache.plc4x.java.api.value.PlcValueHandler { - @Override - public PlcValue newPlcValue(Object value) { - throw new RuntimeException("Data Type " + value.getClass().getSimpleName() + "Is not supported"); - } - - @Override - public PlcValue newPlcValue(Object[] values) { - throw new RuntimeException("Data Type " + values.getClass().getSimpleName() + "Is not supported"); - } - - @Override - public PlcValue newPlcValue(org.apache.plc4x.java.api.model.PlcTag tag, Object value) { - throw new RuntimeException("Data Type " + value.getClass().getSimpleName() + "Is not supported"); - } - - @Override - public PlcValue newPlcValue(org.apache.plc4x.java.api.model.PlcTag tag, Object[] values) { - throw new RuntimeException("Data Type " + values.getClass().getSimpleName() + "Is not supported"); - } - } - private static class NoEntity { } diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/manual/ManualTest.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/manual/ManualTest.java index 88f88dbbf12..5126b67a990 100644 --- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/manual/ManualTest.java +++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/manual/ManualTest.java @@ -61,7 +61,17 @@ public ManualTest(String connectionString, boolean testRead, boolean testWrite, } public ManualTest addTestCase(String address, PlcValue expectedReadValue) { - testCases.add(new TestCase(address, expectedReadValue, null)); + testCases.add(new TestCase(address, PlcResponseCode.OK, expectedReadValue)); + return this; + } + + public ManualTest addTestCase(String address, PlcResponseCode expectedResponseCode) { + testCases.add(new TestCase(address, expectedResponseCode, null)); + return this; + } + + public ManualTest addTestCase(String address, PlcResponseCode expectedResponseCode, PlcValue expectedReadValue) { + testCases.add(new TestCase(address, expectedResponseCode, expectedReadValue)); return this; } @@ -78,7 +88,8 @@ public void run() throws Exception { if (testRead) { System.out.println(" - Reading: " + tagName); // Prepare the read-request - final PlcReadRequest readRequest = plcConnection.readRequestBuilder().addTagAddress(tagName, testCase.address).build(); + final PlcReadRequest readRequest = plcConnection.readRequestBuilder().addTagAddress( + tagName, testCase.address).build(); // Execute the read request long startTime = System.currentTimeMillis(); @@ -88,7 +99,7 @@ public void run() throws Exception { // Check the result Assertions.assertEquals(1, readResponse.getTagNames().size(), tagName); Assertions.assertEquals(tagName, readResponse.getTagNames().iterator().next(), tagName); - Assertions.assertEquals(PlcResponseCode.OK, readResponse.getResponseCode(tagName), tagName); + Assertions.assertEquals(testCase.responseCode, readResponse.getResponseCode(tagName), tagName); Assertions.assertNotNull(readResponse.getPlcValue(tagName), tagName); if (readResponse.getPlcValue(tagName) instanceof PlcList) { PlcList plcList = (PlcList) readResponse.getPlcValue(tagName); @@ -104,24 +115,29 @@ public void run() throws Exception { } for (int j = 0; j < expectedValues.size(); j++) { if (expectedValues.get(j) instanceof PlcValue) { - Assertions.assertEquals(((PlcValue) expectedValues.get(j)).getObject(), plcList.getIndex(j).getObject(), tagName + "[" + j + "]"); + Assertions.assertEquals(((PlcValue) expectedValues.get(j)).getObject(), + plcList.getIndex(j).getObject(), tagName + "[" + j + "]"); } else { - Assertions.assertEquals(expectedValues.get(j), plcList.getIndex(j).getObject(), tagName + "[" + j + "]"); + Assertions.assertEquals(expectedValues.get(j), plcList.getIndex(j).getObject(), + tagName + "[" + j + "]"); } } } else { if (testCase.expectedReadValue instanceof PlcStruct) { - Assertions.assertEquals(testCase.expectedReadValue.toString(), readResponse.getPlcValue(tagName).toString(), tagName); + Assertions.assertEquals(testCase.expectedReadValue.toString(), + readResponse.getPlcValue(tagName).toString(), tagName); } else if (testCase.expectedReadValue instanceof PlcRawByteArray) { byte[] expectedRawByteArray = ((PlcRawByteArray) testCase.expectedReadValue).getRaw(); byte[] readRawByteArray = ((PlcRawByteArray) readResponse.getPlcValue(tagName)).getRaw(); Assertions.assertArrayEquals(expectedRawByteArray, readRawByteArray); } else if (testCase.expectedReadValue instanceof PlcValue) { Assertions.assertEquals( - ((PlcValue) testCase.expectedReadValue).getObject(), readResponse.getPlcValue(tagName).getObject(), tagName); + ((PlcValue) testCase.expectedReadValue).getObject(), + readResponse.getPlcValue(tagName).getObject(), tagName); } else { Assertions.assertEquals( - testCase.expectedReadValue.toString(), readResponse.getPlcValue(tagName).getObject().toString(), tagName); + testCase.expectedReadValue.toString(), + readResponse.getPlcValue(tagName).getObject().toString(), tagName); } } } @@ -137,7 +153,8 @@ public void run() throws Exception { } // Prepare the write request - PlcWriteRequest writeRequest = plcConnection.writeRequestBuilder().addTagAddress(tagName, testCase.address, plcValue).build(); + PlcWriteRequest writeRequest = plcConnection.writeRequestBuilder().addTagAddress( + tagName, testCase.address, plcValue).build(); // Execute the write request long startTime = System.currentTimeMillis(); @@ -145,7 +162,9 @@ public void run() throws Exception { long endTime = System.currentTimeMillis(); // Check the result - Assertions.assertEquals(PlcResponseCode.OK, writeResponse.getResponseCode(tagName), String.format("Got status %s for %s", writeResponse.getResponseCode(tagName).name(), testCase.address)); + Assertions.assertEquals(testCase.responseCode, writeResponse.getResponseCode(tagName), + String.format("Got status %s for %s", + writeResponse.getResponseCode(tagName).name(), testCase.address)); } } System.out.println("Success"); @@ -234,25 +253,25 @@ public void run() throws Exception { public static class TestCase { private final String address; + private final PlcResponseCode responseCode; private final Object expectedReadValue; - private final Object writeValue; - public TestCase(String address, Object expectedReadValue, Object writeValue) { + public TestCase(String address, PlcResponseCode responseCode, Object expectedReadValue) { this.address = address; + this.responseCode = responseCode; this.expectedReadValue = expectedReadValue; - this.writeValue = writeValue; } public String getAddress() { return address; } - public Object getExpectedReadValue() { - return expectedReadValue; + public PlcResponseCode getResponseCode() { + return responseCode; } - public Object getWriteValue() { - return writeValue; + public Object getExpectedReadValue() { + return expectedReadValue; } }