Example usage for com.fasterxml.jackson.databind.util TokenBuffer copyCurrentStructure

List of usage examples for com.fasterxml.jackson.databind.util TokenBuffer copyCurrentStructure

Introduction

In this page you can find the example usage for com.fasterxml.jackson.databind.util TokenBuffer copyCurrentStructure.

Prototype

public void copyCurrentStructure(JsonParser paramJsonParser)

Source Link

Usage

From source file:org.immutables.gson.stream.JsonParserReader.java

/**
 * Reads current value including objects and array as effiecient token buffer.
 * Use of Jackson's own mechanisms is important to preserve custom elements
 * such as special embedded objects in BSON or other data formats.
 * @return {@link TokenBuffer}//from   www  .j  av a2 s . co  m
 * @throws IOException if error occured
 */
public final TokenBuffer nextTokenBuffer() throws IOException {
    TokenBuffer buffer = new TokenBuffer(parser);
    // if token is consumed, but undelying parser is still sitting on this token, we move forward
    requirePeek();
    buffer.copyCurrentStructure(parser);
    // when we will return to reading from reader, state will be cleared and nextToken after
    clearPeek();
    return buffer;
}

From source file:com.basistech.rosette.dm.jackson.ListAttributeDeserializer.java

@Override
@SuppressWarnings("unchecked")
public ListAttribute deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
    if (jp.getCurrentToken() == JsonToken.START_OBJECT) { // this is what we expect.
        // we advance to be in the same place the 'else' will be -- the first FIELD_NAME.
        jp.nextToken();/*from w w w .j ava2s  .  c  o m*/
    } else {
        /* In a full AnnotatedText, which is already doing some polymorphism shuffling, we end up here. */
        /* We find a FIELD_NAME for the first field of the object */
        if (jp.getCurrentToken() != JsonToken.FIELD_NAME) {
            throw ctxt.wrongTokenException(jp, JsonToken.START_OBJECT,
                    "ListAttributeDeserializer called not at or FIELD_NAME of first field");
        }
        /* We are at the field name, ready for the loop. */
    }
    TokenBuffer tb = null;
    for (JsonToken t = jp.getCurrentToken(); t == JsonToken.FIELD_NAME; t = jp.nextToken()) {
        String name = jp.getCurrentName();
        if ("itemType".equals(name)) { // gotcha!
            return deserialize(jp, ctxt, tb);
        }
        if (tb == null) {
            tb = new TokenBuffer(null, false);
        }
        tb.copyCurrentStructure(jp);
    }
    throw ctxt.mappingException("No itemType provided in a list");
}

From source file:org.emfjson.jackson.streaming.StreamReader.java

protected EObject parseObject(JsonParser parser, EReference containment, EObject owner, EClass currentClass)
        throws IOException {

    EObject current = null;//w w  w .  j av a2 s  . c o  m

    if (currentClass != null) {
        current = EcoreUtil.create(currentClass);
    }

    final TokenBuffer buffer = new TokenBuffer(parser);

    while (parser.nextToken() != JsonToken.END_OBJECT) {
        final String fieldName = parser.getCurrentName();

        switch (fieldName) {
        case EJS_TYPE_KEYWORD:
            current = create(parser.nextTextValue());
            break;
        case EJS_UUID_ANNOTATION:
            if (resource instanceof UuidResource) {
                if (current != null) {
                    ((UuidResource) resource).setID(current, parser.nextTextValue());
                }
            }
            break;
        default:
            if (current == null && containment != null) {
                final EClass defaultType = containment.getEReferenceType();

                if (!defaultType.isAbstract()) {
                    current = EcoreUtil.create(defaultType);
                }
            }

            if (current != null) {
                readFeature(parser, current, fieldName);
            } else {
                buffer.copyCurrentStructure(parser);
            }
            break;
        }
    }

    buffer.close();

    if (current != null) {
        final JsonParser bufferedParser = buffer.asParser();

        while (bufferedParser.nextToken() != null) {
            readFeature(bufferedParser, current, bufferedParser.getCurrentName());
        }

        bufferedParser.close();
    }

    if (current != null && containment != null && owner != null) {
        EObjects.setOrAdd(owner, containment, current);
    }

    return current;
}

