package org.araqne.logdb.cep.query; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.araqne.logdb.DriverQueryCommand; import org.araqne.logdb.FieldOrdering; import org.araqne.logdb.Row; import org.araqne.logdb.cep.EventContext; import org.araqne.logdb.cep.EventContextService; import org.araqne.logdb.cep.EventContextStorage; import org.araqne.logdb.cep.EventKey; public class EvtCtxListCommand extends DriverQueryCommand implements FieldOrdering { private EventContextService eventContextService; private String topicFilter; public EvtCtxListCommand(EventContextService eventContextService, String topicFilter) { this.eventContextService = eventContextService; this.topicFilter = topicFilter; } @Override public String getName() { return "evtctxlst"; } @Override public List<String> getFieldOrder() { return Arrays.asList("topic", "key", "host", "counter", "created", "expire_at", "timeout_at", "maxrows", "vars"); } @Override public void run() { EventContextStorage storage = eventContextService.getDefaultStorage(); Iterator<EventKey> eventKeyItr = storage.getContextKeys(topicFilter); Set<EventKey> keys = new HashSet<EventKey>(); int i = 0; while (eventKeyItr.hasNext()) { EventKey key = eventKeyItr.next(); keys.add(key); if (++i >= 5000) { pushEventContexts(storage.getContexts(keys)); keys.clear(); i = 0; } } pushEventContexts(storage.getContexts(keys)); } private void pushEventContexts(List<EventContext> events) { for (EventContext ctx : events) { if (ctx == null) continue; EventKey key = ctx.getKey(); String topic = key.getTopic(); if (topicFilter != null && !topic.equals(topicFilter)) continue; Row row = new Row(); row.put("topic", topic); row.put("key", key.getKey()); row.put("host", key.getHost()); row.put("counter", ctx.getCounter().get()); row.put("created", new Date(ctx.getCreated())); row.put("expire_at", ctx.getExpireTime() == 0 ? null : new Date(ctx.getExpireTime())); row.put("timeout_at", ctx.getTimeoutTime() == 0 ? null : new Date(ctx.getTimeoutTime())); row.put("maxrows", ctx.getMaxRows()); row.put("vars", ctx.getVariables()); // following query command can corrupt data in cep context List<Object> rows = new ArrayList<Object>(); for (Row r : ctx.getRows()) rows.add(Row.clone(r.map())); row.put("rows", rows); pushPipe(row); } } @Override public String toString() { String opt = ""; if (topicFilter != null) opt = " topic=" + topicFilter; return "evtctxlist" + opt; } }