Skip to content

Commit d85faef

Browse files
committed
[Java] Check if the repeating group or var data is present in the acting version when doing OTF decoding. Issue #386.
1 parent 91e37eb commit d85faef

File tree

1 file changed

+27
-11
lines changed

1 file changed

+27
-11
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/otf/OtfMessageDecoder.java

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ public static int decode(
6363

6464
final long packedValues = decodeGroups(buffer, bufferIdx, actingVersion, msgTokens, tokenIdx, numTokens, listener);
6565

66-
bufferIdx = decodeData(buffer, bufferIndex(packedValues), msgTokens, tokenIndex(packedValues), numTokens, listener);
66+
bufferIdx = decodeData(
67+
buffer, bufferIndex(packedValues), msgTokens, tokenIndex(packedValues), numTokens, actingVersion, listener);
6768

6869
listener.onEndMessage(msgTokens.get(numTokens - 1));
6970

@@ -138,22 +139,30 @@ private static long decodeGroups(
138139
break;
139140
}
140141

142+
final boolean isPresent = token.version() <= actingVersion;
143+
141144
final Token blockLengthToken = tokens.get(tokenIdx + 2);
142-
final int blockLength = Types.getInt(
145+
final int blockLength = isPresent ? Types.getInt(
143146
buffer,
144147
bufferIdx + blockLengthToken.offset(),
145148
blockLengthToken.encoding().primitiveType(),
146-
blockLengthToken.encoding().byteOrder());
149+
blockLengthToken.encoding().byteOrder())
150+
: 0;
147151

148152
final Token numInGroupToken = tokens.get(tokenIdx + 3);
149-
final int numInGroup = Types.getInt(
153+
final int numInGroup = isPresent ? Types.getInt(
150154
buffer,
151155
bufferIdx + numInGroupToken.offset(),
152156
numInGroupToken.encoding().primitiveType(),
153-
numInGroupToken.encoding().byteOrder());
157+
numInGroupToken.encoding().byteOrder())
158+
: 0;
154159

155160
final Token dimensionTypeComposite = tokens.get(tokenIdx + 1);
156-
bufferIdx += dimensionTypeComposite.encodedLength();
161+
162+
if (isPresent)
163+
{
164+
bufferIdx += dimensionTypeComposite.encodedLength();
165+
}
157166

158167
final int beginFieldsIdx = tokenIdx + dimensionTypeComposite.componentTokenCount() + 1;
159168

@@ -171,7 +180,7 @@ private static long decodeGroups(
171180
buffer, bufferIdx, actingVersion, tokens, afterFieldsIdx, numTokens, listener);
172181

173182
bufferIdx = decodeData(
174-
buffer, bufferIndex(packedValues), tokens, tokenIndex(packedValues), numTokens, listener);
183+
buffer, bufferIndex(packedValues), tokens, tokenIndex(packedValues), numTokens, actingVersion, listener);
175184

176185
listener.onEndGroup(token, i, numInGroup);
177186
}
@@ -194,7 +203,7 @@ private static void decodeComposite(
194203
{
195204
listener.onBeginComposite(fieldToken, tokens, tokenIdx, toIndex);
196205

197-
for (int i = tokenIdx + 1; i < toIndex;)
206+
for (int i = tokenIdx + 1; i < toIndex; )
198207
{
199208
final Token typeToken = tokens.get(i);
200209
final int nextFieldIdx = i + typeToken.componentTokenCount();
@@ -235,6 +244,7 @@ private static int decodeData(
235244
final List<Token> tokens,
236245
int tokenIdx,
237246
final int numTokens,
247+
final int actingVersion,
238248
final TokenListener listener)
239249
{
240250
while (tokenIdx < numTokens)
@@ -245,15 +255,21 @@ private static int decodeData(
245255
break;
246256
}
247257

258+
final boolean isPresent = token.version() <= actingVersion;
259+
248260
final Token lengthToken = tokens.get(tokenIdx + 2);
249-
final int length = Types.getInt(
261+
final int length = isPresent ? Types.getInt(
250262
buffer,
251263
bufferIdx + lengthToken.offset(),
252264
lengthToken.encoding().primitiveType(),
253-
lengthToken.encoding().byteOrder());
265+
lengthToken.encoding().byteOrder())
266+
: 0;
254267

255268
final Token dataToken = tokens.get(tokenIdx + 3);
256-
bufferIdx += dataToken.offset();
269+
if (isPresent)
270+
{
271+
bufferIdx += dataToken.offset();
272+
}
257273

258274
listener.onVarData(token, buffer, bufferIdx, length, dataToken);
259275

0 commit comments

Comments
 (0)