package org.araqne.logdb.metadata; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; 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.AccountService; import org.araqne.logdb.FieldOrdering; import org.araqne.logdb.FunctionRegistry; 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.logstorage.Log; import org.araqne.logstorage.LogStorage; import org.araqne.logstorage.LogTableRegistry; @Component(name = "logdb-last-log-metadata") public class LastLogMetadataProvider implements MetadataProvider, FieldOrdering { @Requires private LogTableRegistry tableRegistry; @Requires private AccountService accountService; @Requires private LogStorage storage; @Requires private FunctionRegistry functionRegistry; @Requires private MetadataService metadataService; @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("table_name", "date", "last_log"); } @Override public String getType() { return "lastlog"; } @Override public void verify(QueryContext context, String queryString) { MetadataQueryStringParser.getTableNames(context, tableRegistry, accountService, functionRegistry, queryString); } @Override public void query(QueryContext context, String queryString, MetadataCallback callback) { TableScanOption opt = MetadataQueryStringParser.getTableNames(context, tableRegistry, accountService, functionRegistry, queryString); List<String> targetTables = opt.getTableNames(); for (String tableName : tableRegistry.getTableNames()) { if (!targetTables.contains(tableName)) continue; Map<String, Object> m = new HashMap<String, Object>(); m.put("table_name", tableName); Date lastDate = getLastDate(tableName); if (lastDate != null) { Iterator<Log> it = storage.getLogs(tableName, lastDate, null, 1).iterator(); if (it.hasNext()) { Log log = it.next(); m.put("date", log.getDate()); m.put("data", log.getData()); } } else { m.put("date", null); m.put("data", null); } callback.onPush(new Row(m)); } } private Date getLastDate(String tableName) { Iterator<Date> it = storage.getLogDates(tableName).iterator(); Date lastDay = null; if (it.hasNext()) lastDay = it.next(); return lastDay; } }