//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.history.mongo; import org.apache.uima.fit.descriptor.ConfigurationParameter; import org.apache.uima.fit.descriptor.ExternalResource; import org.apache.uima.resource.ResourceInitializationException; import org.bson.Document; import com.mongodb.client.MongoCollection; import uk.gov.dstl.baleen.core.history.AbstractBaleenHistory; import uk.gov.dstl.baleen.core.history.DocumentHistory; import uk.gov.dstl.baleen.resources.SharedMongoResource; /** A history implementation which is backed by Mongo. * * Use history.mongoCollection to set the collection (defaults to history). * The Mongo database used if as per the global configuration. * * The specifics of implementation are discussed in @link MongoDocumentHistory. * * For implementors wishing for a different db structure they should override * MongoDocumentHistory, and then add configuration options here. (Example * would be to store an entity per Mongo document, rather than a document * per Mongo document). * * * @baleen.javadoc */ public class MongoHistory extends AbstractBaleenHistory { /** * Optional connection to Mongo * * @baleen.resource uk.gov.dstl.baleen.resources.SharedMongoResource */ public static final String KEY_MONGO = "mongo"; @ExternalResource(key = KEY_MONGO) private SharedMongoResource mongo; /** * The Mongo collection to write history to * * @baleen.config history */ public static final String PARAM_COLLECTION = "history.mongoCollection"; @ConfigurationParameter(name = PARAM_COLLECTION, defaultValue="history") private String collectionName; private MongoCollection<Document> collection; /** New instance, used for UIMA fit dependency injection. * */ public MongoHistory() { //Empty contructor, do nothing } /** New instance, used for testing without DI. * */ public MongoHistory(SharedMongoResource mongo) { this.mongo = mongo; } @Override public void afterResourcesInitialized() throws ResourceInitializationException { // Our initialisation needs to wait for Mongo to be initialised and then injected collection = mongo.getDB().getCollection(collectionName); collection.createIndex(new Document("docId", 1)); } @Override public DocumentHistory getHistory(String documentId) { return new MongoDocumentHistory(this, collection, documentId); } @Override public void closeHistory(String documentId) { // Do nothing } }