Skip to content

Commit 37461d6

Browse files
committed
minor code simplification
1 parent 38c146c commit 37461d6

File tree

1 file changed

+73
-91
lines changed

1 file changed

+73
-91
lines changed

src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java

Lines changed: 73 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,8 @@ public Object deserializeFromObject(JsonParser p, DeserializationContext ctxt)
329329
* values for creator method need to be buffered, first; and
330330
* due to non-guaranteed ordering possibly some other properties
331331
* as well.
332+
*
333+
* @return Builder instance constructed
332334
*/
333335
@Override
334336
@SuppressWarnings("resource")
@@ -357,22 +359,22 @@ protected final Object _deserializeUsingPropertyBased(final JsonParser p,
357359
// Last creator property to set?
358360
if (buffer.assignParameter(creatorProp, creatorProp.deserialize(p, ctxt))) {
359361
p.nextToken(); // to move to following FIELD_NAME/END_OBJECT
360-
Object bean;
362+
Object builder;
361363
try {
362-
bean = creator.build(ctxt, buffer);
364+
builder = creator.build(ctxt, buffer);
363365
} catch (Exception e) {
364366
wrapAndThrow(e, _beanType.getRawClass(), propName, ctxt);
365367
continue; // never gets here
366368
}
367369
// polymorphic?
368-
if (bean.getClass() != _beanType.getRawClass()) {
369-
return handlePolymorphic(p, ctxt, bean, unknown);
370+
if (builder.getClass() != _beanType.getRawClass()) {
371+
return handlePolymorphic(p, ctxt, builder, unknown);
370372
}
371373
if (unknown != null) { // nope, just extra unknown stuff...
372-
bean = handleUnknownProperties(ctxt, bean, unknown);
374+
builder = handleUnknownProperties(ctxt, builder, unknown);
373375
}
374376
// or just clean?
375-
return _deserialize(p, ctxt, bean);
377+
return _deserialize(p, ctxt, builder);
376378
}
377379
continue;
378380
}
@@ -406,31 +408,37 @@ protected final Object _deserializeUsingPropertyBased(final JsonParser p,
406408
}
407409

408410
// We hit END_OBJECT, so:
409-
Object bean;
411+
Object builder;
410412
try {
411-
bean = creator.build(ctxt, buffer);
413+
builder = creator.build(ctxt, buffer);
412414
} catch (Exception e) {
413-
bean = wrapInstantiationProblem(e, ctxt);
415+
builder = wrapInstantiationProblem(e, ctxt);
414416
}
415417
if (unknown != null) {
416418
// polymorphic?
417-
if (bean.getClass() != _beanType.getRawClass()) {
418-
return handlePolymorphic(null, ctxt, bean, unknown);
419+
if (builder.getClass() != _beanType.getRawClass()) {
420+
return handlePolymorphic(null, ctxt, builder, unknown);
419421
}
420422
// no, just some extra unknown properties
421-
return handleUnknownProperties(ctxt, bean, unknown);
423+
return handleUnknownProperties(ctxt, builder, unknown);
422424
}
423-
return bean;
425+
return builder;
424426
}
425427

428+
@SuppressWarnings("resource")
426429
protected final Object _deserialize(JsonParser p,
427430
DeserializationContext ctxt, Object builder) throws IOException
428431
{
429432
if (_injectables != null) {
430433
injectValues(ctxt, builder);
431434
}
432435
if (_unwrappedPropertyHandler != null) {
433-
return deserializeWithUnwrapped(p, ctxt, builder);
436+
if (p.hasToken(JsonToken.START_OBJECT)) {
437+
p.nextToken();
438+
}
439+
TokenBuffer tokens = new TokenBuffer(p, ctxt);
440+
tokens.writeStartObject();
441+
return deserializeWithUnwrapped(p, ctxt, builder, tokens);
434442
}
435443
if (_externalTypeIdHandler != null) {
436444
return deserializeWithExternalTypeId(p, ctxt, builder);
@@ -563,53 +571,7 @@ protected Object deserializeWithUnwrapped(JsonParser p, DeserializationContext c
563571
}
564572
}
565573
tokens.writeEndObject();
566-
_unwrappedPropertyHandler.processUnwrapped(p, ctxt, bean, tokens);
567-
return bean;
568-
}
569-
570-
@SuppressWarnings("resource")
571-
protected Object deserializeWithUnwrapped(JsonParser p,
572-
DeserializationContext ctxt, Object bean)
573-
throws IOException
574-
{
575-
JsonToken t = p.getCurrentToken();
576-
if (t == JsonToken.START_OBJECT) {
577-
t = p.nextToken();
578-
}
579-
TokenBuffer tokens = new TokenBuffer(p, ctxt);
580-
tokens.writeStartObject();
581-
final Class<?> activeView = _needViewProcesing ? ctxt.getActiveView() : null;
582-
for (; t == JsonToken.FIELD_NAME; t = p.nextToken()) {
583-
String propName = p.getCurrentName();
584-
SettableBeanProperty prop = _beanProperties.find(propName);
585-
p.nextToken();
586-
if (prop != null) { // normal case
587-
if (activeView != null && !prop.visibleInView(activeView)) {
588-
p.skipChildren();
589-
continue;
590-
}
591-
try {
592-
bean = prop.deserializeSetAndReturn(p, ctxt, bean);
593-
} catch (Exception e) {
594-
wrapAndThrow(e, bean, propName, ctxt);
595-
}
596-
continue;
597-
}
598-
if (_ignorableProps != null && _ignorableProps.contains(propName)) {
599-
handleIgnoredProperty(p, ctxt, bean, propName);
600-
continue;
601-
}
602-
// but... others should be passed to unwrapped property deserializers
603-
tokens.writeFieldName(propName);
604-
tokens.copyCurrentStructure(p);
605-
// how about any setter? We'll get copies but...
606-
if (_anySetter != null) {
607-
_anySetter.deserializeAndSet(p, ctxt, bean, propName);
608-
}
609-
}
610-
tokens.writeEndObject();
611-
_unwrappedPropertyHandler.processUnwrapped(p, ctxt, bean, tokens);
612-
return bean;
574+
return _unwrappedPropertyHandler.processUnwrapped(p, ctxt, bean, tokens);
613575
}
614576

615577
@SuppressWarnings("resource")
@@ -622,6 +584,7 @@ protected Object deserializeUsingPropertyBasedWithUnwrapped(JsonParser p,
622584

623585
TokenBuffer tokens = new TokenBuffer(p, ctxt);
624586
tokens.writeStartObject();
587+
Object builder = null;
625588

626589
JsonToken t = p.getCurrentToken();
627590
for (; t == JsonToken.FIELD_NAME; t = p.nextToken()) {
@@ -630,38 +593,20 @@ protected Object deserializeUsingPropertyBasedWithUnwrapped(JsonParser p,
630593
// creator property?
631594
SettableBeanProperty creatorProp = creator.findCreatorProperty(propName);
632595
if (creatorProp != null) {
633-
// 27-Mar-2017, tatu: As per [databind#1573], can not short-circuit
634-
// here because assignments are to be done via Builder, and
635-
// not value object.
636-
buffer.assignParameter(creatorProp, creatorProp.deserialize(p, ctxt));
637-
/*
638596
// Last creator property to set?
639597
if (buffer.assignParameter(creatorProp, creatorProp.deserialize(p, ctxt))) {
640598
t = p.nextToken(); // to move to following FIELD_NAME/END_OBJECT
641-
Object bean;
642599
try {
643-
bean = creator.build(ctxt, buffer);
600+
builder = creator.build(ctxt, buffer);
644601
} catch (Exception e) {
645602
wrapAndThrow(e, _beanType.getRawClass(), propName, ctxt);
646603
continue; // never gets here
647604
}
648-
// if so, need to copy all remaining tokens into buffer
649-
while (t == JsonToken.FIELD_NAME) {
650-
p.nextToken(); // to skip name
651-
tokens.copyCurrentStructure(p);
652-
t = p.nextToken();
653-
}
654-
tokens.writeEndObject();
655-
if (bean.getClass() != _beanType.getRawClass()) {
656-
// !!! 08-Jul-2011, tatu: Could probably support; but for now
657-
// it's too complicated, so bail out
658-
ctxt.reportInputMismatch(creatorProp,
659-
"Can not create polymorphic instances with unwrapped values");
660-
return null;
605+
if (builder.getClass() != _beanType.getRawClass()) {
606+
return handlePolymorphic(p, ctxt, builder, tokens);
661607
}
662-
return _unwrappedPropertyHandler.processUnwrapped(p, ctxt, bean, tokens);
608+
return deserializeWithUnwrapped(p, ctxt, builder, tokens);
663609
}
664-
*/
665610
continue;
666611
}
667612
// Object Id property?
@@ -685,15 +630,52 @@ protected Object deserializeUsingPropertyBasedWithUnwrapped(JsonParser p,
685630
buffer.bufferAnyProperty(_anySetter, propName, _anySetter.deserialize(p, ctxt));
686631
}
687632
}
688-
689633
// We hit END_OBJECT, so:
690-
Object bean;
691-
try {
692-
bean = creator.build(ctxt, buffer);
693-
} catch (Exception e) {
694-
return wrapInstantiationProblem(e, ctxt);
634+
if (builder == null) {
635+
try {
636+
builder = creator.build(ctxt, buffer);
637+
} catch (Exception e) {
638+
return wrapInstantiationProblem(e, ctxt);
639+
}
695640
}
696-
return _unwrappedPropertyHandler.processUnwrapped(p, ctxt, bean, tokens);
641+
return _unwrappedPropertyHandler.processUnwrapped(p, ctxt, builder, tokens);
642+
}
643+
644+
protected Object deserializeWithUnwrapped(JsonParser p,
645+
DeserializationContext ctxt, Object builder, TokenBuffer tokens)
646+
throws IOException
647+
{
648+
final Class<?> activeView = _needViewProcesing ? ctxt.getActiveView() : null;
649+
for (JsonToken t = p.getCurrentToken(); t == JsonToken.FIELD_NAME; t = p.nextToken()) {
650+
String propName = p.getCurrentName();
651+
SettableBeanProperty prop = _beanProperties.find(propName);
652+
p.nextToken();
653+
if (prop != null) { // normal case
654+
if (activeView != null && !prop.visibleInView(activeView)) {
655+
p.skipChildren();
656+
continue;
657+
}
658+
try {
659+
builder = prop.deserializeSetAndReturn(p, ctxt, builder);
660+
} catch (Exception e) {
661+
wrapAndThrow(e, builder, propName, ctxt);
662+
}
663+
continue;
664+
}
665+
if (_ignorableProps != null && _ignorableProps.contains(propName)) {
666+
handleIgnoredProperty(p, ctxt, builder, propName);
667+
continue;
668+
}
669+
// but... others should be passed to unwrapped property deserializers
670+
tokens.writeFieldName(propName);
671+
tokens.copyCurrentStructure(p);
672+
// how about any setter? We'll get copies but...
673+
if (_anySetter != null) {
674+
_anySetter.deserializeAndSet(p, ctxt, builder, propName);
675+
}
676+
}
677+
tokens.writeEndObject();
678+
return _unwrappedPropertyHandler.processUnwrapped(p, ctxt, builder, tokens);
697679
}
698680

699681
/*
@@ -724,7 +706,7 @@ protected Object deserializeWithExternalTypeId(JsonParser p,
724706
t = p.nextToken();
725707
SettableBeanProperty prop = _beanProperties.find(propName);
726708
if (prop != null) { // normal case
727-
// [JACKSON-831]: may have property AND be used as external type id:
709+
// May have property AND be used as external type id:
728710
if (t.isScalarValue()) {
729711
ext.handleTypePropertyValue(p, ctxt, propName, bean);
730712
}

0 commit comments

Comments
 (0)