package com.fasterxml.jackson.dataformat.javaprop.io;
import com.fasterxml.jackson.core.*;
//import com.fasterxml.jackson.core.json.JsonWriteContext;
public class JPropWriteContext
extends JsonStreamContext
{
Parent context for this context; null for root context.
/**
* Parent context for this context; null for root context.
*/
protected final JPropWriteContext _parent;
/*
/**********************************************************
/* Simple instance reuse slots; speed up things
/* a bit (10-15%) for docs with lots of small
/* arrays/objects
/**********************************************************
*/
protected JPropWriteContext _child = null;
/*
/**********************************************************
/* Location/state information (minus source reference)
/**********************************************************
*/
Value that is being serialized and caused this context to be created;
typically a POJO or container type.
/**
* Value that is being serialized and caused this context to be created;
* typically a POJO or container type.
*/
protected Object _currentValue;
Marker used to indicate that we just received a name, and
now expect a value
/**
* Marker used to indicate that we just received a name, and
* now expect a value
*/
protected boolean _gotName;
Name of the field of which value is to be parsed; only
used for OBJECT contexts
/**
* Name of the field of which value is to be parsed; only
* used for OBJECT contexts
*/
protected String _currentName;
protected int _basePathLength;
/*
/**********************************************************
/* Life-cycle
/**********************************************************
*/
protected JPropWriteContext(int type, JPropWriteContext parent,
int basePathLength)
{
super();
_type = type;
_parent = parent;
_basePathLength = basePathLength;
_index = -1;
}
private void reset(int type, int basePathLength) {
_type = type;
_basePathLength = basePathLength;
_currentValue = null;
_index = -1;
}
// // // Factory methods
public static JPropWriteContext createRootContext() {
return new JPropWriteContext(TYPE_ROOT, null, 0);
}
public static JPropWriteContext createRootContext(int basePathLength) {
return new JPropWriteContext(TYPE_ROOT, null, basePathLength);
}
public JPropWriteContext createChildArrayContext(int basePathLength) {
JPropWriteContext ctxt = _child;
if (ctxt == null) {
_child = ctxt = new JPropWriteContext(TYPE_ARRAY, this, basePathLength);
return ctxt;
}
ctxt.reset(TYPE_ARRAY, basePathLength);
return ctxt;
}
public JPropWriteContext createChildObjectContext(int basePathLength) {
JPropWriteContext ctxt = _child;
if (ctxt == null) {
_child = ctxt = new JPropWriteContext(TYPE_OBJECT, this, basePathLength);
return ctxt;
}
ctxt.reset(TYPE_OBJECT, basePathLength);
return ctxt;
}
/*
/**********************************************************
/* State changes
/**********************************************************
*/
public boolean writeFieldName(String name) throws JsonProcessingException {
if (_gotName) {
return false;
}
_gotName = true;
_currentName = name;
return true;
}
public boolean writeValue() {
// Most likely, object:
if (_type == TYPE_OBJECT) {
if (!_gotName) {
return false;
}
_gotName = false;
}
// Array fine, and must allow root context for Object values too so...
++_index;
return true;
}
public void truncatePath(StringBuilder sb) {
int len = sb.length();
if (len != _basePathLength) {
if (len < _basePathLength) { // sanity check
throw new IllegalStateException(String.format
("Internal error: base path length %d, buffered %d, trying to truncate",
_basePathLength, len));
}
sb.setLength(_basePathLength);
}
}
/*
/**********************************************************
/* Simple accessors, mutators
/**********************************************************
*/
@Override
public final JPropWriteContext getParent() { return _parent; }
@Override
public String getCurrentName() {
return _currentName;
}
@Override
public Object getCurrentValue() {
return _currentValue;
}
@Override
public void setCurrentValue(Object v) {
_currentValue = v;
}
public StringBuilder appendDesc(StringBuilder sb) {
if (_parent != null) {
sb = _parent.appendDesc(sb);
sb.append('/');
}
switch (_type) {
case TYPE_OBJECT:
if (_currentName != null) {
sb.append(_currentName);
}
break;
case TYPE_ARRAY:
sb.append(getCurrentIndex());
break;
case TYPE_ROOT:
}
return sb;
}
// // // Overridden standard methods
Overridden to provide developer JsonPointer representation
of the context.
/**
* Overridden to provide developer JsonPointer representation
* of the context.
*/
@Override
public final String toString() {
return appendDesc(new StringBuilder(64)).toString();
}
}