3
3
import java .util .*;
4
4
5
5
import org .apache .avro .Schema ;
6
- import org .apache .avro .util .internal .JacksonUtils ;
7
6
7
+ import com .fasterxml .jackson .databind .ObjectMapper ;
8
8
import com .fasterxml .jackson .dataformat .avro .deser .ScalarDecoder .*;
9
9
import com .fasterxml .jackson .dataformat .avro .schema .AvroSchemaHelper ;
10
10
@@ -22,6 +22,7 @@ public abstract class AvroReaderFactory
22
22
protected final static ScalarDecoder READER_LONG = new LongReader ();
23
23
protected final static ScalarDecoder READER_NULL = new NullReader ();
24
24
protected final static ScalarDecoder READER_STRING = new StringReader ();
25
+ private final static ObjectMapper DEFAULT_MAPPER = new ObjectMapper ();
25
26
26
27
/**
27
28
* To resolve cyclic types, need to keep track of resolved named
@@ -56,24 +57,24 @@ public ScalarDecoder createScalarValueDecoder(Schema type)
56
57
switch (type .getType ()) {
57
58
case BOOLEAN :
58
59
return READER_BOOLEAN ;
59
- case BYTES :
60
+ case BYTES :
60
61
return READER_BYTES ;
61
- case DOUBLE :
62
+ case DOUBLE :
62
63
return READER_DOUBLE ;
63
- case ENUM :
64
+ case ENUM :
64
65
return new EnumDecoder (AvroSchemaHelper .getFullName (type ), type .getEnumSymbols ());
65
- case FIXED :
66
+ case FIXED :
66
67
return new FixedDecoder (type .getFixedSize (), AvroSchemaHelper .getFullName (type ));
67
- case FLOAT :
68
+ case FLOAT :
68
69
return READER_FLOAT ;
69
70
case INT :
70
71
if (AvroSchemaHelper .getTypeId (type ) != null ) {
71
72
return new IntReader (AvroSchemaHelper .getTypeId (type ));
72
73
}
73
74
return READER_INT ;
74
- case LONG :
75
+ case LONG :
75
76
return READER_LONG ;
76
- case NULL :
77
+ case NULL :
77
78
return READER_NULL ;
78
79
case STRING :
79
80
if (AvroSchemaHelper .getTypeId (type ) != null ) {
@@ -127,7 +128,7 @@ public AvroStructureReader createReader(Schema schema)
127
128
switch (schema .getType ()) {
128
129
case ARRAY :
129
130
return createArrayReader (schema );
130
- case MAP :
131
+ case MAP :
131
132
return createMapReader (schema );
132
133
case RECORD :
133
134
return createRecordReader (schema );
@@ -252,7 +253,7 @@ public AvroStructureReader createReader(Schema writerSchema, Schema readerSchema
252
253
switch (writerSchema .getType ()) {
253
254
case ARRAY :
254
255
return createArrayReader (writerSchema , readerSchema );
255
- case MAP :
256
+ case MAP :
256
257
return createMapReader (writerSchema , readerSchema );
257
258
case RECORD :
258
259
return createRecordReader (writerSchema , readerSchema );
@@ -303,7 +304,7 @@ protected AvroStructureReader createRecordReader(Schema writerSchema, Schema rea
303
304
final List <Schema .Field > writerFields = writerSchema .getFields ();
304
305
305
306
// but first: find fields that only exist in reader-side and need defaults,
306
- // and remove those from
307
+ // and remove those from
307
308
Map <String ,Schema .Field > readerFields = new HashMap <String ,Schema .Field >();
308
309
List <Schema .Field > defaultFields = new ArrayList <Schema .Field >();
309
310
{
@@ -320,7 +321,7 @@ protected AvroStructureReader createRecordReader(Schema writerSchema, Schema rea
320
321
}
321
322
}
322
323
}
323
-
324
+
324
325
// note: despite changes, we will always have known number of field entities,
325
326
// ones from writer schema -- some may skip, but there's entry there
326
327
AvroFieldReader [] fieldReaders = new AvroFieldReader [writerFields .size ()
@@ -339,12 +340,13 @@ protected AvroStructureReader createRecordReader(Schema writerSchema, Schema rea
339
340
: createFieldReader (readerField .name (),
340
341
writerField .schema (), readerField .schema ());
341
342
}
342
-
343
+
343
344
// Any defaults to consider?
344
345
if (!defaultFields .isEmpty ()) {
345
346
for (Schema .Field defaultField : defaultFields ) {
346
- AvroFieldReader fr =
347
- AvroFieldDefaulters .createDefaulter (defaultField .name (), JacksonUtils .toJsonNode (defaultField .defaultVal ()));
347
+ AvroFieldReader fr = AvroFieldDefaulters .createDefaulter (defaultField .name (),
348
+ AvroSchemaHelper .parseDefaultValue (defaultField .defaultVal ())
349
+ );
348
350
if (fr == null ) {
349
351
throw new IllegalArgumentException ("Unsupported default type: " +defaultField .schema ().getType ());
350
352
}
@@ -359,9 +361,9 @@ protected AvroStructureReader createUnionReader(Schema writerSchema, Schema read
359
361
final List <Schema > types = writerSchema .getTypes ();
360
362
AvroStructureReader [] typeReaders = new AvroStructureReader [types .size ()];
361
363
int i = 0 ;
362
-
364
+
363
365
// !!! TODO: actual resolution !!!
364
-
366
+
365
367
for (Schema type : types ) {
366
368
typeReaders [i ++] = createReader (type );
367
369
}
@@ -414,7 +416,7 @@ private Schema _verifyMatchingStructure(Schema readerSchema, Schema writerSchema
414
416
// in case there are multiple alternatives of same structured type.
415
417
// But since that is quite non-trivial let's wait for a good example of actual
416
418
// usage before tackling that.
417
-
419
+
418
420
if (actualType == Schema .Type .UNION ) {
419
421
for (Schema sch : readerSchema .getTypes ()) {
420
422
if (sch .getType () == expectedType ) {
0 commit comments