@@ -277,7 +277,7 @@ public TokenBuffer append(TokenBuffer other) throws IOException
277
277
* references (from core to mapper package); and as such we also
278
278
* can not take second argument.
279
279
*/
280
- public void serialize (JsonGenerator jgen ) throws IOException
280
+ public void serialize (JsonGenerator gen ) throws IOException
281
281
{
282
282
Segment segment = _first ;
283
283
int ptr = -1 ;
@@ -298,94 +298,101 @@ public void serialize(JsonGenerator jgen) throws IOException
298
298
if (hasIds ) {
299
299
Object id = segment .findObjectId (ptr );
300
300
if (id != null ) {
301
- jgen .writeObjectId (id );
301
+ gen .writeObjectId (id );
302
302
}
303
303
id = segment .findTypeId (ptr );
304
304
if (id != null ) {
305
- jgen .writeTypeId (id );
305
+ gen .writeTypeId (id );
306
306
}
307
307
}
308
308
309
309
// Note: copied from 'copyCurrentEvent'...
310
310
switch (t ) {
311
311
case START_OBJECT :
312
- jgen .writeStartObject ();
312
+ gen .writeStartObject ();
313
313
break ;
314
314
case END_OBJECT :
315
- jgen .writeEndObject ();
315
+ gen .writeEndObject ();
316
316
break ;
317
317
case START_ARRAY :
318
- jgen .writeStartArray ();
318
+ gen .writeStartArray ();
319
319
break ;
320
320
case END_ARRAY :
321
- jgen .writeEndArray ();
321
+ gen .writeEndArray ();
322
322
break ;
323
323
case FIELD_NAME :
324
324
{
325
325
// 13-Dec-2010, tatu: Maybe we should start using different type tokens to reduce casting?
326
326
Object ob = segment .get (ptr );
327
327
if (ob instanceof SerializableString ) {
328
- jgen .writeFieldName ((SerializableString ) ob );
328
+ gen .writeFieldName ((SerializableString ) ob );
329
329
} else {
330
- jgen .writeFieldName ((String ) ob );
330
+ gen .writeFieldName ((String ) ob );
331
331
}
332
332
}
333
333
break ;
334
334
case VALUE_STRING :
335
335
{
336
336
Object ob = segment .get (ptr );
337
337
if (ob instanceof SerializableString ) {
338
- jgen .writeString ((SerializableString ) ob );
338
+ gen .writeString ((SerializableString ) ob );
339
339
} else {
340
- jgen .writeString ((String ) ob );
340
+ gen .writeString ((String ) ob );
341
341
}
342
342
}
343
343
break ;
344
344
case VALUE_NUMBER_INT :
345
345
{
346
346
Object n = segment .get (ptr );
347
347
if (n instanceof Integer ) {
348
- jgen .writeNumber ((Integer ) n );
348
+ gen .writeNumber ((Integer ) n );
349
349
} else if (n instanceof BigInteger ) {
350
- jgen .writeNumber ((BigInteger ) n );
350
+ gen .writeNumber ((BigInteger ) n );
351
351
} else if (n instanceof Long ) {
352
- jgen .writeNumber ((Long ) n );
352
+ gen .writeNumber ((Long ) n );
353
353
} else if (n instanceof Short ) {
354
- jgen .writeNumber ((Short ) n );
354
+ gen .writeNumber ((Short ) n );
355
355
} else {
356
- jgen .writeNumber (((Number ) n ).intValue ());
356
+ gen .writeNumber (((Number ) n ).intValue ());
357
357
}
358
358
}
359
359
break ;
360
360
case VALUE_NUMBER_FLOAT :
361
361
{
362
362
Object n = segment .get (ptr );
363
363
if (n instanceof Double ) {
364
- jgen .writeNumber (((Double ) n ).doubleValue ());
364
+ gen .writeNumber (((Double ) n ).doubleValue ());
365
365
} else if (n instanceof BigDecimal ) {
366
- jgen .writeNumber ((BigDecimal ) n );
366
+ gen .writeNumber ((BigDecimal ) n );
367
367
} else if (n instanceof Float ) {
368
- jgen .writeNumber (((Float ) n ).floatValue ());
368
+ gen .writeNumber (((Float ) n ).floatValue ());
369
369
} else if (n == null ) {
370
- jgen .writeNull ();
370
+ gen .writeNull ();
371
371
} else if (n instanceof String ) {
372
- jgen .writeNumber ((String ) n );
372
+ gen .writeNumber ((String ) n );
373
373
} else {
374
374
throw new JsonGenerationException ("Unrecognized value type for VALUE_NUMBER_FLOAT: " +n .getClass ().getName ()+", can not serialize" );
375
375
}
376
376
}
377
377
break ;
378
378
case VALUE_TRUE :
379
- jgen .writeBoolean (true );
379
+ gen .writeBoolean (true );
380
380
break ;
381
381
case VALUE_FALSE :
382
- jgen .writeBoolean (false );
382
+ gen .writeBoolean (false );
383
383
break ;
384
384
case VALUE_NULL :
385
- jgen .writeNull ();
385
+ gen .writeNull ();
386
386
break ;
387
387
case VALUE_EMBEDDED_OBJECT :
388
- jgen .writeObject (segment .get (ptr ));
388
+ {
389
+ Object value = segment .get (ptr );
390
+ if (value instanceof RawValue ) {
391
+ ((RawValue ) value ).serialize (gen );
392
+ } else {
393
+ gen .writeObject (value );
394
+ }
395
+ }
389
396
break ;
390
397
default :
391
398
throw new RuntimeException ("Internal error: should never end up through this code path" );
@@ -656,16 +663,14 @@ public void writeString(SerializableString text) throws IOException {
656
663
}
657
664
658
665
@ Override
659
- public void writeRawUTF8String (byte [] text , int offset , int length )
660
- throws IOException
666
+ public void writeRawUTF8String (byte [] text , int offset , int length ) throws IOException
661
667
{
662
668
// could add support for buffering if we really want it...
663
669
_reportUnsupportedOperation ();
664
670
}
665
671
666
672
@ Override
667
- public void writeUTF8String (byte [] text , int offset , int length )
668
- throws IOException
673
+ public void writeUTF8String (byte [] text , int offset , int length ) throws IOException
669
674
{
670
675
// could add support for buffering if we really want it...
671
676
_reportUnsupportedOperation ();
@@ -698,17 +703,20 @@ public void writeRaw(char c) throws IOException {
698
703
699
704
@ Override
700
705
public void writeRawValue (String text ) throws IOException {
701
- _reportUnsupportedOperation ( );
706
+ _append ( JsonToken . VALUE_EMBEDDED_OBJECT , new RawValue ( text ) );
702
707
}
703
708
704
709
@ Override
705
710
public void writeRawValue (String text , int offset , int len ) throws IOException {
706
- _reportUnsupportedOperation ();
711
+ if (offset > 0 || len != text .length ()) {
712
+ text = text .substring (offset , offset +len );
713
+ }
714
+ _append (JsonToken .VALUE_EMBEDDED_OBJECT , new RawValue (text ));
707
715
}
708
716
709
717
@ Override
710
718
public void writeRawValue (char [] text , int offset , int len ) throws IOException {
711
- _reportUnsupportedOperation ( );
719
+ _append ( JsonToken . VALUE_EMBEDDED_OBJECT , new String ( text , offset , len ) );
712
720
}
713
721
714
722
/*
@@ -792,10 +800,11 @@ public void writeObject(Object value) throws IOException
792
800
return ;
793
801
}
794
802
Class <?> raw = value .getClass ();
795
- if (raw == byte [].class ) {
803
+ if (raw == byte [].class || ( value instanceof RawValue ) ) {
796
804
_append (JsonToken .VALUE_EMBEDDED_OBJECT , value );
797
805
return ;
798
- } else if (_objectCodec == null ) {
806
+ }
807
+ if (_objectCodec == null ) {
799
808
/* 28-May-2014, tatu: Tricky choice here; if no codec, should we
800
809
* err out, or just embed? For now, do latter.
801
810
*/
0 commit comments