You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2022/05/13 15:19:49 UTC

[plc4x] branch develop updated (4bdd42af1c -> 09192feb5e)

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

sruehl pushed a change to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


    from 4bdd42af1c fix(bacnet): fixed several bugs
     new c21a1842f2 feat(codegen): changed validation to fail parsing conditionally
     new 09192feb5e fix(bacnet): fixed several parsing errors

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../templates/go/complex-type-template.go.ftlh     |   4 +-
 .../templates/java/complex-type-template.java.ftlh |   4 +-
 .../plugins/codegenerator/language/mspec/MSpec.g4  |   2 +-
 .../mspec/model/fields/DefaultValidationField.java |  12 +-
 .../mspec/parser/MessageFormatListener.java        |   6 +-
 .../readwrite/model/BACnetApplicationTag.go        |   2 +-
 .../bacnetip/readwrite/model/BACnetClosingTag.go   |   2 +-
 .../BACnetConfirmedServiceRequestAuthenticate.go   |   2 +-
 ...tConfirmedServiceRequestConfirmedTextMessage.go |   2 +-
 .../BACnetConfirmedServiceRequestCreateObject.go   |   2 +-
 .../BACnetConfirmedServiceRequestDeleteObject.go   |   2 +-
 ...tConfirmedServiceRequestGetEnrollmentSummary.go |   2 +-
 ...etConfirmedServiceRequestLifeSafetyOperation.go |   2 +-
 ...nfirmedServiceRequestReadPropertyConditional.go |   2 +-
 .../BACnetConfirmedServiceRequestRequestKey.go     |   2 +-
 ...tConfirmedServiceRequestSubscribeCOVProperty.go |   2 +-
 ...edServiceRequestSubscribeCOVPropertyMultiple.go |   2 +-
 .../model/BACnetConfirmedServiceRequestVTClose.go  |   2 +-
 .../model/BACnetConfirmedServiceRequestVTData.go   |   2 +-
 .../model/BACnetConfirmedServiceRequestVTOpen.go   |   2 +-
 .../model/BACnetConstructedDataElement.go          |   4 +-
 .../model/BACnetConstructedDataUnspecified.go      | 137 +--------------
 .../bacnetip/readwrite/model/BACnetContextTag.go   |   2 +-
 .../readwrite/model/BACnetContextTagBoolean.go     |   2 +-
 .../readwrite/model/BACnetContextTagDeviceState.go |   2 +-
 .../readwrite/model/BACnetContextTagDouble.go      |   2 +-
 .../readwrite/model/BACnetContextTagEventState.go  |   2 +-
 .../readwrite/model/BACnetContextTagEventType.go   |   2 +-
 .../readwrite/model/BACnetContextTagNotifyType.go  |   2 +-
 .../readwrite/model/BACnetContextTagNull.go        |   2 +-
 .../readwrite/model/BACnetContextTagOctetString.go |   2 +-
 .../readwrite/model/BACnetContextTagReal.go        |   2 +-
 ...CnetNotificationParametersExtendedParameters.go | 193 +++++++++++++++++++--
 .../model/BACnetNotificationParametersUnmapped.go  |   2 +-
 .../bacnetip/readwrite/model/BACnetOpeningTag.go   |   2 +-
 .../model/BACnetPropertyStateActionUnmapped.go     |   2 +-
 .../model/BACnetServiceAckAcknowledgeAlarm.go      |   2 +-
 .../model/BACnetServiceAckAddListElement.go        |   2 +-
 .../model/BACnetServiceAckAuthenticate.go          |   2 +-
 .../BACnetServiceAckConfirmedCovNotification.go    |   2 +-
 ...etServiceAckConfirmedCovNotificationMultiple.go |   2 +-
 .../BACnetServiceAckConfirmedEventNotification.go  |   2 +-
 .../model/BACnetServiceAckConfirmedTextMessage.go  |   2 +-
 .../model/BACnetServiceAckCreateObject.go          |   2 +-
 .../BACnetServiceAckDeviceCommunicationControl.go  |   2 +-
 .../model/BACnetServiceAckGetAlarmSummary.go       |   2 +-
 .../model/BACnetServiceAckGetEnrollmentSummary.go  |   2 +-
 .../model/BACnetServiceAckLifeSafetyOperation.go   |   2 +-
 .../BACnetServiceAckReadPropertyConditional.go     |   2 +-
 .../model/BACnetServiceAckReinitializeDevice.go    |   2 +-
 .../model/BACnetServiceAckRemoveListElement.go     |   2 +-
 .../readwrite/model/BACnetServiceAckRequestKey.go  |   2 +-
 .../model/BACnetServiceAckSubscribeCov.go          |   2 +-
 .../model/BACnetServiceAckSubscribeCovProperty.go  |   2 +-
 ...BACnetServiceAckSubscribeCovPropertyMultiple.go |   2 +-
 .../readwrite/model/BACnetServiceAckVTClose.go     |   2 +-
 .../readwrite/model/BACnetServiceAckVTData.go      |   2 +-
 .../readwrite/model/BACnetServiceAckVTOpen.go      |   2 +-
 .../model/BACnetServiceAckWriteProperty.go         |   2 +-
 .../model/BACnetServiceAckWritePropertyMultiple.go |   2 +-
 .../model/BACnetTagPayloadSignedInteger.go         |   2 +-
 .../model/BACnetTagPayloadUnsignedInteger.go       |   2 +-
 ...iceRequestUnconfirmedCOVNotificationMultiple.go |   2 +-
 ...onfirmedServiceRequestUnconfirmedTextMessage.go |   2 +-
 .../BACnetUnconfirmedServiceRequestWriteGroup.go   |   2 +-
 .../plc4go/bacnetip/readwrite/model/NPDU.go        |   2 +-
 .../plc4go/cbus/readwrite/model/CALReplyLong.go    |   2 +-
 .../model/MonitoredSALLongFormSmartMode.go         |   2 +-
 .../cbus/readwrite/model/StatusRequestLevel.go     |   2 +-
 plc4go/internal/plc4go/spi/utils/Utils.go          |  16 +-
 .../plc4x/java/bacnetip/RandomPackagesTest.java    |   9 +-
 ...xception.java => ParseValidationException.java} |   8 +-
 .../resources/protocols/bacnetip/bacnetip.mspec    |  79 +++++----
 73 files changed, 337 insertions(+), 259 deletions(-)
 copy plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/{ParseAssertException.java => ParseValidationException.java} (79%)


[plc4x] 02/02: fix(bacnet): fixed several parsing errors

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 09192feb5e83f3f96971e7bf0d39c146d80dea72
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri May 13 17:19:38 2022 +0200

    fix(bacnet): fixed several parsing errors
---
 .../readwrite/model/BACnetApplicationTag.go        |   2 +-
 .../bacnetip/readwrite/model/BACnetClosingTag.go   |   2 +-
 .../BACnetConfirmedServiceRequestAuthenticate.go   |   2 +-
 ...tConfirmedServiceRequestConfirmedTextMessage.go |   2 +-
 .../BACnetConfirmedServiceRequestCreateObject.go   |   2 +-
 .../BACnetConfirmedServiceRequestDeleteObject.go   |   2 +-
 ...tConfirmedServiceRequestGetEnrollmentSummary.go |   2 +-
 ...etConfirmedServiceRequestLifeSafetyOperation.go |   2 +-
 ...nfirmedServiceRequestReadPropertyConditional.go |   2 +-
 .../BACnetConfirmedServiceRequestRequestKey.go     |   2 +-
 ...tConfirmedServiceRequestSubscribeCOVProperty.go |   2 +-
 ...edServiceRequestSubscribeCOVPropertyMultiple.go |   2 +-
 .../model/BACnetConfirmedServiceRequestVTClose.go  |   2 +-
 .../model/BACnetConfirmedServiceRequestVTData.go   |   2 +-
 .../model/BACnetConfirmedServiceRequestVTOpen.go   |   2 +-
 .../model/BACnetConstructedDataElement.go          |   4 +-
 .../model/BACnetConstructedDataUnspecified.go      | 137 +--------------
 .../bacnetip/readwrite/model/BACnetContextTag.go   |   2 +-
 .../readwrite/model/BACnetContextTagBoolean.go     |   2 +-
 .../readwrite/model/BACnetContextTagDeviceState.go |   2 +-
 .../readwrite/model/BACnetContextTagDouble.go      |   2 +-
 .../readwrite/model/BACnetContextTagEventState.go  |   2 +-
 .../readwrite/model/BACnetContextTagEventType.go   |   2 +-
 .../readwrite/model/BACnetContextTagNotifyType.go  |   2 +-
 .../readwrite/model/BACnetContextTagNull.go        |   2 +-
 .../readwrite/model/BACnetContextTagOctetString.go |   2 +-
 .../readwrite/model/BACnetContextTagReal.go        |   2 +-
 ...CnetNotificationParametersExtendedParameters.go | 193 +++++++++++++++++++--
 .../model/BACnetNotificationParametersUnmapped.go  |   2 +-
 .../bacnetip/readwrite/model/BACnetOpeningTag.go   |   2 +-
 .../model/BACnetPropertyStateActionUnmapped.go     |   2 +-
 .../model/BACnetServiceAckAcknowledgeAlarm.go      |   2 +-
 .../model/BACnetServiceAckAddListElement.go        |   2 +-
 .../model/BACnetServiceAckAuthenticate.go          |   2 +-
 .../BACnetServiceAckConfirmedCovNotification.go    |   2 +-
 ...etServiceAckConfirmedCovNotificationMultiple.go |   2 +-
 .../BACnetServiceAckConfirmedEventNotification.go  |   2 +-
 .../model/BACnetServiceAckConfirmedTextMessage.go  |   2 +-
 .../model/BACnetServiceAckCreateObject.go          |   2 +-
 .../BACnetServiceAckDeviceCommunicationControl.go  |   2 +-
 .../model/BACnetServiceAckGetAlarmSummary.go       |   2 +-
 .../model/BACnetServiceAckGetEnrollmentSummary.go  |   2 +-
 .../model/BACnetServiceAckLifeSafetyOperation.go   |   2 +-
 .../BACnetServiceAckReadPropertyConditional.go     |   2 +-
 .../model/BACnetServiceAckReinitializeDevice.go    |   2 +-
 .../model/BACnetServiceAckRemoveListElement.go     |   2 +-
 .../readwrite/model/BACnetServiceAckRequestKey.go  |   2 +-
 .../model/BACnetServiceAckSubscribeCov.go          |   2 +-
 .../model/BACnetServiceAckSubscribeCovProperty.go  |   2 +-
 ...BACnetServiceAckSubscribeCovPropertyMultiple.go |   2 +-
 .../readwrite/model/BACnetServiceAckVTClose.go     |   2 +-
 .../readwrite/model/BACnetServiceAckVTData.go      |   2 +-
 .../readwrite/model/BACnetServiceAckVTOpen.go      |   2 +-
 .../model/BACnetServiceAckWriteProperty.go         |   2 +-
 .../model/BACnetServiceAckWritePropertyMultiple.go |   2 +-
 .../model/BACnetTagPayloadSignedInteger.go         |   2 +-
 .../model/BACnetTagPayloadUnsignedInteger.go       |   2 +-
 ...iceRequestUnconfirmedCOVNotificationMultiple.go |   2 +-
 ...onfirmedServiceRequestUnconfirmedTextMessage.go |   2 +-
 .../BACnetUnconfirmedServiceRequestWriteGroup.go   |   2 +-
 .../plc4go/bacnetip/readwrite/model/NPDU.go        |   2 +-
 .../plc4go/cbus/readwrite/model/CALReplyLong.go    |   2 +-
 .../model/MonitoredSALLongFormSmartMode.go         |   2 +-
 .../cbus/readwrite/model/StatusRequestLevel.go     |   2 +-
 plc4go/internal/plc4go/spi/utils/Utils.go          |  16 +-
 .../plc4x/java/bacnetip/RandomPackagesTest.java    |   9 +-
 .../resources/protocols/bacnetip/bacnetip.mspec    |  79 +++++----
 67 files changed, 311 insertions(+), 249 deletions(-)

diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTag.go
index 16bb1ab2b2..0b9c2bfba9 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTag.go
@@ -162,7 +162,7 @@ func BACnetApplicationTagParse(readBuffer utils.ReadBuffer) (*BACnetApplicationT
 
 	// Validation
 	if !(bool((header.GetTagClass()) == (TagClass_APPLICATION_TAGS))) {
-		return nil, utils.ParseAssertError{"should be a application tag"}
+		return nil, utils.ParseValidationError{"should be a application tag"}
 	}
 
 	// Virtual field
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetClosingTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetClosingTag.go
index f6e835b724..1cd0e7a6a2 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetClosingTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetClosingTag.go
@@ -119,7 +119,7 @@ func BACnetClosingTagParse(readBuffer utils.ReadBuffer, tagNumberArgument uint8,
 
 	// Validation
 	if !(bool((actualLength) == (7))) {
-		return nil, utils.ParseAssertError{"closing tag should have a value of 7"}
+		return nil, utils.ParseValidationError{"closing tag should have a value of 7"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetClosingTag"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAuthenticate.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAuthenticate.go
index b470d27efe..35cd1724cc 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAuthenticate.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAuthenticate.go
@@ -117,7 +117,7 @@ func BACnetConfirmedServiceRequestAuthenticateParse(readBuffer utils.ReadBuffer,
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestAuthenticate"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
index 45c9c57808..6181f80df1 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
@@ -117,7 +117,7 @@ func BACnetConfirmedServiceRequestConfirmedTextMessageParse(readBuffer utils.Rea
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestConfirmedTextMessage"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
index 258f8acfc1..97ed1dcd88 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
@@ -117,7 +117,7 @@ func BACnetConfirmedServiceRequestCreateObjectParse(readBuffer utils.ReadBuffer,
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestCreateObject"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
index 40365caeb5..9068ba4ec6 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
@@ -117,7 +117,7 @@ func BACnetConfirmedServiceRequestDeleteObjectParse(readBuffer utils.ReadBuffer,
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestDeleteObject"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go
index 69b1b69821..d23145e8b2 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go
@@ -117,7 +117,7 @@ func BACnetConfirmedServiceRequestGetEnrollmentSummaryParse(readBuffer utils.Rea
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestGetEnrollmentSummary"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go
index 0dbccecc11..3bd43262cc 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go
@@ -117,7 +117,7 @@ func BACnetConfirmedServiceRequestLifeSafetyOperationParse(readBuffer utils.Read
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestLifeSafetyOperation"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyConditional.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyConditional.go
index 08e2a66b15..ea3ba5e183 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyConditional.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyConditional.go
@@ -117,7 +117,7 @@ func BACnetConfirmedServiceRequestReadPropertyConditionalParse(readBuffer utils.
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestReadPropertyConditional"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRequestKey.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRequestKey.go
index 2f13bbf988..562100dfeb 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRequestKey.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRequestKey.go
@@ -117,7 +117,7 @@ func BACnetConfirmedServiceRequestRequestKeyParse(readBuffer utils.ReadBuffer, s
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestRequestKey"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go
index 4f24fd8838..0e7feca699 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go
@@ -117,7 +117,7 @@ func BACnetConfirmedServiceRequestSubscribeCOVPropertyParse(readBuffer utils.Rea
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestSubscribeCOVProperty"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go
index 7474e26350..27b9aa6851 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go
@@ -117,7 +117,7 @@ func BACnetConfirmedServiceRequestSubscribeCOVPropertyMultipleParse(readBuffer u
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go
index 6f42db7304..43f4da544a 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go
@@ -117,7 +117,7 @@ func BACnetConfirmedServiceRequestVTCloseParse(readBuffer utils.ReadBuffer, serv
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestVTClose"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go
index 91416d8355..89590c0ecd 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go
@@ -117,7 +117,7 @@ func BACnetConfirmedServiceRequestVTDataParse(readBuffer utils.ReadBuffer, servi
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestVTData"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go
index c8826a8a04..3ccb1ed107 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go
@@ -117,7 +117,7 @@ func BACnetConfirmedServiceRequestVTOpenParse(readBuffer utils.ReadBuffer, servi
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConfirmedServiceRequestVTOpen"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go
index ccdb680701..f17d0b653f 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataElement.go
@@ -233,7 +233,7 @@ func BACnetConstructedDataElementParse(readBuffer utils.ReadBuffer, objectType B
 
 	// Validation
 	if !(bool(!(isContextTag)) || bool(bool(bool(isContextTag) && bool(bool((peekedTagHeader.GetLengthValueType()) != (0x7)))))) {
-		return nil, utils.ParseAssertError{"unexpected closing tag"}
+		return nil, utils.ParseValidationError{"unexpected closing tag"}
 	}
 
 	// Optional Field (applicationTag) (Can be skipped, if a given expression evaluates to false)
@@ -301,7 +301,7 @@ func BACnetConstructedDataElementParse(readBuffer utils.ReadBuffer, objectType B
 
 	// Validation
 	if !(bool(bool(isApplicationTag) || bool(isContextTag)) || bool(isConstructedData)) {
-		return nil, utils.ParseAssertError{"BACnetConstructedDataElement could not parse anything"}
+		return nil, utils.ParseValidationError{"BACnetConstructedDataElement could not parse anything"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetConstructedDataElement"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataUnspecified.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataUnspecified.go
index 0a042a2f58..58551782ee 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataUnspecified.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConstructedDataUnspecified.go
@@ -22,7 +22,6 @@ package model
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"github.com/pkg/errors"
-	"io"
 )
 
 // Code generated by code-generation. DO NOT EDIT.
@@ -30,9 +29,7 @@ import (
 // BACnetConstructedDataUnspecified is the data-structure of this message
 type BACnetConstructedDataUnspecified struct {
 	*BACnetConstructedData
-	Data               []*BACnetConstructedDataElement
-	PropertyIdentifier *BACnetContextTagPropertyIdentifier
-	Content            *BACnetApplicationTag
+	Data []*BACnetConstructedDataElement
 
 	// Arguments.
 	TagNumber                  uint8
@@ -44,12 +41,6 @@ type IBACnetConstructedDataUnspecified interface {
 	IBACnetConstructedData
 	// GetData returns Data (property field)
 	GetData() []*BACnetConstructedDataElement
-	// GetPropertyIdentifier returns PropertyIdentifier (property field)
-	GetPropertyIdentifier() *BACnetContextTagPropertyIdentifier
-	// GetContent returns Content (property field)
-	GetContent() *BACnetApplicationTag
-	// GetHasData returns HasData (virtual field)
-	GetHasData() bool
 	// GetLengthInBytes returns the length in bytes
 	GetLengthInBytes() uint16
 	// GetLengthInBits returns the length in bits
@@ -90,42 +81,15 @@ func (m *BACnetConstructedDataUnspecified) GetData() []*BACnetConstructedDataEle
 	return m.Data
 }
 
-func (m *BACnetConstructedDataUnspecified) GetPropertyIdentifier() *BACnetContextTagPropertyIdentifier {
-	return m.PropertyIdentifier
-}
-
-func (m *BACnetConstructedDataUnspecified) GetContent() *BACnetApplicationTag {
-	return m.Content
-}
-
-///////////////////////
-///////////////////////
-///////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////
-/////////////////////// Accessors for virtual fields.
-///////////////////////
-
-func (m *BACnetConstructedDataUnspecified) GetHasData() bool {
-	propertyIdentifier := m.PropertyIdentifier
-	_ = propertyIdentifier
-	content := m.Content
-	_ = content
-	return bool(bool((len(m.GetData())) != (0)))
-}
-
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
 // NewBACnetConstructedDataUnspecified factory function for BACnetConstructedDataUnspecified
-func NewBACnetConstructedDataUnspecified(data []*BACnetConstructedDataElement, propertyIdentifier *BACnetContextTagPropertyIdentifier, content *BACnetApplicationTag, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag, tagNumber uint8, propertyIdentifierArgument BACnetContextTagPropertyIdentifier) *BACnetConstructedDataUnspecified {
+func NewBACnetConstructedDataUnspecified(data []*BACnetConstructedDataElement, openingTag *BACnetOpeningTag, closingTag *BACnetClosingTag, tagNumber uint8, propertyIdentifierArgument BACnetContextTagPropertyIdentifier) *BACnetConstructedDataUnspecified {
 	_result := &BACnetConstructedDataUnspecified{
 		Data:                  data,
-		PropertyIdentifier:    propertyIdentifier,
-		Content:               content,
 		BACnetConstructedData: NewBACnetConstructedData(openingTag, closingTag, tagNumber, propertyIdentifierArgument),
 	}
 	_result.Child = _result
@@ -166,18 +130,6 @@ func (m *BACnetConstructedDataUnspecified) GetLengthInBitsConditional(lastItem b
 		}
 	}
 
-	// A virtual field doesn't have any in- or output.
-
-	// Optional Field (propertyIdentifier)
-	if m.PropertyIdentifier != nil {
-		lengthInBits += (*m.PropertyIdentifier).GetLengthInBits()
-	}
-
-	// Optional Field (content)
-	if m.Content != nil {
-		lengthInBits += (*m.Content).GetLengthInBits()
-	}
-
 	return lengthInBits
 }
 
@@ -212,53 +164,6 @@ func BACnetConstructedDataUnspecifiedParse(readBuffer utils.ReadBuffer, tagNumbe
 		return nil, closeErr
 	}
 
-	// Virtual field
-	_hasData := bool((len(data)) != (0))
-	hasData := bool(_hasData)
-	_ = hasData
-
-	// Optional Field (propertyIdentifier) (Can be skipped, if a given expression evaluates to false)
-	var propertyIdentifier *BACnetContextTagPropertyIdentifier = nil
-	if !(hasData) {
-		currentPos = readBuffer.GetPos()
-		if pullErr := readBuffer.PullContext("propertyIdentifier"); pullErr != nil {
-			return nil, pullErr
-		}
-		_val, _err := BACnetContextTagParse(readBuffer, uint8(0), BACnetDataType_BACNET_PROPERTY_IDENTIFIER)
-		switch {
-		case errors.Is(_err, utils.ParseAssertError{}) || errors.Is(_err, io.EOF):
-			readBuffer.Reset(currentPos)
-		case _err != nil:
-			return nil, errors.Wrap(_err, "Error parsing 'propertyIdentifier' field")
-		default:
-			propertyIdentifier = CastBACnetContextTagPropertyIdentifier(_val)
-			if closeErr := readBuffer.CloseContext("propertyIdentifier"); closeErr != nil {
-				return nil, closeErr
-			}
-		}
-	}
-
-	// Optional Field (content) (Can be skipped, if a given expression evaluates to false)
-	var content *BACnetApplicationTag = nil
-	if !(hasData) {
-		currentPos = readBuffer.GetPos()
-		if pullErr := readBuffer.PullContext("content"); pullErr != nil {
-			return nil, pullErr
-		}
-		_val, _err := BACnetApplicationTagParse(readBuffer)
-		switch {
-		case errors.Is(_err, utils.ParseAssertError{}) || errors.Is(_err, io.EOF):
-			readBuffer.Reset(currentPos)
-		case _err != nil:
-			return nil, errors.Wrap(_err, "Error parsing 'content' field")
-		default:
-			content = CastBACnetApplicationTag(_val)
-			if closeErr := readBuffer.CloseContext("content"); closeErr != nil {
-				return nil, closeErr
-			}
-		}
-	}
-
 	if closeErr := readBuffer.CloseContext("BACnetConstructedDataUnspecified"); closeErr != nil {
 		return nil, closeErr
 	}
@@ -266,8 +171,6 @@ func BACnetConstructedDataUnspecifiedParse(readBuffer utils.ReadBuffer, tagNumbe
 	// Create a partially initialized instance
 	_child := &BACnetConstructedDataUnspecified{
 		Data:                  data,
-		PropertyIdentifier:    CastBACnetContextTagPropertyIdentifier(propertyIdentifier),
-		Content:               CastBACnetApplicationTag(content),
 		BACnetConstructedData: &BACnetConstructedData{},
 	}
 	_child.BACnetConstructedData.Child = _child
@@ -295,42 +198,6 @@ func (m *BACnetConstructedDataUnspecified) Serialize(writeBuffer utils.WriteBuff
 				return popErr
 			}
 		}
-		// Virtual field
-		if _hasDataErr := writeBuffer.WriteVirtual("hasData", m.GetHasData()); _hasDataErr != nil {
-			return errors.Wrap(_hasDataErr, "Error serializing 'hasData' field")
-		}
-
-		// Optional Field (propertyIdentifier) (Can be skipped, if the value is null)
-		var propertyIdentifier *BACnetContextTagPropertyIdentifier = nil
-		if m.PropertyIdentifier != nil {
-			if pushErr := writeBuffer.PushContext("propertyIdentifier"); pushErr != nil {
-				return pushErr
-			}
-			propertyIdentifier = m.PropertyIdentifier
-			_propertyIdentifierErr := propertyIdentifier.Serialize(writeBuffer)
-			if popErr := writeBuffer.PopContext("propertyIdentifier"); popErr != nil {
-				return popErr
-			}
-			if _propertyIdentifierErr != nil {
-				return errors.Wrap(_propertyIdentifierErr, "Error serializing 'propertyIdentifier' field")
-			}
-		}
-
-		// Optional Field (content) (Can be skipped, if the value is null)
-		var content *BACnetApplicationTag = nil
-		if m.Content != nil {
-			if pushErr := writeBuffer.PushContext("content"); pushErr != nil {
-				return pushErr
-			}
-			content = m.Content
-			_contentErr := content.Serialize(writeBuffer)
-			if popErr := writeBuffer.PopContext("content"); popErr != nil {
-				return popErr
-			}
-			if _contentErr != nil {
-				return errors.Wrap(_contentErr, "Error serializing 'content' field")
-			}
-		}
 
 		if popErr := writeBuffer.PopContext("BACnetConstructedDataUnspecified"); popErr != nil {
 			return popErr
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTag.go
index 52ec5c3e2a..4639674405 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTag.go
@@ -180,7 +180,7 @@ func BACnetContextTagParse(readBuffer utils.ReadBuffer, tagNumberArgument uint8,
 
 	// Validation
 	if !(bool((header.GetTagClass()) == (TagClass_CONTEXT_SPECIFIC_TAGS))) {
-		return nil, utils.ParseAssertError{"should be a context tag"}
+		return nil, utils.ParseValidationError{"should be a context tag"}
 	}
 
 	// Virtual field
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBoolean.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBoolean.go
index a722c78fe8..2fb7f73044 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBoolean.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBoolean.go
@@ -174,7 +174,7 @@ func BACnetContextTagBooleanParse(readBuffer utils.ReadBuffer, tagNumberArgument
 
 	// Validation
 	if !(bool((header.GetActualLength()) == (1))) {
-		return nil, utils.ParseAssertError{"length field should be 1"}
+		return nil, utils.ParseValidationError{"length field should be 1"}
 	}
 
 	// Simple Field (value)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDeviceState.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDeviceState.go
index c223caca6b..e0c510c4c4 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDeviceState.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDeviceState.go
@@ -141,7 +141,7 @@ func BACnetContextTagDeviceStateParse(readBuffer utils.ReadBuffer, tagNumberArgu
 
 	// Validation
 	if !(isNotOpeningOrClosingTag) {
-		return nil, utils.ParseAssertError{"length 6 and 7 reserved for opening and closing tag"}
+		return nil, utils.ParseValidationError{"length 6 and 7 reserved for opening and closing tag"}
 	}
 
 	// Simple Field (state)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDouble.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDouble.go
index dc1324cddb..89e1d89471 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDouble.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDouble.go
@@ -158,7 +158,7 @@ func BACnetContextTagDoubleParse(readBuffer utils.ReadBuffer, tagNumberArgument
 
 	// Validation
 	if !(isNotOpeningOrClosingTag) {
-		return nil, utils.ParseAssertError{"length 6 and 7 reserved for opening and closing tag"}
+		return nil, utils.ParseValidationError{"length 6 and 7 reserved for opening and closing tag"}
 	}
 
 	// Simple Field (payload)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventState.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventState.go
index e0161164de..0f043dd45e 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventState.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventState.go
@@ -170,7 +170,7 @@ func BACnetContextTagEventStateParse(readBuffer utils.ReadBuffer, tagNumberArgum
 
 	// Validation
 	if !(isNotOpeningOrClosingTag) {
-		return nil, utils.ParseAssertError{"length 6 and 7 reserved for opening and closing tag"}
+		return nil, utils.ParseValidationError{"length 6 and 7 reserved for opening and closing tag"}
 	}
 
 	// Manual Field (eventState)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventType.go
index e6e87273fd..6943664851 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventType.go
@@ -170,7 +170,7 @@ func BACnetContextTagEventTypeParse(readBuffer utils.ReadBuffer, tagNumberArgume
 
 	// Validation
 	if !(isNotOpeningOrClosingTag) {
-		return nil, utils.ParseAssertError{"length 6 and 7 reserved for opening and closing tag"}
+		return nil, utils.ParseValidationError{"length 6 and 7 reserved for opening and closing tag"}
 	}
 
 	// Manual Field (eventType)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNotifyType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNotifyType.go
index 550abfaa2d..d94483f134 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNotifyType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNotifyType.go
@@ -142,7 +142,7 @@ func BACnetContextTagNotifyTypeParse(readBuffer utils.ReadBuffer, tagNumberArgum
 
 	// Validation
 	if !(isNotOpeningOrClosingTag) {
-		return nil, utils.ParseAssertError{"length 6 and 7 reserved for opening and closing tag"}
+		return nil, utils.ParseValidationError{"length 6 and 7 reserved for opening and closing tag"}
 	}
 
 	// Simple Field (value)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNull.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNull.go
index 84bed07d74..ec5af1a242 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNull.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNull.go
@@ -124,7 +124,7 @@ func BACnetContextTagNullParse(readBuffer utils.ReadBuffer, tagNumberArgument ui
 
 	// Validation
 	if !(bool((header.GetActualLength()) == (0))) {
-		return nil, utils.ParseAssertError{"length field should be 0"}
+		return nil, utils.ParseValidationError{"length field should be 0"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetContextTagNull"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagOctetString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagOctetString.go
index 90c9200db1..d0098e7cec 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagOctetString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagOctetString.go
@@ -158,7 +158,7 @@ func BACnetContextTagOctetStringParse(readBuffer utils.ReadBuffer, tagNumberArgu
 
 	// Validation
 	if !(isNotOpeningOrClosingTag) {
-		return nil, utils.ParseAssertError{"length 6 and 7 reserved for opening and closing tag"}
+		return nil, utils.ParseValidationError{"length 6 and 7 reserved for opening and closing tag"}
 	}
 
 	// Simple Field (payload)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagReal.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagReal.go
index 543051880c..4988d1f756 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagReal.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagReal.go
@@ -158,7 +158,7 @@ func BACnetContextTagRealParse(readBuffer utils.ReadBuffer, tagNumberArgument ui
 
 	// Validation
 	if !(isNotOpeningOrClosingTag) {
-		return nil, utils.ParseAssertError{"length 6 and 7 reserved for opening and closing tag"}
+		return nil, utils.ParseValidationError{"length 6 and 7 reserved for opening and closing tag"}
 	}
 
 	// Simple Field (payload)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersExtendedParameters.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersExtendedParameters.go
index ba32c6ebae..d63a48c7ef 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersExtendedParameters.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersExtendedParameters.go
@@ -30,6 +30,7 @@ import (
 // BACnetNotificationParametersExtendedParameters is the data-structure of this message
 type BACnetNotificationParametersExtendedParameters struct {
 	OpeningTag           *BACnetOpeningTag
+	PeekedTagHeader      *BACnetTagHeader
 	NullValue            *BACnetApplicationTagNull
 	RealValue            *BACnetApplicationTagReal
 	UnsignedValue        *BACnetApplicationTagUnsignedInteger
@@ -54,6 +55,8 @@ type BACnetNotificationParametersExtendedParameters struct {
 type IBACnetNotificationParametersExtendedParameters interface {
 	// GetOpeningTag returns OpeningTag (property field)
 	GetOpeningTag() *BACnetOpeningTag
+	// GetPeekedTagHeader returns PeekedTagHeader (property field)
+	GetPeekedTagHeader() *BACnetTagHeader
 	// GetNullValue returns NullValue (property field)
 	GetNullValue() *BACnetApplicationTagNull
 	// GetRealValue returns RealValue (property field)
@@ -84,6 +87,12 @@ type IBACnetNotificationParametersExtendedParameters interface {
 	GetReference() *BACnetDeviceObjectPropertyReferenceEnclosed
 	// GetClosingTag returns ClosingTag (property field)
 	GetClosingTag() *BACnetClosingTag
+	// GetPeekedTagNumber returns PeekedTagNumber (virtual field)
+	GetPeekedTagNumber() uint8
+	// GetIsOpeningTag returns IsOpeningTag (virtual field)
+	GetIsOpeningTag() bool
+	// GetIsClosingTag returns IsClosingTag (virtual field)
+	GetIsClosingTag() bool
 	// GetLengthInBytes returns the length in bytes
 	GetLengthInBytes() uint16
 	// GetLengthInBits returns the length in bits
@@ -101,6 +110,10 @@ func (m *BACnetNotificationParametersExtendedParameters) GetOpeningTag() *BACnet
 	return m.OpeningTag
 }
 
+func (m *BACnetNotificationParametersExtendedParameters) GetPeekedTagHeader() *BACnetTagHeader {
+	return m.PeekedTagHeader
+}
+
 func (m *BACnetNotificationParametersExtendedParameters) GetNullValue() *BACnetApplicationTagNull {
 	return m.NullValue
 }
@@ -161,14 +174,119 @@ func (m *BACnetNotificationParametersExtendedParameters) GetClosingTag() *BACnet
 	return m.ClosingTag
 }
 
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for virtual fields.
+///////////////////////
+
+func (m *BACnetNotificationParametersExtendedParameters) GetPeekedTagNumber() uint8 {
+	nullValue := m.NullValue
+	_ = nullValue
+	realValue := m.RealValue
+	_ = realValue
+	unsignedValue := m.UnsignedValue
+	_ = unsignedValue
+	booleanValue := m.BooleanValue
+	_ = booleanValue
+	integerValue := m.IntegerValue
+	_ = integerValue
+	doubleValue := m.DoubleValue
+	_ = doubleValue
+	octetStringValue := m.OctetStringValue
+	_ = octetStringValue
+	characterStringValue := m.CharacterStringValue
+	_ = characterStringValue
+	bitStringValue := m.BitStringValue
+	_ = bitStringValue
+	enumeratedValue := m.EnumeratedValue
+	_ = enumeratedValue
+	dateValue := m.DateValue
+	_ = dateValue
+	timeValue := m.TimeValue
+	_ = timeValue
+	objectIdentifier := m.ObjectIdentifier
+	_ = objectIdentifier
+	reference := m.Reference
+	_ = reference
+	return uint8(m.GetPeekedTagHeader().GetActualTagNumber())
+}
+
+func (m *BACnetNotificationParametersExtendedParameters) GetIsOpeningTag() bool {
+	nullValue := m.NullValue
+	_ = nullValue
+	realValue := m.RealValue
+	_ = realValue
+	unsignedValue := m.UnsignedValue
+	_ = unsignedValue
+	booleanValue := m.BooleanValue
+	_ = booleanValue
+	integerValue := m.IntegerValue
+	_ = integerValue
+	doubleValue := m.DoubleValue
+	_ = doubleValue
+	octetStringValue := m.OctetStringValue
+	_ = octetStringValue
+	characterStringValue := m.CharacterStringValue
+	_ = characterStringValue
+	bitStringValue := m.BitStringValue
+	_ = bitStringValue
+	enumeratedValue := m.EnumeratedValue
+	_ = enumeratedValue
+	dateValue := m.DateValue
+	_ = dateValue
+	timeValue := m.TimeValue
+	_ = timeValue
+	objectIdentifier := m.ObjectIdentifier
+	_ = objectIdentifier
+	reference := m.Reference
+	_ = reference
+	return bool(bool((m.GetPeekedTagHeader().GetLengthValueType()) == (0x6)))
+}
+
+func (m *BACnetNotificationParametersExtendedParameters) GetIsClosingTag() bool {
+	nullValue := m.NullValue
+	_ = nullValue
+	realValue := m.RealValue
+	_ = realValue
+	unsignedValue := m.UnsignedValue
+	_ = unsignedValue
+	booleanValue := m.BooleanValue
+	_ = booleanValue
+	integerValue := m.IntegerValue
+	_ = integerValue
+	doubleValue := m.DoubleValue
+	_ = doubleValue
+	octetStringValue := m.OctetStringValue
+	_ = octetStringValue
+	characterStringValue := m.CharacterStringValue
+	_ = characterStringValue
+	bitStringValue := m.BitStringValue
+	_ = bitStringValue
+	enumeratedValue := m.EnumeratedValue
+	_ = enumeratedValue
+	dateValue := m.DateValue
+	_ = dateValue
+	timeValue := m.TimeValue
+	_ = timeValue
+	objectIdentifier := m.ObjectIdentifier
+	_ = objectIdentifier
+	reference := m.Reference
+	_ = reference
+	return bool(bool((m.GetPeekedTagHeader().GetLengthValueType()) == (0x7)))
+}
+
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
 // NewBACnetNotificationParametersExtendedParameters factory function for BACnetNotificationParametersExtendedParameters
-func NewBACnetNotificationParametersExtendedParameters(openingTag *BACnetOpeningTag, nullValue *BACnetApplicationTagNull, realValue *BACnetApplicationTagReal, unsignedValue *BACnetApplicationTagUnsignedInteger, booleanValue *BACnetApplicationTagBoolean, integerValue *BACnetApplicationTagSignedInteger, doubleValue *BACnetApplicationTagDouble, octetStringValue *BACnetApplicationTagOctetString, characterStringValue *BACnetApplicationTagCharacterString, bitStringValue *BACnetApplicationTagBi [...]
-	return &BACnetNotificationParametersExtendedParameters{OpeningTag: openingTag, NullValue: nullValue, RealValue: realValue, UnsignedValue: unsignedValue, BooleanValue: booleanValue, IntegerValue: integerValue, DoubleValue: doubleValue, OctetStringValue: octetStringValue, CharacterStringValue: characterStringValue, BitStringValue: bitStringValue, EnumeratedValue: enumeratedValue, DateValue: dateValue, TimeValue: timeValue, ObjectIdentifier: objectIdentifier, Reference: reference, ClosingT [...]
+func NewBACnetNotificationParametersExtendedParameters(openingTag *BACnetOpeningTag, peekedTagHeader *BACnetTagHeader, nullValue *BACnetApplicationTagNull, realValue *BACnetApplicationTagReal, unsignedValue *BACnetApplicationTagUnsignedInteger, booleanValue *BACnetApplicationTagBoolean, integerValue *BACnetApplicationTagSignedInteger, doubleValue *BACnetApplicationTagDouble, octetStringValue *BACnetApplicationTagOctetString, characterStringValue *BACnetApplicationTagCharacterString, bitS [...]
+	return &BACnetNotificationParametersExtendedParameters{OpeningTag: openingTag, PeekedTagHeader: peekedTagHeader, NullValue: nullValue, RealValue: realValue, UnsignedValue: unsignedValue, BooleanValue: booleanValue, IntegerValue: integerValue, DoubleValue: doubleValue, OctetStringValue: octetStringValue, CharacterStringValue: characterStringValue, BitStringValue: bitStringValue, EnumeratedValue: enumeratedValue, DateValue: dateValue, TimeValue: timeValue, ObjectIdentifier: objectIdentifi [...]
 }
 
 func CastBACnetNotificationParametersExtendedParameters(structType interface{}) *BACnetNotificationParametersExtendedParameters {
@@ -195,6 +313,12 @@ func (m *BACnetNotificationParametersExtendedParameters) GetLengthInBitsConditio
 	// Simple field (openingTag)
 	lengthInBits += m.OpeningTag.GetLengthInBits()
 
+	// A virtual field doesn't have any in- or output.
+
+	// A virtual field doesn't have any in- or output.
+
+	// A virtual field doesn't have any in- or output.
+
 	// Optional Field (nullValue)
 	if m.NullValue != nil {
 		lengthInBits += (*m.NullValue).GetLengthInBits()
@@ -295,9 +419,32 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 		return nil, closeErr
 	}
 
+	// Peek Field (peekedTagHeader)
+	currentPos = readBuffer.GetPos()
+	if pullErr := readBuffer.PullContext("peekedTagHeader"); pullErr != nil {
+		return nil, pullErr
+	}
+	peekedTagHeader, _ := BACnetTagHeaderParse(readBuffer)
+	readBuffer.Reset(currentPos)
+
+	// Virtual field
+	_peekedTagNumber := peekedTagHeader.GetActualTagNumber()
+	peekedTagNumber := uint8(_peekedTagNumber)
+	_ = peekedTagNumber
+
+	// Virtual field
+	_isOpeningTag := bool((peekedTagHeader.GetLengthValueType()) == (0x6))
+	isOpeningTag := bool(_isOpeningTag)
+	_ = isOpeningTag
+
+	// Virtual field
+	_isClosingTag := bool((peekedTagHeader.GetLengthValueType()) == (0x7))
+	isClosingTag := bool(_isClosingTag)
+	_ = isClosingTag
+
 	// Optional Field (nullValue) (Can be skipped, if a given expression evaluates to false)
 	var nullValue *BACnetApplicationTagNull = nil
-	{
+	if bool(bool(bool((peekedTagNumber) == (0x0))) && bool(!(isOpeningTag))) && bool(!(isClosingTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("nullValue"); pullErr != nil {
 			return nil, pullErr
@@ -318,7 +465,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 
 	// Optional Field (realValue) (Can be skipped, if a given expression evaluates to false)
 	var realValue *BACnetApplicationTagReal = nil
-	{
+	if bool(bool(bool((peekedTagNumber) == (0x4))) && bool(!(isOpeningTag))) && bool(!(isClosingTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("realValue"); pullErr != nil {
 			return nil, pullErr
@@ -339,7 +486,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 
 	// Optional Field (unsignedValue) (Can be skipped, if a given expression evaluates to false)
 	var unsignedValue *BACnetApplicationTagUnsignedInteger = nil
-	{
+	if bool(bool(bool((peekedTagNumber) == (0x2))) && bool(!(isOpeningTag))) && bool(!(isClosingTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("unsignedValue"); pullErr != nil {
 			return nil, pullErr
@@ -360,7 +507,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 
 	// Optional Field (booleanValue) (Can be skipped, if a given expression evaluates to false)
 	var booleanValue *BACnetApplicationTagBoolean = nil
-	{
+	if bool(bool(bool((peekedTagNumber) == (0x1))) && bool(!(isOpeningTag))) && bool(!(isClosingTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("booleanValue"); pullErr != nil {
 			return nil, pullErr
@@ -381,7 +528,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 
 	// Optional Field (integerValue) (Can be skipped, if a given expression evaluates to false)
 	var integerValue *BACnetApplicationTagSignedInteger = nil
-	{
+	if bool(bool(bool((peekedTagNumber) == (0x3))) && bool(!(isOpeningTag))) && bool(!(isClosingTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("integerValue"); pullErr != nil {
 			return nil, pullErr
@@ -402,7 +549,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 
 	// Optional Field (doubleValue) (Can be skipped, if a given expression evaluates to false)
 	var doubleValue *BACnetApplicationTagDouble = nil
-	{
+	if bool(bool(bool((peekedTagNumber) == (0x5))) && bool(!(isOpeningTag))) && bool(!(isClosingTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("doubleValue"); pullErr != nil {
 			return nil, pullErr
@@ -423,7 +570,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 
 	// Optional Field (octetStringValue) (Can be skipped, if a given expression evaluates to false)
 	var octetStringValue *BACnetApplicationTagOctetString = nil
-	{
+	if bool(bool(bool((peekedTagNumber) == (0x6))) && bool(!(isOpeningTag))) && bool(!(isClosingTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("octetStringValue"); pullErr != nil {
 			return nil, pullErr
@@ -444,7 +591,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 
 	// Optional Field (characterStringValue) (Can be skipped, if a given expression evaluates to false)
 	var characterStringValue *BACnetApplicationTagCharacterString = nil
-	{
+	if bool(bool(bool((peekedTagNumber) == (0x7))) && bool(!(isOpeningTag))) && bool(!(isClosingTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("characterStringValue"); pullErr != nil {
 			return nil, pullErr
@@ -465,7 +612,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 
 	// Optional Field (bitStringValue) (Can be skipped, if a given expression evaluates to false)
 	var bitStringValue *BACnetApplicationTagBitString = nil
-	{
+	if bool(bool(bool((peekedTagNumber) == (0x8))) && bool(!(isOpeningTag))) && bool(!(isClosingTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("bitStringValue"); pullErr != nil {
 			return nil, pullErr
@@ -486,7 +633,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 
 	// Optional Field (enumeratedValue) (Can be skipped, if a given expression evaluates to false)
 	var enumeratedValue *BACnetApplicationTagEnumerated = nil
-	{
+	if bool(bool(bool((peekedTagNumber) == (0x9))) && bool(!(isOpeningTag))) && bool(!(isClosingTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("enumeratedValue"); pullErr != nil {
 			return nil, pullErr
@@ -507,7 +654,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 
 	// Optional Field (dateValue) (Can be skipped, if a given expression evaluates to false)
 	var dateValue *BACnetApplicationTagDate = nil
-	{
+	if bool(bool(bool((peekedTagNumber) == (0xA))) && bool(!(isOpeningTag))) && bool(!(isClosingTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("dateValue"); pullErr != nil {
 			return nil, pullErr
@@ -528,7 +675,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 
 	// Optional Field (timeValue) (Can be skipped, if a given expression evaluates to false)
 	var timeValue *BACnetApplicationTagTime = nil
-	{
+	if bool(bool(bool((peekedTagNumber) == (0xB))) && bool(!(isOpeningTag))) && bool(!(isClosingTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("timeValue"); pullErr != nil {
 			return nil, pullErr
@@ -549,7 +696,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 
 	// Optional Field (objectIdentifier) (Can be skipped, if a given expression evaluates to false)
 	var objectIdentifier *BACnetApplicationTagObjectIdentifier = nil
-	{
+	if bool(bool((peekedTagNumber) == (0xC))) && bool(!(isOpeningTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("objectIdentifier"); pullErr != nil {
 			return nil, pullErr
@@ -570,7 +717,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 
 	// Optional Field (reference) (Can be skipped, if a given expression evaluates to false)
 	var reference *BACnetDeviceObjectPropertyReferenceEnclosed = nil
-	{
+	if bool(isOpeningTag) && bool(!(isClosingTag)) {
 		currentPos = readBuffer.GetPos()
 		if pullErr := readBuffer.PullContext("reference"); pullErr != nil {
 			return nil, pullErr
@@ -607,7 +754,7 @@ func BACnetNotificationParametersExtendedParametersParse(readBuffer utils.ReadBu
 	}
 
 	// Create the instance
-	return NewBACnetNotificationParametersExtendedParameters(openingTag, nullValue, realValue, unsignedValue, booleanValue, integerValue, doubleValue, octetStringValue, characterStringValue, bitStringValue, enumeratedValue, dateValue, timeValue, objectIdentifier, reference, closingTag, tagNumber), nil
+	return NewBACnetNotificationParametersExtendedParameters(openingTag, peekedTagHeader, nullValue, realValue, unsignedValue, booleanValue, integerValue, doubleValue, octetStringValue, characterStringValue, bitStringValue, enumeratedValue, dateValue, timeValue, objectIdentifier, reference, closingTag, tagNumber), nil
 }
 
 func (m *BACnetNotificationParametersExtendedParameters) Serialize(writeBuffer utils.WriteBuffer) error {
@@ -626,6 +773,18 @@ func (m *BACnetNotificationParametersExtendedParameters) Serialize(writeBuffer u
 	if _openingTagErr != nil {
 		return errors.Wrap(_openingTagErr, "Error serializing 'openingTag' field")
 	}
+	// Virtual field
+	if _peekedTagNumberErr := writeBuffer.WriteVirtual("peekedTagNumber", m.GetPeekedTagNumber()); _peekedTagNumberErr != nil {
+		return errors.Wrap(_peekedTagNumberErr, "Error serializing 'peekedTagNumber' field")
+	}
+	// Virtual field
+	if _isOpeningTagErr := writeBuffer.WriteVirtual("isOpeningTag", m.GetIsOpeningTag()); _isOpeningTagErr != nil {
+		return errors.Wrap(_isOpeningTagErr, "Error serializing 'isOpeningTag' field")
+	}
+	// Virtual field
+	if _isClosingTagErr := writeBuffer.WriteVirtual("isClosingTag", m.GetIsClosingTag()); _isClosingTagErr != nil {
+		return errors.Wrap(_isClosingTagErr, "Error serializing 'isClosingTag' field")
+	}
 
 	// Optional Field (nullValue) (Can be skipped, if the value is null)
 	var nullValue *BACnetApplicationTagNull = nil
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersUnmapped.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersUnmapped.go
index a2a1dd705e..2a3ec1698f 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersUnmapped.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotificationParametersUnmapped.go
@@ -117,7 +117,7 @@ func BACnetNotificationParametersUnmappedParse(readBuffer utils.ReadBuffer, tagN
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetNotificationParametersUnmapped"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetOpeningTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetOpeningTag.go
index 59cb886aa7..d0d866d3a7 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetOpeningTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetOpeningTag.go
@@ -119,7 +119,7 @@ func BACnetOpeningTagParse(readBuffer utils.ReadBuffer, tagNumberArgument uint8,
 
 	// Validation
 	if !(bool((actualLength) == (6))) {
-		return nil, utils.ParseAssertError{"opening tag should have a value of 6"}
+		return nil, utils.ParseValidationError{"opening tag should have a value of 6"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetOpeningTag"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetPropertyStateActionUnmapped.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetPropertyStateActionUnmapped.go
index 6cb1a70804..8be81d9d3d 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetPropertyStateActionUnmapped.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetPropertyStateActionUnmapped.go
@@ -116,7 +116,7 @@ func BACnetPropertyStateActionUnmappedParse(readBuffer utils.ReadBuffer, tagNumb
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetPropertyStateActionUnmapped"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAcknowledgeAlarm.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAcknowledgeAlarm.go
index 893936eee0..46ec199059 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAcknowledgeAlarm.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAcknowledgeAlarm.go
@@ -116,7 +116,7 @@ func BACnetServiceAckAcknowledgeAlarmParse(readBuffer utils.ReadBuffer, serviceR
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckAcknowledgeAlarm"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAddListElement.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAddListElement.go
index 6604a357ee..984c08fb1e 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAddListElement.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAddListElement.go
@@ -116,7 +116,7 @@ func BACnetServiceAckAddListElementParse(readBuffer utils.ReadBuffer, serviceReq
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckAddListElement"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAuthenticate.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAuthenticate.go
index df13fef103..77bb9d4b27 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAuthenticate.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAuthenticate.go
@@ -116,7 +116,7 @@ func BACnetServiceAckAuthenticateParse(readBuffer utils.ReadBuffer, serviceReque
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckAuthenticate"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedCovNotification.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedCovNotification.go
index ccafe74ca1..a92905c6da 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedCovNotification.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedCovNotification.go
@@ -116,7 +116,7 @@ func BACnetServiceAckConfirmedCovNotificationParse(readBuffer utils.ReadBuffer,
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckConfirmedCovNotification"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedCovNotificationMultiple.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedCovNotificationMultiple.go
index 1f127b0946..86f35a05da 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedCovNotificationMultiple.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedCovNotificationMultiple.go
@@ -117,7 +117,7 @@ func BACnetServiceAckConfirmedCovNotificationMultipleParse(readBuffer utils.Read
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckConfirmedCovNotificationMultiple"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedEventNotification.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedEventNotification.go
index 5ad83e80b8..2b53bbcaea 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedEventNotification.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedEventNotification.go
@@ -116,7 +116,7 @@ func BACnetServiceAckConfirmedEventNotificationParse(readBuffer utils.ReadBuffer
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckConfirmedEventNotification"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedTextMessage.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedTextMessage.go
index b3f9406a75..bf64c4e3cd 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedTextMessage.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedTextMessage.go
@@ -116,7 +116,7 @@ func BACnetServiceAckConfirmedTextMessageParse(readBuffer utils.ReadBuffer, serv
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckConfirmedTextMessage"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckCreateObject.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckCreateObject.go
index 5f9f7cf60a..48ce5d70c4 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckCreateObject.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckCreateObject.go
@@ -116,7 +116,7 @@ func BACnetServiceAckCreateObjectParse(readBuffer utils.ReadBuffer, serviceReque
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckCreateObject"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckDeviceCommunicationControl.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckDeviceCommunicationControl.go
index 3eb6a10df9..792507420e 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckDeviceCommunicationControl.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckDeviceCommunicationControl.go
@@ -116,7 +116,7 @@ func BACnetServiceAckDeviceCommunicationControlParse(readBuffer utils.ReadBuffer
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckDeviceCommunicationControl"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetAlarmSummary.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetAlarmSummary.go
index a828d374e3..cb83705bad 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetAlarmSummary.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetAlarmSummary.go
@@ -116,7 +116,7 @@ func BACnetServiceAckGetAlarmSummaryParse(readBuffer utils.ReadBuffer, serviceRe
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckGetAlarmSummary"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEnrollmentSummary.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEnrollmentSummary.go
index bcd2a2a204..6f70f335a1 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEnrollmentSummary.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEnrollmentSummary.go
@@ -116,7 +116,7 @@ func BACnetServiceAckGetEnrollmentSummaryParse(readBuffer utils.ReadBuffer, serv
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckGetEnrollmentSummary"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckLifeSafetyOperation.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckLifeSafetyOperation.go
index 523be816e9..69a0d4e036 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckLifeSafetyOperation.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckLifeSafetyOperation.go
@@ -116,7 +116,7 @@ func BACnetServiceAckLifeSafetyOperationParse(readBuffer utils.ReadBuffer, servi
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckLifeSafetyOperation"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadPropertyConditional.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadPropertyConditional.go
index 4ced3b92b4..34509e11a6 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadPropertyConditional.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadPropertyConditional.go
@@ -116,7 +116,7 @@ func BACnetServiceAckReadPropertyConditionalParse(readBuffer utils.ReadBuffer, s
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckReadPropertyConditional"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReinitializeDevice.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReinitializeDevice.go
index ad3bdf3a2d..ce4ed3d4c2 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReinitializeDevice.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReinitializeDevice.go
@@ -116,7 +116,7 @@ func BACnetServiceAckReinitializeDeviceParse(readBuffer utils.ReadBuffer, servic
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckReinitializeDevice"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemoveListElement.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemoveListElement.go
index f0130b770f..5f91b22605 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemoveListElement.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemoveListElement.go
@@ -116,7 +116,7 @@ func BACnetServiceAckRemoveListElementParse(readBuffer utils.ReadBuffer, service
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckRemoveListElement"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRequestKey.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRequestKey.go
index 2bda8b90f5..40d70694a9 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRequestKey.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRequestKey.go
@@ -116,7 +116,7 @@ func BACnetServiceAckRequestKeyParse(readBuffer utils.ReadBuffer, serviceRequest
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckRequestKey"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckSubscribeCov.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckSubscribeCov.go
index 974067e4d7..56f97c5801 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckSubscribeCov.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckSubscribeCov.go
@@ -116,7 +116,7 @@ func BACnetServiceAckSubscribeCovParse(readBuffer utils.ReadBuffer, serviceReque
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckSubscribeCov"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckSubscribeCovProperty.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckSubscribeCovProperty.go
index 282c2f3a52..f7c3c2f8e7 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckSubscribeCovProperty.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckSubscribeCovProperty.go
@@ -116,7 +116,7 @@ func BACnetServiceAckSubscribeCovPropertyParse(readBuffer utils.ReadBuffer, serv
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckSubscribeCovProperty"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckSubscribeCovPropertyMultiple.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckSubscribeCovPropertyMultiple.go
index d1a944fcc2..f5a5b4644c 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckSubscribeCovPropertyMultiple.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckSubscribeCovPropertyMultiple.go
@@ -116,7 +116,7 @@ func BACnetServiceAckSubscribeCovPropertyMultipleParse(readBuffer utils.ReadBuff
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckSubscribeCovPropertyMultiple"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTClose.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTClose.go
index 1289f835a6..2197a509c2 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTClose.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTClose.go
@@ -116,7 +116,7 @@ func BACnetServiceAckVTCloseParse(readBuffer utils.ReadBuffer, serviceRequestLen
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckVTClose"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTData.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTData.go
index c90153d545..b575b6f7b6 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTData.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTData.go
@@ -116,7 +116,7 @@ func BACnetServiceAckVTDataParse(readBuffer utils.ReadBuffer, serviceRequestLeng
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckVTData"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTOpen.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTOpen.go
index b0ae72f09f..33a843decb 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTOpen.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTOpen.go
@@ -116,7 +116,7 @@ func BACnetServiceAckVTOpenParse(readBuffer utils.ReadBuffer, serviceRequestLeng
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckVTOpen"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckWriteProperty.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckWriteProperty.go
index 8b37349c33..5c5fd5afcb 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckWriteProperty.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckWriteProperty.go
@@ -116,7 +116,7 @@ func BACnetServiceAckWritePropertyParse(readBuffer utils.ReadBuffer, serviceRequ
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckWriteProperty"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckWritePropertyMultiple.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckWritePropertyMultiple.go
index aee6a58b0d..9610341ebb 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckWritePropertyMultiple.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckWritePropertyMultiple.go
@@ -116,7 +116,7 @@ func BACnetServiceAckWritePropertyMultipleParse(readBuffer utils.ReadBuffer, ser
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetServiceAckWritePropertyMultiple"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadSignedInteger.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadSignedInteger.go
index 514ec0eeb1..4c3da6258a 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadSignedInteger.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadSignedInteger.go
@@ -548,7 +548,7 @@ func BACnetTagPayloadSignedIntegerParse(readBuffer utils.ReadBuffer, actualLengt
 
 	// Validation
 	if !(bool(bool(bool(bool(bool(bool(bool(isInt8) || bool(isInt16)) || bool(isInt24)) || bool(isInt32)) || bool(isInt40)) || bool(isInt48)) || bool(isInt56)) || bool(isInt64)) {
-		return nil, utils.ParseAssertError{"unmapped integer length"}
+		return nil, utils.ParseValidationError{"unmapped integer length"}
 	}
 
 	// Virtual field
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadUnsignedInteger.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadUnsignedInteger.go
index 4f911ebda4..d17e7fc8a2 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadUnsignedInteger.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagPayloadUnsignedInteger.go
@@ -548,7 +548,7 @@ func BACnetTagPayloadUnsignedIntegerParse(readBuffer utils.ReadBuffer, actualLen
 
 	// Validation
 	if !(bool(bool(bool(bool(bool(bool(bool(isUint8) || bool(isUint16)) || bool(isUint24)) || bool(isUint32)) || bool(isUint40)) || bool(isUint48)) || bool(isUint56)) || bool(isUint64)) {
-		return nil, utils.ParseAssertError{"unmapped integer length"}
+		return nil, utils.ParseValidationError{"unmapped integer length"}
 	}
 
 	// Virtual field
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple.go
index a896730ace..a147455825 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple.go
@@ -117,7 +117,7 @@ func BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultipleParse(read
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedTextMessage.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedTextMessage.go
index 09fb9407ad..56cc8176d6 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedTextMessage.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedTextMessage.go
@@ -117,7 +117,7 @@ func BACnetUnconfirmedServiceRequestUnconfirmedTextMessageParse(readBuffer utils
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetUnconfirmedServiceRequestUnconfirmedTextMessage"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWriteGroup.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWriteGroup.go
index d876a21c5f..bdeb3b5b8d 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWriteGroup.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWriteGroup.go
@@ -117,7 +117,7 @@ func BACnetUnconfirmedServiceRequestWriteGroupParse(readBuffer utils.ReadBuffer,
 
 	// Validation
 	if !(bool((1) == (2))) {
-		return nil, utils.ParseAssertError{"TODO: implement me"}
+		return nil, utils.ParseValidationError{"TODO: implement me"}
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetUnconfirmedServiceRequestWriteGroup"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
index c4bef5352f..6a99575f8a 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
@@ -464,7 +464,7 @@ func NPDUParse(readBuffer utils.ReadBuffer, npduLength uint16) (*NPDU, error) {
 
 	// Validation
 	if !(bool(bool((nlm) != (nil))) || bool(bool((apdu) != (nil)))) {
-		return nil, utils.ParseAssertError{"something is wrong here... apdu and nlm not set"}
+		return nil, utils.ParseValidationError{"something is wrong here... apdu and nlm not set"}
 	}
 
 	if closeErr := readBuffer.CloseContext("NPDU"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/cbus/readwrite/model/CALReplyLong.go b/plc4go/internal/plc4go/cbus/readwrite/model/CALReplyLong.go
index a595734ad5..f5844734cb 100644
--- a/plc4go/internal/plc4go/cbus/readwrite/model/CALReplyLong.go
+++ b/plc4go/internal/plc4go/cbus/readwrite/model/CALReplyLong.go
@@ -317,7 +317,7 @@ func CALReplyLongParse(readBuffer utils.ReadBuffer) (*CALReplyLong, error) {
 
 	// Validation
 	if !(bool(bool(isUnitAddress) && bool(bool((*reservedByte) == (0x00)))) || bool(!(isUnitAddress))) {
-		return nil, utils.ParseAssertError{"wrong reservedByte"}
+		return nil, utils.ParseValidationError{"wrong reservedByte"}
 	}
 
 	// Optional Field (replyNetwork) (Can be skipped, if a given expression evaluates to false)
diff --git a/plc4go/internal/plc4go/cbus/readwrite/model/MonitoredSALLongFormSmartMode.go b/plc4go/internal/plc4go/cbus/readwrite/model/MonitoredSALLongFormSmartMode.go
index 4d36b93be8..7027bf3d00 100644
--- a/plc4go/internal/plc4go/cbus/readwrite/model/MonitoredSALLongFormSmartMode.go
+++ b/plc4go/internal/plc4go/cbus/readwrite/model/MonitoredSALLongFormSmartMode.go
@@ -317,7 +317,7 @@ func MonitoredSALLongFormSmartModeParse(readBuffer utils.ReadBuffer) (*Monitored
 
 	// Validation
 	if !(bool(bool(isUnitAddress) && bool(bool((*reservedByte) == (0x00)))) || bool(!(isUnitAddress))) {
-		return nil, utils.ParseAssertError{"invalid unit address"}
+		return nil, utils.ParseValidationError{"invalid unit address"}
 	}
 
 	// Optional Field (replyNetwork) (Can be skipped, if a given expression evaluates to false)
diff --git a/plc4go/internal/plc4go/cbus/readwrite/model/StatusRequestLevel.go b/plc4go/internal/plc4go/cbus/readwrite/model/StatusRequestLevel.go
index 752e4ad4c2..109a227098 100644
--- a/plc4go/internal/plc4go/cbus/readwrite/model/StatusRequestLevel.go
+++ b/plc4go/internal/plc4go/cbus/readwrite/model/StatusRequestLevel.go
@@ -193,7 +193,7 @@ func StatusRequestLevelParse(readBuffer utils.ReadBuffer) (*StatusRequestLevel,
 
 	// Validation
 	if !(bool(bool(bool(bool(bool(bool(bool(bool((startingGroupAddressLabel) == (0x00))) || bool(bool((startingGroupAddressLabel) == (0x20)))) || bool(bool((startingGroupAddressLabel) == (0x40)))) || bool(bool((startingGroupAddressLabel) == (0x60)))) || bool(bool((startingGroupAddressLabel) == (0x80)))) || bool(bool((startingGroupAddressLabel) == (0xA0)))) || bool(bool((startingGroupAddressLabel) == (0xC0)))) || bool(bool((startingGroupAddressLabel) == (0xE0)))) {
-		return nil, utils.ParseAssertError{"invalid label"}
+		return nil, utils.ParseValidationError{"invalid label"}
 	}
 
 	if closeErr := readBuffer.CloseContext("StatusRequestLevel"); closeErr != nil {
diff --git a/plc4go/internal/plc4go/spi/utils/Utils.go b/plc4go/internal/plc4go/spi/utils/Utils.go
index 1bc1c20ed3..79960e19dd 100644
--- a/plc4go/internal/plc4go/spi/utils/Utils.go
+++ b/plc4go/internal/plc4go/spi/utils/Utils.go
@@ -37,5 +37,19 @@ func (e ParseAssertError) Error() string {
 }
 
 func (e ParseAssertError) Is(target error) bool {
-	return true
+	_, ok := target.(ParseAssertError)
+	return ok
+}
+
+type ParseValidationError struct {
+	Message string
+}
+
+func (e ParseValidationError) Error() string {
+	return e.Message
+}
+
+func (e ParseValidationError) Is(target error) bool {
+	_, ok := target.(ParseValidationError)
+	return ok
 }
diff --git a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
index 39876b62c9..10aca0f4ca 100644
--- a/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
+++ b/plc4j/drivers/bacnet/src/test/java/org/apache/plc4x/java/bacnetip/RandomPackagesTest.java
@@ -2778,7 +2778,14 @@ public class RandomPackagesTest {
     @DisplayName("plugfest-2011-siemens-1")
     Collection<DynamicNode> plugfest_2011_siemens_1() throws Exception {
         TestPcapEvaluator pcapEvaluator = pcapEvaluator("plugfest-2011-siemens-1.pcap", BACNET_BPF_FILTER_UDP);
-        return List.of(pcapEvaluator.parseEmAll());
+        return List.of(pcapEvaluator.parseEmAll(
+            // TODO: siemens shenanigans again
+            225,
+            // TODO: siemens shenanigans again
+            2329,
+            // TODO: siemens shenanigans again
+            2345
+        ));
     }
 
     @TestFactory
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index e03887d2e7..7012ec3326 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -1413,34 +1413,54 @@
     [simple     BACnetOpeningTag('tagNumber', 'BACnetDataType.OPENING_TAG')
                 openingTag
     ]
+    [peek       BACnetTagHeader
+                            peekedTagHeader
+    ]
+    [virtual    uint 8      peekedTagNumber     'peekedTagHeader.actualTagNumber'       ]
+    [virtual    bit         isOpeningTag        'peekedTagHeader.lengthValueType == 0x6']
+    [virtual    bit         isClosingTag        'peekedTagHeader.lengthValueType == 0x7']
     [optional   BACnetApplicationTagNull
-                nullValue]
+                nullValue
+                    'peekedTagNumber == 0x0 && !isOpeningTag && !isClosingTag'          ]
     [optional   BACnetApplicationTagReal
-                realValue]
+                realValue
+                    'peekedTagNumber == 0x4 && !isOpeningTag && !isClosingTag'          ]
     [optional   BACnetApplicationTagUnsignedInteger
-                unsignedValue]
+                unsignedValue
+                    'peekedTagNumber == 0x2 && !isOpeningTag && !isClosingTag'          ]
     [optional   BACnetApplicationTagBoolean
-                booleanValue]
+                booleanValue
+                    'peekedTagNumber == 0x1 && !isOpeningTag && !isClosingTag'          ]
     [optional   BACnetApplicationTagSignedInteger
-                integerValue]
+                integerValue
+                    'peekedTagNumber == 0x3 && !isOpeningTag && !isClosingTag'          ]
     [optional   BACnetApplicationTagDouble
-                doubleValue]
+                doubleValue
+                    'peekedTagNumber == 0x5 && !isOpeningTag && !isClosingTag'          ]
     [optional   BACnetApplicationTagOctetString
-                octetStringValue]
+                octetStringValue
+                    'peekedTagNumber == 0x6 && !isOpeningTag && !isClosingTag'          ]
     [optional   BACnetApplicationTagCharacterString
-                characterStringValue]
+                characterStringValue
+                    'peekedTagNumber == 0x7 && !isOpeningTag && !isClosingTag'          ]
     [optional   BACnetApplicationTagBitString
-                bitStringValue]
+                bitStringValue
+                    'peekedTagNumber == 0x8 && !isOpeningTag && !isClosingTag'          ]
     [optional   BACnetApplicationTagEnumerated
-                enumeratedValue]
+                enumeratedValue
+                    'peekedTagNumber == 0x9 && !isOpeningTag && !isClosingTag'          ]
     [optional   BACnetApplicationTagDate
-                dateValue]
+                dateValue
+                    'peekedTagNumber == 0xA && !isOpeningTag && !isClosingTag'          ]
     [optional   BACnetApplicationTagTime
-                timeValue]
+                timeValue
+                    'peekedTagNumber == 0xB && !isOpeningTag && !isClosingTag'          ]
     [optional   BACnetApplicationTagObjectIdentifier
-                objectIdentifier]
+                objectIdentifier
+                    'peekedTagNumber == 0xC && !isOpeningTag'                           ]
     [optional   BACnetDeviceObjectPropertyReferenceEnclosed('0')
-                reference]
+                reference
+                    'isOpeningTag && !isClosingTag'                                     ]
     [simple     BACnetClosingTag('tagNumber', 'BACnetDataType.CLOSING_TAG')
                 closingTag
     ]
@@ -1739,18 +1759,18 @@
     [simple        BACnetTagHeader
                             header
     ]
-    [validation    'header.actualTagNumber == tagNumberArgument'    "tagnumber doesn't match"                           ]
-    [validation    'header.tagClass == TagClass.CONTEXT_SPECIFIC_TAGS'    "should be a context tag"                     ]
+    [validation    'header.actualTagNumber == tagNumberArgument' "tagnumber doesn't match" shouldFail=false             ]
+    [validation    'header.tagClass == TagClass.CONTEXT_SPECIFIC_TAGS' "should be a context tag"                        ]
     [virtual       uint 4   tagNumber     'header.tagNumber'                                                            ]
     [virtual       uint 32  actualLength  'header.actualLength'                                                         ]
     [virtual       bit      isNotOpeningOrClosingTag    'header.lengthValueType != 6 && header.lengthValueType != 7'    ]
     [typeSwitch dataType
         ['NULL' BACnetContextTagNull(bit isNotOpeningOrClosingTag, BACnetTagHeader header)
-            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag"                ]
+            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag" shouldFail=false]
             [validation 'header.actualLength == 0' "length field should be 0"                                           ]
         ]
         ['BOOLEAN' BACnetContextTagBoolean(bit isNotOpeningOrClosingTag, BACnetTagHeader header)
-            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag"                ]
+            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag" shouldFail=false]
             [validation 'header.actualLength == 1' "length field should be 1"                                           ]
             [simple  uint 8 value                                                                                       ]
             [simple BACnetTagPayloadBoolean('value')
@@ -1758,13 +1778,13 @@
             [virtual bit    actualValue 'payload.value'                                                                 ]
         ]
         ['UNSIGNED_INTEGER' BACnetContextTagUnsignedInteger(bit isNotOpeningOrClosingTag, BACnetTagHeader header)
-            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag"                ]
+            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag" shouldFail=false]
             [simple BACnetTagPayloadUnsignedInteger('header.actualLength')
                                 payload                                                                                 ]
             [virtual    uint 64 actualValue 'payload.actualValue'                                                     ]
         ]
         ['SIGNED_INTEGER' BACnetContextTagSignedInteger(bit isNotOpeningOrClosingTag, BACnetTagHeader header)
-            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag"                ]
+            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag" shouldFail=false]
             [simple BACnetTagPayloadSignedInteger('header.actualLength')
                                 payload                                                                                 ]
             [virtual    uint 64     actualValue 'payload.actualValue'                                                 ]
@@ -1789,34 +1809,34 @@
             [virtual vstring     value             'payload.value'                                                      ]
         ]
         ['CHARACTER_STRING' BACnetContextTagCharacterString(bit isNotOpeningOrClosingTag, BACnetTagHeader header)
-            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag"                ]
+            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag" shouldFail=false]
             [simple BACnetTagPayloadCharacterString('header.actualLength')
                                 payload                                                                                 ]
             [virtual vstring     value             'payload.value'                                                      ]
         ]
         ['BIT_STRING' BACnetContextTagBitString(bit isNotOpeningOrClosingTag, BACnetTagHeader header)
-            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag"                ]
+            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag" shouldFail=false]
             [simple BACnetTagPayloadBitString('header.actualLength')
                                 payload                                                                                 ]
         ]
         ['ENUMERATED' BACnetContextTagEnumerated(bit isNotOpeningOrClosingTag, BACnetTagHeader header)
-            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag"                ]
+            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag" shouldFail=false]
             [simple BACnetTagPayloadEnumerated('header.actualLength')
                                 payload                                                                                 ]
             [virtual  uint 32   actualValue 'payload.actualValue'                                                       ]
         ]
         ['DATE' BACnetContextTagDate(bit isNotOpeningOrClosingTag)
-            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag"                ]
+            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag" shouldFail=false]
             [simple BACnetTagPayloadDate
                                 payload                                                                                 ]
         ]
         ['TIME' BACnetContextTagTime(bit isNotOpeningOrClosingTag)
-            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag"                ]
+            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag" shouldFail=false]
             [simple     BACnetTagPayloadTime
                                 payload                                                                                 ]
         ]
         ['BACNET_OBJECT_IDENTIFIER' BACnetContextTagObjectIdentifier(bit isNotOpeningOrClosingTag)
-            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag"                ]
+            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag" shouldFail=false]
             [simple  BACnetTagPayloadObjectIdentifier
                                 payload                                                                                 ]
             [virtual BACnetObjectType
@@ -1825,7 +1845,7 @@
                                                'payload.instanceNumber'                                                 ]
         ]
         ['BACNET_PROPERTY_IDENTIFIER' BACnetContextTagPropertyIdentifier(bit isNotOpeningOrClosingTag, uint 32 actualLength)
-            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag"                ]
+            [validation 'isNotOpeningOrClosingTag' "length 6 and 7 reserved for opening and closing tag" shouldFail=false]
             [manual     BACnetPropertyIdentifier
                                 propertyIdentifier
                                 'STATIC_CALL("readPropertyIdentifier", readBuffer, actualLength)'
@@ -2530,11 +2550,6 @@
             [array    BACnetConstructedDataElement('objectType', 'propertyIdentifierArgument')
                             data                    terminated
                                 'STATIC_CALL("isBACnetConstructedDataClosingTag", readBuffer, false, tagNumber)']
-            [virtual  bit   hasData                 'COUNT(data) != 0']
-            [optional       BACnetContextTagPropertyIdentifier('0', 'BACnetDataType.BACNET_PROPERTY_IDENTIFIER')
-                            propertyIdentifier      '!hasData'                                                   ]
-            [optional       BACnetApplicationTag
-                            content                 '!hasData'                                                   ]
         ]
         //
         /////


[plc4x] 01/02: feat(codegen): changed validation to fail parsing conditionally

Posted by sr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit c21a1842f2dd9f0d4755bd634e1a38acc48b24bc
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri May 13 17:19:10 2022 +0200

    feat(codegen): changed validation to fail parsing conditionally
    
    + added option to switch between failing and non failing behavior
---
 .../templates/go/complex-type-template.go.ftlh     |  4 ++-
 .../templates/java/complex-type-template.java.ftlh |  4 ++-
 .../plugins/codegenerator/language/mspec/MSpec.g4  |  2 +-
 .../mspec/model/fields/DefaultValidationField.java | 12 ++++++--
 .../mspec/parser/MessageFormatListener.java        |  6 +++-
 .../spi/generation/ParseValidationException.java   | 33 ++++++++++++++++++++++
 6 files changed, 55 insertions(+), 6 deletions(-)

diff --git a/code-generation/language-go/src/main/resources/templates/go/complex-type-template.go.ftlh b/code-generation/language-go/src/main/resources/templates/go/complex-type-template.go.ftlh
index dc2255aea5..3cdb2e54f7 100644
--- a/code-generation/language-go/src/main/resources/templates/go/complex-type-template.go.ftlh
+++ b/code-generation/language-go/src/main/resources/templates/go/complex-type-template.go.ftlh
@@ -1362,7 +1362,9 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
 
 	// Validation
 	if (!(${helper.toParseExpression(validationField, helper.boolTypeReference, validationField.getValidationExpression(), null)})) {
-		return nil, utils.ParseAssertError{${validationField.getDescription().orElse("Validation failed")}}
+		<#assign errorType="ParseValidationError">
+		<#if !validationField.shouldFail()><#assign errorType="ParseAssertError"></#if>
+		return nil, utils.${errorType}{${validationField.getDescription().orElse("Validation failed")}}
 	}
                 <#break>
             <#case "peek">
diff --git a/code-generation/language-java/src/main/resources/templates/java/complex-type-template.java.ftlh b/code-generation/language-java/src/main/resources/templates/java/complex-type-template.java.ftlh
index 237aee2aca..589e1e8a97 100644
--- a/code-generation/language-java/src/main/resources/templates/java/complex-type-template.java.ftlh
+++ b/code-generation/language-java/src/main/resources/templates/java/complex-type-template.java.ftlh
@@ -757,7 +757,9 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
                 <#assign validationField = field.asValidationField().orElseThrow()>
                 // Validation
                 if (!(${helper.toParseExpression(validationField, helper.boolTypeReference, validationField.getValidationExpression(), null)})) {
-                    throw new ParseAssertException(${validationField.getDescription().orElse("Validation failed")});
+                    <#assign errorType="ParseValidationException">
+                    <#if !validationField.shouldFail()><#assign errorType="ParseAssertException"></#if>
+                    throw new ${errorType}(${validationField.getDescription().orElse("Validation failed")});
                 }
                 <#break>
             <#case "peek">
diff --git a/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4 b/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
index 332d3b2e21..ddbc405da1 100644
--- a/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
+++ b/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
@@ -137,7 +137,7 @@ virtualField
  ;
 
 validationField
- : 'validation' validationExpression=expression (description=STRING_LITERAL)?
+ : 'validation' validationExpression=expression (description=STRING_LITERAL)? ('shouldFail='shouldFail=BOOLEAN_LITERAL)?
  ;
 
 peekField
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultValidationField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultValidationField.java
index 14db0e8771..75cbdcb8d2 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultValidationField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultValidationField.java
@@ -30,9 +30,12 @@ public class DefaultValidationField implements ValidationField, Field {
     private final Term validationExpression;
     private final String description;
 
-    public DefaultValidationField(Term validationExpression, String description) {
+    private final boolean shouldFail;
+
+    public DefaultValidationField(Term validationExpression, String description, boolean shouldFail) {
         this.validationExpression = Objects.requireNonNull(validationExpression);
-        this.description=description;
+        this.description = description;
+        this.shouldFail = shouldFail;
     }
 
     @Override
@@ -45,6 +48,11 @@ public class DefaultValidationField implements ValidationField, Field {
         return Optional.ofNullable(description);
     }
 
+    @Override
+    public boolean shouldFail() {
+        return shouldFail;
+    }
+
     // TODO: dummy implementation as this is not really a field
     @Override
     public String getTypeName() {
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index e43e6fdb93..579e6e7b11 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@ -480,7 +480,11 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
     @Override
     public void enterValidationField(MSpecParser.ValidationFieldContext ctx) {
         Term validationExpression = getExpressionTerm(ctx.validationExpression);
-        Field field = new DefaultValidationField(validationExpression, ctx.description.getText());
+        boolean shouldFail = true;
+        if (ctx.shouldFail!=null){
+            shouldFail = "true".equalsIgnoreCase(ctx.shouldFail.getText());
+        }
+        Field field = new DefaultValidationField(validationExpression, ctx.description.getText(), shouldFail);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ParseValidationException.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ParseValidationException.java
new file mode 100644
index 0000000000..af09dbd64c
--- /dev/null
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/ParseValidationException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.generation;
+
+/**
+ * Is thrown when an validation field in mspec says no.
+ */
+public class ParseValidationException extends ParseException {
+    public ParseValidationException(String message) {
+        super(message);
+    }
+
+    public ParseValidationException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}