From source file:org.emfjson.jackson.databind.deser.EObjectDeserializer.java

@Override
public EObject deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
    EMFContext.prepare(ctxt);/* w  ww . jav  a  2s .  c o  m*/

    final EClass defaultType = findRoot(ctxt);
    final Resource resource = getResource(ctxt);
    final EStructuralFeature feature = EMFContext.getFeature(ctxt);

    EObject current = null;
    EObjectPropertyMap propertyMap;

    if (feature == null && defaultType != null) {
        propertyMap = builder.construct(defaultType);
    } else if (feature instanceof EReference) {
        propertyMap = builder.construct(((EReference) feature).getEReferenceType());
    } else {
        propertyMap = builder.constructDefault();
    }

    TokenBuffer buffer = null;
    //
    //      System.out.println("context name " + jp.getParsingContext().getCurrentName());
    //      System.out.println("current " + jp.getCurrentValue());
    //      if (jp.getParsingContext().getParent() != null) {
    //         System.out.println("context parent name " + jp.getParsingContext().getParent().getCurrentName());
    //      }

    while (jp.nextToken() != JsonToken.END_OBJECT) {
        final String field = jp.getCurrentName();
        final EObjectProperty property = propertyMap.findProperty(field);

        if (property instanceof EObjectTypeProperty) {
            current = property.deserialize(jp, ctxt);
            if (current != null) {
                propertyMap = builder.construct(current.eClass());
            }
        } else if (property != null && current != null) {
            property.deserializeAndSet(jp, current, ctxt, resource);
        } else if (property == null && current != null) {
            handleUnknownProperty(jp, resource, ctxt);
        } else {
            if (buffer == null) {
                buffer = new TokenBuffer(jp);
            }
            buffer.copyCurrentStructure(jp);
        }
    }

    return buffer == null ? current : postDeserialize(buffer, current, defaultType, ctxt);
}

From source file:com.github.shyiko.jackson.module.advice.AdvisedBeanDeserializer.java

@SuppressWarnings("resource")
protected Object deserializeUsingPropertyBasedWithUnwrapped(JsonParser jp, DeserializationContext ctxt)
        throws IOException {
    final PropertyBasedCreator creator = _propertyBasedCreator;
    PropertyValueBuffer buffer = creator.startBuilding(jp, ctxt, _objectIdReader);

    TokenBuffer tokens = new TokenBuffer(jp);
    tokens.writeStartObject();//from  w  w w .j  a  v  a 2 s.c o  m

    JsonToken t = jp.getCurrentToken();
    for (; t == JsonToken.FIELD_NAME; t = jp.nextToken()) {
        String propName = jp.getCurrentName();
        jp.nextToken(); // to point to value
        // creator property?
        SettableBeanProperty creatorProp = creator.findCreatorProperty(propName);
        if (creatorProp != null) {
            // Last creator property to set?
            Object value = creatorProp.deserialize(jp, ctxt);
            if (buffer.assignParameter(creatorProp.getCreatorIndex(), value)) {
                t = jp.nextToken(); // to move to following FIELD_NAME/END_OBJECT
                Object bean;
                try {
                    bean = creator.build(ctxt, buffer);
                } catch (Exception e) {
                    wrapAndThrow(e, _beanType.getRawClass(), propName, ctxt);
                    continue; // never gets here
                }
                // if so, need to copy all remaining tokens into buffer
                while (t == JsonToken.FIELD_NAME) {
                    jp.nextToken(); // to skip name
                    tokens.copyCurrentStructure(jp);
                    t = jp.nextToken();
                }
                tokens.writeEndObject();
                if (bean.getClass() != _beanType.getRawClass()) {
                    // !!! 08-Jul-2011, tatu: Could probably support; but for now
                    //   it's too complicated, so bail out
                    tokens.close();
                    throw ctxt.mappingException("Can not create polymorphic instances with unwrapped values");
                }
                return _unwrappedPropertyHandler.processUnwrapped(jp, ctxt, bean, tokens);
            }
            continue;
        }
        // Object Id property?
        if (buffer.readIdProperty(propName)) {
            continue;
        }

        // regular property? needs buffering
        SettableBeanProperty prop = _beanProperties.find(propName);
        if (prop != null) {
            buffer.bufferProperty(prop, prop.deserialize(jp, ctxt));
            continue;
        }
        /* As per [JACKSON-313], things marked as ignorable should not be
         * passed to any setter
         */
        if (_ignorableProps != null && _ignorableProps.contains(propName)) {
            handleIgnoredProperty(jp, ctxt, handledType(), propName);
            continue;
        }
        tokens.writeFieldName(propName);
        tokens.copyCurrentStructure(jp);
        // "any property"?
        if (_anySetter != null) {
            buffer.bufferAnyProperty(_anySetter, propName, _anySetter.deserialize(jp, ctxt));
        }
    }

    // We hit END_OBJECT, so:
    Object bean;
    try {
        bean = creator.build(ctxt, buffer);
    } catch (Exception e) {
        wrapInstantiationProblem(e, ctxt);
        return null; // never gets here
    }
    return _unwrappedPropertyHandler.processUnwrapped(jp, ctxt, bean, tokens);
}

