diff --git a/artio-codecs/src/main/java/uk/co/real_logic/artio/builder/RejectEmptyTag.java b/artio-codecs/src/main/java/uk/co/real_logic/artio/builder/RejectEmptyTag.java new file mode 100644 index 0000000000..9d4e264dae --- /dev/null +++ b/artio-codecs/src/main/java/uk/co/real_logic/artio/builder/RejectEmptyTag.java @@ -0,0 +1,26 @@ +/* + * Copyright 2015-2023 Real Logic Limited. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package uk.co.real_logic.artio.builder; + +public final class RejectEmptyTag +{ + private static final String CODEC_DISABLE_REJECT_EMPTY_TAG_PROP = + "fix.codecs.disable_reject_empty_tag"; + private static final boolean CODEC_DISABLE_REJECT_EMPTY_TAG_ENABLED = + Boolean.getBoolean(CODEC_DISABLE_REJECT_EMPTY_TAG_PROP); + public static final boolean CODEC_REJECT_EMPTY_TAG_ENABLED = + !CODEC_DISABLE_REJECT_EMPTY_TAG_ENABLED; +} diff --git a/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/CodecGenerator.java b/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/CodecGenerator.java index 6964b4e895..f0ec3e2096 100644 --- a/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/CodecGenerator.java +++ b/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/CodecGenerator.java @@ -17,6 +17,9 @@ import org.agrona.generation.OutputManager; import org.agrona.generation.PackageOutputManager; + + +import uk.co.real_logic.artio.builder.RejectEmptyTag; import uk.co.real_logic.artio.builder.RejectUnknownEnumValue; import uk.co.real_logic.artio.builder.RejectUnknownField; import uk.co.real_logic.artio.builder.Validation; @@ -163,6 +166,7 @@ private static void generateDictionary( parentPackage, encoderOutput, Validation.class, + RejectEmptyTag.class, RejectUnknownField.class, RejectUnknownEnumValue.class, codecRejectUnknownEnumValueEnabled, @@ -176,6 +180,7 @@ private static void generateDictionary( encoderPackage, decoderOutput, Validation.class, + RejectEmptyTag.class, RejectUnknownField.class, RejectUnknownEnumValue.class, false, @@ -198,6 +203,7 @@ private static void generateDictionary( parentPackage, encoderPackage, flyweightDecoderOutput, Validation.class, + RejectEmptyTag.class, RejectUnknownField.class, RejectUnknownEnumValue.class, true, diff --git a/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/DecoderGenerator.java b/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/DecoderGenerator.java index de021e4f02..cf973ffaae 100644 --- a/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/DecoderGenerator.java +++ b/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/DecoderGenerator.java @@ -128,6 +128,7 @@ static String decoderClassName(final String name) final String encoderPackage, final OutputManager outputManager, final Class validationClass, + final Class rejectEmptyTagClass, final Class rejectUnknownFieldClass, final Class rejectUnknownEnumValueClass, final boolean flyweightsEnabled, @@ -135,8 +136,9 @@ static String decoderClassName(final String name) final String codecRejectUnknownEnumValueEnabled, final boolean fixTagsInJavadoc) { - super(dictionary, thisPackage, commonPackage, outputManager, validationClass, rejectUnknownFieldClass, - rejectUnknownEnumValueClass, flyweightsEnabled, codecRejectUnknownEnumValueEnabled, fixTagsInJavadoc); + super(dictionary, thisPackage, commonPackage, outputManager, validationClass, rejectEmptyTagClass, + rejectUnknownFieldClass, rejectUnknownEnumValueClass, flyweightsEnabled, codecRejectUnknownEnumValueEnabled, + fixTagsInJavadoc); this.initialBufferSize = initialBufferSize; this.encoderPackage = encoderPackage; this.wrapEmptyBuffer = wrapEmptyBuffer; @@ -1676,30 +1678,31 @@ private String decodeMethod(final List entries, final Aggregate aggregate .collect(joining("\n", "", "\n")); final String suffix = - " default:\n" + - " if (!" + CODEC_REJECT_UNKNOWN_FIELD_ENABLED + ")\n" + - " {\n" + + " default:\n" + + " if (!" + CODEC_REJECT_UNKNOWN_FIELD_ENABLED + ")\n" + + " {\n" + (isGroup ? - " seenFields.remove(tag);\n" : - " alreadyVisitedFields.remove(tag);\n") + - " }\n" + + " seenFields.remove(tag);\n" : + " alreadyVisitedFields.remove(tag);\n") + + " }\n" + (isGroup ? "" : - " else\n" + - " {\n" + - " if (!" + unknownFieldPredicate(type) + ")\n" + + " else\n" + " {\n" + - " unknownFields.add(tag);\n" + - " }\n" + - " }\n") + + " if (!" + unknownFieldPredicate(type) + ")\n" + + " {\n" + + " unknownFields.add(tag);\n" + + " }\n" + + " }\n") + // Skip the thing if it's a completely unknown field and you aren't validating messages - " if (" + CODEC_REJECT_UNKNOWN_FIELD_ENABLED + + " if (" + CODEC_REJECT_UNKNOWN_FIELD_ENABLED + " || " + unknownFieldPredicate(type) + ")\n" + - " {\n" + - decodeTrailerOrReturn(hasCommonCompounds, 5) + - " }\n" + + " {\n" + + decodeTrailerOrReturn(hasCommonCompounds, 6) + + " }\n" + "\n" + - " }\n\n" + + " }\n\n" + + " }\n" + " if (position < (endOfField + 1))\n" + " {\n" + " position = endOfField + 1;\n" + @@ -1718,61 +1721,63 @@ private String generateDecodePrefix( final String endGroupCheck) { return " public int decode(final AsciiBuffer buffer, final int offset, final int length)\n" + - " {\n" + - " // Decode " + aggregate.name() + "\n" + - " int seenFieldCount = 0;\n" + - " if (" + CODEC_VALIDATION_ENABLED + ")\n" + - " {\n" + - " missingRequiredFields.copy(" + REQUIRED_FIELDS + ");\n" + - (isGroup ? "" : " alreadyVisitedFields.clear();\n") + - " }\n" + - " this.buffer = buffer;\n" + - " final int end = offset + length;\n" + - " int position = offset;\n" + - (hasCommonCompounds ? " position += header.decode(buffer, position, length);\n" : "") + - (isGroup ? " seenFields.clear();\n" : "") + - " int tag;\n\n" + - " while (position < end)\n" + - " {\n" + - " final int equalsPosition = buffer.scan(position, end, '=');\n" + - " if (equalsPosition == AsciiBuffer.UNKNOWN_INDEX)\n" + - " {\n" + - " return position;\n" + - " }\n" + - " tag = buffer.getInt(position, equalsPosition);\n" + - endGroupCheck + - " final int valueOffset = equalsPosition + 1;\n" + - " int endOfField = buffer.scan(valueOffset, end, START_OF_HEADER);\n" + - " if (endOfField == AsciiBuffer.UNKNOWN_INDEX)\n" + - " {\n" + - " rejectReason = " + VALUE_IS_INCORRECT + ";\n" + - " break;\n" + - " }\n" + - " final int valueLength = endOfField - valueOffset;\n" + - " if (" + CODEC_VALIDATION_ENABLED + ")\n" + - " {\n" + - " if (tag <= 0)\n" + - " {\n" + - " invalidTagId = tag;\n" + - " rejectReason = " + INVALID_TAG_NUMBER + ";\n" + - " }\n" + - " else if (valueLength == 0)\n" + - " {\n" + - " invalidTagId = tag;\n" + - " rejectReason = " + TAG_SPECIFIED_WITHOUT_A_VALUE + ";\n" + - " }\n" + - headerValidation(isHeader) + - (isGroup ? "" : + " {\n" + + " // Decode " + aggregate.name() + "\n" + + " int seenFieldCount = 0;\n" + + " if (" + CODEC_VALIDATION_ENABLED + ")\n" + + " {\n" + + " missingRequiredFields.copy(" + REQUIRED_FIELDS + ");\n" + + (isGroup ? "" : " alreadyVisitedFields.clear();\n") + + " }\n" + + " this.buffer = buffer;\n" + + " final int end = offset + length;\n" + + " int position = offset;\n" + + (hasCommonCompounds ? " position += header.decode(buffer, position, length);\n" : "") + + (isGroup ? " seenFields.clear();\n" : "") + + " int tag;\n\n" + + " while (position < end)\n" + + " {\n" + + " final int equalsPosition = buffer.scan(position, end, '=');\n" + + " if (equalsPosition == AsciiBuffer.UNKNOWN_INDEX)\n" + + " {\n" + + " return position;\n" + + " }\n" + + " tag = buffer.getInt(position, equalsPosition);\n" + + endGroupCheck + + " final int valueOffset = equalsPosition + 1;\n" + + " int endOfField = buffer.scan(valueOffset, end, START_OF_HEADER);\n" + + " if (endOfField == AsciiBuffer.UNKNOWN_INDEX)\n" + + " {\n" + + " rejectReason = " + VALUE_IS_INCORRECT + ";\n" + + " break;\n" + + " }\n" + + " final int valueLength = endOfField - valueOffset;\n" + + " if (" + CODEC_VALIDATION_ENABLED + ")\n" + + " {\n" + + " if (tag <= 0)\n" + + " {\n" + + " invalidTagId = tag;\n" + + " rejectReason = " + INVALID_TAG_NUMBER + ";\n" + + " }\n" + + " else if (" + CODEC_REJECT_EMPTY_TAG_ENABLED + " && valueLength == 0)\n" + + " {\n" + + " invalidTagId = tag;\n" + + " rejectReason = " + TAG_SPECIFIED_WITHOUT_A_VALUE + ";\n" + + " }\n" + + headerValidation(isHeader) + + (isGroup ? "" : " if (!alreadyVisitedFields.add(tag))\n" + " {\n" + " invalidTagId = tag;\n" + " rejectReason = " + TAG_APPEARS_MORE_THAN_ONCE + ";\n" + " }\n") + - " missingRequiredFields.remove(tag);\n" + - " seenFieldCount++;\n" + - " }\n\n" + - " switch (tag)\n" + - " {\n"; + " missingRequiredFields.remove(tag);\n" + + " seenFieldCount++;\n" + + " }\n\n" + + " if (valueLength > 0)\n" + + " {\n" + + " switch (tag)\n" + + " {\n"; } private String decodeTrailerOrReturn(final boolean hasCommonCompounds, final int indent) @@ -1948,13 +1953,13 @@ private String decodeField(final Entry entry, final String suffix) final String fieldName = formatPropertyName(name); return String.format( - " case Constants.%s:\n" + + " case Constants.%s:\n" + "%s" + "%s" + "%s" + "%s" + "%s" + - " break;\n", + " break;\n", constantName(name), optionalAssign(entry), fieldDecodeMethod(field, fieldName), @@ -1966,25 +1971,25 @@ private String decodeField(final Entry entry, final String suffix) private String storeLengthForVariableLengthFields(final Type type, final String fieldName) { return type.hasLengthField(flyweightsEnabled) ? - String.format(" %sLength = valueLength;\n", fieldName) : + String.format(" %sLength = valueLength;\n", fieldName) : ""; } private String storeOffsetForVariableLengthFields(final Type type, final String fieldName) { return type.hasOffsetField(flyweightsEnabled) ? - String.format(" %sOffset = valueOffset;\n", fieldName) : + String.format(" %sOffset = valueOffset;\n", fieldName) : ""; } private String optionalAssign(final Entry entry) { - return entry.required() ? "" : String.format(" has%s = true;\n", entry.name()); + return entry.required() ? "" : String.format(" has%s = true;\n", entry.name()); } private String fieldDecodeMethod(final Field field, final String fieldName) { - final String prefix = String.format(" %s = ", fieldName); + final String prefix = String.format(" %s = ", fieldName); final String decodeMethod; switch (field.type()) { diff --git a/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/EncoderGenerator.java b/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/EncoderGenerator.java index 711c951be8..d8876aab9b 100644 --- a/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/EncoderGenerator.java +++ b/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/EncoderGenerator.java @@ -162,13 +162,15 @@ static String encoderClassName(final String name) final String builderCommonPackage, final OutputManager outputManager, final Class validationClass, + final Class rejectEmptyTagClass, final Class rejectUnknownFieldClass, final Class rejectUnknownEnumValueClass, final String codecRejectUnknownEnumValueEnabled, final boolean fixTagsInJavadoc) { - super(dictionary, builderPackage, builderCommonPackage, outputManager, validationClass, rejectUnknownFieldClass, - rejectUnknownEnumValueClass, false, codecRejectUnknownEnumValueEnabled, fixTagsInJavadoc); + super(dictionary, builderPackage, builderCommonPackage, outputManager, validationClass, rejectEmptyTagClass, + rejectUnknownFieldClass, rejectUnknownEnumValueClass, false, codecRejectUnknownEnumValueEnabled, + fixTagsInJavadoc); final Component header = dictionary.header(); validateHasField(header, BEGIN_STRING); diff --git a/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/Generator.java b/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/Generator.java index 31e2b47fcb..9935cbaac5 100644 --- a/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/Generator.java +++ b/artio-codecs/src/main/java/uk/co/real_logic/artio/dictionary/generation/Generator.java @@ -56,6 +56,7 @@ public abstract class Generator public static final String BODY_LENGTH = "BodyLength"; public static final String CODEC_VALIDATION_ENABLED = "CODEC_VALIDATION_ENABLED"; + public static final String CODEC_REJECT_EMPTY_TAG_ENABLED = "CODEC_REJECT_EMPTY_TAG_ENABLED"; public static final String CODEC_REJECT_UNKNOWN_FIELD_ENABLED = "CODEC_REJECT_UNKNOWN_FIELD_ENABLED"; public static final String RUNTIME_REJECT_UNKNOWN_ENUM_VALUE_PROPERTY = "CODEC_REJECT_UNKNOWN_ENUM_VALUE_ENABLED"; public static final Pattern NEWLINE = Pattern.compile("^", MULTILINE); @@ -92,6 +93,7 @@ protected String commonCompoundImports(final String form, final boolean headerWr private final String commonPackage; protected final OutputManager outputManager; protected final Class validationClass; + protected final Class rejectEmptyTagClass; protected final Class rejectUnknownFieldClass; private final Class rejectUnknownEnumValueClass; protected final boolean flyweightsEnabled; @@ -107,6 +109,7 @@ protected Generator( final String commonPackage, final OutputManager outputManager, final Class validationClass, + final Class rejectEmptyTagClass, final Class rejectUnknownFieldClass, final Class rejectUnknownEnumValueClass, final boolean flyweightsEnabled, @@ -118,6 +121,7 @@ protected Generator( this.commonPackage = commonPackage; this.outputManager = outputManager; this.validationClass = validationClass; + this.rejectEmptyTagClass = rejectEmptyTagClass; this.rejectUnknownFieldClass = rejectUnknownFieldClass; this.rejectUnknownEnumValueClass = rejectUnknownEnumValueClass; this.flyweightsEnabled = flyweightsEnabled; @@ -179,6 +183,7 @@ protected void generateImports( out .append(importStaticFor(StandardCharsets.class, "US_ASCII")) .append(importStaticFor(validationClass, CODEC_VALIDATION_ENABLED)) + .append(importStaticFor(rejectEmptyTagClass, CODEC_REJECT_EMPTY_TAG_ENABLED)) .append(importStaticFor(rejectUnknownFieldClass, CODEC_REJECT_UNKNOWN_FIELD_ENABLED)) .append(importStaticFor(rejectUnknownEnumValueClass, RUNTIME_REJECT_UNKNOWN_ENUM_VALUE_PROPERTY)); diff --git a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/ExampleDictionary.java b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/ExampleDictionary.java index 2c6c2eb34e..4dec687880 100644 --- a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/ExampleDictionary.java +++ b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/ExampleDictionary.java @@ -433,6 +433,10 @@ public final class ExampleDictionary public static final String EG_NO_OPTIONAL_FIELDS_MESSAGE = "8=FIX.4.4\0019=0049\00135=Z\0011001=USD\0011002=N\0011003=US\00110=209\001"; + public static final String EG_OPTIONAL_FIELDS_EMPTY_MESSAGE = + "8=FIX.4.4\0019=0049\00135=Z\0011001=USD\0011002=N\0011003=US" + + "\0011004=\0011005=\0011006=\0011007=\00110=209\001"; + public static final String EG_HIGH_NUMBER_FIELD_MESSAGE = "8=FIX.4.4\0019=0049\00135=Z\0019001=1\0011001=USD\0011002=N\0011003=US\00110=209\001"; diff --git a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/AbstractDecoderGeneratorTest.java b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/AbstractDecoderGeneratorTest.java index a2de167637..1672108275 100644 --- a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/AbstractDecoderGeneratorTest.java +++ b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/AbstractDecoderGeneratorTest.java @@ -20,6 +20,8 @@ import org.agrona.generation.StringWriterOutputManager; import org.hamcrest.Matcher; import org.junit.Test; + + import uk.co.real_logic.artio.builder.Decoder; import uk.co.real_logic.artio.decoder.SessionHeaderDecoder; import uk.co.real_logic.artio.dictionary.ExampleDictionary; @@ -75,6 +77,7 @@ public abstract class AbstractDecoderGeneratorTest private static Class component; private static Class otherMessage; private static Class fieldsMessage; + private static Class fieldsMessageAllowingEmptyTags; private static Class phoneBookMessage; private static Class allReqFieldTypesMessage; private static Class enumTestMessage; @@ -84,13 +87,15 @@ public abstract class AbstractDecoderGeneratorTest static void generate(final boolean flyweightStringsEnabled) throws Exception { sourcesWithValidation = generateSources( - true, false, true, flyweightStringsEnabled, false); + true, true, false, true, flyweightStringsEnabled, false); final Map sourcesWithNoEnumValueValidation = generateSources( - true, false, false, flyweightStringsEnabled, false); + true, true, false, false, flyweightStringsEnabled, false); final Map sourcesWithoutValidation = generateSources( - false, false, true, flyweightStringsEnabled, true); + false, true, false, true, flyweightStringsEnabled, true); final Map sourcesRejectingUnknownFields = generateSources( - true, true, true, flyweightStringsEnabled, false); + true, true, true, true, flyweightStringsEnabled, false); + final Map sourcesAllowingEmptyTags = generateSources( + true, false, true, true, flyweightStringsEnabled, false); heartbeat = compileInMemory(HEARTBEAT_DECODER, sourcesWithValidation); if (heartbeat == null || CODEC_LOGGING) { @@ -108,6 +113,7 @@ static void generate(final boolean flyweightStringsEnabled) throws Exception heartbeatWithoutValidation = compileInMemory(HEARTBEAT_DECODER, sourcesWithoutValidation); heartbeatWithoutEnumValueValidation = compileInMemory(HEARTBEAT_DECODER, sourcesWithNoEnumValueValidation); heartbeatWithRejectingUnknownFields = compileInMemory(HEARTBEAT_DECODER, sourcesRejectingUnknownFields); + fieldsMessageAllowingEmptyTags = compileInMemory(FIELDS_MESSAGE_DECODER, sourcesAllowingEmptyTags); allReqFieldTypesMessage = compileInMemory(ALL_REQ_FIELD_TYPES_MESSAGE_DECODER, sourcesWithoutValidation); if (heartbeatWithoutValidation == null || CODEC_LOGGING) { @@ -116,10 +122,13 @@ static void generate(final boolean flyweightStringsEnabled) throws Exception } private static Map generateSources( - final boolean validation, final boolean rejectingUnknownFields, final boolean rejectingUnknownEnumValue, - final boolean flyweightStringsEnabled, final boolean wrapEmptyBuffer) + final boolean validation, final boolean rejectingEmptyTags, final boolean rejectingUnknownFields, + final boolean rejectingUnknownEnumValue, final boolean flyweightStringsEnabled, + final boolean wrapEmptyBuffer + ) { final Class validationClass = validation ? ValidationOn.class : ValidationOff.class; + final Class rejectEmptyTag = rejectingEmptyTags ? RejectEmptyTagOn.class : RejectEmptyTagOff.class; final Class rejectUnknownField = rejectingUnknownFields ? RejectUnknownFieldOn.class : RejectUnknownFieldOff.class; final Class rejectUnknownEnumValue = rejectingUnknownEnumValue ? @@ -130,11 +139,11 @@ private static Map generateSources( final EnumGenerator enumGenerator = new EnumGenerator(MESSAGE_EXAMPLE, TEST_PARENT_PACKAGE, outputManager); final DecoderGenerator decoderGenerator = new DecoderGenerator( MESSAGE_EXAMPLE, 1, TEST_PACKAGE, TEST_PARENT_PACKAGE, TEST_PACKAGE, - outputManager, validationClass, rejectUnknownField, + outputManager, validationClass, rejectEmptyTag, rejectUnknownField, rejectUnknownEnumValue, flyweightStringsEnabled, wrapEmptyBuffer, String.valueOf(rejectingUnknownEnumValue), true); final EncoderGenerator encoderGenerator = new EncoderGenerator(MESSAGE_EXAMPLE, TEST_PACKAGE, - TEST_PARENT_PACKAGE, outputManager, ValidationOn.class, RejectUnknownFieldOn.class, + TEST_PARENT_PACKAGE, outputManager, ValidationOn.class, RejectEmptyTagOn.class, RejectUnknownFieldOn.class, RejectUnknownEnumValueOn.class, RUNTIME_REJECT_UNKNOWN_ENUM_VALUE_PROPERTY, true); constantGenerator.generate(); @@ -1228,6 +1237,19 @@ public void shouldDecodeDifferentFieldTypesWithoutOptionalFields() throws Except assertValid(decoder); } + @Test + public void shouldDecodeDifferentFieldTypesWithoutOptionalFieldsWhenTagsEmpty() throws Exception + { + final Decoder decoder = (Decoder)fieldsMessageAllowingEmptyTags.getConstructor().newInstance(); + decode(EG_OPTIONAL_FIELDS_EMPTY_MESSAGE, decoder); + + assertRequiredFieldsMessageFieldsDecoded(decoder, "USD", "N", "US"); + + assertOptionalDifferentFieldsNotDecoded(decoder); + + assertValid(decoder); + } + @Test public void shouldResetDifferentFieldTypes() throws Exception { diff --git a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/AcceptorGeneratorTest.java b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/AcceptorGeneratorTest.java index 574235a7bb..71fc149002 100644 --- a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/AcceptorGeneratorTest.java +++ b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/AcceptorGeneratorTest.java @@ -40,11 +40,11 @@ public class AcceptorGeneratorTest private static final EnumGenerator ENUM_GENERATOR = new EnumGenerator( MESSAGE_EXAMPLE, TEST_PACKAGE, OUTPUT_MANAGER); private static final EncoderGenerator ENCODER_GENERATOR = new EncoderGenerator( - MESSAGE_EXAMPLE, TEST_PACKAGE, TEST_PARENT_PACKAGE, OUTPUT_MANAGER, ValidationOn.class, + MESSAGE_EXAMPLE, TEST_PACKAGE, TEST_PARENT_PACKAGE, OUTPUT_MANAGER, ValidationOn.class, RejectEmptyTagOn.class, RejectUnknownFieldOn.class, RejectUnknownEnumValueOn.class, RUNTIME_REJECT_UNKNOWN_ENUM_VALUE_PROPERTY, true); private static final DecoderGenerator DECODER_GENERATOR = new DecoderGenerator( MESSAGE_EXAMPLE, 1, TEST_PACKAGE, TEST_PARENT_PACKAGE, TEST_PACKAGE, OUTPUT_MANAGER, ValidationOn.class, - RejectUnknownFieldOff.class, RejectUnknownEnumValueOn.class, false, false, + RejectEmptyTagOn.class, RejectUnknownFieldOff.class, RejectUnknownEnumValueOn.class, false, false, Generator.RUNTIME_REJECT_UNKNOWN_ENUM_VALUE_PROPERTY, true); private static final AcceptorGenerator ACCEPTOR_GENERATOR = new AcceptorGenerator( MESSAGE_EXAMPLE, TEST_PACKAGE, OUTPUT_MANAGER); diff --git a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/CopyToEncoderGeneratorTest.java b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/CopyToEncoderGeneratorTest.java index c89436301a..6a527d3cb9 100644 --- a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/CopyToEncoderGeneratorTest.java +++ b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/CopyToEncoderGeneratorTest.java @@ -75,11 +75,11 @@ private static Map generateClasses() final EnumGenerator enumGenerator = new EnumGenerator(MESSAGE_EXAMPLE, TEST_PARENT_PACKAGE, outputManager); final DecoderGenerator decoderGenerator = new DecoderGenerator( MESSAGE_EXAMPLE, 1, TEST_PACKAGE, - TEST_PARENT_PACKAGE, TEST_PACKAGE, outputManager, ValidationOn.class, + TEST_PARENT_PACKAGE, TEST_PACKAGE, outputManager, ValidationOn.class, RejectEmptyTagOn.class, RejectUnknownFieldOn.class, RejectUnknownEnumValueOn.class, false, false, RUNTIME_REJECT_UNKNOWN_ENUM_VALUE_PROPERTY, true); final EncoderGenerator encoderGenerator = new EncoderGenerator(MESSAGE_EXAMPLE, TEST_PACKAGE, - TEST_PARENT_PACKAGE, outputManager, ValidationOn.class, RejectUnknownFieldOn.class, + TEST_PARENT_PACKAGE, outputManager, ValidationOn.class, RejectEmptyTagOn.class, RejectUnknownFieldOn.class, RejectUnknownEnumValueOn.class, RUNTIME_REJECT_UNKNOWN_ENUM_VALUE_PROPERTY, true); constantGenerator.generate(); diff --git a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/EncoderGeneratorTest.java b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/EncoderGeneratorTest.java index f3cbb71f8d..4c02312630 100644 --- a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/EncoderGeneratorTest.java +++ b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/EncoderGeneratorTest.java @@ -82,12 +82,13 @@ private static Map generateSources(final boolean validatio final Class validationClass = validation ? ValidationOn.class : ValidationOff.class; final Class rejectUnknownField = RejectUnknownFieldOff.class; final Class rejectUnknownEnumValue = RejectUnknownEnumValueOn.class; + final Class rejectEmptyTag = RejectEmptyTagOn.class; final StringWriterOutputManager outputManager = new StringWriterOutputManager(); final EnumGenerator enumGenerator = new EnumGenerator(MESSAGE_EXAMPLE, TEST_PARENT_PACKAGE, outputManager); final EncoderGenerator encoderGenerator = new EncoderGenerator(MESSAGE_EXAMPLE, TEST_PACKAGE, TEST_PARENT_PACKAGE, outputManager, validationClass, - rejectUnknownField, rejectUnknownEnumValue, Generator.RUNTIME_REJECT_UNKNOWN_ENUM_VALUE_PROPERTY, - true); + rejectEmptyTag, rejectUnknownField, rejectUnknownEnumValue, + Generator.RUNTIME_REJECT_UNKNOWN_ENUM_VALUE_PROPERTY, true); enumGenerator.generate(); encoderGenerator.generate(); return outputManager.getSources(); diff --git a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/PrinterGeneratorTest.java b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/PrinterGeneratorTest.java index fa3d1e1724..b0e678c521 100644 --- a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/PrinterGeneratorTest.java +++ b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/PrinterGeneratorTest.java @@ -40,11 +40,11 @@ public class PrinterGeneratorTest private static final DecoderGenerator DECODER_GENERATOR = new DecoderGenerator( MESSAGE_EXAMPLE, 1, TEST_PACKAGE, TEST_PARENT_PACKAGE, TEST_PACKAGE, - OUTPUT_MANAGER, ValidationOn.class, + OUTPUT_MANAGER, ValidationOn.class, RejectEmptyTagOn.class, RejectUnknownFieldOff.class, RejectUnknownEnumValueOn.class, false, false, Generator.RUNTIME_REJECT_UNKNOWN_ENUM_VALUE_PROPERTY, true); private static final EncoderGenerator ENCODER_GENERATOR = new EncoderGenerator( - MESSAGE_EXAMPLE, TEST_PACKAGE, TEST_PARENT_PACKAGE, OUTPUT_MANAGER, ValidationOn.class, + MESSAGE_EXAMPLE, TEST_PACKAGE, TEST_PARENT_PACKAGE, OUTPUT_MANAGER, ValidationOn.class, RejectEmptyTagOn.class, RejectUnknownFieldOn.class, RejectUnknownEnumValueOn.class, RUNTIME_REJECT_UNKNOWN_ENUM_VALUE_PROPERTY, true); diff --git a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/RejectEmptyTagOff.java b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/RejectEmptyTagOff.java new file mode 100644 index 0000000000..3e2ccc1006 --- /dev/null +++ b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/RejectEmptyTagOff.java @@ -0,0 +1,6 @@ +package uk.co.real_logic.artio.dictionary.generation; + +public class RejectEmptyTagOff +{ + public static final boolean CODEC_REJECT_EMPTY_TAG_ENABLED = false; +} diff --git a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/RejectEmptyTagOn.java b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/RejectEmptyTagOn.java new file mode 100644 index 0000000000..ea475c80a7 --- /dev/null +++ b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/RejectEmptyTagOn.java @@ -0,0 +1,6 @@ +package uk.co.real_logic.artio.dictionary.generation; + +public class RejectEmptyTagOn +{ + public static final boolean CODEC_REJECT_EMPTY_TAG_ENABLED = true; +} diff --git a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/ToEncoderDecoderGeneratorTest.java b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/ToEncoderDecoderGeneratorTest.java index ddb4516ad2..03e6a795a5 100644 --- a/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/ToEncoderDecoderGeneratorTest.java +++ b/artio-codecs/src/test/java/uk/co/real_logic/artio/dictionary/generation/ToEncoderDecoderGeneratorTest.java @@ -92,11 +92,11 @@ private static Map generateClasses(final boolean flyweight final EnumGenerator enumGenerator = new EnumGenerator(MESSAGE_EXAMPLE, TEST_PARENT_PACKAGE, outputManager); final DecoderGenerator decoderGenerator = new DecoderGenerator( MESSAGE_EXAMPLE, 1, TEST_PACKAGE, - TEST_PARENT_PACKAGE, TEST_PACKAGE, outputManager, ValidationOn.class, + TEST_PARENT_PACKAGE, TEST_PACKAGE, outputManager, ValidationOn.class, RejectEmptyTagOn.class, RejectUnknownFieldOn.class, RejectUnknownEnumValueOn.class, flyweightStringsEnabled, false, RUNTIME_REJECT_UNKNOWN_ENUM_VALUE_PROPERTY, true); final EncoderGenerator encoderGenerator = new EncoderGenerator(MESSAGE_EXAMPLE, TEST_PACKAGE, - TEST_PARENT_PACKAGE, outputManager, ValidationOn.class, RejectUnknownFieldOn.class, + TEST_PARENT_PACKAGE, outputManager, ValidationOn.class, RejectEmptyTagOn.class, RejectUnknownFieldOn.class, RejectUnknownEnumValueOn.class, RUNTIME_REJECT_UNKNOWN_ENUM_VALUE_PROPERTY, true); constantGenerator.generate();