package org.araqne.logdb.cep.query; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import org.apache.felix.ipojo.annotations.Component; import org.apache.felix.ipojo.annotations.Invalidate; import org.apache.felix.ipojo.annotations.Requires; import org.apache.felix.ipojo.annotations.Validate; import org.araqne.logdb.FieldOrdering; import org.araqne.logdb.MetadataCallback; import org.araqne.logdb.MetadataProvider; import org.araqne.logdb.MetadataService; import org.araqne.logdb.QueryContext; import org.araqne.logdb.Row; import org.araqne.logdb.cep.EventContextService; import org.araqne.logdb.cep.EventContextStorage; import org.araqne.logdb.cep.EventKey; @Component(name = "cep-topic-meta-provider") public class CepTopicMetadataProvider implements MetadataProvider, FieldOrdering { @Requires private MetadataService metadataService; @Requires private EventContextService eventContextService; @Override public String getType() { return "ceptopics"; } @Validate public void start() { metadataService.addProvider(this); } @Invalidate public void stop() { if (metadataService != null) metadataService.removeProvider(this); } @Override public List<String> getFieldOrder() { return Arrays.asList("topic", "count"); } @Override public void verify(QueryContext context, String queryString) { } @Override public void query(QueryContext context, String queryString, MetadataCallback callback) { EventContextStorage storage = eventContextService.getDefaultStorage(); HashMap<String, Integer> topicMap = new HashMap<String, Integer>(); // for (EventKey key : storage.getContextKeys()) { Iterator<EventKey> itr = storage.getContextKeys(); while (itr.hasNext()) { EventKey key = itr.next(); String topic = key.getTopic(); Integer count = topicMap.get(topic); if (count == null) topicMap.put(topic, 1); else topicMap.put(topic, count + 1); } for (Entry<String, Integer> pair : topicMap.entrySet()) { Row row = new Row(); row.put("topic", pair.getKey()); row.put("count", pair.getValue()); callback.onPush(row); } } }