20
20
import org .agrona .collections .MutableInteger ;
21
21
import org .w3c .dom .Document ;
22
22
import org .w3c .dom .Element ;
23
+ import org .w3c .dom .Node ;
23
24
24
25
import java .io .File ;
25
26
import java .io .StringWriter ;
@@ -74,7 +75,7 @@ private static void writeTo(
74
75
final Element topLevelTypes = createTypesElement (document );
75
76
root .appendChild (topLevelTypes );
76
77
77
- final HashMap <TypeSchema , String > typeToName = new HashMap <>();
78
+ final HashMap <Object , String > typeToName = new HashMap <>();
78
79
79
80
final TypeSchemaConverter typeSchemaConverter = new TypeSchemaConverter (
80
81
document ,
@@ -88,7 +89,8 @@ private static void writeTo(
88
89
topLevelTypes ,
89
90
typeSchemaConverter ,
90
91
schema .blockFields ().stream ().map (FieldSchema ::type ).collect (Collectors .toList ()),
91
- schema .groups ());
92
+ schema .groups (),
93
+ schema .varData ());
92
94
93
95
final Element message = document .createElement ("sbe:message" );
94
96
message .setAttribute ("name" , "TestMessage" );
@@ -129,7 +131,7 @@ private static void writeTo(
129
131
130
132
private static void appendMembers (
131
133
final Document document ,
132
- final HashMap <TypeSchema , String > typeToName ,
134
+ final HashMap <Object , String > typeToName ,
133
135
final List <FieldSchema > blockFields ,
134
136
final List <GroupSchema > groups ,
135
137
final List <VarDataSchema > varData ,
@@ -174,21 +176,10 @@ private static void appendMembers(
174
176
for (final VarDataSchema data : varData )
175
177
{
176
178
final int id = nextMemberId .getAndIncrement ();
177
-
178
179
final Element element = document .createElement ("data" );
179
180
element .setAttribute ("id" , Integer .toString (id ));
180
181
element .setAttribute ("name" , "member" + id );
181
- switch (data .encoding ())
182
- {
183
- case ASCII :
184
- element .setAttribute ("type" , "varStringEncoding" );
185
- break ;
186
- case BYTES :
187
- element .setAttribute ("type" , "varDataEncoding" );
188
- break ;
189
- default :
190
- throw new IllegalStateException ("Unknown encoding: " + data .encoding ());
191
- }
182
+ element .setAttribute ("type" , requireNonNull (typeToName .get (data )));
192
183
parent .appendChild (element );
193
184
}
194
185
}
@@ -213,27 +204,6 @@ private static Element createTypesElement(final Document document)
213
204
createTypeElement (document , "numInGroup" , "uint16" )
214
205
));
215
206
216
- final Element varString = createTypeElement (document , "varData" , "uint8" );
217
- varString .setAttribute ("length" , "0" );
218
- varString .setAttribute ("characterEncoding" , "US-ASCII" );
219
- types .appendChild (createCompositeElement (
220
- document ,
221
- "varStringEncoding" ,
222
- createTypeElement (document , "length" , "uint16" ),
223
- varString
224
- ));
225
-
226
- final Element varData = createTypeElement (document , "varData" , "uint8" );
227
- final Element varDataLength = createTypeElement (document , "length" , "uint32" );
228
- varDataLength .setAttribute ("maxValue" , "1000000" );
229
- varData .setAttribute ("length" , "0" );
230
- types .appendChild (createCompositeElement (
231
- document ,
232
- "varDataEncoding" ,
233
- varDataLength ,
234
- varData
235
- ));
236
-
237
207
return types ;
238
208
}
239
209
@@ -359,7 +329,8 @@ private static void appendTypes(
359
329
final Element topLevelTypes ,
360
330
final TypeSchemaConverter typeSchemaConverter ,
361
331
final List <TypeSchema > blockFields ,
362
- final List <GroupSchema > groups )
332
+ final List <GroupSchema > groups ,
333
+ final List <VarDataSchema > varDataFields )
363
334
{
364
335
for (final TypeSchema field : blockFields )
365
336
{
@@ -376,23 +347,29 @@ private static void appendTypes(
376
347
topLevelTypes ,
377
348
typeSchemaConverter ,
378
349
group .blockFields ().stream ().map (FieldSchema ::type ).collect (Collectors .toList ()),
379
- group .groups ()
380
- );
350
+ group .groups (),
351
+ group .varData ());
352
+ }
353
+
354
+ for (final VarDataSchema varData : varDataFields )
355
+ {
356
+ topLevelTypes .appendChild (typeSchemaConverter .convert (varData ));
381
357
}
382
358
}
383
359
360
+ @ SuppressWarnings ("EnhancedSwitchMigration" )
384
361
private static final class TypeSchemaConverter implements TypeSchemaVisitor
385
362
{
386
363
private final Document document ;
387
364
private final Element topLevelTypes ;
388
- private final Map <TypeSchema , String > typeToName ;
389
- private final Function <TypeSchema , String > nextName ;
365
+ private final Map <Object , String > typeToName ;
366
+ private final Function <Object , String > nextName ;
390
367
private Element result ;
391
368
392
369
private TypeSchemaConverter (
393
370
final Document document ,
394
371
final Element topLevelTypes ,
395
- final Map <TypeSchema , String > typeToName )
372
+ final Map <Object , String > typeToName )
396
373
{
397
374
this .document = document ;
398
375
this .topLevelTypes = topLevelTypes ;
@@ -481,5 +458,31 @@ public Element convert(final TypeSchema type)
481
458
type .accept (this );
482
459
return requireNonNull (result );
483
460
}
461
+
462
+ public Node convert (final VarDataSchema varData )
463
+ {
464
+ final Element lengthElement = createTypeElement (document , "length" ,
465
+ varData .lengthEncoding ().primitiveName ());
466
+
467
+ if (varData .lengthEncoding ().size () >= 4 )
468
+ {
469
+ lengthElement .setAttribute ("maxValue" , Integer .toString (1_000_000 ));
470
+ }
471
+
472
+ final Element varDataElement = createTypeElement (document , "varData" , "uint8" );
473
+ varDataElement .setAttribute ("length" , "0" );
474
+
475
+ if (varData .dataEncoding ().equals (VarDataSchema .Encoding .ASCII ))
476
+ {
477
+ varDataElement .setAttribute ("characterEncoding" , "US-ASCII" );
478
+ }
479
+
480
+ return createCompositeElement (
481
+ document ,
482
+ typeToName .computeIfAbsent (varData , nextName ),
483
+ lengthElement ,
484
+ varDataElement
485
+ );
486
+ }
484
487
}
485
488
}
0 commit comments