private static int computeMessageRootBlockLength(final List<Field> fields) { int blockLength = 0; for (final Field field : fields) { if (field.groupFields() != null) { return blockLength; } else if (field.type() != null) { final int fieldLength = field.type().encodedLength(); if (Token.VARIABLE_LENGTH == fieldLength) { return blockLength; } if (field.presence() == Presence.CONSTANT) { blockLength = field.computedOffset(); } else { blockLength = field.computedOffset() + fieldLength; } } } return blockLength; }
@Test public void shouldCalculateDataOffsetWithPaddingFromBlockLength() throws Exception { final MessageSchema schema = parse(TestUtil.getLocalResource( "block-length-schema.xml"), ParserOptions.DEFAULT); final List<Field> fields = schema.getMessage(4).fields(); assertThat(valueOf(fields.get(0).computedOffset()), is(valueOf(0))); assertThat(valueOf(fields.get(0).type().encodedLength()), is(valueOf(8))); assertThat(valueOf(fields.get(1).computedOffset()), is(valueOf(64))); assertThat(valueOf(fields.get(1).type().encodedLength()), is(valueOf(-1))); }
@Test public void shouldHandleAllTypeOffsets() throws Exception { final MessageSchema schema = parse(TestUtil.getLocalResource( "basic-types-schema.xml"), ParserOptions.DEFAULT); final List<Field> fields = schema.getMessage(1).fields(); assertThat(valueOf(fields.get(0).computedOffset()), is(valueOf(0))); assertThat(valueOf(fields.get(0).type().encodedLength()), is(valueOf(8))); assertThat(valueOf(fields.get(1).computedOffset()), is(valueOf(8))); assertThat(valueOf(fields.get(1).type().encodedLength()), is(valueOf(20))); assertThat(valueOf(fields.get(2).computedOffset()), is(valueOf(28))); assertThat(valueOf(fields.get(2).type().encodedLength()), is(valueOf(1))); assertThat(valueOf(fields.get(3).computedOffset()), is(valueOf(29))); assertThat(valueOf(fields.get(3).type().encodedLength()), is(valueOf(4))); assertThat(valueOf(fields.get(4).computedOffset()), is(valueOf(33))); assertThat(valueOf(fields.get(4).type().encodedLength()), is(valueOf(8))); }
@Test public void shouldHandleAllTypeOffsetsSetByXML() throws Exception { final MessageSchema schema = parse(TestUtil.getLocalResource( "basic-types-schema.xml"), ParserOptions.DEFAULT); final List<Field> fields = schema.getMessage(2).fields(); assertThat(valueOf(fields.get(0).computedOffset()), is(valueOf(0))); assertThat(valueOf(fields.get(0).type().encodedLength()), is(valueOf(8))); assertThat(valueOf(fields.get(1).computedOffset()), is(valueOf(8))); assertThat(valueOf(fields.get(1).type().encodedLength()), is(valueOf(20))); assertThat(valueOf(fields.get(2).computedOffset()), is(valueOf(32))); assertThat(valueOf(fields.get(2).type().encodedLength()), is(valueOf(1))); assertThat(valueOf(fields.get(3).computedOffset()), is(valueOf(128))); assertThat(valueOf(fields.get(3).type().encodedLength()), is(valueOf(4))); assertThat(valueOf(fields.get(4).computedOffset()), is(valueOf(136))); assertThat(valueOf(fields.get(4).type().encodedLength()), is(valueOf(8))); }
add((CompositeType)type, field.computedOffset(), field); addFieldSignal(field, Signal.END_VAR_DATA); add((EncodedDataType)type, field.computedOffset(), field); add((CompositeType)type, field.computedOffset(), field); add((EnumType)type, field.computedOffset(), field); add((SetType)type, field.computedOffset(), field);
@Test public void shouldCalculateGroupOffsetWithPaddingFromBlockLengthAndGroupBlockLength() throws Exception { final MessageSchema schema = parse(TestUtil.getLocalResource( "block-length-schema.xml"), ParserOptions.DEFAULT); final List<Field> fields = schema.getMessage(3).fields(); assertThat(valueOf(fields.get(0).computedOffset()), is(valueOf(0))); assertThat(valueOf(fields.get(0).type().encodedLength()), is(valueOf(8))); assertThat(valueOf(fields.get(1).computedOffset()), is(valueOf(64))); Assert.assertNull(fields.get(1).type()); assertThat(valueOf(fields.get(1).computedBlockLength()), is(valueOf(16))); final List<Field> groupFields = fields.get(1).groupFields(); assertThat(valueOf(groupFields.size()), is(valueOf(2))); assertThat(valueOf(groupFields.get(0).computedOffset()), is(valueOf(0))); assertThat(valueOf(groupFields.get(0).type().encodedLength()), is(valueOf(4))); assertThat(valueOf(groupFields.get(1).computedOffset()), is(valueOf(4))); assertThat(valueOf(groupFields.get(1).type().encodedLength()), is(valueOf(8))); }
@Test public void shouldCalculateGroupOffsetWithPaddingFromBlockLength() throws Exception { final MessageSchema schema = parse(TestUtil.getLocalResource( "block-length-schema.xml"), ParserOptions.DEFAULT); final List<Field> fields = schema.getMessage(2).fields(); assertThat(valueOf(fields.get(0).computedOffset()), is(valueOf(0))); assertThat(valueOf(fields.get(0).type().encodedLength()), is(valueOf(8))); assertThat(valueOf(fields.get(1).computedOffset()), is(valueOf(64))); Assert.assertNull(fields.get(1).type()); assertThat(valueOf(fields.get(1).computedBlockLength()), is(valueOf(12))); final List<Field> groupFields = fields.get(1).groupFields(); assertThat(valueOf(groupFields.size()), is(valueOf(2))); assertThat(valueOf(groupFields.get(0).computedOffset()), is(valueOf(0))); assertThat(valueOf(groupFields.get(0).type().encodedLength()), is(valueOf(4))); assertThat(valueOf(groupFields.get(1).computedOffset()), is(valueOf(4))); assertThat(valueOf(groupFields.get(1).type().encodedLength()), is(valueOf(8))); }
@Test public void shouldCalculateGroupOffsetWithNoPaddingFromBlockLength() throws Exception { final MessageSchema schema = parse(TestUtil.getLocalResource( "block-length-schema.xml"), ParserOptions.DEFAULT); final Message msg = schema.getMessage(1); assertThat(valueOf(msg.blockLength()), is(valueOf(8))); final List<Field> fields = msg.fields(); assertThat(valueOf(fields.get(0).computedOffset()), is(valueOf(0))); assertThat(valueOf(fields.get(0).type().encodedLength()), is(valueOf(8))); assertThat(valueOf(fields.get(1).computedOffset()), is(valueOf(8))); Assert.assertNull(fields.get(1).type()); final List<Field> groupFields = fields.get(1).groupFields(); assertThat(valueOf(groupFields.size()), is(valueOf(2))); assertThat(valueOf(groupFields.get(0).computedOffset()), is(valueOf(0))); assertThat(valueOf(groupFields.get(0).type().encodedLength()), is(valueOf(4))); assertThat(valueOf(groupFields.get(1).computedOffset()), is(valueOf(4))); assertThat(valueOf(groupFields.get(1).type().encodedLength()), is(valueOf(8))); }
private void addFieldSignal(final Field field, final Signal signal) { final Encoding.Builder encodingBuilder = new Encoding.Builder() .epoch(field.epoch()) .timeUnit(field.timeUnit()) .presence(mapPresence(field.presence())) .semanticType(semanticTypeOf(null, field)); if (field.presence() == Presence.CONSTANT && null != field.valueRef()) { final String valueRef = field.valueRef(); final byte[] bytes; bytes = valueRef.getBytes(StandardCharsets.UTF_8); encodingBuilder.constValue(new PrimitiveValue(bytes, "UTF-8", valueRef.length())); encodingBuilder.primitiveType(PrimitiveType.CHAR); } final Token token = new Token.Builder() .signal(signal) .size(field.computedBlockLength()) .name(field.name()) .description(field.description()) .id(field.id()) .offset(field.computedOffset()) .version(field.sinceVersion()) .deprecated(field.deprecated()) .encoding(encodingBuilder.build()) .build(); tokenList.add(token); }
field.computedOffset(variableLengthBlock ? Token.VARIABLE_LENGTH : offset);
private static int computeMessageRootBlockLength(final List<Field> fields) { int blockLength = 0; for (final Field field : fields) { if (field.groupFields() != null) { return blockLength; } else if (field.type() != null) { final int fieldLength = field.type().encodedLength(); if (Token.VARIABLE_LENGTH == fieldLength) { return blockLength; } if (field.presence() == Presence.CONSTANT) { blockLength = field.computedOffset(); } else { blockLength = field.computedOffset() + fieldLength; } } } return blockLength; }
private static int computeMessageRootBlockLength(final List<Field> fields) { int blockLength = 0; for (final Field field : fields) { if (field.groupFields() != null) { return blockLength; } else if (field.type() != null) { final int fieldLength = field.type().encodedLength(); if (Token.VARIABLE_LENGTH == fieldLength) { return blockLength; } if (field.presence() == Presence.CONSTANT) { blockLength = field.computedOffset(); } else { blockLength = field.computedOffset() + fieldLength; } } } return blockLength; }
private int computeMessageRootBlockLength() { int blockLength = 0; for (final Field field : fieldList) { if (field.groupFields() != null) { return blockLength; } else if (field.type() != null) { final int fieldLength = field.type().encodedLength(); if (Token.VARIABLE_LENGTH == fieldLength) { return blockLength; } blockLength = field.computedOffset() + fieldLength; } } return blockLength; }
add((CompositeType)type, field.computedOffset(), field); addFieldSignal(field, Signal.END_VAR_DATA); add((EncodedDataType)type, field.computedOffset(), field); add((CompositeType)type, field.computedOffset(), field); add((EnumType)type, field.computedOffset(), field); add((SetType)type, field.computedOffset(), field);
add((CompositeType)type, field.computedOffset(), field); addFieldSignal(field, Signal.END_VAR_DATA); add((EncodedDataType)type, field.computedOffset(), field); add((CompositeType)type, field.computedOffset(), field); add((EnumType)type, field.computedOffset(), field); add((SetType)type, field.computedOffset(), field);
add((CompositeType)type, field.computedOffset(), field); addFieldSignal(field, Signal.END_VAR_DATA); add((EncodedDataType)type, field.computedOffset(), field); add((CompositeType)type, field.computedOffset(), field); add((EnumType)type, field.computedOffset(), field); add((SetType)type, field.computedOffset(), field);
private void addFieldSignal(final Field field, final Signal signal) { final Token token = new Token.Builder() .signal(signal) .size(field.computedBlockLength()) .name(field.name()) .id(field.id()) .offset(field.computedOffset()) .version(field.sinceVersion()) .encoding(new Encoding.Builder() .epoch(field.epoch()) .timeUnit(field.timeUnit()) .semanticType(semanticTypeOf(null, field)) .build()) .build(); tokenList.add(token); }
private void addFieldSignal(final Field field, final Signal signal) { final Encoding.Builder encodingBuilder = new Encoding.Builder() .epoch(field.epoch()) .timeUnit(field.timeUnit()) .presence(mapPresence(field.presence())) .semanticType(semanticTypeOf(null, field)); if (field.presence() == Presence.CONSTANT && null != field.valueRef()) { final String valueRef = field.valueRef(); final byte[] bytes; bytes = valueRef.getBytes(StandardCharsets.UTF_8); encodingBuilder.constValue(new PrimitiveValue(bytes, "UTF-8", valueRef.length())); encodingBuilder.primitiveType(PrimitiveType.CHAR); } final Token token = new Token.Builder() .signal(signal) .size(field.computedBlockLength()) .name(field.name()) .description(field.description()) .id(field.id()) .offset(field.computedOffset()) .version(field.sinceVersion()) .deprecated(field.deprecated()) .encoding(encodingBuilder.build()) .build(); tokenList.add(token); }
private void addFieldSignal(final Field field, final Signal signal) { final Encoding.Builder encodingBuilder = new Encoding.Builder() .epoch(field.epoch()) .timeUnit(field.timeUnit()) .presence(mapPresence(field.presence())) .semanticType(semanticTypeOf(null, field)); if (field.presence() == Presence.CONSTANT && null != field.valueRef()) { final String valueRef = field.valueRef(); final byte[] bytes; bytes = valueRef.getBytes(StandardCharsets.UTF_8); encodingBuilder.constValue(new PrimitiveValue(bytes, "UTF-8", valueRef.length())); encodingBuilder.primitiveType(PrimitiveType.CHAR); } final Token token = new Token.Builder() .signal(signal) .size(field.computedBlockLength()) .name(field.name()) .description(field.description()) .id(field.id()) .offset(field.computedOffset()) .version(field.sinceVersion()) .deprecated(field.deprecated()) .encoding(encodingBuilder.build()) .build(); tokenList.add(token); }
field.computedOffset(variableLengthBlock ? Token.VARIABLE_LENGTH : offset);