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 @@
+