diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java index 16e1f1353a..d206ca7bc2 100644 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java @@ -801,6 +801,37 @@ private void generateDataDecodeMethods( sizeOfLengthField, generateGet(lengthType, "limit", byteOrderStr), characterEncoding)); + + if (characterEncoding.contains("ASCII")) + { + sb.append(String.format("\n" + + indent + " public void get%1$s(final Appendable value)\n" + + indent + " {\n" + + "%2$s" + + indent + " final int headerLength = %3$d;\n" + + indent + " final int limit = parentMessage.limit();\n" + + indent + " final int dataLength = (int)%4$s;\n" + + indent + " final int dataOffset = limit + headerLength;\n" + + indent + " parentMessage.limit(dataOffset + dataLength);\n" + + indent + " for (int i = 0; i < dataLength; ++i)\n" + + indent + " {\n" + + indent + " try\n" + + indent + " {\n" + + indent + " final int c = buffer.getByte(dataOffset + i) & 0xFF;\n" + + indent + " value.append(c > 127 ? '?' : (char)c);\n" + + indent + " }\n" + + indent + " catch (final java.io.IOException e)\n" + + indent + " {\n" + + indent + " throw new java.io.UncheckedIOException(e);\n" + + indent + " }\n" + + indent + " }\n" + + indent + " }\n", + Generators.toUpperFirstChar(propertyName), + generateStringNotPresentCondition(token.version(), indent), + sizeOfLengthField, + generateGet(lengthType, "limit", byteOrderStr), + byteOrderStr)); + } } } @@ -1813,6 +1844,34 @@ private CharSequence generatePrimitiveArrayPropertyDecode( fieldLength, offset, fieldLength, fieldLength, charset(encoding.characterEncoding()))); + + if (encoding.characterEncoding().contains("ASCII")) + { + sb.append(String.format("\n" + + indent + " public void get%s(final Appendable value)\n" + + indent + " {\n" + + "%s" + + indent + " for (int i = 0; i < %d ; ++i)\n" + + indent + " {\n" + + indent + " final int c = buffer.getByte(this.offset + %d + i) & 0xFF;\n" + + indent + " if (c == 0)\n" + + indent + " {\n" + + indent + " break;\n" + + indent + " }\n" + + indent + " try\n" + + indent + " {\n" + + indent + " value.append(c > 127 ? '?' : (char)c);\n" + + indent + " }\n" + + indent + " catch (final java.io.IOException e)\n" + + indent + " {\n" + + indent + " throw new java.io.UncheckedIOException(e);\n" + + indent + " }\n" + + indent + " }\n" + + indent + " }\n\n", + Generators.toUpperFirstChar(propertyName), + generateStringNotPresentCondition(propertyToken.version(), indent), + fieldLength, offset)); + } } return sb; diff --git a/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/JavaGeneratorTest.java b/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/JavaGeneratorTest.java index edabbfac85..0fa0de6300 100644 --- a/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/JavaGeneratorTest.java +++ b/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/JavaGeneratorTest.java @@ -375,6 +375,55 @@ public void shouldGenerateGetString() throws Exception assertThat(get(decoder, "vehicleCode"), is("R11R12")); } + @Test + public void shouldGenerateGetFixedLengthStringUsingAppendable() throws Exception + { + final UnsafeBuffer buffer = new UnsafeBuffer(new byte[4096]); + final StringBuilder result = new StringBuilder(); + generator().generate(); + + final Object encoder = wrap(buffer, compileCarEncoder().newInstance()); + final Object decoder = getCarDecoder(buffer, encoder); + + set(encoder, "vehicleCode", String.class, "R11"); + get(decoder, "vehicleCode", result); + assertThat(result.toString(), is("R11")); + + result.setLength(0); + set(encoder, "vehicleCode", String.class, ""); + get(decoder, "vehicleCode", result); + assertThat(result.toString(), is("")); + + result.setLength(0); + set(encoder, "vehicleCode", String.class, "R11R12"); + get(decoder, "vehicleCode", result); + assertThat(result.toString(), is("R11R12")); + } + + @Test + public void shouldGenerateGetVariableStringUsingAppendable() throws Exception + { + final UnsafeBuffer buffer = new UnsafeBuffer(new byte[4096]); + final StringBuilder result = new StringBuilder(); + generator().generate(); + + final Object encoder = wrap(buffer, compileCarEncoder().newInstance()); + final Object decoder = getCarDecoder(buffer, encoder); + set(encoder, "color", String.class, "Red"); + get(decoder, "color", result); + assertThat(result.toString(), is("Red")); + + result.setLength(0); + set(encoder, "color", String.class, ""); + get(decoder, "color", result); + assertThat(result.toString(), is("")); + + result.setLength(0); + set(encoder, "color", String.class, "Red and Blue"); + get(decoder, "color", result); + assertThat(result.toString(), is("Red and Blue")); + } + @Test public void shouldGeneratePutCharSequence() throws Exception { diff --git a/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/ReflectionUtil.java b/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/ReflectionUtil.java index 580812511c..bf92bee807 100644 --- a/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/ReflectionUtil.java +++ b/sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/ReflectionUtil.java @@ -15,6 +15,8 @@ */ package uk.co.real_logic.sbe.generation.java; +import uk.co.real_logic.sbe.generation.Generators; + public final class ReflectionUtil { static int getSbeSchemaVersion(final Object encoder) throws Exception @@ -37,6 +39,12 @@ static Object get(final Object object, final String fieldName) throws Exception return object.getClass().getMethod(fieldName).invoke(object); } + static void get(final Object object, final String fieldName, final Appendable arg) throws Exception + { + final String methodName = "get" + Generators.toUpperFirstChar(fieldName); + object.getClass().getMethod(methodName, Appendable.class).invoke(object, arg); + } + static String getManufacturer(final Object decoder) throws Exception { return (String)get(decoder, "manufacturer"); diff --git a/sbe-tool/src/test/resources/code-generation-schema.xml b/sbe-tool/src/test/resources/code-generation-schema.xml index 265fb6641c..7e1634cd1f 100644 --- a/sbe-tool/src/test/resources/code-generation-schema.xml +++ b/sbe-tool/src/test/resources/code-generation-schema.xml @@ -30,6 +30,10 @@ + + + + @@ -84,5 +88,6 @@ +