// BasicBSONCallback.java
package org.bson;
import java.io.*;
import java.util.*;
import java.util.regex.*;
import org.bson.types.*;
public class BasicBSONCallback implements BSONCallback {
public BasicBSONCallback(){
reset();
}
public BSONObject create(){
return new BasicBSONObject();
}
public BSONObject create( boolean array , List<String> path ){
if ( array )
return new BasicBSONList();
return new BasicBSONObject();
}
public void objectStart(){
if ( _stack.size() > 0 ) {
throw new IllegalStateException( "something is wrong" );
}
objectStart(false);
}
public void objectStart(boolean array){
_root = create(array, null);
_stack.add( (BSONObject)_root );
}
public void objectStart(String name){
objectStart( false , name );
}
public void objectStart(boolean array, String name){
_nameStack.addLast( name );
BSONObject o = create( array , _nameStack );
_stack.getLast().put( name , o);
_stack.addLast( o );
}
public Object objectDone(){
BSONObject o =_stack.removeLast();
if ( _nameStack.size() > 0 )
_nameStack.removeLast();
else if ( _stack.size() > 0 ) {
throw new IllegalStateException( "something is wrong" );
}
return (BSONObject)BSON.applyDecodingHooks(o);
}
public void arrayStart(){
objectStart( true );
}
public void arrayStart(String name){
objectStart( true , name );
}
public Object arrayDone(){
return objectDone();
}
public void gotNull( String name ){
cur().put( name , null );
}
public void gotUndefined( String name ){
}
public void gotMinKey( String name ){
cur().put( name , "MinKey" );
}
public void gotMaxKey( String name ){
cur().put( name , "MaxKey" );
}
public void gotBoolean( String name , boolean v ){
_put( name , v );
}
public void gotDouble( String name , double v ){
_put( name , v );
}
public void gotInt( String name , int v ){
_put( name , v );
}
public void gotLong( String name , long v ){
_put( name , v );
}
public void gotDate( String name , long millis ){
_put( name , new Date( millis ) );
}
public void gotRegex( String name , String pattern , String flags ){
_put( name , Pattern.compile( pattern , BSON.regexFlags( flags ) ) );
}
public void gotString( String name , String v ){
_put( name , v );
}
public void gotSymbol( String name , String v ){
_put( name , v );
}
public void gotTimestamp( String name , int time , int inc ){
_put( name , new BSONTimestamp( time , inc ) );
}
public void gotObjectId( String name , ObjectId id ){
_put( name , id );
}
public void gotCodeWScope(String name,CodeWScope object){
_put( name , object );
}
public void gotDBRef( String name , String ns , ObjectId id ){
_put( name , new BasicBSONObject( "$ns" , ns ).append( "$id" , id ) );
}
public void gotBinaryArray( String name , byte[] b ){
_put( name , b );
}
public void gotBinary( String name , byte type , byte[] data ){
_put( name , new Binary( type , data ) );
}
protected void _put( String name , Object o ){
cur().put( name , BSON.applyDecodingHooks( o ) );
}
public BSONObject cur(){
return _stack.getLast();
}
public Object get(){
return _root;
}
protected void setRoot(Object o) {
_root = o;
}
protected boolean isStackEmpty() {
return _stack.size() < 1;
}
public void reset(){
_root = null;
_stack.clear();
_nameStack.clear();
}
private Object _root;
private final LinkedList<BSONObject> _stack = new LinkedList<BSONObject>();
private final LinkedList<String> _nameStack = new LinkedList<String>();
}