//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.resources;
import java.util.Arrays;
import java.util.Map;
import org.apache.uima.fit.descriptor.ConfigurationParameter;
import org.apache.uima.resource.ResourceInitializationException;
import org.apache.uima.resource.ResourceSpecifier;
import org.bson.BsonArray;
import org.bson.BsonValue;
import org.bson.Document;
import org.bson.codecs.BsonArrayCodec;
import org.bson.codecs.BsonValueCodecProvider;
import org.bson.codecs.DecoderContext;
import org.bson.codecs.DocumentCodecProvider;
import org.bson.codecs.ValueCodecProvider;
import org.bson.codecs.configuration.CodecRegistries;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.json.JsonReader;
import com.github.fakemongo.Fongo;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoDatabase;
/**
* Fake Mongo (fongo) for unit testing.
*
* Match fongo.collection to the collection your annotator (other) is expecting. Provide fixture
* data as fongo.data for example:
*
* <pre>
* private static final List<Document> DATA = Lists.newArrayList(
* new Document("fake", "doc1"),
* new Document("fake", "doc2"),
* new Document("fake", "doc3"));
*
* ExternalResourceDescription erd = ExternalResourceFactory.createExternalResourceDescription("mongo",
* SharedFongoResource.class, SharedFongoResource.PARAM_FONGO_COLLECTION, "documents",
* SharedFongoResource.PARAM_FONGO_DATA, JSON.serialize(DATA));
*
* </pre>
*/
public class SharedFongoResource extends SharedMongoResource {
private static final String BALEEN = "baleen";
private final Fongo fongo = new Fongo("baleen_test_server");
public static final String PARAM_FONGO_COLLECTION = "fongo.collection";
@ConfigurationParameter(name = PARAM_FONGO_COLLECTION, defaultValue = "baleen_test_collection")
private String fongoCollection;
public static final String PARAM_FONGO_DATA = "fongo.data";
@ConfigurationParameter(name = PARAM_FONGO_DATA, defaultValue = "{}")
private String fongoData;
@Override
protected boolean doInitialize(ResourceSpecifier aSpecifier, Map<String, Object> aAdditionalParams)
throws ResourceInitializationException {
// Work whether it's a list of DB Objects or a single
if ("{}".equals(fongoData) || "[]".equals(fongoData) || Strings.isNullOrEmpty(fongoData)) {
return true;
}
if (fongoData.trim().startsWith("[")) {
CodecRegistry codecRegistry = CodecRegistries.fromProviders(Arrays.asList(new ValueCodecProvider(), new BsonValueCodecProvider(), new DocumentCodecProvider()));
JsonReader reader = new JsonReader(fongoData);
BsonArrayCodec arrayReader = new BsonArrayCodec(codecRegistry);
BsonArray docArray = arrayReader.decode(reader, DecoderContext.builder().build());
for(BsonValue doc : docArray.getValues()){
fongo.getDatabase(BALEEN).getCollection(fongoCollection).insertOne(Document.parse(doc.asDocument().toJson()));
}
} else if (fongoData.trim().startsWith("{")) {
Document data = Document.parse(fongoData);
fongo.getDatabase(BALEEN).getCollection(fongoCollection).insertOne(data);
} else {
getMonitor().error("Unsupported type");
throw new ResourceInitializationException();
}
return true;
}
@Override
protected MongoClient createMongoClient(ServerAddress sa, Optional<MongoCredential> credentials) {
// Doesn't test credentials
return fongo.getMongo();
}
@Override
protected void doDestroy() {
// Do nothing
}
@Override
public MongoDatabase getDB() {
return fongo.getDatabase(BALEEN);
}
}