package org.bson;
import org.bson.types.Decimal128;
import org.bson.types.ObjectId;
import static org.bson.io.Bits.readLong;
class BSONCallbackAdapter extends AbstractBsonWriter {
private BSONCallback bsonCallback;
protected BSONCallbackAdapter(final BsonWriterSettings settings, final BSONCallback bsonCallback) {
super(settings);
this.bsonCallback = bsonCallback;
}
@Override
public void flush() {
}
@Override
public void doWriteStartDocument() {
BsonContextType contextType = getState() == State.SCOPE_DOCUMENT
? BsonContextType.SCOPE_DOCUMENT
: BsonContextType.DOCUMENT;
if (getContext() == null || contextType == BsonContextType.SCOPE_DOCUMENT) {
bsonCallback.objectStart();
} else {
bsonCallback.objectStart(getName());
}
setContext(new Context(getContext(), contextType));
}
@Override
protected void doWriteEndDocument() {
BsonContextType contextType = getContext().getContextType();
setContext(getContext().getParentContext());
bsonCallback.objectDone();
if (contextType == BsonContextType.SCOPE_DOCUMENT) {
Object scope = bsonCallback.get();
bsonCallback = getContext().callback;
bsonCallback.gotCodeWScope(getContext().name, getContext().code, scope);
}
}
@Override
public void doWriteStartArray() {
bsonCallback.arrayStart(getName());
setContext(new Context(getContext(), BsonContextType.ARRAY));
}
@Override
protected void doWriteEndArray() {
setContext(getContext().getParentContext());
bsonCallback.arrayDone();
}
@Override
protected void doWriteBinaryData(final BsonBinary value) {
if (value.getType() == BsonBinarySubType.UUID_LEGACY.getValue()) {
bsonCallback.gotUUID(getName(),
readLong(value.getData(), 0),
readLong(value.getData(), 8));
} else {
bsonCallback.gotBinary(getName(), value.getType(), value.getData());
}
}
@Override
public void doWriteBoolean(final boolean value) {
bsonCallback.gotBoolean(getName(), value);
setState(getNextState());
}
@Override
protected void doWriteDateTime(final long value) {
bsonCallback.gotDate(getName(), value);
}
@Override
protected void doWriteDBPointer(final BsonDbPointer value) {
bsonCallback.gotDBRef(getName(), value.getNamespace(), value.getId());
}
@Override
protected void doWriteDouble(final double value) {
bsonCallback.gotDouble(getName(), value);
}
@Override
protected void doWriteInt32(final int value) {
bsonCallback.gotInt(getName(), value);
}
@Override
protected void doWriteInt64(final long value) {
bsonCallback.gotLong(getName(), value);
}
@Override
protected void doWriteDecimal128(final Decimal128 value) {
bsonCallback.gotDecimal128(getName(), value);
}
@Override
protected void doWriteJavaScript(final String value) {
bsonCallback.gotCode(getName(), value);
}
@Override
protected void doWriteJavaScriptWithScope(final String value) {
getContext().callback = bsonCallback;
getContext().code = value;
getContext().name = getName();
this.bsonCallback = bsonCallback.createBSONCallback();
}
@Override
protected void doWriteMaxKey() {
bsonCallback.gotMaxKey(getName());
}
@Override
protected void doWriteMinKey() {
bsonCallback.gotMinKey(getName());
}
@Override
public void doWriteNull() {
bsonCallback.gotNull(getName());
}
@Override
public void doWriteObjectId(final ObjectId value) {
bsonCallback.gotObjectId(getName(), value);
}
@Override
public void doWriteRegularExpression(final BsonRegularExpression value) {
bsonCallback.gotRegex(getName(), value.getPattern(), value.getOptions());
}
@Override
public void doWriteString(final String value) {
bsonCallback.gotString(getName(), value);
}
@Override
public void doWriteSymbol(final String value) {
bsonCallback.gotSymbol(getName(), value);
}
@Override
public void doWriteTimestamp(final BsonTimestamp value) {
bsonCallback.gotTimestamp(getName(), value.getTime(), value.getInc());
}
@Override
public void doWriteUndefined() {
bsonCallback.gotUndefined(getName());
}
@Override
protected Context getContext() {
return (Context) super.getContext();
}
@Override
protected String getName() {
if (getContext().getContextType() == BsonContextType.ARRAY) {
return Integer.toString(getContext().index++);
} else {
return super.getName();
}
}
public class Context extends AbstractBsonWriter.Context {
private int index;
private BSONCallback callback;
private String code;
private String name;
Context(final Context parentContext, final BsonContextType contextType) {
super(parentContext, contextType);
}
@Override
public Context getParentContext() {
return (Context) super.getParentContext();
}
}
}