package org.araqne.logdb.metadata;
import java.util.Arrays;
import java.util.HashMap;
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.log.api.LoggerRegistry;
import org.araqne.logdb.AccountService;
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.QueryParseException;
import org.araqne.logdb.Row;
import org.slf4j.LoggerFactory;
@Component(name = "logdb-logger-metadata")
public class LoggerMetadataProvider implements MetadataProvider, FieldOrdering {
private final org.slf4j.Logger slog = LoggerFactory.getLogger(LoggerMetadataProvider.class);
@Requires
private AccountService accountService;
@Requires
private MetadataService metadataService;
@Requires
private LoggerRegistry loggerRegistry;
@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("namespace", "name", "factory_namespace", "factory_name", "status", "interval", "log_count",
"drop_count", "last_start_at", "last_run_at", "last_log_at", "last_write_at");
}
@Override
public String getType() {
return "loggers";
}
@Override
public void verify(QueryContext context, String queryString) {
if (!context.getSession().isAdmin()) {
// throw new QueryParseException("no-read-permission", -1);
throw new QueryParseException("90510", -1, -1, null);
}
}
@Override
public void query(QueryContext context, String queryString, MetadataCallback callback) {
try {
for (org.araqne.log.api.Logger logger : loggerRegistry.getLoggers()) {
Map<String, Object> m = new HashMap<String, Object>();
m.put("namespace", logger.getNamespace());
m.put("name", logger.getName());
m.put("factory_namespace", logger.getFactoryNamespace());
m.put("factory_name", logger.getFactoryName());
m.put("status", logger.isRunning() ? "running" : "stopped");
m.put("interval", logger.getInterval());
m.put("log_count", logger.getLogCount());
m.put("drop_count", logger.getDropCount());
m.put("log_volume", logger.getLogVolume());
m.put("drop_volume", logger.getDropVolume());
m.put("last_start_at", logger.getLastStartDate());
m.put("last_run_at", logger.getLastRunDate());
m.put("last_log_at", logger.getLastLogDate());
m.put("last_write_at", logger.getLastWriteDate());
callback.onPush(new Row(m));
}
} catch (Throwable t) {
slog.error("araqne logdb: failed to load logger status");
Map<String, String> params = new HashMap<String, String>();
params.put("msg", t.getMessage());
throw new QueryParseException("95011", -1, -1, params);
// throw new QueryParseException("logger-load-fail", -1);
}
}
}