Skip to content

Commit 3224cc5

Browse files
committed
[Java]: Added <propertyName>MetaAttribute() method to Java code gen for supporting access to the likes of semanticType, epoch, and timeUnit from layer 7.
1 parent 924711e commit 3224cc5

File tree

5 files changed

+45
-5
lines changed

5 files changed

+45
-5
lines changed

examples/resources/TestExtensionSchema.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
<field name="seconds" id="16" type="float"/>
6969
</group>
7070
</group>
71-
<data name="make" id="17" type="varDataEncoding"/>
71+
<data name="make" id="17" type="varDataEncoding" semanticType="Make"/>
7272
<data name="model" id="18" type="varDataEncoding"/>
7373
</message>
7474
</messageSchema>

examples/resources/TestSchema.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
<field name="seconds" id="16" type="float"/>
6868
</group>
6969
</group>
70-
<data name="make" id="17" type="varDataEncoding"/>
70+
<data name="make" id="17" type="varDataEncoding" semanticType="Make"/>
7171
<data name="model" id="18" type="varDataEncoding"/>
7272
</message>
7373
</messageSchema>

main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ private CharSequence generateVarData(final List<Token> tokens)
354354

355355
final String characterEncoding = tokens.get(i + 3).encoding().characterEncoding();
356356
generateCharacterEncodingMethod(sb, token.name(), characterEncoding);
357+
generateFieldMetaAttributeMethod(sb, token, BASE_INDENT);
357358

358359
final String propertyName = toUpperFirstChar(token.name());
359360
final Token lengthToken = tokens.get(i + 2);
@@ -365,6 +366,7 @@ private CharSequence generateVarData(final List<Token> tokens)
365366
final String byteOrderStr = lengthEncoding.primitiveType().size() == 1 ? "" : ", java.nio.ByteOrder." + byteOrder;
366367

367368
sb.append(String.format(
369+
"\n" +
368370
" public int get%s(final byte[] dst, final int dstOffset, final int length)\n" +
369371
" {\n" +
370372
"%s" +
@@ -376,7 +378,7 @@ private CharSequence generateVarData(final List<Token> tokens)
376378
" position(position + sizeOfLengthField + dataLength);\n" +
377379
" CodecUtil.int8sGet(buffer, position + sizeOfLengthField, dst, dstOffset, bytesCopied);\n\n" +
378380
" return bytesCopied;\n" +
379-
" }\n\n",
381+
" }\n",
380382
propertyName,
381383
generateArrayFieldNotPresentCondition(token.version(), BASE_INDENT),
382384
sizeOfLengthField,
@@ -385,6 +387,7 @@ private CharSequence generateVarData(final List<Token> tokens)
385387
));
386388

387389
sb.append(String.format(
390+
"\n" +
388391
" public int put%s(final byte[] src, final int srcOffset, final int length)\n" +
389392
" {\n" +
390393
" final int sizeOfLengthField = %d;\n" +
@@ -607,7 +610,13 @@ private CharSequence generateClassDeclaration(final String className)
607610
{
608611
return String.format(
609612
"public class %s\n" +
610-
"{\n",
613+
"{\n" +
614+
" public enum MetaAttribute\n" +
615+
" {\n" +
616+
" EPOCH,\n" +
617+
" TIME_UNIT,\n" +
618+
" SEMANTIC_TYPE\n" +
619+
" }\n\n",
611620
className
612621
);
613622
}
@@ -925,7 +934,7 @@ private void generateCharacterEncodingMethod(final StringBuilder sb, final Strin
925934
" public static String %sCharacterEncoding()\n" +
926935
" {\n" +
927936
" return \"%s\";\n" +
928-
" }\n\n",
937+
" }\n",
929938
formatPropertyName(propertyName),
930939
encoding
931940
));
@@ -1124,6 +1133,7 @@ private CharSequence generateFields(final String containingClassName, final List
11241133
final String propertyName = formatPropertyName(signalToken.name());
11251134

11261135
generateFieldIdMethod(sb, signalToken, indent);
1136+
generateFieldMetaAttributeMethod(sb, signalToken, indent);
11271137

11281138
switch (encodingToken.signal())
11291139
{
@@ -1162,6 +1172,32 @@ private void generateFieldIdMethod(final StringBuilder sb, final Token token, fi
11621172
));
11631173
}
11641174

1175+
private void generateFieldMetaAttributeMethod(final StringBuilder sb, final Token token, final String indent)
1176+
{
1177+
final Encoding encoding = token.encoding();
1178+
final String epoch = encoding.epoch() == null ? "" : encoding.epoch();
1179+
final String timeUnit = encoding.timeUnit() == null ? "" : encoding.timeUnit();
1180+
final String semanticType = encoding.semanticType() == null ? "" : encoding.semanticType();
1181+
1182+
sb.append(String.format(
1183+
"\n" +
1184+
indent + " public static String %sMetaAttribute(final MetaAttribute metaAttribute)\n" +
1185+
indent + " {\n" +
1186+
indent + " switch (metaAttribute)\n" +
1187+
indent + " {\n" +
1188+
indent + " case EPOCH: return \"%s\";\n" +
1189+
indent + " case TIME_UNIT: return \"%s\";\n" +
1190+
indent + " case SEMANTIC_TYPE: return \"%s\";\n" +
1191+
indent + " }\n\n" +
1192+
indent + " return \"\";\n" +
1193+
indent + " }\n",
1194+
token.name(),
1195+
epoch,
1196+
timeUnit,
1197+
semanticType
1198+
));
1199+
}
1200+
11651201
private CharSequence generateEnumProperty(final String containingClassName,
11661202
final String propertyName,
11671203
final Token token,

main/java/uk/co/real_logic/sbe/xml/IrGenerator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ private void addFieldSignal(final Field field, final Signal signal)
100100
.schemaId(field.id())
101101
.version(field.sinceVersion())
102102
.encoding(new Encoding.Builder()
103+
.epoch(field.epoch())
104+
.timeUnit(field.timeUnit())
103105
.semanticType(semanticTypeOf(null, field)).build())
104106
.build();
105107

main/java/uk/co/real_logic/sbe/xml/Message.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,8 @@ else if (!(fieldType instanceof CompositeType))
283283
.semanticType(getAttributeValueOrNull(nodeList.item(nodeIndex), "semanticType"))
284284
.presence(Presence.get(getAttributeValue(nodeList.item(nodeIndex), "presence", "required")))
285285
.sinceVersion(Integer.parseInt(getAttributeValue(nodeList.item(nodeIndex), "sinceVersion", "0")))
286+
.epoch(getAttributeValue(nodeList.item(nodeIndex), "epoch", "unix"))
287+
.timeUnit(getAttributeValue(nodeList.item(nodeIndex), "timeUnit", "nanosecond"))
286288
.type(fieldType)
287289
.variableLength(true)
288290
.build();

0 commit comments

Comments
 (0)