Skip to content

Commit 09a5d4d

Browse files
authored
Merge pull request #557 from tom-smalls/master
[Java] Add new method to decoders to pass in Appendable to write ascii encoded strings to
2 parents cbb68f5 + 0d88895 commit 09a5d4d

File tree

4 files changed

+121
-0
lines changed

4 files changed

+121
-0
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,37 @@ private void generateDataDecodeMethods(
801801
sizeOfLengthField,
802802
generateGet(lengthType, "limit", byteOrderStr),
803803
characterEncoding));
804+
805+
if (characterEncoding.contains("ASCII"))
806+
{
807+
sb.append(String.format("\n" +
808+
indent + " public void get%1$s(final Appendable value)\n" +
809+
indent + " {\n" +
810+
"%2$s" +
811+
indent + " final int headerLength = %3$d;\n" +
812+
indent + " final int limit = parentMessage.limit();\n" +
813+
indent + " final int dataLength = (int)%4$s;\n" +
814+
indent + " final int dataOffset = limit + headerLength;\n" +
815+
indent + " parentMessage.limit(dataOffset + dataLength);\n" +
816+
indent + " for (int i = 0; i < dataLength; ++i)\n" +
817+
indent + " {\n" +
818+
indent + " try\n" +
819+
indent + " {\n" +
820+
indent + " final int c = buffer.getByte(dataOffset + i) & 0xFF;\n" +
821+
indent + " value.append(c > 127 ? '?' : (char)c);\n" +
822+
indent + " }\n" +
823+
indent + " catch (final java.io.IOException e)\n" +
824+
indent + " {\n" +
825+
indent + " throw new java.io.UncheckedIOException(e);\n" +
826+
indent + " }\n" +
827+
indent + " }\n" +
828+
indent + " }\n",
829+
Generators.toUpperFirstChar(propertyName),
830+
generateStringNotPresentCondition(token.version(), indent),
831+
sizeOfLengthField,
832+
generateGet(lengthType, "limit", byteOrderStr),
833+
byteOrderStr));
834+
}
804835
}
805836
}
806837

@@ -1813,6 +1844,34 @@ private CharSequence generatePrimitiveArrayPropertyDecode(
18131844
fieldLength, offset,
18141845
fieldLength, fieldLength,
18151846
charset(encoding.characterEncoding())));
1847+
1848+
if (encoding.characterEncoding().contains("ASCII"))
1849+
{
1850+
sb.append(String.format("\n" +
1851+
indent + " public void get%s(final Appendable value)\n" +
1852+
indent + " {\n" +
1853+
"%s" +
1854+
indent + " for (int i = 0; i < %d ; ++i)\n" +
1855+
indent + " {\n" +
1856+
indent + " final int c = buffer.getByte(this.offset + %d + i) & 0xFF;\n" +
1857+
indent + " if (c == 0)\n" +
1858+
indent + " {\n" +
1859+
indent + " break;\n" +
1860+
indent + " }\n" +
1861+
indent + " try\n" +
1862+
indent + " {\n" +
1863+
indent + " value.append(c > 127 ? '?' : (char)c);\n" +
1864+
indent + " }\n" +
1865+
indent + " catch (final java.io.IOException e)\n" +
1866+
indent + " {\n" +
1867+
indent + " throw new java.io.UncheckedIOException(e);\n" +
1868+
indent + " }\n" +
1869+
indent + " }\n" +
1870+
indent + " }\n\n",
1871+
Generators.toUpperFirstChar(propertyName),
1872+
generateStringNotPresentCondition(propertyToken.version(), indent),
1873+
fieldLength, offset));
1874+
}
18161875
}
18171876

18181877
return sb;

sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/JavaGeneratorTest.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,55 @@ public void shouldGenerateGetString() throws Exception
375375
assertThat(get(decoder, "vehicleCode"), is("R11R12"));
376376
}
377377

