private void addMessageSignal(final Message msg, final Signal signal) { final Encoding encoding = new Encoding.Builder() .semanticType(msg.semanticType()) .build(); final Token token = new Token.Builder() .signal(signal) .name(msg.name()) .description(msg.description()) .size(msg.blockLength()) .id(msg.id()) .version(msg.sinceVersion()) .deprecated(msg.deprecated()) .encoding(encoding) .build(); tokenList.add(token); }
private List<Token> generateForMessage(final MessageSchema schema, final long messageId) { tokenList.clear(); final Message msg = schema.getMessage(messageId); addMessageSignal(msg, Signal.BEGIN_MESSAGE); addAllFields(msg.fields()); addMessageSignal(msg, Signal.END_MESSAGE); return tokenList; }
/** * Scan XML for all message definitions and save in map * * @param document for the XML parsing * @param xPath for XPath expression reuse * @param typeByNameMap to use for Type objects * @return {@link java.util.Map} of schemaId to Message * @throws Exception on parsing error. */ public static Map<Long, Message> findMessages( final Document document, final XPath xPath, final Map<String, Type> typeByNameMap) throws Exception { final Map<Long, Message> messageByIdMap = new HashMap<>(); final ObjectHashSet<String> distinctNames = new ObjectHashSet<>(); forEach((NodeList)xPath.compile(MESSAGE_XPATH_EXPR).evaluate(document, XPathConstants.NODESET), (node) -> addMessageWithIdCheck(distinctNames, messageByIdMap, new Message(node, typeByNameMap), node)); return messageByIdMap; }
private static void addMessageWithIdCheck( final ObjectHashSet<String> distinctNames, final Map<Long, Message> messageByIdMap, final Message message, final Node node) { if (messageByIdMap.get((long)message.id()) != null) { handleError(node, "message template id already exists: " + message.id()); } if (!distinctNames.add(message.name())) { handleError(node, "message name already exists: " + message.name()); } checkForValidName(node, message.name()); messageByIdMap.put((long)message.id(), message); }
/** * Construct a new message from XML Schema. * * @param messageNode from the XML Schema Parsing * @param typeByNameMap holding type information for message * @throws XPathExpressionException on invalid XPath */ public Message(final Node messageNode, final Map<String, Type> typeByNameMap) throws XPathExpressionException { id = Integer.parseInt(getAttributeValue(messageNode, "id")); // required name = getAttributeValue(messageNode, "name"); // required description = getAttributeValueOrNull(messageNode, "description"); // optional blockLength = Integer.parseInt(getAttributeValue(messageNode, "blockLength", "0")); // 0 means not set sinceVersion = Integer.parseInt(getAttributeValue(messageNode, "sinceVersion", "0")); deprecated = Integer.parseInt(getAttributeValue(messageNode, "deprecated", "0")); semanticType = getAttributeValueOrNull(messageNode, "semanticType"); // optional this.typeByNameMap = typeByNameMap; fieldList = parseMembers(messageNode); computeAndValidateOffsets(messageNode, fieldList, blockLength); computedBlockLength = computeMessageRootBlockLength(fieldList); validateBlockLength(messageNode, blockLength, computedBlockLength); }
field = parseGroupField(list, i); groupEncountered = true; break; field = parseDataField(list, i); dataEncountered = true; break; field = parseField(list, i); break;
private void addMessageSignal(final Message msg, final Signal signal) { final Token token = new Token.Builder() .signal(signal) .name(msg.name()) .size(msg.blockLength()) .id(msg.id()) .version(version) .encoding(new Encoding.Builder() .semanticType(msg.semanticType()) .build()) .build(); tokenList.add(token); }
final int groupBlockLength = computeAndValidateOffsets(node, field.groupFields(), 0); validateBlockLength(node, field.blockLength(), groupBlockLength); field.computedBlockLength(Math.max(field.blockLength(), groupBlockLength));
@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))); }
/** * Construct a new message from XML Schema. * * @param messageNode from the XML Schema Parsing * @param typeByNameMap holding type information for message * @throws XPathExpressionException on invalid XPath */ public Message(final Node messageNode, final Map<String, Type> typeByNameMap) throws XPathExpressionException { id = Integer.parseInt(getAttributeValue(messageNode, "id")); // required name = getAttributeValue(messageNode, "name"); // required description = getAttributeValueOrNull(messageNode, "description"); // optional blockLength = Integer.parseInt(getAttributeValue(messageNode, "blockLength", "0")); // 0 means not set semanticType = getAttributeValueOrNull(messageNode, "semanticType"); // optional headerType = getAttributeValue(messageNode, "headerType", "messageHeader"); // has default this.typeByNameMap = typeByNameMap; fieldList = parseFieldsAndGroups(messageNode); computeAndValidateOffsets(messageNode, fieldList, blockLength); computedBlockLength = computeMessageRootBlockLength(); validateBlockLength(messageNode, blockLength, computedBlockLength); }
/** * Generate a complete {@link uk.co.real_logic.sbe.ir.Ir} for a given schema. * * @param schema from which the {@link uk.co.real_logic.sbe.ir.Ir} should be generated. * @param namespace for the generated code. * @return complete {@link uk.co.real_logic.sbe.ir.Ir} for a given schema. */ public Ir generate(final MessageSchema schema, final String namespace) { this.schema = schema; final List<Token> headerTokens = generateForHeader(schema); final Ir ir = new Ir( schema.packageName(), namespace, schema.id(), schema.version(), schema.semanticVersion(), schema.byteOrder(), headerTokens); for (final Message message : schema.messages()) { final long msgId = message.id(); ir.addMessage(msgId, generateForMessage(schema, msgId)); } return ir; }
/** * Construct a new message from XML Schema. * * @param messageNode from the XML Schema Parsing * @param typeByNameMap holding type information for message * @throws XPathExpressionException on invalid XPath */ public Message(final Node messageNode, final Map<String, Type> typeByNameMap) throws XPathExpressionException { id = Integer.parseInt(getAttributeValue(messageNode, "id")); // required name = getAttributeValue(messageNode, "name"); // required description = getAttributeValueOrNull(messageNode, "description"); // optional blockLength = Integer.parseInt(getAttributeValue(messageNode, "blockLength", "0")); // 0 means not set sinceVersion = Integer.parseInt(getAttributeValue(messageNode, "sinceVersion", "0")); deprecated = Integer.parseInt(getAttributeValue(messageNode, "deprecated", "0")); semanticType = getAttributeValueOrNull(messageNode, "semanticType"); // optional this.typeByNameMap = typeByNameMap; fieldList = parseMembers(messageNode); computeAndValidateOffsets(messageNode, fieldList, blockLength); computedBlockLength = computeMessageRootBlockLength(fieldList); validateBlockLength(messageNode, blockLength, computedBlockLength); }
field = parseGroupField(list, i); groupEncountered = true; break; field = parseDataField(list, i); dataEncountered = true; break; field = parseField(list, i); break;
private static void addMessageWithIdCheck( final Map<Long, Message> messageByIdMap, final Message message, final Node node) { if (messageByIdMap.get(Long.valueOf(message.id())) != null) { handleError(node, "message template id already exists: " + message.id()); } checkForValidName(node, message.name()); messageByIdMap.put(Long.valueOf(message.id()), message); }
final int groupBlockLength = computeAndValidateOffsets(node, field.groupFields(), 0); validateBlockLength(node, field.blockLength(), groupBlockLength); field.computedBlockLength(Math.max(field.blockLength(), groupBlockLength));
/** * Generate a complete {@link uk.co.real_logic.sbe.ir.Ir} for a given schema. * * @param schema from which the {@link uk.co.real_logic.sbe.ir.Ir} should be generated. * @param namespace for the generated code. * @return complete {@link uk.co.real_logic.sbe.ir.Ir} for a given schema. */ public Ir generate(final MessageSchema schema, final String namespace) { final Ir ir = new Ir( schema.packageName(), namespace, schema.id(), schema.version(), schema.semanticVersion(), generateForHeader(schema)); for (final Message message : schema.messages()) { final long msgId = message.id(); ir.addMessage(msgId, generateForMessage(schema, msgId)); } return ir; }
private void addMessageSignal(final Message msg, final Signal signal) { final Encoding encoding = new Encoding.Builder() .semanticType(msg.semanticType()) .build(); final Token token = new Token.Builder() .signal(signal) .name(msg.name()) .description(msg.description()) .size(msg.blockLength()) .id(msg.id()) .version(msg.sinceVersion()) .deprecated(msg.deprecated()) .encoding(encoding) .build(); tokenList.add(token); }
/** * Construct a new message from XML Schema. * * @param messageNode from the XML Schema Parsing * @param typeByNameMap holding type information for message * @throws XPathExpressionException on invalid XPath */ public Message(final Node messageNode, final Map<String, Type> typeByNameMap) throws XPathExpressionException { id = Integer.parseInt(getAttributeValue(messageNode, "id")); // required name = getAttributeValue(messageNode, "name"); // required description = getAttributeValueOrNull(messageNode, "description"); // optional blockLength = Integer.parseInt(getAttributeValue(messageNode, "blockLength", "0")); // 0 means not set sinceVersion = Integer.parseInt(getAttributeValue(messageNode, "sinceVersion", "0")); deprecated = Integer.parseInt(getAttributeValue(messageNode, "deprecated", "0")); semanticType = getAttributeValueOrNull(messageNode, "semanticType"); // optional this.typeByNameMap = typeByNameMap; fieldList = parseMembers(messageNode); computeAndValidateOffsets(messageNode, fieldList, blockLength); computedBlockLength = computeMessageRootBlockLength(fieldList); validateBlockLength(messageNode, blockLength, computedBlockLength); }
field = parseGroupField(list, i); groupEncountered = true; break; field = parseDataField(list, i); dataEncountered = true; break; field = parseField(list, i); break;
@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))); }