// JSONCallback.java /** * Copyright (C) 2008 10gen Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.mongodb.util; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.GregorianCalendar; import java.util.SimpleTimeZone; import java.util.UUID; import java.util.regex.Pattern; import org.bson.BSON; import org.bson.BSONObject; import org.bson.BasicBSONCallback; import org.bson.types.BSONTimestamp; import org.bson.types.Code; import org.bson.types.CodeWScope; import org.bson.types.MaxKey; import org.bson.types.MinKey; import org.bson.types.ObjectId; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mongodb.DBRef; public class JSONCallback extends BasicBSONCallback { @Override public BSONObject create(){ return new BasicDBObject(); } @Override protected BSONObject createList() { return new BasicDBList(); } public void objectStart(boolean array, String name){ _lastArray = array; super.objectStart( array , name ); } public Object objectDone(){ String name = curName(); Object o = super.objectDone(); BSONObject b = (BSONObject)o; // override the object if it's a special type if ( ! _lastArray ) { if ( b.containsField( "$oid" ) ) { o = new ObjectId((String)b.get("$oid")); if (!isStackEmpty()) { gotObjectId( name, (ObjectId)o); } else { setRoot(o); } } else if ( b.containsField( "$date" ) ) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); GregorianCalendar calendar = new GregorianCalendar(new SimpleTimeZone(0, "GMT")); format.setCalendar(calendar); String txtdate = (String) b.get("$date"); o = format.parse(txtdate, new ParsePosition(0)); if (o == null) { // try older format with no ms format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); format.setCalendar(calendar); o = format.parse(txtdate, new ParsePosition(0)); } if (!isStackEmpty()) { cur().put( name, o ); } else { setRoot(o); } } else if ( b.containsField( "$regex" ) ) { o = Pattern.compile( (String)b.get( "$regex" ), BSON.regexFlags( (String)b.get( "$options" )) ); if (!isStackEmpty()) { cur().put( name, o ); } else { setRoot(o); } } else if ( b.containsField( "$ts" ) ) { Long ts = ((Number)b.get("$ts")).longValue(); Long inc = ((Number)b.get("$inc")).longValue(); o = new BSONTimestamp(ts.intValue(), inc.intValue()); if (!isStackEmpty()) { cur().put( name, o ); } else { setRoot(o); } } else if ( b.containsField( "$code" ) ) { if (b.containsField("$scope")) { o = new CodeWScope((String)b.get("$code"), (DBObject)b.get("$scope")); } else { o = new Code((String)b.get("$code")); } if (!isStackEmpty()) { cur().put( name, o ); } else { setRoot(o); } } else if ( b.containsField( "$ref" ) ) { o = new DBRef(null, (String)b.get("$ref"), b.get("$id")); if (!isStackEmpty()) { cur().put( name, o ); } else { setRoot(o); } } else if ( b.containsField( "$minKey" ) ) { o = new MinKey(); if (!isStackEmpty()) { cur().put( name, o ); } else { setRoot(o); } } else if ( b.containsField( "$maxKey" ) ) { o = new MaxKey(); if (!isStackEmpty()) { cur().put( name, o ); } else { setRoot(o); } } else if ( b.containsField( "$uuid" ) ) { o = UUID.fromString((String)b.get("$uuid")); if (!isStackEmpty()) { cur().put( name, o ); } else { setRoot(o); } } } return o; } private boolean _lastArray = false; }