378+
@Test
379+
public void shouldGenerateGetFixedLengthStringUsingAppendable() throws Exception
380+
{
381+
final UnsafeBuffer buffer = new UnsafeBuffer(new byte[4096]);
382+
final StringBuilder result = new StringBuilder();
383+
generator().generate();
384+
385+
final Object encoder = wrap(buffer, compileCarEncoder().newInstance());
386+
final Object decoder = getCarDecoder(buffer, encoder);
387+
388+
set(encoder, "vehicleCode", String.class, "R11");
389+
get(decoder, "vehicleCode", result);
390+
assertThat(result.toString(), is("R11"));
391+
392+
result.setLength(0);
393+
set(encoder, "vehicleCode", String.class, "");
394+
get(decoder, "vehicleCode", result);
395+
assertThat(result.toString(), is(""));
396+
397+
result.setLength(0);
398+
set(encoder, "vehicleCode", String.class, "R11R12");
399+
get(decoder, "vehicleCode", result);
400+
assertThat(result.toString(), is("R11R12"));
401+
}
402+
403+
@Test
404+
public void shouldGenerateGetVariableStringUsingAppendable() throws Exception
405+
{
406+
final UnsafeBuffer buffer = new UnsafeBuffer(new byte[4096]);
407+
final StringBuilder result = new StringBuilder();
408+
generator().generate();
409+
410+
final Object encoder = wrap(buffer, compileCarEncoder().newInstance());
411+
final Object decoder = getCarDecoder(buffer, encoder);
412+
set(encoder, "color", String.class, "Red");
413+
get(decoder, "color", result);
414+
assertThat(result.toString(), is("Red"));
415+
416+
result.setLength(0);
417+
set(encoder, "color", String.class, "");
418+
get(decoder, "color", result);
419+
assertThat(result.toString(), is(""));
420+
421+
result.setLength(0);
422+
set(encoder, "color", String.class, "Red and Blue");
423+
get(decoder, "color", result);
424+
assertThat(result.toString(), is("Red and Blue"));
425+
}
426+
378427
@Test
379428
public void shouldGeneratePutCharSequence() throws Exception
380429
{

sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/ReflectionUtil.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package uk.co.real_logic.sbe.generation.java;
1717

18+
import uk.co.real_logic.sbe.generation.Generators;
19+
1820
public final class ReflectionUtil
1921
{
2022
static int getSbeSchemaVersion(final Object encoder) throws Exception
@@ -37,6 +39,12 @@ static Object get(final Object object, final String fieldName) throws Exception
3739
return object.getClass().getMethod(fieldName).invoke(object);
3840
}
3941

42+
static void get(final Object object, final String fieldName, final Appendable arg) throws Exception
43+
{
44+
final String methodName = "get" + Generators.toUpperFirstChar(fieldName);
45+
object.getClass().getMethod(methodName, Appendable.class).invoke(object, arg);
46+
}
47+
4048
static String getManufacturer(final Object decoder) throws Exception
4149
{
4250
return (String)get(decoder, "manufacturer");

sbe-tool/src/test/resources/code-generation-schema.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
<type name="length" primitiveType="uint16"/>
3131
<type name="varData" primitiveType="uint8" length="0" characterEncoding="UTF-8"/>
3232
</composite>
33+
<composite name="varAsciiStringEncoding">
34+
<type name="length" primitiveType="uint32" maxValue="1073741824"/>
35+
<type name="varData" primitiveType="uint8" length="0" characterEncoding="ASCII"/>
36+
</composite>
3337
</types>
3438
<types>
3539
<type name="ModelYear" primitiveType="uint16"/>
@@ -84,5 +88,6 @@
8488
<data name="manufacturer" id="18" type="varStringEncoding"/>
8589
<data name="model" id="19" type="varStringEncoding"/>
8690
<data name="activationCode" id="20" type="varStringEncoding"/>
91+
<data name="color" id="21" type="varAsciiStringEncoding"/>
8792
</sbe:message>
8893
</sbe:messageSchema>

0 commit comments

Comments
 (0)