@Test public void shouldGenerateValueRefToEnum() throws Exception { final MessageSchema schema = parse(getLocalResource("value-ref-schema.xml"), ParserOptions.DEFAULT); final IrGenerator irg = new IrGenerator(); final Ir ir = irg.generate(schema); 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)); } }
private CharSequence generateFixedFlyweightCode(final String className, final int size) final String schemaIdType = cppTypeName(ir.headerStructure().schemaIdType()); final String schemaVersionType = cppTypeName(ir.headerStructure().schemaVersionType()); size, schemaIdType, generateLiteral(ir.headerStructure().schemaIdType(), Integer.toString(ir.id())), schemaVersionType, generateLiteral(ir.headerStructure().schemaVersionType(), Integer.toString(ir.version())));
public Ir decode() { decodeFrame(); final List<Token> tokens = new ArrayList<>(); while (offset < length) { tokens.add(decodeToken()); } int i = 0; if (tokens.get(0).signal() == Signal.BEGIN_COMPOSITE) { i = captureHeader(tokens); } final ByteOrder byteOrder = tokens.size() > 0 ? tokens.get(0).encoding().byteOrder() : null; final Ir ir = new Ir(irPackageName, irNamespaceName, irId, irVersion, semanticVersion, byteOrder, irHeader); for (int size = tokens.size(); i < size; i++) { if (tokens.get(i).signal() == Signal.BEGIN_MESSAGE) { i = captureMessage(tokens, i, ir); } } return ir; }
private void generateExtensibilityMethods( final StringBuilder sb, final String typeName, final Token token) { sb.append(String.format( "\nfunc (*%1$s) SbeBlockLength() (blockLength uint) {\n" + "\treturn %2$s\n" + "}\n" + "\nfunc (*%1$s) SbeSchemaVersion() (schemaVersion %3$s) {\n" + "\treturn %4$s\n" + "}\n", typeName, generateLiteral(ir.headerStructure().blockLengthType(), Integer.toString(token.encodedLength())), golangTypeName(ir.headerStructure().schemaVersionType()), generateLiteral(ir.headerStructure().schemaVersionType(), Integer.toString(ir.version())))); }
public void generateMessageHeaderStub() throws IOException { final String messageHeader = "MessageHeader"; try (Writer out = outputManager.createOutput(messageHeader)) { final StringBuilder sb = new StringBuilder(); final List<Token> tokens = ir.headerStructure().tokens(); imports = new TreeSet<>(); imports.add("io"); generateTypeDeclaration(sb, messageHeader); generateTypeBodyComposite(sb, messageHeader, tokens.subList(1, tokens.size() - 1)); generateEncodeDecode(sb, messageHeader, tokens.subList(1, tokens.size() - 1), false, false); generateCompositePropertyElements(sb, messageHeader, tokens.subList(1, tokens.size() - 1)); out.append(generateFileHeader(ir.namespaces())); out.append(sb); } }
public int encode() { Verify.notNull(ir, "ir"); write(buffer, encodeFrame()); encodeTokenList(ir.headerStructure().tokens()); ir.messages().forEach(this::encodeTokenList); return totalLength; }
private int encodeFrame() { frameEncoder .wrap(directBuffer, 0) .irId(ir.id()) .irVersion(0) .schemaVersion(ir.version()); try { final byte[] packageBytes = ir.packageName().getBytes(packageNameCharacterEncoding()); frameEncoder.putPackageName(packageBytes, 0, packageBytes.length); final byte[] namespaceBytes = getBytes(ir.namespaceName(), namespaceNameCharacterEncoding()); frameEncoder.putNamespaceName(namespaceBytes, 0, namespaceBytes.length); final byte[] semanticVersionBytes = getBytes(ir.semanticVersion(), semanticVersionCharacterEncoding()); frameEncoder.putSemanticVersion(semanticVersionBytes, 0, semanticVersionBytes.length); } catch (final UnsupportedEncodingException ex) { LangUtil.rethrowUnchecked(ex); } return frameEncoder.encodedLength(); }
@Test public void shouldGenerateAndEncodeIr() throws Exception { System.setProperty(SbeTool.KEYWORD_APPEND_TOKEN, "_"); final ParserOptions options = ParserOptions.builder().stopOnError(true).build(); final MessageSchema schema = parse(TestUtil.getLocalResource("FixBinary.xml"), options); final IrGenerator irg = new IrGenerator(); final Ir ir = irg.generate(schema); final ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024); final IrEncoder irEncoder = new IrEncoder(buffer, ir); irEncoder.encode(); buffer.flip(); final IrDecoder irDecoder = new IrDecoder(buffer); final Ir decodedIr = irDecoder.decode(); assertEquals(ir.id(), decodedIr.id()); assertEquals(ir.version(), decodedIr.version()); assertEquals(ir.byteOrder(), decodedIr.byteOrder()); assertEquals(ir.applicableNamespace(), decodedIr.applicableNamespace()); assertEquals(ir.packageName(), decodedIr.packageName()); assertEquals(ir.types().size(), decodedIr.types().size()); assertEquals(ir.messages().size(), decodedIr.messages().size()); } }
private CharSequence generateFixedFlyweightCode( final String className, final int size, final String bufferImplementation) final String schemaIdType = javaTypeName(ir.headerStructure().schemaIdType()); final String schemaVersionType = javaTypeName(ir.headerStructure().schemaVersionType()); size, bufferImplementation, ir.byteOrder(), schemaIdType, generateLiteral(ir.headerStructure().schemaIdType(), Integer.toString(ir.id())), schemaVersionType, generateLiteral(ir.headerStructure().schemaVersionType(), Integer.toString(ir.version())));
final Ir decodedIr = irDecoder.decode(); assertThat(decodedIr.messages().size(), is(ir.messages().size())); for (final List<Token> decodedTokenList : decodedIr.messages()) final List<Token> tokens = ir.getMessage(decodedTokenList.get(0).id()); assertThat(decodedIr.types().size(), is(ir.types().size())); for (final List<Token> decodedTokenList : decodedIr.types()) final List<Token> tokens = ir.getType(name);
public CodeGenerator newInstance(final Ir ir, final String outputDir) { return new JavaGenerator( ir, System.getProperty(JAVA_ENCODING_BUFFER_TYPE, JAVA_DEFAULT_ENCODING_BUFFER_TYPE), System.getProperty(JAVA_DECODING_BUFFER_TYPE, JAVA_DEFAULT_DECODING_BUFFER_TYPE), Boolean.getBoolean(JAVA_GROUP_ORDER_ANNOTATION), Boolean.getBoolean(JAVA_GENERATE_INTERFACES), Boolean.getBoolean(DECODE_UNKNOWN_ENUM_VALUES), new PackageOutputManager(outputDir, ir.applicableNamespace())); } },
private static void generateComposites(final Ir ir, final OutputManager outputManager) throws IOException { for (final List<Token> tokens : ir.types()) { if (!tokens.isEmpty() && tokens.get(0).signal() == Signal.BEGIN_COMPOSITE) { generateSingleComposite(tokens, outputManager); } } }
final OtfHeaderDecoder headerDecoder = new OtfHeaderDecoder(ir.headerStructure()); final List<Token> msgTokens = ir.getMessage(templateId);
/** * 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; }
public JsonPrinter(final Ir ir) { this.ir = ir; headerDecoder = new OtfHeaderDecoder(ir.headerStructure()); }
if (ir.byteOrder() == ByteOrder.LITTLE_ENDIAN) generateTypeStubs(); for (final List<Token> tokens : ir.messages()) generateVarData(sb, typeName, varData); out.append(generateFileHeader(ir.namespaces())); out.append(sb);
generateTypeStubs(); for (final List<Token> tokens : ir.messages()) out.append(generateFileHeader(ir.applicableNamespace())); out.append(generateClassDeclaration(className)); out.append(generateMessageFlyweightCode(className, msgToken, BASE_INDENT));
final List<String> typesToInclude = generateTypeStubs(); for (final List<Token> tokens : ir.messages()) out.append(generateFileHeader(ir.namespaces(), className, typesToInclude)); out.append(generateClassDeclaration(className)); out.append(generateMessageFlyweightCode(className, msgToken)); out.append(generateVarData(className, varData, BASE_INDENT)); out.append("};\n"); out.append(CppUtil.closingBraces(ir.namespaces().length)).append("#endif\n");