Skip to content

Commit 4454c85

Browse files
authored
JsonPrinter remove trailing garbage after non-printable char (#950)
1 parent b0bfc35 commit 4454c85

File tree

2 files changed

+49
-6
lines changed

2 files changed

+49
-6
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/json/JsonTokenListener.java

+17-6
Original file line numberDiff line numberDiff line change
@@ -336,12 +336,7 @@ private void appendEncodingAsString(
336336
if (size > 1 && encoding.primitiveType() == CHAR)
337337
{
338338
doubleQuote();
339-
340-
for (int i = 0; i < size; i++)
341-
{
342-
escape((char)buffer.getByte(index + (i * elementSize)));
343-
}
344-
339+
escapePrintableChar(buffer, index, size, elementSize);
345340
doubleQuote();
346341
}
347342
else
@@ -369,6 +364,22 @@ private void appendEncodingAsString(
369364
}
370365
}
371366

367+
private void escapePrintableChar(final DirectBuffer buffer, final int index, final int size, final int elementSize)
368+
{
369+
for (int i = 0; i < size; i++)
370+
{
371+
final byte c = buffer.getByte(index + (i * elementSize));
372+
if (c > 0)
373+
{
374+
escape((char)c);
375+
}
376+
else
377+
{
378+
break;
379+
}
380+
}
381+
}
382+
372383
private void backup()
373384
{
374385
final int newLength = output.length() - 2;

sbe-tool/src/test/java/uk/co/real_logic/sbe/json/JsonPrinterTest.java

+32
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package uk.co.real_logic.sbe.json;
1717

18+
import baseline.CarEncoder;
1819
import baseline.CredentialsEncoder;
1920
import baseline.MessageHeaderEncoder;
2021
import org.agrona.concurrent.UnsafeBuffer;
@@ -155,6 +156,37 @@ public void exampleVarData() throws Exception
155156
result);
156157
}
157158

159+
@Test
160+
public void removeTrailingGarbage() throws Exception
161+
{
162+
final ByteBuffer encodedSchemaBuffer = ByteBuffer.allocate(SCHEMA_BUFFER_CAPACITY);
163+
encodeSchema(encodedSchemaBuffer);
164+
165+
final ByteBuffer encodedMsgBuffer = ByteBuffer.allocate(MSG_BUFFER_CAPACITY);
166+
final UnsafeBuffer buffer = new UnsafeBuffer(encodedMsgBuffer);
167+
final CarEncoder encoder = new CarEncoder();
168+
encoder.wrapAndApplyHeader(buffer, 0, new MessageHeaderEncoder());
169+
encoder.vehicleCode("vc\0ノ�");
170+
encodedMsgBuffer.position(encoder.encodedLength());
171+
encodedSchemaBuffer.flip();
172+
final Ir ir = decodeIr(encodedSchemaBuffer);
173+
174+
final JsonPrinter printer = new JsonPrinter(ir);
175+
final String result = printer.print(encodedMsgBuffer);
176+
assertEquals("{\n" + " \"serialNumber\": 0,\n" +
177+
" \"modelYear\": 0,\n" +
178+
" \"available\": \"F\",\n" + " \"code\": \"null\",\n" + " \"someNumbers\": [0, 0, 0, 0, 0],\n" +
179+
" \"vehicleCode\": \"vc\",\n" + //trailing garbage removed
180+
" \"extras\": { \"sunRoof\": false, \"sportsPack\": false, \"cruiseControl\": false },\n" +
181+
" \"engine\": \n" + " {\n" + " \"capacity\": 0,\n" + " \"numCylinders\": 0,\n" +
182+
" \"maxRpm\": 9000,\n" + " \"manufacturerCode\": \"\",\n" +
183+
" \"fuel\": \"Petrol\"\n" + " },\n" + " \"uuid\": [0, 0],\n" + " \"cupHolderCount\": 0,\n" +
184+
" \"fuelFigures\": [],\n" + " \"performanceFigures\": [],\n" + " \"manufacturer\": \"\",\n" +
185+
" \"model\": \"\",\n" + " \"activationCode\": \"\"\n" + "}",
186+
result);
187+
}
188+
189+
158190
private static void encodeSchema(final ByteBuffer buffer) throws Exception
159191
{
160192
final Path path = Paths.get("src/test/resources/json-printer-test-schema.xml");

0 commit comments

Comments
 (0)