/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.livedata.server;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.MutableFudgeMsg;
import org.fudgemsg.mapping.FudgeDeserializer;
import org.fudgemsg.mapping.FudgeSerializer;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.opengamma.livedata.LiveDataSpecification;
import com.opengamma.livedata.LiveDataSpecificationFudgeBuilder;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.fudgemsg.OpenGammaFudgeContext;
import com.opengamma.util.mongo.MongoConnector;
/**
* Stores persistent subscriptions in a Mongo database.
*/
public class MongoDBPersistentSubscriptionManager extends AbstractPersistentSubscriptionManager {
/**
* The collection name.
*/
private static final String PERSISTENT_SUBSCRIPTION = "subscription";
/**
* The Mongo connector.
*/
private final MongoConnector _mongoConnector;
/**
* The Mongo collection.
*/
private final DBCollection _mongoCollection;
/**
* Creates an instance.
*
* @param server the live data server, not null
* @param mongoConnector the Mongo connector, not null
*/
public MongoDBPersistentSubscriptionManager(StandardLiveDataServer server, MongoConnector mongoConnector) {
super(server);
ArgumentChecker.notNull(mongoConnector, "mongoConnector");
_mongoConnector = mongoConnector;
_mongoCollection = _mongoConnector.getDBCollection(PERSISTENT_SUBSCRIPTION);
}
@Override
protected void readFromStorage() {
FudgeSerializer serializer = new FudgeSerializer(OpenGammaFudgeContext.getInstance());
FudgeDeserializer deserializer = new FudgeDeserializer(OpenGammaFudgeContext.getInstance());
DBCursor cursor = _mongoCollection.find();
while (cursor.hasNext()) {
DBObject mainObject = cursor.next();
DBObject fieldData = (DBObject) mainObject.get("fieldData");
MutableFudgeMsg msg = serializer.objectToFudgeMsg(fieldData);
LiveDataSpecification spec = LiveDataSpecificationFudgeBuilder.fromFudgeMsg(deserializer, msg);
addPersistentSubscription(new PersistentSubscription(spec));
}
}
@Override
public void saveToStorage(Set<PersistentSubscription> newState) {
clean();
FudgeSerializer serializer = new FudgeSerializer(OpenGammaFudgeContext.getInstance());
FudgeDeserializer deserializer = new FudgeDeserializer(OpenGammaFudgeContext.getInstance());
List<DBObject> objects = new ArrayList<DBObject>();
for (PersistentSubscription sub : newState) {
FudgeMsg msg = LiveDataSpecificationFudgeBuilder.toFudgeMsg(serializer, sub.getFullyQualifiedSpec());
DBObject fieldData = deserializer.fudgeMsgToObject(DBObject.class, msg);
BasicDBObject mainObject = new BasicDBObject();
mainObject.append("fieldData", fieldData);
objects.add(mainObject);
}
_mongoCollection.insert(objects);
}
void clean() {
_mongoCollection.drop();
}
}