From source file:com.github.shyiko.jackson.module.advice.AdvisedBeanDeserializer.java

@SuppressWarnings("resource")
protected Object deserializeWithUnwrapped(JsonParser jp, DeserializationContext ctxt, Object bean)
        throws IOException {
    JsonToken t = jp.getCurrentToken();//from www  . j ava 2  s .c om
    if (t == JsonToken.START_OBJECT) {
        t = jp.nextToken();
    }
    TokenBuffer tokens = new TokenBuffer(jp);
    tokens.writeStartObject();
    final Class<?> activeView = _needViewProcesing ? ctxt.getActiveView() : null;
    beanDeserializerAdvice.before(bean, jp, ctxt);
    for (; t == JsonToken.FIELD_NAME; t = jp.nextToken()) {
        String propName = jp.getCurrentName();

        if (beanDeserializerAdvice.intercept(bean, propName, jp, ctxt)) {
            continue;
        }

        SettableBeanProperty prop = _beanProperties.find(propName);
        jp.nextToken();
        if (prop != null) { // normal case
            if (activeView != null && !prop.visibleInView(activeView)) {
                jp.skipChildren();
                continue;
            }
            try {
                prop.deserializeAndSet(jp, ctxt, bean);
            } catch (Exception e) {
                wrapAndThrow(e, bean, propName, ctxt);
            }
            continue;
        }
        if (_ignorableProps != null && _ignorableProps.contains(propName)) {
            handleIgnoredProperty(jp, ctxt, bean, propName);
            continue;
        }
        // but... others should be passed to unwrapped property deserializers
        tokens.writeFieldName(propName);
        tokens.copyCurrentStructure(jp);
        // how about any setter? We'll get copies but...
        if (_anySetter != null) {
            _anySetter.deserializeAndSet(jp, ctxt, bean, propName);
        }
    }
    tokens.writeEndObject();
    _unwrappedPropertyHandler.processUnwrapped(jp, ctxt, bean, tokens);
    beanDeserializerAdvice.after(bean, jp, ctxt);
    return bean;
}

From source file:com.github.shyiko.jackson.module.advice.AdvisedBeanDeserializer.java

