private JavaGenerator generator() { return new JavaGenerator(ir, BUFFER_NAME, READ_ONLY_BUFFER_NAME, false, false, false, outputManager); }
public void generate() throws IOException { generateTypeStubs(); generateMessageHeaderStub(); for (final List<Token> tokens : ir.messages()) { final Token msgToken = tokens.get(0); final List<Token> messageBody = getMessageBody(tokens); int i = 0; final List<Token> fields = new ArrayList<>(); i = collectFields(messageBody, i, fields); final List<Token> groups = new ArrayList<>(); i = collectGroups(messageBody, i, groups); final List<Token> varData = new ArrayList<>(); collectVarData(messageBody, i, varData); generateDecoder(BASE_INDENT, fields, groups, varData, msgToken); generateEncoder(BASE_INDENT, fields, groups, varData, msgToken); } }
final String javaTypeName = javaTypeName(encoding.primitiveType()); final int offset = encodingToken.offset(); final String byteOrderStr = byteOrderString(encoding); final int fieldLength = encodingToken.arrayLength(); final int typeSize = sizeOfPrimitive(encoding); generateArrayLengthMethod(propertyName, indent, fieldLength, sb); propertyName, fieldLength, generateFieldNotPresentCondition(inComposite, propertyToken.version(), encoding, indent), offset, typeSize, generateGet(encoding.primitiveType(), "pos", byteOrderStr))); generateCharacterEncodingMethod(sb, propertyName, encoding.characterEncoding(), indent); Generators.toUpperFirstChar(propertyName), fieldLength, generateArrayFieldNotPresentCondition(propertyToken.version(), indent), offset)); indent + " }\n\n", propertyName, generateStringNotPresentCondition(propertyToken.version(), indent), fieldLength, offset, fieldLength, fieldLength, indent + " }\n\n",
public void generateTypeStubs() throws IOException { generateMetaAttributeEnum(); for (final List<Token> tokens : ir.types()) { switch (tokens.get(0).signal()) { case BEGIN_ENUM: generateEnum(tokens); break; case BEGIN_SET: generateBitSet(tokens); break; case BEGIN_COMPOSITE: generateComposite(tokens); break; } } }
private void generateEncoder( final String indent, final List<Token> fields, final List<Token> groups, final List<Token> varData, final Token msgToken) throws IOException { final String className = formatClassName(encoderName(msgToken.name())); final String implementsString = implementsInterface(MESSAGE_ENCODER_FLYWEIGHT); try (Writer out = outputManager.createOutput(className)) { out.append(generateMainHeader(ir.applicableNamespace())); generateAnnotations(indent, className, groups, out, 0, this::encoderName); out.append(generateDeclaration(className, implementsString, msgToken)); out.append(generateEncoderFlyweightCode(className, msgToken)); out.append(generateEncoderFields(className, fields, indent)); final StringBuilder sb = new StringBuilder(); generateEncoderGroups(sb, className, groups, indent, false); out.append(sb); out.append(generateEncoderVarData(className, varData, indent)); out.append(generateEncoderDisplay(formatClassName(decoderName(msgToken.name())), indent)); out.append("}\n"); } }
private void generateDecoder( final String indent, final List<Token> fields, final List<Token> groups, final List<Token> varData, final Token msgToken) throws IOException { final String className = formatClassName(decoderName(msgToken.name())); final String implementsString = implementsInterface(MESSAGE_DECODER_FLYWEIGHT); try (Writer out = outputManager.createOutput(className)) { out.append(generateMainHeader(ir.applicableNamespace())); generateAnnotations(indent, className, groups, out, 0, this::decoderName); out.append(generateDeclaration(className, implementsString, msgToken)); out.append(generateDecoderFlyweightCode(className, msgToken)); out.append(generateDecoderFields(fields, indent)); final StringBuilder sb = new StringBuilder(); generateDecoderGroups(sb, className, groups, indent, false); out.append(sb); out.append(generateDecoderVarData(varData, indent)); out.append(generateDecoderDisplay(msgToken.name(), fields, groups, varData, indent)); out.append("}\n"); } }
final String decoderName = decoderName(compositeName); final String encoderName = encoderName(compositeName); final String implementsString = implementsInterface(COMPOSITE_DECODER_FLYWEIGHT); generateCompositeFlyweightHeader( token, decoderName, out, readOnlyBuffer, fqReadOnlyBuffer, implementsString); final String typeName = formatClassName(decoderName(encodingToken.applicableTypeName())); generateEncodingOffsetMethod(sb, propertyName, encodingToken.offset(), BASE_INDENT); generateEncodingLengthMethod(sb, propertyName, encodingToken.encodedLength(), BASE_INDENT); generateFieldSinceVersionMethod(sb, encodingToken, BASE_INDENT); out.append(sb).append(generatePrimitiveDecoder( true, encodingToken.name(), encodingToken, encodingToken, BASE_INDENT)); break; out.append(sb).append(generateEnumDecoder( true, encodingToken, propertyName, encodingToken, BASE_INDENT)); break; out.append(sb).append(generateBitSetProperty( true, DECODER, propertyName, encodingToken, encodingToken, BASE_INDENT, typeName)); break; out.append(sb).append(generateCompositeProperty( true, DECODER, propertyName, encodingToken, encodingToken, BASE_INDENT, typeName)); break;
private void generateBitSet(final List<Token> tokens) throws IOException { final Token token = tokens.get(0); final String bitSetName = formatClassName(token.applicableTypeName()); final String decoderName = decoderName(bitSetName); final String encoderName = encoderName(bitSetName); final List<Token> messageBody = getMessageBody(tokens); final String implementsString = implementsInterface(FLYWEIGHT); try (Writer out = outputManager.createOutput(decoderName)) { generateFixedFlyweightHeader(token, decoderName, implementsString, out, readOnlyBuffer, fqReadOnlyBuffer); out.append(generateChoiceIsEmpty(token.encoding().primitiveType())); out.append(generateChoiceDecoders(messageBody)); out.append(generateChoiceDisplay(messageBody)); out.append("}\n"); } try (Writer out = outputManager.createOutput(encoderName)) { generateFixedFlyweightHeader(token, encoderName, implementsString, out, mutableBuffer, fqMutableBuffer); out.append(generateChoiceClear(encoderName, token)); out.append(generateChoiceEncoders(encoderName, messageBody)); out.append("}\n"); } }
final String groupClassName = formatClassName(encoderName(groupName)); i = collectVarData(tokens, i, varData); sb.append(generateGroupEncoderProperty(groupName, groupToken, indent, isSubGroup)); generateAnnotations(indent + INDENT, groupClassName, tokens, sb, groupIndex + 1, this::encoderName); generateGroupEncoderClassHeader(sb, groupName, outerClassName, tokens, groups, groupIndex, indent + INDENT); sb.append(generateEncoderFields(groupClassName, fields, indent + INDENT)); generateEncoderGroups(sb, outerClassName, groups, indent + INDENT, true); sb.append(generateEncoderVarData(groupClassName, varData, indent + INDENT));
final String typeName = decoderName(formatClassName(typeToken.name())); generateFieldIdMethod(sb, fieldToken, indent); generateFieldSinceVersionMethod(sb, fieldToken, indent); generateEncodingOffsetMethod(sb, propertyName, fieldToken.offset(), indent); generateEncodingLengthMethod(sb, propertyName, typeToken.encodedLength(), indent); generateFieldMetaAttributeMethod(sb, fieldToken, indent); sb.append(generatePrimitiveDecoder(false, propertyName, fieldToken, typeToken, indent)); break; sb.append(generateEnumDecoder(false, fieldToken, propertyName, typeToken, indent)); break; sb.append(generateBitSetProperty( false, DECODER, propertyName, fieldToken, typeToken, indent, typeName)); break; sb.append(generateCompositeProperty( false, DECODER, propertyName, fieldToken, typeToken, indent, typeName)); break;
final String typeName = formatClassName(encoderName(typeToken.name())); generateFieldIdMethod(sb, fieldToken, indent); generateFieldSinceVersionMethod(sb, fieldToken, indent); generateEncodingOffsetMethod(sb, propertyName, fieldToken.offset(), indent); generateEncodingLengthMethod(sb, propertyName, typeToken.encodedLength(), indent); generateFieldMetaAttributeMethod(sb, fieldToken, indent); sb.append(generatePrimitiveEncoder(containingClassName, propertyName, typeToken, indent)); break; sb.append(generateEnumEncoder(containingClassName, propertyName, typeToken, indent)); break; sb.append(generateBitSetProperty( false, ENCODER, propertyName, fieldToken, typeToken, indent, typeName)); break; sb.append(generateCompositeProperty( false, ENCODER, propertyName, fieldToken, typeToken, indent, typeName)); break;
final String groupName = decoderName(formatClassName(groupToken.name())); i = collectVarData(tokens, i, varData); sb.append(generateGroupDecoderProperty(groupName, groupToken, indent, isSubGroup)); generateAnnotations(indent + INDENT, groupName, tokens, sb, groupIndex + 1, this::decoderName); generateGroupDecoderClassHeader(sb, groupName, outerClassName, tokens, groups, groupIndex, indent + INDENT); sb.append(generateDecoderFields(fields, indent + INDENT)); generateDecoderGroups(sb, outerClassName, groups, indent + INDENT, true); sb.append(generateDecoderVarData(varData, indent + INDENT)); appendGroupInstanceDecoderDisplay(sb, fields, groups, varData, indent + INDENT);
generateFieldIdMethod(sb, token, indent); generateFieldSinceVersionMethod(sb, token, indent); generateCharacterEncodingMethod(sb, token.name(), characterEncoding, indent); generateFieldMetaAttributeMethod(sb, token, indent); final Encoding lengthEncoding = lengthToken.encoding(); final PrimitiveType lengthType = lengthEncoding.primitiveType(); final String byteOrderStr = byteOrderString(lengthEncoding); indent + " }\n", Generators.toLowerFirstChar(propertyName), generateArrayFieldNotPresentCondition(token.version(), indent), generateGet(lengthType, "limit", byteOrderStr))); generateDataDecodeMethods( sb, token, propertyName, sizeOfLengthField, lengthType, byteOrderStr, characterEncoding, indent);
final String javaTypeName = javaTypeName(encoding.primitiveType()); final int offset = token.offset(); final String byteOrderStr = byteOrderString(encoding); final int fieldLength = token.arrayLength(); final int typeSize = sizeOfPrimitive(encoding); generateArrayLengthMethod(propertyName, indent, fieldLength, sb); offset, typeSize, generatePut(encoding.primitiveType(), "pos", "value", byteOrderStr))); generateCharArrayEncodeMethods( containingClassName, propertyName, indent, encoding, offset, fieldLength, sb);
private CharSequence generateDecoderFields( final List<Token> tokens, final String indent) { final StringBuilder sb = new StringBuilder(); eachField(tokens, (signalToken, encodingToken) -> { final String propertyName = formatPropertyName(signalToken.name()); final String typeName = decoderName(formatClassName(encodingToken.name())); generateFieldIdMethod(sb, signalToken, indent); generateFieldMetaAttributeMethod(sb, signalToken, indent); switch (encodingToken.signal()) { case ENCODING: sb.append(generatePrimitiveDecoder(propertyName, encodingToken, indent)); break; case BEGIN_ENUM: sb.append(generateEnumDecoder(propertyName, encodingToken, indent)); break; case BEGIN_SET: sb.append(generateBitSetProperty(propertyName, encodingToken, indent, typeName)); break; case BEGIN_COMPOSITE: sb.append(generateCompositeProperty(propertyName, encodingToken, indent, typeName)); break; } }); return sb; }
private void generateEncoder( final List<Token> groups, final List<Token> rootFields, final List<Token> varData, final Token msgToken) throws IOException { final String className = formatClassName(encoderName(msgToken.name())); try (final Writer out = outputManager.createOutput(className)) { out.append(generateFileHeader(ir.applicableNamespace(), fullMutableBuffer)); generateAnnotations(className, groups, out, 0, this::encoderName); out.append(generateClassDeclaration(className)); out.append(generateEncoderFlyweightCode(className, msgToken)); out.append(generateEncoderFields(className, rootFields, BASE_INDENT)); final StringBuilder sb = new StringBuilder(); generateEncoderGroups(sb, className, groups, 0, BASE_INDENT); out.append(sb); out.append(generateVarDataEncoders(className, varData)); out.append("}\n"); } }
private void generateDecoder( final List<Token> groups, final List<Token> rootFields, final List<Token> varData, final Token msgToken) throws IOException { final String className = formatClassName(decoderName(msgToken.name())); try (final Writer out = outputManager.createOutput(className)) { out.append(generateFileHeader(ir.applicableNamespace(), fullReadOnlyBuffer)); generateAnnotations(className, groups, out, 0, this::decoderName); out.append(generateClassDeclaration(className)); out.append(generateDecoderFlyweightCode(className, msgToken)); out.append(generateDecoderFields(rootFields, BASE_INDENT)); final StringBuilder sb = new StringBuilder(); generateDecoderGroups(sb, className, groups, 0, BASE_INDENT); out.append(sb); out.append(generateVarDataDecoders(varData)); out.append("}\n"); } }
generateFieldIdMethod(sb, token, indent); final Token varDataToken = Generators.findFirst("varData", tokens, i); final String characterEncoding = varDataToken.encoding().characterEncoding(); generateCharacterEncodingMethod(sb, token.name(), characterEncoding, indent); generateFieldMetaAttributeMethod(sb, token, indent); final Encoding lengthEncoding = lengthToken.encoding(); final int maxLengthValue = (int)lengthEncoding.applicableMaxValue().longValue(); final String byteOrderStr = byteOrderString(lengthEncoding); sizeOfLengthField)); generateDataEncodeMethods( sb, propertyName,
private void generateBitSet(final List<Token> tokens) throws IOException { final Token token = tokens.get(0); final String bitSetName = formatClassName(token.name()); final String decoderName = decoderName(bitSetName); final String encoderName = encoderName(bitSetName); final List<Token> messageBody = getMessageBody(tokens); try (final Writer out = outputManager.createOutput(decoderName)) { generateFixedFlyweightHeader(token, decoderName, out, readOnlyBuffer, fullReadOnlyBuffer); out.append(generateChoiceDecoders(messageBody)); out.append("}\n"); } try (final Writer out = outputManager.createOutput(encoderName)) { generateFixedFlyweightHeader(token, encoderName, out, mutableBuffer, fullMutableBuffer); out.append(generateChoiceClear(encoderName, token)); out.append(generateChoiceEncoders(encoderName, messageBody)); out.append("}\n"); } }
private int generateDecoderGroups( final StringBuilder sb, final String parentMessageClassName, final List<Token> tokens, int index, final String indent) throws IOException { for (int size = tokens.size(); index < size; index++) { final Token groupToken = tokens.get(index); if (groupToken.signal() == Signal.BEGIN_GROUP) { final String groupName = decoderName(formatClassName(groupToken.name())); sb.append(generateGroupDecoderProperty(groupName, groupToken, indent)); generateAnnotations(groupName, tokens, sb, index + 1, this::decoderName); generateGroupDecoderClassHeader(sb, groupName, parentMessageClassName, tokens, index, indent + INDENT); final List<Token> rootFields = new ArrayList<>(); index = collectRootFields(tokens, ++index, rootFields); sb.append(generateDecoderFields(rootFields, indent + INDENT)); if (tokens.get(index).signal() == Signal.BEGIN_GROUP) { index = generateDecoderGroups(sb, parentMessageClassName, tokens, index, indent + INDENT); } sb.append(indent).append(" }\n"); } } return index; }