package com.eveningoutpost.dexdrip.Services; import java.io.IOException; import java.net.UnknownHostException; import android.util.Log; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.MongoClient; import com.mongodb.MongoException; import com.mongodb.MongoClientURI; import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.Set; public class MongoWrapper { MongoClient mongoClient_; String dbUriStr_; String dbName_; String collection_; String index_; String machineName_; private final static String TAG = WixelReader.class.getName(); public MongoWrapper(String dbUriStr, String collection, String index, String machineName) { dbUriStr_ = dbUriStr; // dbName is the last part of the string starting with /dbname dbName_ = dbUriStr.substring(dbUriStr.lastIndexOf('/') + 1); collection_ = collection; index_ = index; machineName_ = machineName; } // Unfortunately, this also throws other exceptions that are not documetned... public DBCollection openMongoDb() throws UnknownHostException { MongoClientURI dbUri = new MongoClientURI(dbUriStr_); //?? thros mongoClient_ = new MongoClient(dbUri); DB db = mongoClient_.getDB( dbName_ ); DBCollection coll = db.getCollection(collection_); coll.createIndex(new BasicDBObject(index_, 1)); // create index on "i", ascending return coll; } public void closeMongoDb() { if(mongoClient_ != null) { mongoClient_.close(); } } public boolean WriteDebugDataToMongo(String message) { String complete = machineName_ + " " + new Date().toLocaleString() + " " + message; BasicDBObject doc = new BasicDBObject("DebugMessage", complete); return WriteToMongo(doc); } public boolean WriteToMongo(TransmitterRawData trd) { BasicDBObject bdbo = trd.toDbObj(machineName_ + " " + new Date(trd.CaptureDateTime).toLocaleString()); return WriteToMongo(bdbo); } public boolean WriteToMongo(BasicDBObject bdbo) { DBCollection coll; try { coll = openMongoDb(); coll.insert(bdbo); } catch (UnknownHostException e) { Log.e(TAG, "WriteToMongo cought UnknownHostException! ",e); return false; } catch (MongoException e) { Log.e(TAG, "WriteToMongo cought MongoException! ", e); return false; } catch (Exception e) { Log.e(TAG, "WriteToMongo cought Exception! ", e); closeMongoDb(); return false; } finally { closeMongoDb(); } return true; } // records will be marked by their timestamp public List<TransmitterRawData> ReadFromMongo(int numberOfRecords) { System.out.println( "Starting to read from mongodb"); List<TransmitterRawData> trd_list = new LinkedList<TransmitterRawData>(); DBCollection coll; TransmitterRawData lastTrd = null; try { coll = openMongoDb(); BasicDBObject query = new BasicDBObject("RawValue", new BasicDBObject("$exists", true)); DBCursor cursor = coll.find(query); cursor.sort(new BasicDBObject("CaptureDateTime", -1)); try { while(cursor.hasNext() && trd_list.size() < numberOfRecords) { //System.out.println(cursor.next()); Log.e(TAG, "Read an object from mongodb"); TransmitterRawData trd = new TransmitterRawData((BasicDBObject)cursor.next()); // Do our best to fix the relative time... trd.RelativeTime = new Date().getTime() - trd.CaptureDateTime; // since we are reading it from the db, it was uploaded... trd.Uploaded = 1; if(lastTrd == null) { trd_list.add(0,trd); lastTrd = trd; System.out.println( trd.toTableString()); } else if(!WixelReader.almostEquals(lastTrd, trd)) { lastTrd = trd; trd_list.add(0,trd); System.out.println( trd.toTableString()); } } } finally { cursor.close(); } } catch (UnknownHostException e) { Log.e(TAG, "ReadFromMongo: cought UnknownHostException! ", e); return null; } catch (MongoException e) { Log.e(TAG, "ReadFromMongo: cought MongoException! " , e); return trd_list; } catch (Exception e) { Log.e(TAG, "ReadFromMongo: cought Exception! " , e); closeMongoDb(); return null; }finally { closeMongoDb(); } return trd_list; } }