protected Object deserializeUsingPropertyBasedWithExternalTypeId(JsonParser jp, DeserializationContext ctxt)
        throws IOException {
    final ExternalTypeHandler ext = _externalTypeIdHandler.start();
    final PropertyBasedCreator creator = _propertyBasedCreator;
    PropertyValueBuffer buffer = creator.startBuilding(jp, ctxt, _objectIdReader);

    TokenBuffer tokens = new TokenBuffer(jp);
    tokens.writeStartObject();//ww  w. jav  a  2s .com

    JsonToken t = jp.getCurrentToken();
    for (; t == JsonToken.FIELD_NAME; t = jp.nextToken()) {
        String propName = jp.getCurrentName();
        jp.nextToken(); // to point to value
        // creator property?
        SettableBeanProperty creatorProp = creator.findCreatorProperty(propName);
        if (creatorProp != null) {
            // first: let's check to see if this might be part of value with external type id:
            if (!ext.handlePropertyValue(jp, ctxt, propName, buffer)) {
                // Last creator property to set?
                Object value = creatorProp.deserialize(jp, ctxt);
                if (buffer.assignParameter(creatorProp.getCreatorIndex(), value)) {
                    t = jp.nextToken(); // to move to following FIELD_NAME/END_OBJECT
                    Object bean;
                    try {
                        bean = creator.build(ctxt, buffer);
                    } catch (Exception e) {
                        wrapAndThrow(e, _beanType.getRawClass(), propName, ctxt);
                        continue; // never gets here
                    }
                    // if so, need to copy all remaining tokens into buffer
                    while (t == JsonToken.FIELD_NAME) {
                        jp.nextToken(); // to skip name
                        tokens.copyCurrentStructure(jp);
                        t = jp.nextToken();
                    }
                    if (bean.getClass() != _beanType.getRawClass()) {
                        // !!! 08-Jul-2011, tatu: Could probably support; but for now
                        //   it's too complicated, so bail out
                        throw ctxt
                                .mappingException("Can not create polymorphic instances with unwrapped values");
                    }
                    return ext.complete(jp, ctxt, bean);
                }
            }
            continue;
        }
        // Object Id property?
        if (buffer.readIdProperty(propName)) {
            continue;
        }

        // regular property? needs buffering
        SettableBeanProperty prop = _beanProperties.find(propName);
        if (prop != null) {
            buffer.bufferProperty(prop, prop.deserialize(jp, ctxt));
            continue;
        }
        // external type id (or property that depends on it)?
        if (ext.handlePropertyValue(jp, ctxt, propName, null)) {
            continue;
        }
        /* As per [JACKSON-313], things marked as ignorable should not be
         * passed to any setter
         */
        if (_ignorableProps != null && _ignorableProps.contains(propName)) {
            handleIgnoredProperty(jp, ctxt, handledType(), propName);
            continue;
        }
        // "any property"?
        if (_anySetter != null) {
            buffer.bufferAnyProperty(_anySetter, propName, _anySetter.deserialize(jp, ctxt));
        }
    }

    // We hit END_OBJECT; resolve the pieces:
    try {
        return ext.complete(jp, ctxt, buffer, creator);
    } catch (Exception e) {
        wrapInstantiationProblem(e, ctxt);
        return null; // never gets here
    }
}

From source file:com.github.shyiko.jackson.module.advice.AdvisedBeanDeserializer.java

/**
 * Method called when there are declared "unwrapped" properties
 * which need special handling//from ww  w.  j  a v  a  2s  . co  m
 */
@SuppressWarnings("resource")
protected Object deserializeWithUnwrapped(JsonParser jp, DeserializationContext ctxt) throws IOException {
    if (_delegateDeserializer != null) {
        return _valueInstantiator.createUsingDelegate(ctxt, _delegateDeserializer.deserialize(jp, ctxt));
    }
    if (_propertyBasedCreator != null) {
        return deserializeUsingPropertyBasedWithUnwrapped(jp, ctxt);
    }
    TokenBuffer tokens = new TokenBuffer(jp);
    tokens.writeStartObject();
    final Object bean = _valueInstantiator.createUsingDefault(ctxt);

    if (_injectables != null) {
        injectValues(ctxt, bean);
    }
    final Class<?> activeView = _needViewProcesing ? ctxt.getActiveView() : null;
    beanDeserializerAdvice.before(bean, jp, ctxt);
    for (; jp.getCurrentToken() != JsonToken.END_OBJECT; jp.nextToken()) {
        String propName = jp.getCurrentName();
        jp.nextToken();

        if (beanDeserializerAdvice.intercept(bean, propName, jp, ctxt)) {
            continue;
        }

        SettableBeanProperty prop = _beanProperties.find(propName);
        if (prop != null) { // normal case
            if (activeView != null && !prop.visibleInView(activeView)) {
                jp.skipChildren();
                continue;
            }
            try {
                prop.deserializeAndSet(jp, ctxt, bean);
            } catch (Exception e) {
                wrapAndThrow(e, bean, propName, ctxt);
            }
            continue;
        }
        // ignorable things should be ignored
        if (_ignorableProps != null && _ignorableProps.contains(propName)) {
            handleIgnoredProperty(jp, ctxt, bean, propName);
            continue;
        }
        // but... others should be passed to unwrapped property deserializers
        tokens.writeFieldName(propName);
        tokens.copyCurrentStructure(jp);
        // how about any setter? We'll get copies but...
        if (_anySetter != null) {
            try {
                _anySetter.deserializeAndSet(jp, ctxt, bean, propName);
            } catch (Exception e) {
                wrapAndThrow(e, bean, propName, ctxt);
            }
            continue;
        }
    }
    tokens.writeEndObject();
    _unwrappedPropertyHandler.processUnwrapped(jp, ctxt, bean, tokens);
    beanDeserializerAdvice.after(bean, jp, ctxt);
    return bean;
}

