Skip to content

Commit 8f28a9d

Browse files
committed
BinarySerialiser: add quantity metadata field
Signed-off-by: Alexander Krimm <[email protected]>
1 parent 94b0289 commit 8f28a9d

File tree

7 files changed

+65
-5
lines changed

7 files changed

+65
-5
lines changed

serialiser/src/main/java/io/opencmw/serialiser/FieldDescription.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ public interface FieldDescription {
5656
*/
5757
String getFieldUnit();
5858

59+
/**
60+
* @return optional meta data tag describing the field's quantity or similar (N.B. can be empty String)
61+
*/
62+
String getFieldQuantity();
63+
5964
/**
6065
* @return for a hierarchical/nested data structure refers to the parent this field belongs to (N.B. can be null if there isn't a parent, e.g. for a root element)
6166
*/

serialiser/src/main/java/io/opencmw/serialiser/annotations/MetaInfo.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
@Target({ ElementType.FIELD, ElementType.TYPE })
1010
public @interface MetaInfo {
1111
String unit() default "";
12+
String quantity() default "";
1213
String description() default "";
1314
byte modifier() default 0;
1415
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.opencmw.serialiser.annotations;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Retention(RetentionPolicy.RUNTIME)
9+
@Target({ ElementType.FIELD, ElementType.TYPE })
10+
public @interface Quantity {
11+
String value() default "";
12+
}

serialiser/src/main/java/io/opencmw/serialiser/spi/BinarySerialiser.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,9 @@ public WireDataFieldDescription getFieldHeader() {
422422
if (buffer.position() < dataStartPosition) {
423423
lastFieldHeader.setFieldUnit(buffer.getString());
424424
}
425+
if (buffer.position() < dataStartPosition) {
426+
lastFieldHeader.setFieldQuantity(buffer.getString());
427+
}
425428
if (buffer.position() < dataStartPosition) {
426429
lastFieldHeader.setFieldDescription(buffer.getString());
427430
}
@@ -1456,6 +1459,7 @@ public WireDataFieldDescription putFieldHeader(final FieldDescription fieldDescr
14561459

14571460
if (isPutFieldMetaData() && fieldDescription.isAnnotationPresent() && dataType != DataType.END_MARKER) {
14581461
buffer.putString(fieldDescription.getFieldUnit());
1462+
buffer.putString(fieldDescription.getFieldQuantity());
14591463
buffer.putString(fieldDescription.getFieldDescription());
14601464
buffer.putByte(fieldDescription.getFieldModifier());
14611465
}
@@ -1470,6 +1474,7 @@ public WireDataFieldDescription putFieldHeader(final FieldDescription fieldDescr
14701474
lastFieldHeader = new WireDataFieldDescription(this, parent, fieldDescription.getFieldName(), dataType, headerStart, dataStartOffset, dataSize);
14711475
if (isPutFieldMetaData() && fieldDescription.isAnnotationPresent()) {
14721476
lastFieldHeader.setFieldUnit(fieldDescription.getFieldUnit());
1477+
lastFieldHeader.setFieldQuantity(fieldDescription.getFieldQuantity());
14731478
lastFieldHeader.setFieldDescription(fieldDescription.getFieldDescription());
14741479
lastFieldHeader.setFieldModifier(fieldDescription.getFieldModifier());
14751480
}

serialiser/src/main/java/io/opencmw/serialiser/spi/ClassFieldDescription.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class ClassFieldDescription implements FieldDescription {
3131
private final String fieldName;
3232
private final String fieldNameRelative;
3333
private final String fieldUnit;
34+
private final String fieldQuantity;
3435
private final String fieldDescription;
3536
private final byte fieldModifier;
3637
private final boolean annotationPresent;
@@ -115,10 +116,11 @@ protected ClassFieldDescription(final Class<?> referenceClass, final Field field
115116
// read annotation values
116117
AnnotatedElement annotatedElement = field == null ? referenceClass : field;
117118
fieldUnit = getFieldUnit(annotatedElement);
119+
fieldQuantity = getFieldQuantity(annotatedElement);
118120
fieldDescription = getFieldDescription(annotatedElement);
119121
fieldModifier = getFieldModifier(annotatedElement);
120122

121-
annotationPresent = fieldUnit != null || fieldDescription != null;
123+
annotationPresent = fieldUnit != null || fieldQuantity != null || fieldDescription != null;
122124

123125
typeName = ClassUtils.translateClassName(classType.getTypeName()).intern();
124126
final int lastDot = typeName.lastIndexOf('.');
@@ -325,6 +327,11 @@ public String getFieldUnit() {
325327
return fieldUnit;
326328
}
327329

330+
@Override
331+
public String getFieldQuantity() {
332+
return fieldQuantity;
333+
}
334+
328335
/**
329336
* @return field type strings (e.g. for the class Map&lt;Integer,String&gt; this returns
330337
* '&lt;java.lang.Integer,java.lang.String&gt;'
@@ -640,9 +647,10 @@ protected static void printClassStructure(final ClassFieldDescription field, fin
640647
if (field.isAnnotationPresent()) {
641648
LOGGER.atInfo().addArgument(mspace).addArgument(isSerialisable ? " " : "//") //
642649
.addArgument(field.getFieldUnit())
650+
.addArgument(field.getFieldQuantity())
643651
.addArgument(field.getFieldDescription())
644652
.addArgument(field.getFieldModifier())
645-
.log("{} {} <meta-info: unit:'{}' description:'{}' modifier:'{}'>");
653+
.log("{} {} <meta-info: unit:'{}' quantity:'{}' description:'{}' modifier:'{}'>");
646654
}
647655

648656
field.getChildren().forEach(f -> printClassStructure((ClassFieldDescription) f, fullView, recursionLevel + 1));
@@ -685,6 +693,18 @@ private static String getFieldUnit(final AnnotatedElement annotatedElement) {
685693
return null;
686694
}
687695

696+
private static String getFieldQuantity(final AnnotatedElement annotatedElement) {
697+
final MetaInfo[] annotationMeta = annotatedElement.getAnnotationsByType(MetaInfo.class);
698+
if (annotationMeta.length > 0) {
699+
return annotationMeta[0].quantity().intern();
700+
}
701+
final Quantity[] annotationQuantity = annotatedElement.getAnnotationsByType(Quantity.class);
702+
if (annotationQuantity.length > 0) {
703+
return annotationQuantity[0].value().intern();
704+
}
705+
return null;
706+
}
707+
688708
private static String spaces(final int spaces) {
689709
return CharBuffer.allocate(spaces).toString().replace('\0', ' ');
690710
}

serialiser/src/main/java/io/opencmw/serialiser/spi/WireDataFieldDescription.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public class WireDataFieldDescription implements FieldDescription {
2929
// local references to source buffer needed for parsing
3030
private final IoSerialiser ioSerialiser;
3131
private String fieldUnit;
32+
private String fieldQuantity;
3233
private String fieldDescription;
3334
private byte fieldModifier;
3435
private int dataSize;
@@ -151,6 +152,15 @@ public void setFieldUnit(final String fieldUnit) {
151152
this.fieldUnit = fieldUnit;
152153
}
153154

155+
@Override
156+
public String getFieldQuantity() {
157+
return fieldQuantity;
158+
}
159+
160+
public void setFieldQuantity(final String fieldQuantity) {
161+
this.fieldQuantity = fieldQuantity;
162+
}
163+
154164
/**
155165
* @return raw ioSerialiser reference this field was retrieved with the position in the underlying IoBuffer at the to be read field
156166
* N.B. this is a safe convenience method and not performance optimised
@@ -208,7 +218,7 @@ public Class<?> getType() {
208218

209219
@Override
210220
public boolean isAnnotationPresent() {
211-
return fieldUnit != null || fieldDescription != null;
221+
return fieldUnit != null || fieldQuantity != null || fieldDescription != null;
212222
}
213223

214224
@Override
@@ -233,9 +243,10 @@ protected static void printFieldStructure(final FieldDescription field, final in
233243
if (field.isAnnotationPresent()) {
234244
LOGGER.atInfo().addArgument(mspace) //
235245
.addArgument(field.getFieldUnit())
246+
.addArgument(field.getFieldQuantity())
236247
.addArgument(field.getFieldDescription())
237248
.addArgument(field.getFieldModifier())
238-
.log("{} <meta-info: unit:'{}' description:'{}' modifier:'{}'>");
249+
.log("{} <meta-info: unit:'{}' quantity='{}' description:'{}' modifier:'{}'>");
239250
}
240251
field.getChildren().forEach(f -> printFieldStructure(f, recursionLevel + 1));
241252
}

serialiser/src/test/java/io/opencmw/serialiser/annotations/SerialiserAnnotationTests.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@ void testAnnotationGeneration() {
3232
final FieldDescription energyField = classFieldDescription.findChildField("energy");
3333
assertNotNull(energyField);
3434
assertEquals("GeV/u", energyField.getFieldUnit());
35+
assertEquals("energy", energyField.getFieldQuantity());
3536
assertEquals("energy description", energyField.getFieldDescription());
3637
assertEquals(0, energyField.getFieldModifier());
3738

3839
final FieldDescription temperatureField = classFieldDescription.findChildField("temperature");
3940
assertNotNull(temperatureField);
4041
assertEquals("°C", temperatureField.getFieldUnit());
42+
assertEquals("temperature", temperatureField.getFieldQuantity());
4143
assertEquals("important temperature reading", temperatureField.getFieldDescription());
4244
assertEquals(0, temperatureField.getFieldModifier());
4345
}
@@ -64,27 +66,31 @@ void testCustomSerialiserIdentity(final Class<? extends IoBuffer> bufferClass) t
6466
final FieldDescription energyField = serialiserFieldDescriptions.findChildField("energy");
6567
assertNotNull(energyField);
6668
assertEquals("GeV/u", energyField.getFieldUnit());
69+
assertEquals("energy", energyField.getFieldQuantity());
6770
assertEquals("energy description", energyField.getFieldDescription());
6871
assertEquals(0, energyField.getFieldModifier());
6972

7073
final FieldDescription temperatureField = serialiserFieldDescriptions.findChildField("temperature");
7174
assertNotNull(temperatureField);
7275
assertEquals("°C", temperatureField.getFieldUnit());
76+
assertEquals("temperature", temperatureField.getFieldQuantity());
7377
assertEquals("important temperature reading", temperatureField.getFieldDescription());
7478
assertEquals(0, temperatureField.getFieldModifier());
7579
}
7680

7781
@Description("this class is used to test field annotation")
7882
public static class AnnotatedDataClass {
79-
@MetaInfo(unit = "GeV/u", description = "energy description", modifier = 0)
83+
@MetaInfo(unit = "GeV/u", quantity = "energy", description = "energy description", modifier = 0)
8084
public double energy;
8185

8286
@Unit("°C")
87+
@Quantity("temperature")
8388
@Description("important temperature reading")
8489
@Modifier(0)
8590
public double temperature;
8691

8792
@Unit("V")
93+
@Quantity("voltage")
8894
@Description("control variable")
8995
@Modifier(1)
9096
public double controlVariable;

0 commit comments

Comments
 (0)