package io.lumify.test; import com.altamiracorp.bigtable.model.FlushFlag; import com.google.inject.Inject; import io.lumify.core.config.Configuration; import io.lumify.core.exception.LumifyException; import io.lumify.core.ingest.WorkerSpout; import io.lumify.core.ingest.graphProperty.GraphPropertyWorkerTuple; import io.lumify.core.model.workQueue.WorkQueueRepository; import org.json.JSONObject; import org.securegraph.Graph; import java.util.*; public class InMemoryWorkQueueRepository extends WorkQueueRepository { private static Map<String, Queue<JSONObject>> queues = new HashMap<String, Queue<JSONObject>>(); private List<BroadcastConsumer> broadcastConsumers = new ArrayList<BroadcastConsumer>(); @Inject public InMemoryWorkQueueRepository(Graph graph, Configuration configuration) { super(graph, configuration); } @Override protected void broadcastJson(JSONObject json) { for (BroadcastConsumer consumer : broadcastConsumers) { consumer.broadcastReceived(json); } } @Override public void pushOnQueue(String queueName, FlushFlag flushFlag, JSONObject json) { LOGGER.debug("push on queue: %s: %s", queueName, json); addToQueue(queueName, json); } public void addToQueue(String queueName, JSONObject json) { final Queue<JSONObject> queue = getQueue(queueName); synchronized (queue) { queue.add(json); queue.notifyAll(); } } @Override public void flush() { } @Override public void format() { clearQueue(); } @Override public void subscribeToBroadcastMessages(BroadcastConsumer broadcastConsumer) { broadcastConsumers.add(broadcastConsumer); } @Override public LongRunningProcessMessage getNextLongRunningProcessMessage() { final Queue<JSONObject> longRunningProcessMessageQueue = getQueue(LONG_RUNNING_PROCESS_QUEUE_NAME); synchronized (longRunningProcessMessageQueue) { while (true) { if (longRunningProcessMessageQueue.size() > 0) { JSONObject message = longRunningProcessMessageQueue.remove(); return new InMemoryLongRunningProcessMessage(message); } try { longRunningProcessMessageQueue.wait(); } catch (InterruptedException ex) { throw new LumifyException("Could not get next long running process message", ex); } } } } @Override public WorkerSpout createWorkerSpout() { final Queue<JSONObject> queue = getQueue(GRAPH_PROPERTY_QUEUE_NAME); return new WorkerSpout() { @Override public GraphPropertyWorkerTuple nextTuple() throws Exception { JSONObject entry = queue.poll(); if (entry == null) { return null; } return new GraphPropertyWorkerTuple("", entry); } }; } private class InMemoryLongRunningProcessMessage extends LongRunningProcessMessage { public InMemoryLongRunningProcessMessage(JSONObject message) { super(message); } @Override public void complete(Throwable ex) { if (ex != null) { LOGGER.error("Failed to process long running process message ", ex); addToQueue(LONG_RUNNING_PROCESS_QUEUE_NAME, getMessage()); } } } public static void clearQueue() { queues.clear(); } public static Queue<JSONObject> getQueue(String queueName) { Queue<JSONObject> queue = queues.get(queueName); if (queue == null) { queue = new LinkedList<JSONObject>(); queues.put(queueName, queue); } return queue; } }