From source file:com.github.shyiko.jackson.module.advice.AdvisedBeanDeserializer.java

/**
 * Method called to deserialize bean using "property-based creator":
 * this means that a non-default constructor or factory method is
 * called, and then possibly other setters. The trick is that
 * values for creator method need to be buffered, first; and
 * due to non-guaranteed ordering possibly some other properties
 * as well./* www . j  av a  2  s.  c  o  m*/
 */
@Override
@SuppressWarnings("resource")
protected Object _deserializeUsingPropertyBased(final JsonParser jp, final DeserializationContext ctxt)
        throws IOException {
    final PropertyBasedCreator creator = _propertyBasedCreator;
    PropertyValueBuffer buffer = creator.startBuilding(jp, ctxt, _objectIdReader);

    // 04-Jan-2010, tatu: May need to collect unknown properties for polymorphic cases
    TokenBuffer unknown = null;

    JsonToken t = jp.getCurrentToken();
    for (; t == JsonToken.FIELD_NAME; t = jp.nextToken()) {
        String propName = jp.getCurrentName();
        jp.nextToken(); // to point to value
        // creator property?
        SettableBeanProperty creatorProp = creator.findCreatorProperty(propName);
        if (creatorProp != null) {
            // Last creator property to set?
            Object value = creatorProp.deserialize(jp, ctxt);
            if (buffer.assignParameter(creatorProp.getCreatorIndex(), value)) {
                jp.nextToken(); // to move to following FIELD_NAME/END_OBJECT
                Object bean;
                try {
                    bean = creator.build(ctxt, buffer);
                } catch (Exception e) {
                    wrapAndThrow(e, _beanType.getRawClass(), propName, ctxt);
                    bean = null; // never gets here
                }
                //  polymorphic?
                if (bean.getClass() != _beanType.getRawClass()) {
                    return handlePolymorphic(jp, ctxt, bean, unknown);
                }
                if (unknown != null) { // nope, just extra unknown stuff...
                    bean = handleUnknownProperties(ctxt, bean, unknown);
                }
                // or just clean?
                return deserialize(jp, ctxt, bean);
            }
            continue;
        }
        // Object Id property?
        if (buffer.readIdProperty(propName)) {
            continue;
        }

        // regular property? needs buffering
        SettableBeanProperty prop = _beanProperties.find(propName);
        if (prop != null) {
            buffer.bufferProperty(prop, prop.deserialize(jp, ctxt));
            continue;
        }
        // As per [JACKSON-313], things marked as ignorable should not be
        // passed to any setter
        if (_ignorableProps != null && _ignorableProps.contains(propName)) {
            handleIgnoredProperty(jp, ctxt, handledType(), propName);
            continue;
        }
        // "any property"?
        if (_anySetter != null) {
            buffer.bufferAnyProperty(_anySetter, propName, _anySetter.deserialize(jp, ctxt));
            continue;
        }
        // Ok then, let's collect the whole field; name and value
        if (unknown == null) {
            unknown = new TokenBuffer(jp);
        }
        unknown.writeFieldName(propName);
        unknown.copyCurrentStructure(jp);
    }

    // We hit END_OBJECT, so:
    Object bean;
    try {
        bean = creator.build(ctxt, buffer);
    } catch (Exception e) {
        wrapInstantiationProblem(e, ctxt);
        bean = null; // never gets here
    }
    if (unknown != null) {
        // polymorphic?
        if (bean.getClass() != _beanType.getRawClass()) {
            return handlePolymorphic(null, ctxt, bean, unknown);
        }
        // no, just some extra unknown properties
        return handleUnknownProperties(ctxt, bean, unknown);
    }
    return bean;
}