This is an automated email from the ASF dual-hosted git repository. sruehl pushed a commit to branch feature/Beckhoff_ADS_protocol in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
The following commit(s) were added to refs/heads/feature/Beckhoff_ADS_protocol by this push: new 1283cf1 + added convinience methods for automatically calculating lengths. + Integrated CalculatedClass into normal classes + added couple more nullchecks 1283cf1 is described below commit 1283cf1c0ac7155ea3694367223c1c50a3a654aa Author: Sebastian Rühl <sru...@apache.org> AuthorDate: Fri Feb 16 18:32:25 2018 +0100 + added convinience methods for automatically calculating lengths. + Integrated CalculatedClass into normal classes + added couple more nullchecks --- .../commands/ADSAddDeviceNotificationRequest.java | 38 ++++++------ .../commands/ADSAddDeviceNotificationResponse.java | 10 +-- .../ADSDeleteDeviceNotificationRequest.java | 8 ++- .../ADSDeleteDeviceNotificationResponse.java | 6 +- .../api/commands/ADSDeviceNotificationRequest.java | 49 ++++++++++----- .../api/commands/ADSReadDeviceInfoResponse.java | 22 ++++--- .../java/ads/api/commands/ADSReadRequest.java | 20 +++--- .../java/ads/api/commands/ADSReadResponse.java | 38 ++++++++---- .../ads/api/commands/ADSReadStateResponse.java | 6 +- .../java/ads/api/commands/ADSReadWriteRequest.java | 56 +++++++++++------ .../ads/api/commands/ADSReadWriteResponse.java | 36 +++++++---- .../ads/api/commands/ADSWriteControlRequest.java | 50 ++++++++++----- .../ads/api/commands/ADSWriteControlResponse.java | 6 +- .../java/ads/api/commands/ADSWriteRequest.java | 55 ++++++++++------- .../java/ads/api/commands/ADSWriteResponse.java | 6 +- .../java/ads/api/commands/UnknownCommand.java | 4 +- .../api/commands/types/AdsNotificationSample.java | 34 ++++++++-- .../java/ads/api/commands/types/AdsReturnCode.java | 4 +- .../ads/api/commands/types/AdsStampHeader.java | 7 ++- .../plc4x/java/ads/api/generic/AMSHeader.java | 57 +++++++++++++---- .../plc4x/java/ads/api/generic/AMSTCPHeader.java | 40 ++++++++++-- .../plc4x/java/ads/api/generic/AMSTCPPaket.java | 32 +++++----- .../generic/calculated/CalculatedAMSHeader.java | 72 ---------------------- .../generic/calculated/CalculatedAMSTCPHeader.java | 66 -------------------- .../plc4x/java/ads/netty/Plc4XADSProtocol.java | 2 +- .../java/org/apache/plc4x/java/ads/ADSDumper.java | 2 - .../plc4x/java/ads/netty/ADSProtocolTest.java | 9 +-- 27 files changed, 396 insertions(+), 339 deletions(-) diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationRequest.java index 1b1807b..f1b19c1 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationRequest.java @@ -26,6 +26,8 @@ import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.types.*; import org.apache.plc4x.java.ads.api.util.ByteValue; +import java.util.Objects; + /** * A notification is created in an ADS device. * <p> @@ -66,32 +68,32 @@ public class ADSAddDeviceNotificationRequest extends ADSAbstractRequest { protected ADSAddDeviceNotificationRequest(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, Length length, TransmissionMode transmissionMode, MaxDelay maxDelay, CycleTime cycleTime) { super(amstcpHeader, amsHeader); - this.indexGroup = indexGroup; - this.indexOffset = indexOffset; - this.length = length; - this.transmissionMode = transmissionMode; - this.maxDelay = maxDelay; - this.cycleTime = cycleTime; + this.indexGroup = Objects.requireNonNull(indexGroup); + this.indexOffset = Objects.requireNonNull(indexOffset); + this.length = Objects.requireNonNull(length); + this.transmissionMode = Objects.requireNonNull(transmissionMode); + this.maxDelay = Objects.requireNonNull(maxDelay); + this.cycleTime = Objects.requireNonNull(cycleTime); } protected ADSAddDeviceNotificationRequest(AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, Length length, TransmissionMode transmissionMode, MaxDelay maxDelay, CycleTime cycleTime) { super(amsHeader); - this.indexGroup = indexGroup; - this.indexOffset = indexOffset; - this.length = length; - this.transmissionMode = transmissionMode; - this.maxDelay = maxDelay; - this.cycleTime = cycleTime; + this.indexGroup = Objects.requireNonNull(indexGroup); + this.indexOffset = Objects.requireNonNull(indexOffset); + this.length = Objects.requireNonNull(length); + this.transmissionMode = Objects.requireNonNull(transmissionMode); + this.maxDelay = Objects.requireNonNull(maxDelay); + this.cycleTime = Objects.requireNonNull(cycleTime); } protected ADSAddDeviceNotificationRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, IndexGroup indexGroup, IndexOffset indexOffset, Length length, TransmissionMode transmissionMode, MaxDelay maxDelay, CycleTime cycleTime) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, State.DEFAULT, invokeId); - this.indexGroup = indexGroup; - this.indexOffset = indexOffset; - this.length = length; - this.transmissionMode = transmissionMode; - this.maxDelay = maxDelay; - this.cycleTime = cycleTime; + this.indexGroup = Objects.requireNonNull(indexGroup); + this.indexOffset = Objects.requireNonNull(indexOffset); + this.length = Objects.requireNonNull(length); + this.transmissionMode = Objects.requireNonNull(transmissionMode); + this.maxDelay = Objects.requireNonNull(maxDelay); + this.cycleTime = Objects.requireNonNull(cycleTime); } @Override diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationResponse.java index 44ecb50..a5cf8b7 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSAddDeviceNotificationResponse.java @@ -28,6 +28,8 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import java.util.Objects; + /** * A notification is created in an ADS device. */ @@ -46,14 +48,14 @@ public class ADSAddDeviceNotificationResponse extends ADSAbstractResponse { protected ADSAddDeviceNotificationResponse(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result, NotificationHandle notificationHandle) { super(amstcpHeader, amsHeader); - this.result = result; - this.notificationHandle = notificationHandle; + this.result = Objects.requireNonNull(result); + this.notificationHandle = Objects.requireNonNull(notificationHandle); } protected ADSAddDeviceNotificationResponse(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result, NotificationHandle notificationHandle) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.result = result; - this.notificationHandle = notificationHandle; + this.result = Objects.requireNonNull(result); + this.notificationHandle = Objects.requireNonNull(notificationHandle); } public static ADSAddDeviceNotificationResponse of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result, NotificationHandle notificationHandle) { diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationRequest.java index 096247f..ecda040 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationRequest.java @@ -27,6 +27,8 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import java.util.Objects; + /** * One before defined notification is deleted in an ADS device. */ @@ -40,17 +42,17 @@ public class ADSDeleteDeviceNotificationRequest extends ADSAbstractRequest { protected ADSDeleteDeviceNotificationRequest(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, NotificationHandle notificationHandle) { super(amstcpHeader, amsHeader); - this.notificationHandle = notificationHandle; + this.notificationHandle = Objects.requireNonNull(notificationHandle); } protected ADSDeleteDeviceNotificationRequest(AMSHeader amsHeader, NotificationHandle notificationHandle) { super(amsHeader); - this.notificationHandle = notificationHandle; + this.notificationHandle = Objects.requireNonNull(notificationHandle); } protected ADSDeleteDeviceNotificationRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, NotificationHandle notificationHandle) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.notificationHandle = notificationHandle; + this.notificationHandle = Objects.requireNonNull(notificationHandle); } public static ADSDeleteDeviceNotificationRequest of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, NotificationHandle notificationHandle) { diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationResponse.java index f3e4c11..688a95c 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeleteDeviceNotificationResponse.java @@ -27,6 +27,8 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import java.util.Objects; + /** * One before defined notification is deleted in an ADS device. */ @@ -40,12 +42,12 @@ public class ADSDeleteDeviceNotificationResponse extends ADSAbstractResponse { protected ADSDeleteDeviceNotificationResponse(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result) { super(amstcpHeader, amsHeader); - this.result = result; + this.result = Objects.requireNonNull(result); } protected ADSDeleteDeviceNotificationResponse(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.result = result; + this.result = Objects.requireNonNull(result); } public static ADSDeleteDeviceNotificationResponse of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result) { diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeviceNotificationRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeviceNotificationRequest.java index 978c4cd..da7c9ab 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeviceNotificationRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSDeviceNotificationRequest.java @@ -29,8 +29,10 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; import org.apache.plc4x.java.ads.api.util.ByteReadable; +import org.apache.plc4x.java.ads.api.util.LengthSupplier; import java.util.List; +import java.util.Objects; /** * Data will carry forward independently from an ADS device to a Client @@ -53,25 +55,44 @@ public class ADSDeviceNotificationRequest extends ADSAbstractRequest { */ private final List<AdsStampHeader> adsStampHeaders; + //// + // Used when fields should be calculated. TODO: check if we better work with a subclass. + private final LengthSupplier lengthSupplier; + private final boolean calculated; + // + /// + protected ADSDeviceNotificationRequest(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Length length, Stamps stamps, List<AdsStampHeader> adsStampHeaders) { super(amstcpHeader, amsHeader); - this.length = length; - this.stamps = stamps; - this.adsStampHeaders = adsStampHeaders; + this.length = Objects.requireNonNull(length); + this.stamps = Objects.requireNonNull(stamps); + this.adsStampHeaders = Objects.requireNonNull(adsStampHeaders); + calculated = false; + lengthSupplier = null; } protected ADSDeviceNotificationRequest(AMSHeader amsHeader, Length length, Stamps stamps, List<AdsStampHeader> adsStampHeaders) { super(amsHeader); - this.length = length; - this.stamps = stamps; - this.adsStampHeaders = adsStampHeaders; + this.length = Objects.requireNonNull(length); + this.stamps = Objects.requireNonNull(stamps); + this.adsStampHeaders = Objects.requireNonNull(adsStampHeaders); + calculated = false; + lengthSupplier = null; } - protected ADSDeviceNotificationRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Length length, Stamps stamps, List<AdsStampHeader> adsStampHeaders) { + protected ADSDeviceNotificationRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Stamps stamps, List<AdsStampHeader> adsStampHeaders) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.length = length; - this.stamps = stamps; - this.adsStampHeaders = adsStampHeaders; + this.length = null; + this.stamps = Objects.requireNonNull(stamps); + this.adsStampHeaders = Objects.requireNonNull(adsStampHeaders); + calculated = true; + this.lengthSupplier = () -> { + long aggregateLength = 0; + for (LengthSupplier supplier : adsStampHeaders) { + aggregateLength += supplier.getCalculatedLength(); + } + return aggregateLength; + }; } public static ADSDeviceNotificationRequest of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Length length, Stamps stamps, List<AdsStampHeader> adsStampHeaders) { @@ -82,19 +103,19 @@ public class ADSDeviceNotificationRequest extends ADSAbstractRequest { return new ADSDeviceNotificationRequest(amsHeader, length, stamps, adsStampHeaders); } - public static ADSDeviceNotificationRequest of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Length length, Stamps stamps, List<AdsStampHeader> adsStampHeaders) { - return new ADSDeviceNotificationRequest(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, length, stamps, adsStampHeaders); + public static ADSDeviceNotificationRequest of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Stamps stamps, List<AdsStampHeader> adsStampHeaders) { + return new ADSDeviceNotificationRequest(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, stamps, adsStampHeaders); } @Override public ADSData getAdsData() { - return buildADSData(length, stamps, buildADSData(adsStampHeaders.toArray(new ByteReadable[adsStampHeaders.size()]))); + return buildADSData((calculated ? Length.of(lengthSupplier.getCalculatedLength()) : length), stamps, buildADSData(adsStampHeaders.toArray(new ByteReadable[adsStampHeaders.size()]))); } @Override public String toString() { return "ADSDeviceNotificationRequest{" + - "length=" + length + + "length=" + (calculated ? Length.of(lengthSupplier.getCalculatedLength()) : length) + ", stamps=" + stamps + ", adsStampHeaders=" + adsStampHeaders + "} " + super.toString(); diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadDeviceInfoResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadDeviceInfoResponse.java index d780890..ffccbb6 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadDeviceInfoResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadDeviceInfoResponse.java @@ -27,6 +27,8 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import java.util.Objects; + /** * Reads the name and the version number of the ADS device. */ @@ -56,20 +58,20 @@ public class ADSReadDeviceInfoResponse extends ADSAbstractResponse { protected ADSReadDeviceInfoResponse(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result, MajorVersion majorVersion, MinorVersion minorVersion, Version version, Device device) { super(amstcpHeader, amsHeader); - this.result = result; - this.majorVersion = majorVersion; - this.minorVersion = minorVersion; - this.version = version; - this.device = device; + this.result = Objects.requireNonNull(result); + this.majorVersion = Objects.requireNonNull(majorVersion); + this.minorVersion = Objects.requireNonNull(minorVersion); + this.version = Objects.requireNonNull(version); + this.device = Objects.requireNonNull(device); } protected ADSReadDeviceInfoResponse(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result, MajorVersion majorVersion, MinorVersion minorVersion, Version version, Device device) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.result = result; - this.majorVersion = majorVersion; - this.minorVersion = minorVersion; - this.version = version; - this.device = device; + this.result = Objects.requireNonNull(result); + this.majorVersion = Objects.requireNonNull(majorVersion); + this.minorVersion = Objects.requireNonNull(minorVersion); + this.version = Objects.requireNonNull(version); + this.device = Objects.requireNonNull(device); } public static ADSReadDeviceInfoResponse of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result, MajorVersion majorVersion, MinorVersion minorVersion, Version version, Device device) { diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadRequest.java index f64d166..2c0356b 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadRequest.java @@ -29,6 +29,8 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import java.util.Objects; + /** * With ADS Read data can be read from an ADS device. The data are addressed by the Index Group and the Index Offset */ @@ -52,23 +54,23 @@ public class ADSReadRequest extends ADSAbstractRequest { protected ADSReadRequest(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, Length length) { super(amstcpHeader, amsHeader); - this.indexGroup = indexGroup; - this.indexOffset = indexOffset; - this.length = length; + this.indexGroup = Objects.requireNonNull(indexGroup); + this.indexOffset = Objects.requireNonNull(indexOffset); + this.length = Objects.requireNonNull(length); } protected ADSReadRequest(AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, Length length) { super(amsHeader); - this.indexGroup = indexGroup; - this.indexOffset = indexOffset; - this.length = length; + this.indexGroup = Objects.requireNonNull(indexGroup); + this.indexOffset = Objects.requireNonNull(indexOffset); + this.length = Objects.requireNonNull(length); } protected ADSReadRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, IndexGroup indexGroup, IndexOffset indexOffset, Length length) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.indexGroup = indexGroup; - this.indexOffset = indexOffset; - this.length = length; + this.indexGroup = Objects.requireNonNull(indexGroup); + this.indexOffset = Objects.requireNonNull(indexOffset); + this.length = Objects.requireNonNull(length); } public static ADSReadRequest of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, Length length) { diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadResponse.java index 91ee085..a4668ed 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadResponse.java @@ -28,6 +28,9 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSNetId; import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import org.apache.plc4x.java.ads.api.util.LengthSupplier; + +import java.util.Objects; /** * With ADS Read data can be read from an ADS device @@ -48,31 +51,42 @@ public class ADSReadResponse extends ADSAbstractResponse { */ private final Data data; + //// + // Used when fields should be calculated. TODO: check if we better work with a subclass. + private final LengthSupplier lengthSupplier; + private final boolean calculated; + // + /// + protected ADSReadResponse(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result, Length length, Data data) { super(amstcpHeader, amsHeader); - this.result = result; - this.length = length; - this.data = data; + this.result = Objects.requireNonNull(result); + this.length = Objects.requireNonNull(length); + this.data = Objects.requireNonNull(data); + this.lengthSupplier = null; + this.calculated = false; } - protected ADSReadResponse(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result, Length length, Data data) { + protected ADSReadResponse(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result, Data data) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.result = result; - this.length = length; - this.data = data; + this.result = Objects.requireNonNull(result); + this.length = null; + this.data = Objects.requireNonNull(data); + this.lengthSupplier = () -> data.getCalculatedLength(); + this.calculated = Objects.requireNonNull(true); } public static ADSReadResponse of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result, Length length, Data data) { return new ADSReadResponse(amstcpHeader, amsHeader, result, length, data); } - public static ADSReadResponse of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result, Length length, Data data) { - return new ADSReadResponse(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, result, length, data); + public static ADSReadResponse of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result, Data data) { + return new ADSReadResponse(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, result, data); } @Override public ADSData getAdsData() { - return buildADSData(result, length, data); + return buildADSData(result, (calculated ? Length.of(lengthSupplier.getCalculatedLength()) : length), data); } public Result getResult() { @@ -80,7 +94,7 @@ public class ADSReadResponse extends ADSAbstractResponse { } public Length getLength() { - return length; + return (calculated ? Length.of(lengthSupplier.getCalculatedLength()) : length); } public Data getData() { @@ -91,7 +105,7 @@ public class ADSReadResponse extends ADSAbstractResponse { public String toString() { return "ADSReadResponse{" + "result=" + result + - ", length=" + length + + ", length=" + (calculated ? Length.of(lengthSupplier.getCalculatedLength()) : length) + ", data=" + data + "} " + super.toString(); } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadStateResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadStateResponse.java index f552e25..6c3d08b 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadStateResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadStateResponse.java @@ -27,6 +27,8 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import java.util.Objects; + /** * Reads the ADS status and the device status of an ADS device. */ @@ -40,12 +42,12 @@ public class ADSReadStateResponse extends ADSAbstractResponse { protected ADSReadStateResponse(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result) { super(amstcpHeader, amsHeader); - this.result = result; + this.result = Objects.requireNonNull(result); } protected ADSReadStateResponse(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.result = result; + this.result = Objects.requireNonNull(result); } public static ADSReadStateResponse of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result) { diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteRequest.java index e6245dd..89b9b7f 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteRequest.java @@ -26,6 +26,9 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSNetId; import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import org.apache.plc4x.java.ads.api.util.LengthSupplier; + +import java.util.Objects; /** * With ADS Read Write data will be written to an ADS device. Additionally, data can be read from the ADS device. @@ -56,31 +59,44 @@ public class ADSReadWriteRequest extends ADSAbstractRequest { */ private final Data data; + //// + // Used when fields should be calculated. TODO: check if we better work with a subclass. + private final LengthSupplier lengthSupplier; + private final boolean calculated; + // + /// + protected ADSReadWriteRequest(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, ReadLength readLength, WriteLength writeLength, Data data) { super(amstcpHeader, amsHeader); - this.indexGroup = indexGroup; - this.indexOffset = indexOffset; - this.readLength = readLength; - this.writeLength = writeLength; - this.data = data; + this.indexGroup = Objects.requireNonNull(indexGroup); + this.indexOffset = Objects.requireNonNull(indexOffset); + this.readLength = Objects.requireNonNull(readLength); + this.writeLength = Objects.requireNonNull(writeLength); + this.data = Objects.requireNonNull(data); + this.lengthSupplier = null; + this.calculated = false; } protected ADSReadWriteRequest(AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, ReadLength readLength, WriteLength writeLength, Data data) { super(amsHeader); - this.indexGroup = indexGroup; - this.indexOffset = indexOffset; - this.readLength = readLength; - this.writeLength = writeLength; - this.data = data; + this.indexGroup = Objects.requireNonNull(indexGroup); + this.indexOffset = Objects.requireNonNull(indexOffset); + this.readLength = Objects.requireNonNull(readLength); + this.writeLength = Objects.requireNonNull(writeLength); + this.data = Objects.requireNonNull(data); + this.lengthSupplier = null; + this.calculated = false; } - protected ADSReadWriteRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, IndexGroup indexGroup, IndexOffset indexOffset, ReadLength readLength, WriteLength writeLength, Data data) { + protected ADSReadWriteRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, IndexGroup indexGroup, IndexOffset indexOffset, ReadLength readLength, Data data) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.indexGroup = indexGroup; - this.indexOffset = indexOffset; - this.readLength = readLength; - this.writeLength = writeLength; - this.data = data; + this.indexGroup = Objects.requireNonNull(indexGroup); + this.indexOffset = Objects.requireNonNull(indexOffset); + this.readLength = Objects.requireNonNull(readLength); + this.writeLength = null; + this.data = Objects.requireNonNull(data); + this.lengthSupplier = () -> data.getCalculatedLength(); + this.calculated = true; } public static ADSReadWriteRequest of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, ReadLength readLength, WriteLength writeLength, Data data) { @@ -91,13 +107,13 @@ public class ADSReadWriteRequest extends ADSAbstractRequest { return new ADSReadWriteRequest(amsHeader, indexGroup, indexOffset, readLength, writeLength, data); } - public static ADSReadWriteRequest of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, IndexGroup indexGroup, IndexOffset indexOffset, ReadLength readLength, WriteLength writeLength, Data data) { - return new ADSReadWriteRequest(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, indexGroup, indexOffset, readLength, writeLength, data); + public static ADSReadWriteRequest of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, IndexGroup indexGroup, IndexOffset indexOffset, ReadLength readLength, Data data) { + return new ADSReadWriteRequest(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, indexGroup, indexOffset, readLength, data); } @Override public ADSData getAdsData() { - return buildADSData(indexGroup, indexOffset, readLength, writeLength, data); + return buildADSData(indexGroup, indexOffset, readLength, (calculated ? WriteLength.of(lengthSupplier.getCalculatedLength()) : writeLength), data); } @Override @@ -106,7 +122,7 @@ public class ADSReadWriteRequest extends ADSAbstractRequest { "indexGroup=" + indexGroup + ", indexOffset=" + indexOffset + ", readLength=" + readLength + - ", writeLength=" + writeLength + + ", writeLength=" + (calculated ? WriteLength.of(lengthSupplier.getCalculatedLength()) : writeLength) + ", data=" + data + "} " + super.toString(); } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteResponse.java index 663d5de..3230f0e 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSReadWriteResponse.java @@ -28,6 +28,9 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSNetId; import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import org.apache.plc4x.java.ads.api.util.LengthSupplier; + +import java.util.Objects; /** * With ADS Read Write data will be written to an ADS device. Additionally, data can be read from the ADS device. @@ -50,38 +53,49 @@ public class ADSReadWriteResponse extends ADSAbstractResponse { */ private final Data data; + //// + // Used when fields should be calculated. TODO: check if we better work with a subclass. + private final LengthSupplier lengthSupplier; + private final boolean calculated; + // + /// + protected ADSReadWriteResponse(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result, Length length, Data data) { super(amstcpHeader, amsHeader); - this.result = result; - this.length = length; - this.data = data; + this.result = Objects.requireNonNull(result); + this.length = Objects.requireNonNull(length); + this.data = Objects.requireNonNull(data); + this.lengthSupplier = null; + this.calculated = false; } - protected ADSReadWriteResponse(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result, Length length, Data data) { + protected ADSReadWriteResponse(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result, Data data) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.result = result; - this.length = length; - this.data = data; + this.result = Objects.requireNonNull(result); + this.length = null; + this.data = Objects.requireNonNull(data); + this.lengthSupplier = () -> data.getCalculatedLength(); + this.calculated = true; } public static ADSReadWriteResponse of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result, Length length, Data data) { return new ADSReadWriteResponse(amstcpHeader, amsHeader, result, length, data); } - public static ADSReadWriteResponse of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result, Length length, Data data) { - return new ADSReadWriteResponse(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, result, length, data); + public static ADSReadWriteResponse of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result, Data data) { + return new ADSReadWriteResponse(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, result, data); } @Override public ADSData getAdsData() { - return buildADSData(result, length, data); + return buildADSData(result, (calculated ? Length.of(lengthSupplier.getCalculatedLength()) : length), data); } @Override public String toString() { return "ADSReadWriteResponse{" + "result=" + result + - ", length=" + length + + ", length=" + (calculated ? Length.of(lengthSupplier.getCalculatedLength()) : length) + ", data=" + data + "} " + super.toString(); } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlRequest.java index 40c6cee..e9e7845 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlRequest.java @@ -29,6 +29,9 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSNetId; import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import org.apache.plc4x.java.ads.api.util.LengthSupplier; + +import java.util.Objects; /** * Changes the ADS status and the device status of an ADS device. @@ -55,28 +58,41 @@ public class ADSWriteControlRequest extends ADSAbstractRequest { */ private final Data data; + //// + // Used when fields should be calculated. TODO: check if we better work with a subclass. + private final LengthSupplier lengthSupplier; + private final boolean calculated; + // + /// + protected ADSWriteControlRequest(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, ADSState adsState, DeviceState deviceState, Length length, Data data) { super(amstcpHeader, amsHeader); - this.adsState = adsState; - this.deviceState = deviceState; - this.length = length; - this.data = data; + this.adsState = Objects.requireNonNull(adsState); + this.deviceState = Objects.requireNonNull(deviceState); + this.length = Objects.requireNonNull(length); + this.data = Objects.requireNonNull(data); + this.lengthSupplier = null; + this.calculated = false; } protected ADSWriteControlRequest(AMSHeader amsHeader, ADSState adsState, DeviceState deviceState, Length length, Data data) { super(amsHeader); - this.adsState = adsState; - this.deviceState = deviceState; - this.length = length; - this.data = data; + this.adsState = Objects.requireNonNull(adsState); + this.deviceState = Objects.requireNonNull(deviceState); + this.length = Objects.requireNonNull(length); + this.data = Objects.requireNonNull(data); + this.lengthSupplier = null; + this.calculated = false; } - protected ADSWriteControlRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, ADSState adsState, DeviceState deviceState, Length length, Data data) { + protected ADSWriteControlRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, ADSState adsState, DeviceState deviceState, Data data) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.adsState = adsState; - this.deviceState = deviceState; - this.length = length; - this.data = data; + this.adsState = Objects.requireNonNull(adsState); + this.deviceState = Objects.requireNonNull(deviceState); + this.length = null; + this.data = Objects.requireNonNull(data); + this.lengthSupplier = data; + this.calculated = true; } public static ADSWriteControlRequest of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, ADSState adsState, DeviceState deviceState, Length length, Data data) { @@ -87,13 +103,13 @@ public class ADSWriteControlRequest extends ADSAbstractRequest { return new ADSWriteControlRequest(amsHeader, adsState, deviceState, length, data); } - public static ADSWriteControlRequest of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, ADSState adsState, DeviceState deviceState, Length length, Data data) { - return new ADSWriteControlRequest(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, adsState, deviceState, length, data); + public static ADSWriteControlRequest of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, ADSState adsState, DeviceState deviceState, Data data) { + return new ADSWriteControlRequest(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, adsState, deviceState, data); } @Override public ADSData getAdsData() { - return buildADSData(adsState, deviceState, length, data); + return buildADSData(adsState, deviceState, (calculated ? Length.of(lengthSupplier.getCalculatedLength()) : length), data); } @Override @@ -101,7 +117,7 @@ public class ADSWriteControlRequest extends ADSAbstractRequest { return "ADSWriteControlRequest{" + "adsState=" + adsState + ", deviceState=" + deviceState + - ", length=" + length + + ", length=" + (calculated ? Length.of(lengthSupplier.getCalculatedLength()) : length) + ", data=" + data + "} " + super.toString(); } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlResponse.java index 19d3282..207e9bd 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteControlResponse.java @@ -27,6 +27,8 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import java.util.Objects; + /** * Changes the ADS status and the device status of an ADS device. */ @@ -39,12 +41,12 @@ public class ADSWriteControlResponse extends ADSAbstractResponse { protected ADSWriteControlResponse(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result) { super(amstcpHeader, amsHeader); - this.result = result; + this.result = Objects.requireNonNull(result); } protected ADSWriteControlResponse(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.result = result; + this.result = Objects.requireNonNull(result); } public static ADSWriteControlResponse of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result) { diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteRequest.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteRequest.java index e60eb42..bd3d054 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteRequest.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteRequest.java @@ -18,10 +18,7 @@ */ package org.apache.plc4x.java.ads.api.commands; -import org.apache.plc4x.java.ads.api.commands.types.Data; -import org.apache.plc4x.java.ads.api.commands.types.IndexGroup; -import org.apache.plc4x.java.ads.api.commands.types.IndexOffset; -import org.apache.plc4x.java.ads.api.commands.types.Length; +import org.apache.plc4x.java.ads.api.commands.types.*; import org.apache.plc4x.java.ads.api.generic.ADSData; import org.apache.plc4x.java.ads.api.generic.AMSHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; @@ -29,6 +26,9 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSNetId; import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import org.apache.plc4x.java.ads.api.util.LengthSupplier; + +import java.util.Objects; /** * With ADS Write data can be written to an ADS device. The data are addressed by the Index Group and the Index Offset. @@ -53,28 +53,41 @@ public class ADSWriteRequest extends ADSAbstractRequest { */ private final Data data; + //// + // Used when fields should be calculated. TODO: check if we better work with a subclass. + private final LengthSupplier lengthSupplier; + private final boolean calculated; + // + /// + protected ADSWriteRequest(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, Length length, Data data) { super(amstcpHeader, amsHeader); - this.indexGroup = indexGroup; - this.indexOffset = indexOffset; - this.length = length; - this.data = data; + this.indexGroup = Objects.requireNonNull(indexGroup); + this.indexOffset = Objects.requireNonNull(indexOffset); + this.length = Objects.requireNonNull(length); + this.data = Objects.requireNonNull(data); + this.lengthSupplier = null; + this.calculated = false; } protected ADSWriteRequest(AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, Length length, Data data) { super(amsHeader); - this.indexGroup = indexGroup; - this.indexOffset = indexOffset; - this.length = length; - this.data = data; + this.indexGroup = Objects.requireNonNull(indexGroup); + this.indexOffset = Objects.requireNonNull(indexOffset); + this.length = Objects.requireNonNull(length); + this.data = Objects.requireNonNull(data); + this.lengthSupplier = null; + this.calculated = false; } - protected ADSWriteRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, IndexGroup indexGroup, IndexOffset indexOffset, Length length, Data data) { + protected ADSWriteRequest(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, IndexGroup indexGroup, IndexOffset indexOffset, Data data) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.indexGroup = indexGroup; - this.indexOffset = indexOffset; - this.length = length; - this.data = data; + this.indexGroup = Objects.requireNonNull(indexGroup); + this.indexOffset = Objects.requireNonNull(indexOffset); + this.length = null; + this.data = Objects.requireNonNull(data); + this.lengthSupplier = () -> data.getCalculatedLength(); + this.calculated = true; } public static ADSWriteRequest of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, IndexGroup indexGroup, IndexOffset indexOffset, Length length, Data data) { @@ -85,13 +98,13 @@ public class ADSWriteRequest extends ADSAbstractRequest { return new ADSWriteRequest(amsHeader, indexGroup, indexOffset, length, data); } - public static ADSWriteRequest of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, IndexGroup indexGroup, IndexOffset indexOffset, Length length, Data data) { - return new ADSWriteRequest(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, indexGroup, indexOffset, length, data); + public static ADSWriteRequest of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, IndexGroup indexGroup, IndexOffset indexOffset, Data data) { + return new ADSWriteRequest(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, indexGroup, indexOffset, data); } @Override public ADSData getAdsData() { - return buildADSData(indexGroup, indexOffset, length, data); + return buildADSData(indexGroup, indexOffset, (calculated ? WriteLength.of(lengthSupplier.getCalculatedLength()) : length), data); } @Override @@ -99,7 +112,7 @@ public class ADSWriteRequest extends ADSAbstractRequest { return "ADSWriteRequest{" + "indexGroup=" + indexGroup + ", indexOffset=" + indexOffset + - ", length=" + length + + ", length=" + (calculated ? WriteLength.of(lengthSupplier.getCalculatedLength()) : length) + ", data=" + data + "} " + super.toString(); } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteResponse.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteResponse.java index 9b2925b..a2f7a1b 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteResponse.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/ADSWriteResponse.java @@ -27,6 +27,8 @@ import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Command; import org.apache.plc4x.java.ads.api.generic.types.Invoke; +import java.util.Objects; + /** * With ADS Write data can be written to an ADS device. */ @@ -40,12 +42,12 @@ public class ADSWriteResponse extends ADSAbstractResponse { protected ADSWriteResponse(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result) { super(amstcpHeader, amsHeader); - this.result = result; + this.result = Objects.requireNonNull(result); } protected ADSWriteResponse(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Invoke invokeId, Result result) { super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId); - this.result = result; + this.result = Objects.requireNonNull(result); } public static ADSWriteResponse of(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, Result result) { diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/UnknownCommand.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/UnknownCommand.java index d1e3aa9..0e983d7 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/UnknownCommand.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/UnknownCommand.java @@ -25,6 +25,8 @@ import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.AMSTCPPaket; import org.apache.plc4x.java.ads.api.generic.types.Command; +import java.util.Objects; + /** * Unknown ADS Package */ @@ -35,7 +37,7 @@ public class UnknownCommand extends AMSTCPPaket { protected UnknownCommand(AMSTCPHeader amstcpHeader, AMSHeader amsHeader, ByteBuf remainingBytes) { super(amstcpHeader, amsHeader); - this.remainingBytes = remainingBytes; + this.remainingBytes = Objects.requireNonNull(remainingBytes); } @Override diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsNotificationSample.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsNotificationSample.java index 24282a0..0f224fa 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsNotificationSample.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsNotificationSample.java @@ -20,6 +20,9 @@ package org.apache.plc4x.java.ads.api.commands.types; import io.netty.buffer.ByteBuf; import org.apache.plc4x.java.ads.api.util.ByteReadable; +import org.apache.plc4x.java.ads.api.util.LengthSupplier; + +import java.util.Objects; import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; @@ -38,10 +41,31 @@ public class AdsNotificationSample implements ByteReadable { */ private final Data data; + //// + // Used when fields should be calculated. TODO: check if we better work with a subclass. + private final LengthSupplier lengthSupplier; + private final boolean calculated; + // + /// + + protected AdsNotificationSample(NotificationHandle notificationHandle, Data data) { + this.notificationHandle = Objects.requireNonNull(notificationHandle); + this.sampleSize = null; + this.data = Objects.requireNonNull(data); + calculated = true; + lengthSupplier = () -> data.getCalculatedLength(); + } + protected AdsNotificationSample(NotificationHandle notificationHandle, SampleSize sampleSize, Data data) { - this.notificationHandle = notificationHandle; - this.sampleSize = sampleSize; - this.data = data; + this.notificationHandle = Objects.requireNonNull(notificationHandle); + this.sampleSize = Objects.requireNonNull(sampleSize); + this.data = Objects.requireNonNull(data); + calculated = true; + lengthSupplier = null; + } + + public static AdsNotificationSample of(NotificationHandle notificationHandle, Data data) { + return new AdsNotificationSample(notificationHandle, data); } public static AdsNotificationSample of(NotificationHandle notificationHandle, SampleSize sampleSize, Data data) { @@ -50,14 +74,14 @@ public class AdsNotificationSample implements ByteReadable { @Override public ByteBuf getByteBuf() { - return buildByteBuff(notificationHandle, sampleSize, data); + return buildByteBuff(notificationHandle, (calculated ? SampleSize.of(lengthSupplier.getCalculatedLength()) : sampleSize), data); } @Override public String toString() { return "AdsNotificationSample{" + "notificationHandle=" + notificationHandle + - ", sampleSize=" + sampleSize + + ", sampleSize=" + (calculated ? SampleSize.of(lengthSupplier.getCalculatedLength()) : sampleSize) + ", data=" + data + '}'; } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsReturnCode.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsReturnCode.java index 9a7c534..e9e1b13 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsReturnCode.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsReturnCode.java @@ -18,6 +18,8 @@ */ package org.apache.plc4x.java.ads.api.commands.types; +import java.util.Objects; + /** * Based on spec from: https://infosys.beckhoff.com/content/1033/tcadscommon/html/ads_returncodes.htm */ @@ -171,7 +173,7 @@ public enum AdsReturnCode { if (hex != dec) { throw new IllegalArgumentException("hex " + hex + " is different from dec " + dec); } - this.description = description; + this.description = Objects.requireNonNull(description); this.possibleCauses = possibleCauses; this.solution = solution; } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsStampHeader.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsStampHeader.java index 29f00b7..701768b 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsStampHeader.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/commands/types/AdsStampHeader.java @@ -22,6 +22,7 @@ import io.netty.buffer.ByteBuf; import org.apache.plc4x.java.ads.api.util.ByteReadable; import java.util.List; +import java.util.Objects; import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; @@ -41,9 +42,9 @@ public class AdsStampHeader implements ByteReadable { private final List<AdsNotificationSample> adsNotificationSamples; protected AdsStampHeader(TimeStamp timeStamp, Samples samples, List<AdsNotificationSample> adsNotificationSamples) { - this.timeStamp = timeStamp; - this.samples = samples; - this.adsNotificationSamples = adsNotificationSamples; + this.timeStamp = Objects.requireNonNull(timeStamp); + this.samples = Objects.requireNonNull(samples); + this.adsNotificationSamples = Objects.requireNonNull(adsNotificationSamples); } public static AdsStampHeader of(TimeStamp timeStamp, Samples samples, List<AdsNotificationSample> adsNotificationSamples) { diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSHeader.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSHeader.java index 09dffdc..679ae4c 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSHeader.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSHeader.java @@ -22,6 +22,7 @@ import io.netty.buffer.ByteBuf; import org.apache.plc4x.java.ads.api.generic.types.*; import org.apache.plc4x.java.ads.api.util.ByteReadable; +import static java.util.Objects.requireNonNull; import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; /** @@ -67,22 +68,49 @@ public class AMSHeader implements ByteReadable { */ protected final Invoke invokeId; + //// + // Used when fields should be calculated. TODO: check if we better work with a subclass. + private final DataLengthSupplier lengthSupplier; + private final boolean calculated; + // + /// + protected AMSHeader(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Command commandId, State stateFlags, DataLength dataLength, AMSError code, Invoke invokeId) { - this.targetAmsNetId = targetAmsNetId; - this.targetAmsPort = targetAmsPort; - this.sourceAmsNetId = sourceAmsNetId; - this.sourceAmsPort = sourceAmsPort; - this.commandId = commandId; - this.stateFlags = stateFlags; - this.dataLength = dataLength; - this.code = code; - this.invokeId = invokeId; + this.targetAmsNetId = requireNonNull(targetAmsNetId); + this.targetAmsPort = requireNonNull(targetAmsPort); + this.sourceAmsNetId = requireNonNull(sourceAmsNetId); + this.sourceAmsPort = requireNonNull(sourceAmsPort); + this.commandId = requireNonNull(commandId); + this.stateFlags = requireNonNull(stateFlags); + this.dataLength = requireNonNull(dataLength); + this.code = requireNonNull(code); + this.invokeId = requireNonNull(invokeId); + lengthSupplier = null; + calculated = false; + } + + protected AMSHeader(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Command commandId, State stateFlags, DataLengthSupplier dataLengthSupplier, AMSError code, Invoke invokeId) { + this.targetAmsNetId = requireNonNull(targetAmsNetId); + this.targetAmsPort = requireNonNull(targetAmsPort); + this.sourceAmsNetId = requireNonNull(sourceAmsNetId); + this.sourceAmsPort = requireNonNull(sourceAmsPort); + this.commandId = requireNonNull(commandId); + this.stateFlags = requireNonNull(stateFlags); + this.dataLength = null; + this.code = requireNonNull(code); + this.invokeId = requireNonNull(invokeId); + lengthSupplier = requireNonNull(dataLengthSupplier); + calculated = true; } public static AMSHeader of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Command commandId, State stateFlags, DataLength dataLength, AMSError code, Invoke invokeId) { return new AMSHeader(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, commandId, stateFlags, dataLength, code, invokeId); } + public static AMSHeader of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Command commandId, State stateFlags, DataLengthSupplier dataLengthSupplier, AMSError code, Invoke invokeId) { + return new AMSHeader(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, commandId, stateFlags, dataLengthSupplier, code, invokeId); + } + @Override public ByteBuf getByteBuf() { return buildByteBuff( @@ -92,7 +120,7 @@ public class AMSHeader implements ByteReadable { sourceAmsPort, commandId, stateFlags, - dataLength, + calculated ? DataLength.of(lengthSupplier.getCalculatedLength()) : dataLength, code, invokeId); } @@ -122,7 +150,7 @@ public class AMSHeader implements ByteReadable { } public DataLength getDataLength() { - return dataLength; + return calculated ? DataLength.of(lengthSupplier.getCalculatedLength()) : dataLength; } public AMSError getCode() { @@ -142,9 +170,14 @@ public class AMSHeader implements ByteReadable { ", sourceAmsPort=" + sourceAmsPort + ", commandId=" + commandId + ", stateFlags=" + stateFlags + - ", dataLength=" + dataLength + + ", dataLength=" + (calculated ? DataLength.of(lengthSupplier.getCalculatedLength()) : dataLength) + ", code=" + code + ", invokeId=" + invokeId + '}'; } + + @FunctionalInterface + public interface DataLengthSupplier { + long getCalculatedLength(); + } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java index 1d257ab..b5d18db 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPHeader.java @@ -22,7 +22,9 @@ import io.netty.buffer.ByteBuf; import org.apache.plc4x.java.ads.api.generic.types.Length; import org.apache.plc4x.java.ads.api.util.ByteReadable; import org.apache.plc4x.java.ads.api.util.ByteValue; +import org.apache.plc4x.java.ads.api.util.LengthSupplier; +import static java.util.Objects.requireNonNull; import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; /** @@ -34,18 +36,38 @@ public class AMSTCPHeader implements ByteReadable { protected final Length length; + //// + // Used when fields should be calculated. TODO: check if we better work with a subclass. + private final LengthSupplier[] lengthSuppliers; + private final boolean calculated; + // + /// + protected AMSTCPHeader(Length length) { - this.reserved = Reserved.CONSTANT; - this.length = length; + this.reserved = requireNonNull(Reserved.CONSTANT); + this.length = requireNonNull(length); + lengthSuppliers = null; + calculated = false; + } + + protected AMSTCPHeader(LengthSupplier... lengthSuppliers) { + this.reserved = requireNonNull(Reserved.CONSTANT); + this.length = null; + this.lengthSuppliers = requireNonNull(lengthSuppliers); + calculated = true; } public static AMSTCPHeader of(long length) { return new AMSTCPHeader(Length.of(length)); } + public static AMSTCPHeader of(LengthSupplier... lengthSuppliers) { + return new AMSTCPHeader(lengthSuppliers); + } + @Override public ByteBuf getByteBuf() { - return buildByteBuff(reserved, length); + return buildByteBuff(reserved, (calculated ? Length.of(getCalculatedLength()) : length)); } /** @@ -65,14 +87,22 @@ public class AMSTCPHeader implements ByteReadable { } public long getCalculatedLength() { - return length.getAsLong(); + if (calculated) { + long aggregateLength = 0; + for (LengthSupplier supplier : lengthSuppliers) { + aggregateLength += supplier.getCalculatedLength(); + } + return aggregateLength; + } else { + return length.getAsLong(); + } } @Override public String toString() { return "AMSTCPHeader{" + "reserved=" + reserved + - ", length=" + length + + ", length=" + (calculated ? Length.of(getCalculatedLength()) : length) + '}'; } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPPaket.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPPaket.java index 328440b..b3acc37 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPPaket.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/AMSTCPPaket.java @@ -20,11 +20,10 @@ package org.apache.plc4x.java.ads.api.generic; import io.netty.buffer.ByteBuf; import org.apache.plc4x.java.ads.api.commands.ADSCommandType; -import org.apache.plc4x.java.ads.api.generic.calculated.CalculatedAMSHeader; -import org.apache.plc4x.java.ads.api.generic.calculated.CalculatedAMSTCPHeader; import org.apache.plc4x.java.ads.api.generic.types.*; import org.apache.plc4x.java.ads.api.util.ByteReadable; +import static java.util.Objects.requireNonNull; import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; public abstract class AMSTCPPaket implements ByteReadable { @@ -33,31 +32,32 @@ public abstract class AMSTCPPaket implements ByteReadable { private final AMSHeader amsHeader; public AMSTCPPaket(AMSTCPHeader amstcpHeader, AMSHeader amsHeader) { - this.amstcpHeader = amstcpHeader; - this.amsHeader = amsHeader; + this.amstcpHeader = requireNonNull(amstcpHeader); + this.amsHeader = requireNonNull(amsHeader); } public AMSTCPPaket(AMSHeader amsHeader) { // It is important that we wrap the ads data call as this will initialized in the constructor // so this value will be null if we call adsData now. - this.amstcpHeader = CalculatedAMSTCPHeader.of(amsHeader, () -> getAdsData().getCalculatedLength()); - this.amsHeader = amsHeader; + this.amstcpHeader = AMSTCPHeader.of(requireNonNull(amsHeader), () -> getAdsData().getCalculatedLength()); + this.amsHeader = requireNonNull(amsHeader); } public AMSTCPPaket(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, State stateId, Invoke invokeId) { if (!getClass().isAnnotationPresent(ADSCommandType.class)) { throw new IllegalArgumentException(ADSCommandType.class + " need to be present."); } - this.amsHeader = CalculatedAMSHeader.of( - targetAmsNetId, - targetAmsPort, - sourceAmsNetId, - sourceAmsPort, - getClass().getAnnotation(ADSCommandType.class).value(), - stateId, - () -> DataLength.of(getAdsData().getCalculatedLength()), - invokeId); - this.amstcpHeader = CalculatedAMSTCPHeader.of(amsHeader, () -> getAdsData().getCalculatedLength()); + this.amsHeader = AMSHeader.of( + requireNonNull(targetAmsNetId), + requireNonNull(targetAmsPort), + requireNonNull(sourceAmsNetId), + requireNonNull(sourceAmsPort), + requireNonNull(getClass().getAnnotation(ADSCommandType.class).value()), + requireNonNull(stateId), + () -> getAdsData().getCalculatedLength(), + requireNonNull(AMSError.NONE), + requireNonNull(invokeId)); + this.amstcpHeader = AMSTCPHeader.of(amsHeader, () -> getAdsData().getCalculatedLength()); } public AMSTCPHeader getAmstcpHeader() { diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/calculated/CalculatedAMSHeader.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/calculated/CalculatedAMSHeader.java deleted file mode 100644 index 92134cb..0000000 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/calculated/CalculatedAMSHeader.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - 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.api.generic.calculated; - -import io.netty.buffer.ByteBuf; -import org.apache.plc4x.java.ads.api.generic.AMSHeader; -import org.apache.plc4x.java.ads.api.generic.types.*; - -import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; - -public class CalculatedAMSHeader extends AMSHeader { - - protected final LengthSupplier lengthSupplier; - - protected CalculatedAMSHeader(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Command commandId, State stateId, LengthSupplier lengthSupplier, Invoke invokeId) { - super(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, commandId, stateId, null, AMSError.NONE, invokeId); - this.lengthSupplier = lengthSupplier; - } - - public static CalculatedAMSHeader of(AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort, Command commandId, State stateId, LengthSupplier lengthSupplier, Invoke invokeId) { - return new CalculatedAMSHeader(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, commandId, stateId, lengthSupplier, invokeId); - } - - public interface LengthSupplier { - DataLength getLength(); - } - - @Override - public ByteBuf getByteBuf() { - return buildByteBuff( - targetAmsNetId, - targetAmsPort, - sourceAmsNetId, - sourceAmsPort, - commandId, - stateFlags, - lengthSupplier.getLength(), - code, - invokeId); - } - - @Override - public String toString() { - return "CalculatedAMSHeader{" + - "targetAmsNetId=" + targetAmsNetId + - ", targetAmsPort=" + targetAmsPort + - ", sourceAmsNetId=" + sourceAmsNetId + - ", sourceAmsPort=" + sourceAmsPort + - ", commandId=" + commandId + - ", stateFlags=" + stateFlags + - ", dataLength=" + lengthSupplier.getLength() + - ", code=" + code + - ", invokeId=" + invokeId + - '}'; - } -} diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/calculated/CalculatedAMSTCPHeader.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/calculated/CalculatedAMSTCPHeader.java deleted file mode 100644 index 5afcd99..0000000 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/generic/calculated/CalculatedAMSTCPHeader.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - 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.api.generic.calculated; - -import io.netty.buffer.ByteBuf; -import org.apache.plc4x.java.ads.api.generic.AMSTCPHeader; -import org.apache.plc4x.java.ads.api.generic.types.Length; -import org.apache.plc4x.java.ads.api.util.LengthSupplier; - -import static org.apache.plc4x.java.ads.api.util.ByteReadableUtils.buildByteBuff; - -/** - * AMS/TCP Header 6 bytes contains the length of the data packet. - * This Header is caluclated. Can be used when sending. - */ -public class CalculatedAMSTCPHeader extends AMSTCPHeader { - - protected final LengthSupplier[] lengthSupplier; - - protected CalculatedAMSTCPHeader(LengthSupplier... lengthSupplier) { - super(null); - this.lengthSupplier = lengthSupplier; - } - - public static CalculatedAMSTCPHeader of(LengthSupplier... lengthSupplier) { - return new CalculatedAMSTCPHeader(lengthSupplier); - } - - @Override - public ByteBuf getByteBuf() { - return buildByteBuff(reserved, Length.of(getCalculatedLength())); - } - - @Override - public long getCalculatedLength() { - long aggregateLength = 0; - for (LengthSupplier supplier : lengthSupplier) { - aggregateLength += supplier.getCalculatedLength(); - } - return aggregateLength; - } - - @Override - public String toString() { - return "CalculatedAMSTCPHeader{" + - "reserved=" + reserved + - ", length=" + getCalculatedLength() + - '}'; - } -} diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/netty/Plc4XADSProtocol.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/netty/Plc4XADSProtocol.java index 8a80d55..95f90f5 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/netty/Plc4XADSProtocol.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/netty/Plc4XADSProtocol.java @@ -115,7 +115,7 @@ public class Plc4XADSProtocol extends MessageToMessageCodec<AMSTCPPaket, PlcRequ byte[] bytes = byteArrayOutputStream.toByteArray(); Length length = Length.of(bytes.length); Data data = Data.of(bytes); - AMSTCPPaket amstcpPaket = ADSWriteRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, indexGroup, indexOffset, length, data); + AMSTCPPaket amstcpPaket = ADSWriteRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, indexGroup, indexOffset, data); out.add(amstcpPaket); } diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSDumper.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSDumper.java index 7846ba8..f9881f0 100644 --- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSDumper.java +++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSDumper.java @@ -23,7 +23,6 @@ import org.apache.plc4x.java.ads.api.commands.ADSWriteRequest; import org.apache.plc4x.java.ads.api.commands.types.Data; import org.apache.plc4x.java.ads.api.commands.types.IndexGroup; import org.apache.plc4x.java.ads.api.commands.types.IndexOffset; -import org.apache.plc4x.java.ads.api.commands.types.Length; import org.apache.plc4x.java.ads.api.generic.types.AMSNetId; import org.apache.plc4x.java.ads.api.generic.types.AMSPort; import org.apache.plc4x.java.ads.api.generic.types.Invoke; @@ -63,7 +62,6 @@ public class ADSDumper { Invoke.of(0), IndexGroup.of(1), IndexOffset.of(3), - Length.of(randomString.getBytes().length), Data.of(randomString.getBytes()) ); diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/netty/ADSProtocolTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/netty/ADSProtocolTest.java index a6d12f2..d5e0a2f 100644 --- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/netty/ADSProtocolTest.java +++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/netty/ADSProtocolTest.java @@ -78,15 +78,13 @@ public class ADSProtocolTest { ), ADSDeviceNotificationRequest.of( targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, - // TODO: must be calculated when using this constructor - Length.of(32), Stamps.of(1), Collections.singletonList( // Nano times need to be offset by (1.1.1970 - 1.1.1601) years in nanos AdsStampHeader.of(TimeStamp.of(System.nanoTime()), Samples.of(1), Collections.singletonList( - AdsNotificationSample.of(NotificationHandle.of(0), SampleSize.of(data.getCalculatedLength()), data)) + AdsNotificationSample.of(NotificationHandle.of(0), data)) ) ) ), @@ -113,7 +111,6 @@ public class ADSProtocolTest { ADSReadResponse.of( targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0), - Length.of(data.getCalculatedLength()), data ), ADSReadStateRequest.of( @@ -128,20 +125,17 @@ public class ADSProtocolTest { IndexGroup.of(0), IndexOffset.of(0), ReadLength.of(data.getCalculatedLength()), - WriteLength.of(data.getCalculatedLength()), data ), ADSReadWriteResponse.of( targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0), - Length.of(data.getCalculatedLength()), data ), ADSWriteControlRequest.of( targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, ADSState.of(0xaffe), DeviceState.of(0xaffe), - Length.of(data.getCalculatedLength()), data ), ADSWriteControlResponse.of( @@ -152,7 +146,6 @@ public class ADSProtocolTest { targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, IndexGroup.of(0), IndexOffset.of(0), - Length.of(data.getCalculatedLength()), data ), ADSWriteResponse.of( -- To stop receiving notification emails like this one, please contact sru...@apache.org.