Skip to content

Commit

Permalink
[Java] IR was losing type information with the use of constant enums.…
Browse files Browse the repository at this point in the history
… Full enums are serialised and fields retain the constant property and encoded length rather than the type. Issue #560.
  • Loading branch information
mjpt777 committed Jun 17, 2018
1 parent 8359719 commit b5c1a7f
Show file tree
Hide file tree
Showing 8 changed files with 42 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,21 @@ public void onEnum(
final long encodedValue = readEncodingAsLong(buffer, bufferIndex, typeToken, actingVersion);

String value = null;
for (int i = beginIndex + 1; i < endIndex; i++)
if (fieldToken.isConstantEncoding())
{
final String refValue = fieldToken.encoding().constValue().toString();
final int indexOfDot = refValue.indexOf('.');
value = -1 == indexOfDot ? refValue : refValue.substring(indexOfDot + 1);
}
else
{
if (encodedValue == tokens.get(i).encoding().constValue().longValue())
for (int i = beginIndex + 1; i < endIndex; i++)
{
value = tokens.get(i).name();
break;
if (encodedValue == tokens.get(i).encoding().constValue().longValue())
{
value = tokens.get(i).name();
break;
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2524,7 +2524,7 @@ private CharSequence generateEnumDecoder(
final String enumName = formatClassName(typeToken.applicableTypeName());
final Encoding encoding = typeToken.encoding();

if (typeToken.isConstantEncoding())
if (fieldToken.isConstantEncoding())
{
return String.format(
"\n" +
Expand Down
36 changes: 0 additions & 36 deletions sbe-tool/src/main/java/uk/co/real_logic/sbe/ir/Ir.java
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ public void addMessage(final long messageId, final List<Token> messageTokens)
Verify.notNull(messageTokens, "messageTokens");

captureTypes(messageTokens, 0, messageTokens.size() - 1);
compressConstantEnums(messageTokens);
updateComponentTokenCounts(messageTokens);

messagesByIdMap.put(messageId, new ArrayList<>(messageTokens));
Expand Down Expand Up @@ -267,41 +266,6 @@ else if (signal.name().startsWith("END_"))
}
}

private static void compressConstantEnums(final List<Token> tokens)
{
final Iterator<Token> iter = tokens.iterator();
while (iter.hasNext())
{
final Token token = iter.next();
if (Signal.BEGIN_FIELD == token.signal() && token.isConstantEncoding())
{
Token nextToken = iter.next();
if (Signal.BEGIN_ENUM == nextToken.signal())
{
final String valueRef = token.encoding().constValue().toString();
nextToken.encodedLength(0);

while (true)
{
nextToken = iter.next();
nextToken.encodedLength(0);
nextToken.encoding().presence(Encoding.Presence.CONSTANT);

if (Signal.END_ENUM == nextToken.signal())
{
break;
}

if (!valueRef.endsWith(nextToken.name()))
{
iter.remove();
}
}
}
}
}
}

private void captureTypes(final List<Token> tokens, final int beginIndex, final int endIndex)
{
for (int i = beginIndex; i <= endIndex; i++)
Expand Down
4 changes: 4 additions & 0 deletions sbe-tool/src/main/java/uk/co/real_logic/sbe/xml/Message.java
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,10 @@ else if (null != field.type() && Presence.CONSTANT != field.presence())
{
variableLengthBlock = true;
}
else
{
field.computedBlockLength(size);
}

if (!variableLengthBlock)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ public void checkValidRustFromAllExampleSchema() throws IOException, Interrupted
}
}

@Ignore
@Test
public void constantFieldsCase() throws IOException, InterruptedException
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public void shouldGenerateCorrectIrForBasicMessage()
assertThat(tokens.get(1).signal(), is(Signal.BEGIN_FIELD));
assertThat(tokens.get(1).name(), is("Tag40001"));
assertThat(valueOf(tokens.get(1).id()), is(valueOf(40001)));
assertThat(valueOf(tokens.get(1).encodedLength()), is(valueOf(0)));
assertThat(valueOf(tokens.get(1).encodedLength()), is(valueOf(4)));
assertThat(valueOf(tokens.get(1).offset()), is(valueOf(0)));

/* assert all elements of node 2 */
Expand All @@ -134,7 +134,7 @@ public void shouldGenerateCorrectIrForBasicMessage()
assertThat(tokens.get(3).signal(), is(Signal.END_FIELD));
assertThat(tokens.get(3).name(), is("Tag40001"));
assertThat(valueOf(tokens.get(3).id()), is(valueOf(40001)));
assertThat(valueOf(tokens.get(3).encodedLength()), is(valueOf(0)));
assertThat(valueOf(tokens.get(3).encodedLength()), is(valueOf(4)));
assertThat(valueOf(tokens.get(3).offset()), is(valueOf(0)));

/* assert all elements of node 4 */
Expand Down
18 changes: 16 additions & 2 deletions sbe-tool/src/test/java/uk/co/real_logic/sbe/ir/EncodedIrTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@

public class EncodedIrTest
{
private static final int CAPACITY = 8192;
private static final int CAPACITY = 1024 * 16;

@Test
public void shouldEncodeIr()
Expand Down Expand Up @@ -155,7 +155,7 @@ public void shouldDecodeCorrectHeader()
}

@Test
public void shouldDecodeCorrectMessages()
public void shouldDecodeCorrectMessagesAndTypes()
throws Exception
{
final MessageSchema schema = parse(TestUtil.getLocalResource(
Expand All @@ -182,5 +182,19 @@ public void shouldDecodeCorrectMessages()
assertEqual(decodedTokenList.get(i), tokens.get(i));
}
}

assertThat(decodedIr.types().size(), is(ir.types().size()));
for (final List<Token> decodedTokenList : decodedIr.types())
{
final Token t = decodedTokenList.get(0);
final String name = t.referencedName() != null ? t.referencedName() : t.name();
final List<Token> tokens = ir.getType(name);

assertThat(name + " token count", decodedTokenList.size(), is(tokens.size()));
for (int i = 0, size = decodedTokenList.size(); i < size; i++)
{
assertEqual(decodedTokenList.get(i), tokens.get(i));
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ public void shouldGenerateValueRefToEnum()
final IrGenerator irg = new IrGenerator();
final Ir ir = irg.generate(schema);

assertThat(ir.getMessage(1).get(2).encodedLength(), is(8));
assertThat(ir.getMessage(2).get(2).encodedLength(), is(0));
assertThat(ir.getMessage(3).get(2).encodedLength(), is(0));
assertThat(ir.getMessage(4).get(2).encodedLength(), is(0));
assertThat(ir.getMessage(5).get(2).encodedLength(), is(0));
assertThat(ir.getMessage(1).get(1).encodedLength(), is(8));
assertThat(ir.getMessage(2).get(1).encodedLength(), is(0));
assertThat(ir.getMessage(3).get(1).encodedLength(), is(0));
assertThat(ir.getMessage(4).get(1).encodedLength(), is(0));
assertThat(ir.getMessage(5).get(1).encodedLength(), is(0));
}
}

0 comments on commit b5c1a7f

Please sign in to comment.