package io.lumify.test;
import com.google.inject.Injector;
import io.lumify.core.config.Configuration;
import io.lumify.core.config.ConfigurationLoader;
import io.lumify.core.config.HashMapConfigurationLoader;
import io.lumify.core.exception.LumifyException;
import io.lumify.core.ingest.graphProperty.GraphPropertyWorkData;
import io.lumify.core.ingest.graphProperty.GraphPropertyWorker;
import io.lumify.core.ingest.graphProperty.GraphPropertyWorkerPrepareData;
import io.lumify.core.ingest.graphProperty.TermMentionFilter;
import io.lumify.core.model.audit.AuditRepository;
import io.lumify.core.model.audit.InMemoryAuditRepository;
import io.lumify.core.model.user.InMemoryUser;
import io.lumify.core.model.workQueue.WorkQueueRepository;
import io.lumify.core.security.DirectVisibilityTranslator;
import io.lumify.core.security.VisibilityTranslator;
import io.lumify.core.user.User;
import io.lumify.web.clientapi.model.Privilege;
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.fs.FileSystem;
import org.json.JSONObject;
import org.junit.After;
import org.junit.Before;
import org.securegraph.*;
import org.securegraph.id.IdGenerator;
import org.securegraph.id.QueueIdGenerator;
import org.securegraph.inmemory.InMemoryAuthorizations;
import org.securegraph.inmemory.InMemoryGraph;
import org.securegraph.inmemory.InMemoryGraphConfiguration;
import org.securegraph.search.DefaultSearchIndex;
import org.securegraph.search.SearchIndex;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
public abstract class GraphPropertyWorkerTestBase {
private InMemoryGraph graph;
private IdGenerator graphIdGenerator;
private SearchIndex graphSearchIndex;
private HashMap configurationMap;
private GraphPropertyWorkerPrepareData graphPropertyWorkerPrepareData;
private User user;
private AuditRepository auditRepository;
private WorkQueueRepository workQueueRepository;
private VisibilityTranslator visibilityTranslator = new DirectVisibilityTranslator();
protected GraphPropertyWorkerTestBase() {
}
@Before
public final void clearGraph() {
if (graph != null) {
graph.shutdown();
graph = null;
}
graphIdGenerator = null;
graphSearchIndex = null;
configurationMap = null;
graphPropertyWorkerPrepareData = null;
user = null;
auditRepository = null;
workQueueRepository = null;
System.setProperty(ConfigurationLoader.ENV_CONFIGURATION_LOADER, HashMapConfigurationLoader.class.getName());
getConfiguration();
InMemoryWorkQueueRepository.clearQueue();
}
@After
public final void after() {
clearGraph();
}
protected GraphPropertyWorkerPrepareData getWorkerPrepareData() {
return getWorkerPrepareData(null, null, null, null, null, null);
}
protected GraphPropertyWorkerPrepareData getWorkerPrepareData(Map configuration, List<TermMentionFilter> termMentionFilters, FileSystem fileSystem, User user, Authorizations authorizations, Injector injector) {
if (graphPropertyWorkerPrepareData == null) {
if (configuration == null) {
configuration = getConfigurationMap();
}
if (termMentionFilters == null) {
termMentionFilters = new ArrayList<TermMentionFilter>();
}
if (user == null) {
user = getUser();
}
if (authorizations == null) {
authorizations = getGraphAuthorizations();
}
graphPropertyWorkerPrepareData = new GraphPropertyWorkerPrepareData(configuration, termMentionFilters, fileSystem, user, authorizations, injector);
}
return graphPropertyWorkerPrepareData;
}
protected User getUser() {
if (user == null) {
Set<Privilege> privileges = Privilege.ALL;
String[] authorizations = new String[0];
user = new InMemoryUser("test", "Test User", "test@lumify.io", privileges, authorizations, null);
}
return user;
}
protected Graph getGraph() {
if (graph == null) {
Map graphConfiguration = getConfigurationMap();
InMemoryGraphConfiguration inMemoryGraphConfiguration = new InMemoryGraphConfiguration(graphConfiguration);
graph = InMemoryGraph.create(inMemoryGraphConfiguration, getGraphIdGenerator(), getGraphSearchIndex(inMemoryGraphConfiguration));
}
return graph;
}
protected IdGenerator getGraphIdGenerator() {
if (graphIdGenerator == null) {
graphIdGenerator = new QueueIdGenerator();
}
return graphIdGenerator;
}
protected SearchIndex getGraphSearchIndex(GraphConfiguration inMemoryGraphConfiguration) {
if (graphSearchIndex == null) {
graphSearchIndex = new DefaultSearchIndex(inMemoryGraphConfiguration);
}
return graphSearchIndex;
}
protected Map getConfigurationMap() {
if (configurationMap == null) {
configurationMap = new HashMap();
configurationMap.put("ontology.intent.concept.location", "http://lumify.io/test#location");
configurationMap.put("ontology.intent.concept.organization", "http://lumify.io/test#organization");
configurationMap.put("ontology.intent.concept.person", "http://lumify.io/test#person");
}
return configurationMap;
}
protected Authorizations getGraphAuthorizations(String... authorizations) {
return new InMemoryAuthorizations(authorizations);
}
protected byte[] getResourceAsByteArray(Class sourceClass, String resourceName) {
try {
InputStream in = sourceClass.getResourceAsStream(resourceName);
if (in == null) {
throw new IOException("Could not find resource: " + resourceName);
}
return IOUtils.toByteArray(in);
} catch (IOException e) {
throw new LumifyException("Could not load resource. " + sourceClass.getName() + " at " + resourceName, e);
}
}
protected boolean run(GraphPropertyWorker gpw, GraphPropertyWorkerPrepareData workerPrepareData, Element e, Property prop, InputStream in) {
return run(gpw, workerPrepareData, e, prop, in, null, null);
}
protected boolean run(GraphPropertyWorker gpw, GraphPropertyWorkerPrepareData workerPrepareData, Element e, Property prop, InputStream in, String workspaceId, String visibilitySource) {
try {
gpw.setConfiguration(getConfiguration());
gpw.setAuditRepository(getAuditRepository());
gpw.setGraph(getGraph());
gpw.setVisibilityTranslator(getVisibilityTranslator());
gpw.setWorkQueueRepository(getWorkQueueRepository());
gpw.prepare(workerPrepareData);
} catch (Exception ex) {
throw new LumifyException("Failed to prepare: " + gpw.getClass().getName(), ex);
}
try {
if (!gpw.isHandled(e, prop)) {
return false;
}
} catch (Exception ex) {
throw new LumifyException("Failed to isHandled: " + gpw.getClass().getName(), ex);
}
try {
GraphPropertyWorkData executeData = new GraphPropertyWorkData(visibilityTranslator, e, prop, workspaceId, visibilitySource);
gpw.execute(in, executeData);
} catch (Exception ex) {
throw new LumifyException("Failed to execute: " + gpw.getClass().getName(), ex);
}
return true;
}
protected WorkQueueRepository getWorkQueueRepository() {
if (workQueueRepository == null) {
workQueueRepository = new InMemoryWorkQueueRepository(getGraph(), getConfiguration());
}
return workQueueRepository;
}
protected Queue<JSONObject> getGraphPropertyQueue() {
return InMemoryWorkQueueRepository.getQueue(WorkQueueRepository.GRAPH_PROPERTY_QUEUE_NAME);
}
protected AuditRepository getAuditRepository() {
if (auditRepository == null) {
auditRepository = new InMemoryAuditRepository();
}
return auditRepository;
}
protected VisibilityTranslator getVisibilityTranslator() {
return visibilityTranslator;
}
protected Configuration getConfiguration() {
return ConfigurationLoader.load(getConfigurationMap());
}
}